跳转至

计算机网络

研究生入学考试,全国统考计算机学科基础,其之四,计算机网络。

第一章 计算机网络体系结构

存储-转发,计算总时间

发送时延/传播时延:计算机发送数据包到链路上所需时间。

传输时延:数据包从链路上传输到接收方所需时间。

存储-转发计算总时间:需要等待一个数据包完全接收后才能开始转发,整体过程类似于一个流水线。

交换技术

电路交换技术:建立连接,传输数据,释放连接。

报文交换技术:不需要建立连接,直接传输数据。

分组交换技术:将数据(报文)分成小块,每个小块独立传输。

OSI 七层模型 与 TCP/IP 四层模型

自底向上:

OSI 七层模型 TCP/IP 四层模型 功能 特征
物理层 网络接口层
数据链路层 网络接口层 MAC 地址
网络层 网际层 OSI 规定提供有连接和无连接服务,TCP/IP 只提供无连接服务 IP 地址
传输层 传输层 OSI 提供有连接服务,TCP/IP 提供有链接(TCP)和无连接(UDP)服务 端口号
会话层 应用层 建立同步,提供检查点机制
表示层 应用层 数据格式转换、编码、压缩、加密与解密
应用层 应用层 网络应用

计算机网络协议的概念

协议包括语法、语义和时序三个要素。

语法:数据格式。例如 TCP 报文段的格式。

语义。例如 TCP 连接建立的过程。

时序。例如 TCP 连接建立中前后的时序关系。

第二章 物理层

波特率、比特率

波特率:每秒传输的码元数。一个码元是固定时长的一个数字脉冲。一个脉冲可以携带不止 1 位的数据。例如,将频率或者振幅空间划分为 \(2^n\) 个等级,那么一个码元可以携带 \(n\) 位数据。

比特率:每秒传输的比特数。比特率 \(=\) 波特率 \(\times\) 每个码元携带的比特数。

计算极限速率

Nyquist 定理:为确保能够恢复原始信号,采样频率至少是信号频率的两倍。假设带宽为 \(W\),那么极限波特率为 \(2W\)。从而极限比特率为 \(2W \log_2 M\),其中 \(M\) 是采样的阶数,\(\log_2 M\) 是每个码元携带的比特数。

在理想低通信道内以“极限比特率”编码

带宽 \(W = 0.5\ \text{Hz}\),即只保留 \(|f|\leq W\) 的基带分量。

取理想 Nyquist 脉冲 \(\displaystyle p(t)=\mathrm{sinc}(\frac{t}{T})=\frac{\sin(\pi t/T)}{\pi t/T}\),其中 \(\displaystyle T = \frac{1}{2W} = 1\)。总发送信号 \(\displaystyle s(t)=\sum_{k} a_k\, p(t-kT)\)

采用 \(M=8\) 阶 PAM,每码元携带 \(\log_2 8=3\) bit,故理论极限比特率 \(R_b = 2W \log_2 M = 1 \times 3 = 3\ \text{bit/s}\)

在全 0 序列背景中嵌入八进制数字串 114514

nyquist

几何直观:带宽上限为 \(W=0.5\) Hz 的最外侧频率对应基波周期 \(T_0=1/W=2\) s,而 Nyquist 间隔为 \(T=1/(2W)=1\) s,故在每个 \(2\) s 的基波周期里可以放置两个符号抽样点(位于 \(kT\)\((k+1)T\))。通俗来讲,利用三角函数在一个周期内有两个零点,每个零点都能保证不对其他脉冲造成干扰。

Shannon 定理:考虑随机的高斯噪声时,极限比特率为 \(W \log_2 (1 + S/N)\),其中 \(S/N\) 是信号功率与噪声功率之比。

信噪比:\(\log_{10} (S/N)\),单位 dB。dB 数转换功率比:\(\displaystyle S/N = 10^{\frac{dB}{10}}\)

往往需要同时考虑 Nyquist 定理和 Shannon 定理的限制。

数字信号的编码

(1) RZ 编码:Return to Zero。每个码元的中间有一个零电平。

(2) NRZ 编码:Non-Return to Zero。每个码元的中间没有零电平。需要双方同步时钟。

(3) NRZI 编码:Non-Return to Zero Inverted。每个码元的中间没有零电平,但是下一个码元的电平取决于上一个码元的电平。如果电平发生跳变,则表示 0,否则表示 1。需要双方同步时钟。

(4) Manchester 编码:每个码元的中间都发生电平跳变。向上跳变表示 0,否则表示 1。可以通过电平跳变来同步时钟。(IEEE 802.3 以太网)

(5) Differential Manchester 编码:每个码元的中间都发生电平跳变,但此跳变无意义。只有码元的开始处的跳变有意义。向上跳变表示 0,否则表示 1。可以通过电平跳变来同步时钟。

物理层设备

中继器:无存储转发功能,只是对信号进行整形、放大、转发。

集线器:多个端口的中继器。

被物理层设备连接的网络同处于一个冲突域。

第三章 上半部分 数据链路层

数据链路层:为网络层提供 有/无连接 有/无确认 服务。

有/无连接:是否需要事先建立可靠连接。

有/无确认:是否需要接收方确认。不使用序号和确认的服务是不可靠的。

不存在有链接但无确认的情况。

封装成帧

帧定界:在数据包前后加上特定的标志,以便接收方识别帧的开始和结束。

透明传输:无论数据内容,都不会造成帧定界的混淆。

(1) 字符计数法:每一帧第一个字段记录整个帧的长度(包括帧头和帧尾)。

(2) 字符填充法:使用特殊的 ASCII 字符定界。在帧中出现特定字符时,插入转义字符,以避免混淆。

(3) 零比特填充法:使用 01111110 作为帧定界。在帧中出现 11111 时,插入 0。接收时,如果出现 11111,根据其后的比特是 0 还是 1 来判断是否是帧定界:如果是 0,则删除填充的 0,此处是数据;如果是 1,则此处是帧定界。

(4) 违规编码法:使用特殊的编码方式,使得帧定界不会出现在数据中。

差错控制

(1) 奇偶校验:使用 1 位的校验码,加上这一位后,1 的个数为奇数或者偶数。(分别对应奇校验和偶校验)

(2) CRC 校验:\(m\) 位的数据,使用 \(r\) 位作为校验码。取 \(r+1\) 位的多项式 \(G(x)\),使用 {data[m-1:0], r{1'b0}} 除以 \(G(x)\),得到余数作为校验码。使用不进位借位的二进制加减法进行计算。将余数放在数据的后面,接收方再次计算与 \(G(x)\) 的除法,如果余数为 0,则说明没有错误(这是因为不进位借位的二进制加法和减法是等价的运算,都等价于异或)。可以检出所有 \(r\) 位以内的错误。

(3) 海明码:提供对单比特错误的检测和纠错,\(n\) 位的数据,\(r\) 位的纠错码,需要满足 \(2^r \geq n + r + 1\),即纠错码的总组合数大于等于 所有可能的单比特错误位置 加上 无单比特错误的情况。

从 1 开始计数,将 \(r\) 位的纠错码排列在第 1, 2, 4, 8, ... 位上,然后在剩余的空间中按顺序填入原先的数据。每个数据被其位置号的二进制表示为 1 的纠错码校验(例如,对于处于位置 0b1011 的数据,被第 1, 2, 4 位的纠错码校验)。纠错码通过计算被其控制的数据位的异或得到。

接收方将检验位与所有被其控制的数据为作异或,如果结果为 0,则说明没有错误;否则,则说明在二进制位置号这一位为 1 的某一位出现了错误。

海明码的码距:海明编码中,任意两个有效的数据位组合之间的海明距离。

码距为 \(d\) 的海明码,提供对 \(d-1\) 位错误的检测和 \(\displaystyle \lfloor \frac{d - 1}{2} \rfloor\) 位错误的纠正(这是因为解码器通过选择距离最近的有效码字纠正错误,如果错误位数大于 \(\displaystyle \lfloor \frac{d - 1}{2}\rfloor\),那么最近的有效码字可能不唯一)。

例子:经典海明码,\(n = 4\)\(2^r \geq n + r -1\) \(\Rightarrow\) \(r = 3\),俗称 7, 4 码。其中任意两个有效数据位组合为 00000001110000 \(\Rightarrow\) 码距 $d =3 $ \(\Rightarrow\) 可以检测(但无法定位) 2 位错误和纠正(检测并定位) 1 位错误。

流量控制与可靠传输

相关概念:逐帧确认/累积确认、发送窗口 \(W_T\) /接收窗口 \(W_R\)(可以发送/允许接收的帧号)。

用滑动窗口来建模帧传输的过程。各个流量控制协议如下:

(1) 停止等待协议

\(W_T = W_R = 1\)。逐帧确认。

(2) Go-Back-N 协议

按序接收,因此 \(W_R = 1\)。累计确认。

\(W_T > 1\),但需要满足 \(W_T + W_R \leq 2^n\),其中 \(n\) 是帧编号的位数,以免在同一轮传输中就用尽所有可能的帧编号。

当发送方检测到超时,重传超时的帧以及之后的所有帧。

当发送方收到 ACK 时,发送窗口后移。

(3) 选择重传协议

\(W_T, W_R > 1\)。逐帧确认。

\(W_T + W_R \leq 2^n\)

\(W_T \geq W_R\)

一旦接收方检测到错误,向发送方发送 NAK,要求重传;无错,发送 ACK,窗口后移。

(4) 计算信道利用率:发送用时 / 总用时

第三章 下半部分 介质访问控制子层

信道划分下的介质访问控制

(1) 时分复用

(2) 频分复用、波分复用(光的频分复用)

(3) 码分复用:每个站使用相互正交的单位向量表示 0 和 1。叠加传播,接收者使用发送站向量上的投影判断这个发送站是否发送了信号:如果投影为正,则发送了 1;如果投影为负,则发送了 0;如果投影为 0,则没有发送信号。

随机访问下的介质访问控制

(1) ALOHA 协议:有就发,如果确认超时,那么就认为发生了冲突,等待随机时长后重发。(如果改为立即重发,则会发生互递归,必然导致继续冲突)

(2) 时隙 ALOHA 协议:将时间划分为时隙,每个站在时隙开始时发送,如果冲突,等待随机时长后重发。

(3) CSMA 协议:CS = Carrier Sense,载波监听。监听信道,如果信道空闲,立即发送;如果信道忙,等待随机时长后重试。又细分为非坚持型 CSMA、1-坚持型 CSMA、p-坚持型 CSMA。这里的「坚持」指的是信道忙时是否继续监听信道;1 和 p 指的是空闲时发送的概率(如果不发送则继续监听)。

(4) CSMA/CD 协议:CD = Collision Detection。如果发送过程中检测到冲突,立即停止发送,等待后重试。如何检测冲突:计算 RTT = \(2\tau\),如果在 \(2\tau\) 内收到了另外一个站的信号,那么就认为发生了冲突。适用于半双工通信(以太网)。这也是以太网帧最小帧长的原因:一个帧不能短到发送完之前还没有检测到可能的冲突(检测到冲突的最大时长需要 \(2\tau\))。以太网最小帧长 64B。另一方面,对于接收到的数据帧,如果小于最小帧长,则可以认为是错误报文,直接丢弃。

CSMA/CD 等待时长的计算:\(2 \tau \cdot r\),其中 \(r\) 是集合 \(\{2^0 - 1, 2^1 -1, \dots, 2^{\min(k, 10)} - 1\}\) 中的随机数,\(k\) 是冲突重传次数。当 \(k = 16\) 时,认为网络拥塞,放弃发送。

(5) CSMA/CA 协议:CA = Collision Avoidance。避免冲突,而不是检测冲突。每个站在收到信息后,必须等待 IFS(InterFrame Space)时间后才能发送下一个帧。每一个帧都需要确认。SIFS 用于分割同一会话中的不同帧;DIFS 当且仅当信道空闲、进行预约时被使用。802.11 标准中的预约流程如下:

(a) 由申请方监测信道空闲后,等待 DIFS,发送 RTS(Request To Send)帧;(b) 当目的站收到 RTS 帧后,等待 SIFS,向所有站点发送 CTS(Clear To Send)帧;(c) 所有收到 CTS 帧的所有其他站点均需等待,而收到 CTS 帧的申请者此时获得信道的独占权,等待 SIFS 后发送数据帧;(d) 目的站接收完成数据帧后,等待 SIFS,向所有站点发送 ACK 帧,通知他们信道占用时间结束。

RTS 和 CTS 帧中都含有标识需要对方等待多长时间的字段,对于 RTS 帧来说是 3*SIFS + 数据帧传输时间 + CTS + ACK;对于 CTS 帧来说是 2*SIFS + 数据帧传输时间 + ACK。

信道忙时,也采用类似 CSMA/CD 的退避算法,等待时长 \(2 \tau \cdot r\),其中 \(r\in \{2^2 - 1, 2^3 -1, \dots, 2^{\min(2+k, 8)} - 1\}\)

适用于无线局域网。

(6) 令牌传递协议:每个站必须持有令牌才能发送数据。由令牌帧携带数据,每个站收到令牌后,可以发送数据(如果没有数据,则立即传递令牌),然后将令牌传递给下一个站。适用于令牌环网络。

局域网

局域网的特性由:拓扑结构、传输介质、介质访问控制决定

以太网:

逻辑拓扑结构:总线型;物理拓扑结构:星型

传输介质:双绞线、光纤

介质访问控制:CSMA/CD

无连接无确认,曼彻斯特编码。

以太网 MAC 帧的格式:

前导码 目的地址 源地址 类型 数据 CRC
8 Byte 6 Byte 6 Byte 2 Byte 46-1500 Byte 4 Byte

前导码包括同步码 7B 和定界符 1B。类型字段可以用来表示数据长度,只需要规定类型从 1501 开始编码即可。不需要帧尾定界符,原因是使用曼彻斯特编码,当电平信号不变时,就能够检测到结束。

CRC 计算包括除前导码和其本身以外的所有字段。

802.11 无线局域网:

介质访问控制:CSMA/CA

802.11 MAC 帧的格式:

帧控制 持续期 地址 1 地址 2 地址 3 序列控制 地址 4 数据 CRC
2 Byte 2 Byte 6 Byte 6 Byte 6 Byte 2 Byte 6 Byte 0-2312 Byte 4 Byte

其中,地址 1、2、3 的含义由帧控制字段中的「去往 AP」、「来自 AP」决定。按顺序为 dest, src, addr3。addr3 为源地址或者目的地址(考虑到需要先向 AP 发送数据,然后再由 AP 转发给目的地址,因此需要 addr3 作为中间变量来标识真正的目的或者源地址)。

802.1Q 虚拟局域网:

通过在以太网帧中添加 VLAN 标签来实现虚拟局域网。

前导码 目的地址 源地址 VLAN 标签 类型 数据 CRC
8 Byte 6 Byte 6 Byte 4 Byte 2 Byte 46-1500 Byte 4 Byte

使用 VLAN 标签(中的后 12 位)来区分不同的虚拟局域网。

广域网

节点交换机:局域网中的路由器与广域网的接口。

PPP 协议:点对点链路控制协议。用于在两个节点之间建立连接。用户计算机与 ISP 之间的连接。有连接、无确认(不可靠)。

异步的 PPP 帧使用字节填充法来进行帧定界。同步的 PPP 帧使用 01111110 作为帧定界。

PPP 帧只有最长限制,没有最短限制,这是因为 PPP 的点对点通信不需要使用 CSMA/CD 进行冲突检测。

数据链路层设备

交换机的自学习机制:交换机通过学习源地址来建立 MAC 地址表。当交换机接收到一个帧时,它会查看帧中的源地址,并将其与接收到这个帧的端口相关联。

交换机在转发帧时,如果目的 MAC 地址在 MAC 地址表中,那么就直接转发到对应的端口;如果不在,那么就广播到所有端口。

被数据链路层设备连接的网络同处于一个广播域。

对比在物理层扩展网络(使用集线器),集线器只能够向各个端口广播帧,而不能定向地转发,因此使用集线器时,如果多个设备同时通信则必然产生冲突,这个冲突的发生范围是所有使用集线器连接的设备集合,这个集合被称为冲突域。而使用交换机时,由于能够定向地转发到某个端口,因此能实现多个设备的并行通信,因此能够隔离冲突域。

第四章 网络层

网络层提供有链接的虚电路服务(OSI) 或者 无连接的数据报服务(TCP/IP)。在 TCP/IP 协议栈中,网络层使用 IP 地址。

SDN:软件定义网络。将网 络设备的控制平面与数据平面分离,通过控制器来控制网络设备。

控制平面:路由选择,集中控制路由表并下发到路由器。

数据平面:数据包转发,根据路由表转发数据包。

IPv4

(1) IP 数据报中部分首部字段:

字段 描述 大小
版本 值为 0x4 4bit
首部长度 以 4B 为单位 4bit
总长度 以 1B 为单位,包括首部和数据 2B
标识 计数器,用于分片 2B
标志 MF,DF,RF 3bit
片偏移 以 8B 为单位 13bit
TTL 生存时间,每经过一个路由器减 1 1B
首部校验和 校验 IP 首部 2B
源 IP 地址 4B
目的 IP 地址 4B

(2) IP 数据报的分片:当数据报长度超过链路层的 MTU 时,进行分片,每一个路由器都可以对数据报进行分片。

其中,首部的标识用于恢复数据报的顺序,以数据报为单位(标识出唯一的数据报);而标志和片偏移用于重组数据报的分片,片偏移的计算可以视作是数据部分在「未经分片的无限长 IP 报文」中的下标,以 8B 为单位。

(3) IPv4 地址:32 位,分为网络号和主机号。网络号用于路由,主机号用于标识主机。

分类的 IP 地址:网络号的位数分别为 8、16、24 位(A、B、C 类,分别以 010110 开头,霍夫曼编码,还有以 11101111 开头的 D 类多播地址和 E 类预留地址)。

保留全 0 和全 1 的网络号。全 0 的主机号表示本网络,全 1 的主机号表示本网络的广播地址。

私有 IP 地址:不被路由器转发的 IP 地址。

类型 地址范围
A 类 10.0.0.0 - 10.255.255.255
B 类 172.16.0.0 - 172.31.255.255
C 类 192.168.0.0 - 192.168.255.255

(4) 对主机号,可以进一步划分为子网号和主机号。

子网掩码:子网掩码的 1 位标识网络号和子网号,0 位标识主机号。

当发送 IP 报文时,检查目的 IP 是否在同一子网中,若是,则直接发送;否则,发送到默认网关。

(5) CIDR:使用不定长的网络号和子网号,通过 CIDR 表示法来表示。(在 IP 地址后面加上 / 和子网掩码的位数。表示点对点链路时,可以使用主机号 0(相当于全 0) 和 1(相当于全 1)用来标识两个主机,从而子网掩码可以到达 /31 而无需 /30

使用 CIDR 表示法,可以通过路由聚合合并路由表表项,减少路由表的大小。

(6) 路由表使用最长前缀匹配,转发到复合条件的表项中,前缀最长的那一项。使用 a.b.c.d/32 表示通往特定主机的路由,使用 0.0.0.0/0 表示默认路由。

(7) NAT:由路由器维护的 NAT 表,将内部 IP 地址+端口映射到外部 IP 地址+端口。由于出现了端口,是一个传输层协议。

(8) ARP:将 IP 地址解析为 MAC 地址。广播 ARP 请求,单播 ARP 响应。路由器中维护 IP 地址与 MAC 地址的映射表。

(9) DHCP:即插即用的 IP 地址分配协议。DHCP 服务器维护 IP 地址池,客户端发送 DHCP 请求,服务器回复 DHCP 响应。UDP,由于区分 C/S,是一个应用层协议。协议全部通过广播来实现。

(10) ICMP:Internet 控制报文协议。其本身是网络层协议(只能得到 IP 地址,不能得到端口号),但使用 ICMP 的 ping 工作在应用层,使用 ICMP 的 traceroute 工作在网络层。

ICMP 差错报文:终点不可达(不能交付数据报),超时(TTL 为 0 时),源点抑制(网络拥塞),参数问题(首部校验和错误),重定向(使用另外的路由)。

IPv6

首部长度固定为 40 字节,首部扩展位于数据部分。

即插即用,不需要 DHCP。由于地址足够长,可以使用后 64bit 接口 ID 中的 48 bit 用作 MAC 地址,因此也不需要 ARP。

只有源主机能够对 IP 数据报进行分片,中间路由器不再对数据报进行分片,并且不再使用校验和。

支持身份验证和加密,支持 Anycast。

IPv6 地址:128 位,分为网络前缀和主机标识。使用 : 分隔,:: 标识若干个连续的 0000 字段。

网络号 子网号 接口 ID = MAC 地址 + ...
48 bit / 3 节 16 bit / 1 节 64 bit / 4 节

私有地址:FE80:...FEBF:...

广播地址:FF00:...FFFF:...

路由算法

(1) 距离-向量算法:即单源最短路径的 Frod-Bellman 算法。每个节点维护到其他节点的距离向量,通过交换距离向量来更新路由表 -> RIP 算法(没有全局视角的最短路径算法),使用 UDP 的 520 端口,是一个传输层协议。

初始化时,每个节点向相邻节点发送自己的距离向量,然后接收相邻节点的距离向量,更新自己的距离向量,如果发生变化,则向相邻节点发送更新的距离向量,直到收敛。

RIP 算法使用跳数作为距离的度量,最大跳数为 15,超过 15 被认为不可达。

graph LR
    A{路由表中有目的网络?} -->|Yes| B{下一跳一致?};
    B -->|Yes| C{新的下一跳总距离更近?};
    C -->|Yes| D[更新];
    C -->|No| E[不更新];
    B -->|No| E;
    A -->|No| E;

不可达信息传送速度慢,因为更新距离时运用到了 \(\min\) 算子。

(2) 链路状态路由算法:即单源最短路径的 Dijkstra 算法。每个节点维护到其他节点的链路状态,通过交换链路状态来更新路由表 -> OSPF 算法(有全局视角的最短路径算法),直接使用 IP 数据包进行发送,是一个网络层协议。

OSPF 算法定时向邻居发送 HELLO 报文,以确定可达性。当链路状态发生变化时,重新计算自己到所有节点的最短路径,然后使用洪泛法向所有节点发送链路状态。

由于 OSPF 算法存在确认报文,因此是一个可靠的协议。

(3) 层次路由算法:分层,AS 内部保持一致,AS 之间无要求。AS 之间使用 BGP 协议,每个 AS 的代理人路由器(BGP 边界路由器)向相邻 AS 的代理人路由器发送路由信息,使用 TCP 的 179 端口,是一个传输层协议。边界路由器使用 iBGP 协议向 AS 内的其他路由器发送相关信息。AS 内的其他路由器如果需要发送到其它 AS 中的路由器,需要先将数据报发送到边界路由器,由边界路由器通过 BGP 协议计算出的路由进行转发。

多播

只有当路径发生分叉时,才会复制数据报。仅 UDP 支持多播。

(1) 多播地址:IPv4 中为 224.xxx.xxx.xxx - 239.xxx.xxx.xxx(以 1110 开头)。以太网原生支持多播,因此在 IPv4 地址中,需要将多播地址映射为以太网的多播地址。IPv4 中多播地址使用 28 位标识主机,但以太网的多播地址只有 23 位,因此在转换为 MAC 地址时舍弃高 5 位。

(2) IGMP:Internet 组管理协议。用于主机向路由器报告自己加入或者离开多播组,不会产生 ICMP 差错报文。

移动 IP(漫游)

由于存在 C/S,是一个应用层协议。用于实现设备移动时固定 IP 地址以保持高层协议的连接。

每个设备存在一个永久的归属地址,以及对应该地址的归属代理。当设备移动到外地时,由当地的外地代理为其分配一个转交地址,所有的通信通过归属地址-归属代理-外地代理-转交地址建立,通过代理之间建立的隧道进行。

网络层设备

路由器,路由器实现了网络层、数据链路层、物理层的功能。隔离广播域,通过网络层连接不同的异构网络。

第五章 传输层

传输层功能:提供端到端的,面向连接(TCP)或者无连接(UDP)的服务。

提供差错检测(同时检测首部和报文,TCP,UDP)和流量控制,拥塞控制(TCP)。

特征以及服务访问点是端口号。TCP 和 UDP 各自独占一套 0-65535 的端口号,也就是说,同一个端口号可以既被 TCP 使用,也被 UDP 使用,而不会产生冲突。

UDP

(1) UDP 首部:

源端口 目的端口 数据报总长 全文校验和
2B 2B 2B 2B

(2) 校验和的计算:添加 12B 的伪首部(源 IP,目的 IP,协议,数据报总长)在最前方,在首部中将校验和填写为全 0 后,以 16 位为粒度,分割,求和,取反。若数据部分为奇数个字节,需要补 0。

(3) UDP 无连接,无确认,无流量控制,无拥塞控制。支持一对一、一对多、多对一、多对多的通信。

目的端口错误:发送 ICMP 端口不可达报文。

校验和错误:直接丢弃或向上层交付并报告错误。

TCP

(1) TCP 首部:

源端口 目的端口 序号 确认号 数据偏移/首部长度 ... 校验和 ...
2B 2B 4B 4B 4b ... 2B ...

TCP 首部长度可变,固定部分 20B,可选部分最长 40B,需要 4B 对齐。

数据偏移/首部长度:以 4B 为单位,表示数据距离数据报第一个字节的偏移量。

校验和:计算与 UDP 一致。

(2) TCP 连接建立(三次握手)

前两次握手(SYN 数据报)不传输数据但需要消耗序列号。第三次握手即可携带数据,如果没有数据,则不需要消耗序列号。

C                                           S
| SYN=1, seq=x                              |
+-------------------------------------->    |
|              SYN=1, ACK=1, seq=y, ack=x+1 |
|    <--------------------------------------+
| ACK=1, seq=x+1, ack=y+1                   |
+-------------------------------------->    |
|                                           |

(3) TCP 连接释放(四次挥手)

FIN 数据报在不传输数据时也消耗序列号。

C                                           S
| FIN=1, seq=x                              |
+-------------------------------------->    |
|              ACK=1, seq=y, ack=x+1        |
|    <--------------------------------------+
|                                           |
|                                           |
|              FIN=1, ACK=1, seq=z, ack=x+1 |
|    <--------------------------------------+
|              ACK=1, seq=x+1, ack=z+1      |
+-------------------------------------->    |
|                                           x
| (TIME_WAIT wait 2 MSL)
|
x

在第二次与第三次挥手之间,如果服务器没有数据发送,那么可以合并第二次与第三次挥手。

关于序列号的占用,可以简要理解为 SYN 和 FIN 各自都需要占用序列号。

从用户发起 FIN 开始计算,用户端最短释放连接的时间时 1 RTT + 2 MSL。

从用户发起 FIN 开始计算,服务端最短释放连接的时间时 1.5 RTT。

(4) 确认与重传

TCP 使用累计确认。TCP 报文的重传会发生在确认超时和收到冗余 ACK 两种情况下。

TCP 规定收到失序报文后,立即发送 ACK 报文。在这种规定下,假设报文 1, 2 正常 3 丢包 4, 5, 6 正常,则发送方会接收到来自对方的确认号 2, 3, 3, 3, 3,这时发送方自己就能够通过收到了冗余 ACK 报文的情况发现报文 3 丢包的情况。

(5) 流量控制

使用 TCP 报文首部的窗口字段来进行流量控制。

接收方通过窗口字段来告诉发送方自己的接收窗口大小 rwnd

为了防止收到 rwnd = 0 的报文后,不再收到来自对方的报文,从而无法更新发送窗口,因此规定:收到零窗口报文后计时,计时器归零后发送零窗口探测报文,请求对方将更新 rwnd 值通知本方。

(6) 拥塞控制

发送方维护拥塞窗口 cwnd 、拥塞窗口阈值 ssthresh 进行拥塞控制。与流量控制的区别是:拥塞控制效果是针对整个网络而言的,流量控制是针对点对点的连接的,就像堵车和车速的关系。

发送方能发送的数据大小为 min(cwnd, rwnd)

拥塞控制分为 5 个主要部分:

(a) 慢开始:初始时 cwnd = 1,每经过一个传输轮次,cwnd *= 2,直到 cwnd >= ssthresh,然后进入拥塞避免阶段。

(b) 拥塞避免:每经过一个传输轮次,cwnd += 1

(c) 拥塞判断:未能够及时地收到对应的确认。如果是因为超时判定的拥塞,则设置 ssthresh = 1/2 * cwnd,重置 cwnd = 1

(d) 快重传:这是一个前置要求。要求使用立即确认而非捎带确认,这样对方能够及时获得 ACK 信息。

(e) 快恢复:在 (d) 的条件下,如果在超时前(一轮内)收到了 3 个冗余 ACK 报文,则也认为发生了拥塞,但此时的网络拥塞又没有严重到 ACK 报文也无法及时到达,因此使用快恢复的策略,设置 ssthresh = 1/2 * cwnd,重置 cwnd = 1/2 * cwnd。接下来直接进入拥塞避免阶段。

与拥塞控制有关的计算,一个样例:

考虑拥塞控制时,不是有多少数据就能发多少数据,而需要同时受限于传输速率、接收窗口大小、拥塞窗口大小。下面的示例假设接收窗口大小总是足够大。并忽略传输时延。

#1 #2 #3 #4 #5 #6 #7
本传输轮次 cwnd 1 2 4 8 16 17 18
累计发送 MSS 1 3 7 15 31 48 66
时间流逝 1RTT 2RTT 3RTT 4RTT 5RTT 6RTT 7RTT
平均速率 \(\frac{1}{RTT}\) \(\frac{3}{2RTT}\) \(\frac{7}{3RTT}\) \(\frac{15}{4RTT}\) \(\frac{31}{5RTT}\) \(\frac{48}{6RTT}\) \(\frac{66}{7RTT}\)

在每一个传输轮次中,每收到一个 ACK,cwnd += 1。例如,当收到 ack = 4 * MSS + 1 的确认报文时,cwnd = 4 + 1 = 5

第六章 应用层

网络应用模型:C/S 模型、P2P 模型。

DNS

C/S 模型,53 号端口,UDP。

分为递归查询和迭代查询。递归查询是指域名服务器替代请求者进行接下来的查询;迭代查询是指由请求者自己进行接下来的查询。

DNS 服务器分为本地域名服务器、根域名服务器、顶级域名服务器、授权域名服务器。主机首先通过递归查询的方式委托本地域名服务器查询 DNS 信息,然后本地域名服务器采用递归查询或迭代查询的方式,向根域名服务器(管理顶级域名服务器的 IP),然后是顶级域名服务器(管理顶级域名的 IP)、授权域名服务器(管理某个域名下的更低等级的域名,例如 wikipedia.org 下的 zh.wikipedia.org)进行查询。

FTP

C/S 模型,21 号端口(控制连接),20 号端口(数据连接),TCP。

分为主动模式和被动模式,此乃相对服务器 20 号端口而言,服务器 20 号端口主动连接客户端某端口,则为主动模式。

HTTP

面向事务,无状态,C/S 模型,80 号端口,TCP。

非持续连接:1 个网页元素对象对应 1 个 TCP 连接。

持续连接、非流水线:收到用户的响应后,才能发送下一个对象。

持续连接、流水线:不需要等待用户的响应,就可以直接发送下一个对象。

有关发送网页元素对象需要的时延的计算,需要考虑 TCP 的拥塞控制。

电子邮件

sender UA   -> sender server    -> receiver server  -> receiver UA

       SMTP push                                 POP3 pull
SMTP(C) -----> SMTP(S)                     POP3(S) -----> POP3(C)
         TCP    #25 |                       | #110  TCP
                    |       SMTP push       |
                   SMTP(C) ----------> SMTP(S)
                               TCP      #25