- 互联网的组成
边缘部分:所有连接在互联网上的主机,又称端系统。
核心部分:大量网络和连接这些网络的路由器组成,核心部分为边缘部分提供服务。
路由器之间用高速链路相连接,主机接入到核心采用较低速率的链路连接,因为路由器是负责传输网络和网络之间的数据,数据量庞大。
端到端通信的含义:运行在主机A上的某个进程和运行在B上的另一个进程通信。
端到端通信方式:
有两种:C/S(客户端和服务器方式,客户和服务器是指两个应用进程) 和 P2P(对等连接方式)。
对等连接是两个通信主机不区分哪个是服务请求方和提供方,其实对等连接方式本质还是使用了客户服务器方式(C/S),只不过每个主机即使客户又是服务器。
对于C/S方式,资源是集中在服务器上的,而P2P方式资源是分散在所有主机上的。
- 分组交换
分组交换指发送端把较长的报文划分为较短的数据段,每个数据段前面添加首部(如目的地址等)构成分组(packet),一个分组就是一个包。
重点在于:切分和添加首部这两个动作。
每个分组的首部都含有地址(目的地址和源地址)和其他控制信息。每个分组都通过通信链路和分组交换机(交换机主要有路由器和链路层交换机2种)。分组以等于该链路最大传输速率的速度通过链路。
存储转发机制
存储转发机制是指交换机能开始向输出链路(一个路由器连接着多条输入链路和输出链路)传输该分组的第一个比特前,必须接收到整个分组。
分组丢失
由于输出缓存有限,一个到达的分组可能发现该缓存已经被其他等待传输的分组充满了,此时到达的分组或在排队的某个分组会被丢弃,这就是分组丢失(丢包)。
转发表和路由选择协议
一个交换机有多条输出链路,如何决定某个分组从哪条链路输出呢?
路由器中具有转发表,包含目标地址到输出链路的映射,分组头部包含目标地址,可以在转发表中以目标地址为索引查到该分组要输出的链路。
转发表的内容是如何设置呢?
是根据路由选择协议,由路由器和路由器之间交换信息计算而来的,并且会动态变化(例如某个时刻某个路由器A针对某个目标IP的下一跳是路由器B,但过了5分钟后下一跳变为路由器C)。例如使用最短路径算法来设置转发表的下一跳。
综上总结,路由器处理分组的过程:先把收到的分组放入缓存暂时存储,查找转发表找到某个目的地址应该从哪个端口转发再转发出去(每个端口连接的是不同的网络和链路)。这个过程叫做存储转发(四个过程:接收、存储、查表和转发)。
分组传输的路径
每个分组在互联网中独立的选择传输路径。某个主机发出的每个分组经过的路径可能不同,是由路由器协同计算得到的。
如上图所示:一个http报文的多个分组从H1到H6可以有多条路径,路由器会计算分组的最优路径并转发,可能某个时刻最优路径是路径A,但当很多分组都走路径A导致拥挤,最优路径变为路径B,其他分组就会走路径B,这是个动态的过程。因此每个去往同一目的地的分组走的路径可能不同。
分组交换的时延
分组从一个节点(主机或路由器)沿着某条输出链路到达后继节点的时间为节点总时延。它包括 节点处理时延、排队时延、传输时延和传播时延。
上图有4个小格子,分别代表4个时延的长短。
处理时延包括检查分组首部和决定分组导向哪个链路(查转发表),微秒级别。
排队时延取决于A到B链路上的输出队列中分组的数量(而队列中分组的数量又取决于分组出队的速度,也就是链路传输速率),毫秒到微秒级别,如果队列为空则排队时延为0。
传输时延将一个分组的所有比特推向链路的时间,假设A到B的链路速率为R比特/s,一个分组的大小为L比特,则该分组传输时延为L/R,传输时延的对象是某个分组,毫秒到微秒级别。
传播时延是某个分组的某个比特从刚进入传输链路到该比特到达路由器B的时间,取决于链路的物理媒介(光纤、双绞铜线等)和两个节点的距离,光纤的速度等于或略小于光速。传播时延等于路由器距离/传播速率。毫秒级别。
请区分链路传输速率和传播速率。
假设端到端之间经过N-1个路由器,且网路无拥塞(没有排队时延)则端到端时延 = N * (传输时延 + 传播时延 + 处理时延)
衡量端到端的网络性能的标准不只是时延,还有丢包率(因为丢包之后重传这个包也需要花时间)和吞吐量。而丢包率又和网络拥塞有直接关系。
吞吐量是指数据从主机A到主机B的传输速率。假设主机A传输一个文件给B(或者B下载A的一个文件),大小为F比特,所花的时间为T,则平均吞吐量为 F/T bps。在任何瞬间的速率是瞬时吞吐量,举个例子就是我们在浏览器上看到的实时下载速度。它不仅包含网络传输的速率还包含服务器处理请求的速度。
分组交换优缺点
优点
1、分组传输过程中动态分配传输带宽,对通信链路是逐段占用的(一个链路可以传输多个分组,每条链路的资源可以由多个分组或者不同主机的分组共享)。
2、为每个分组独立选择最合适的转发路由路径。
3、分布式多路由的分组交换网,使得分组交换更可靠(即每个分组有多条路由路径选择,一条路由路径故障还能走另一条路由)。
4、分组交换无需建立连接就能发送给其他路由器(电路交换需要建立连接),因此迅速高效。
缺点
1、分组可能发生失序、丢失或重复分组。
因为每个分组的转发路径会不同,因此分组会失序;
因为路由器缓存有限,如果缓存已满的情况下,后到的分组可能会被丢弃(丢失);
因为TCP可靠传输下,如果一定时间内(可能因为时延)发送方没有收到接收方的确认报文,发送方会重传造成接收方可能收到重复分组;
失序、丢失和重复分组无法在分组交换过程中(即路由器传输过程中)解决,只能在端对端的主机上(更详细点是操作系统的协议栈上)解决。
2、分组在路由器接收、存储、查表和转发都要耗时,接收和转发要排队,造成一定时延。
3、分组需要携带首部控制信息,发送方主机要添加首部,接收方主机要移除首部并把多个分组拼接为完整报文,会对双方造成一定开销。
- 电路交换(了解即可)
通过网络链路和交换机移动数据的方式除了分组交换之外,还有电路交换。
电路交换有以下特点:
1、电路交换方式的传输在端系统通信期间会预留端到端沿路径通信所需的资源(如缓存。链路传输速率),而在分组交换中是不预留的。
例如 主机A 和 主机B 通信,其沿路的所有路由器要预留AB通信的输出缓存,其他主机的分组不用使用AB的输出缓存。
2、端对端通信需要建立连接,这里的连接不是指TCP连接的那个连接,TCP连接是一个虚拟的连接,而电路交换的连接则是一个真实存在的连接,可以理解为一条电路。
该电路预留了发送方A和接收方B的通信带宽,其他主机不能使用这条连接和该连接的带宽,这也符合第一点。
一条通信链路(路由器A到B的链路)会包含多条这样的连接电路,每条连接电路都有自己的带宽和速率。例如一条通信链路的带宽为100Mbps,内含4条连接电路,每条带宽为25Mbps,A和B通信只能占用该链路的一条连接,其最大速率也只有25Mbps;但如果换成分组交换,则当其他主机不使用该链路的情况下,A和B通信可以用满这100Mbps的带宽(这也是上面所说分组交换的第一个优点)。
因此分组交换对网络链路资源的共享性更强也更灵活,但电路交换更稳定(无论是速率还是时延)。
- 网络的网络
网络是有众多网络服务商ISP的路由器和交换机组成的,除了ISP,第三方公司创建了互联网交换点IXP,IXP是众多ISP信息流通共享的汇合点。
今天的互联网是一个网络的网络,由十多个第一层的ISP和数十万个较低层ISP组成,较低层的ISP与较高层ISP相连,较高层ISP彼此互联。
- 协议分层
为什么要分层?计算机网络是个复杂的系统,分层是为了让每层专注于某一个功能,提供特定的服务,下层为上层提供所需的服务,而上层只需专注实现本层的功能无需关注下层更细小的功能如何实现的(例如HTTP是基于TCP运输协议的,因此HTTP无需担心数据丢失或乱序,因为TCP是提供可靠数据传输服务的,数据的丢失和乱序都会得到重传和恢复,HTTP不关注TCP从数据丢失或乱序的故障中恢复的细节)。
各层所有的协议称为协议栈,因特网的协议栈(TCP/IP协议栈)分为5层:物理层、链路层、网络层、传输层和应用层。
五层模型总结如下:
应用层
功能:负责提供系统接口(即套接字)给用户进程,使用户能使用协议栈的功能(例如用户程序中调用connect、recv、send这样的接口就是应用层提供的);规范用户进程通信所遵循的模式(如C/S模式和P2P模式);负责用户与用户的通信,作用对象是用户。
具体功能:文件传输;访问和管理;电子邮件服务。
协议:FTP、SMTP、POP3、HTTP、DNS。
传输单位:报文。
传输层
功能:负责主机中两个进程间的通信(负责把应用层报文从主机A进程传递到主机B进程)。作用对象是应用或者说进程。
具体功能:为端到端通信提供可靠的传输服务;提供流量控制、差错控制等服务;
协议:TCP、UDP、ARQ
传输单位:报文段(TCP)和用户数据报(UDP)
网络层
功能:负责两个指定主机的通信(负责把传输层的分组传递到目标主机)。
具体功能:组包和拆包、拥塞控制、路由选择。
协议:ICMP、ARP、RARP、IP、IGMP
传输单位:数据报(包)
实现的硬件:路由器
链路层
功能:将网络层传下来的数据包组装为帧,并负责将帧从一个节点传递给另一个节点,这里的节点指主机或路由器,每个节点间可能跨了多个交换机,但这两个节点一定还在一个链路层网络内(比如局域网、无线通信网)。
具体功能:帧定界和帧同步、容错检测
实现的硬件:交换机、网桥
协议:PPP、HDLC、以太网协议
传输单位:帧
物理层
功能:透明的传输比特流
实现的硬件:集线器、中继器
传输单位:比特
需要注意的是:网络层和链路层的功能有点容易混淆,网络层的功能是负责将分组从源主机A传递到目标主机B,而A到B的过程会经过很多链路的节点(路由器和交换机),链路层的功能是负责分组从一个链路节点传递到下一个链路节点(路由器A到路由器B)。
每一层的分组都会经过封装(添加头部)传递给下一层。