计算机网络杂记-10

运输层

运输层的主要任务是为应用层提供端到端的通信服务,运输层的协议有 TCP 和 UDP,TCP 提供面向连接的可靠的数据传输服务,UDP 提供无连接的不可靠的数据传输服务。

UDP (User Datagram Protocol) 是无连接的,不可靠的数据传输服务,UDP 不提供可靠的数据传输服务,UDP 不提供拥塞控制,UDP 不提供流量控制,UDP 不提供差错恢复。

TCP (Transmission Control Protocol) 是面向连接的,可靠的数据传输服务,TCP 提供可靠的数据传输服务,TCP 提供拥塞控制,TCP 提供流量控制,TCP 提供差错恢复。

物理层、数据链路层、网络层共同完成了主机之间的通信,但实际上主机之间的通信是进程之间的通信,运输层的主要任务就是为进程之间的通信提供端到端的通信服务。

运输层向高层用户屏蔽了下层通信的细节,运输层向高层用户提供的是逻辑通信,而不是物理通信,运输层的逻辑通信是端到端的逻辑通信,而不是主机到主机的逻辑通信。

端口号、复用与分用

端口号是一个 16 位的无符号整数,端口号的范围是 0~65535,端口号的范围是 0~1023 的端口号是保留端口号,1024~49151 的端口号是注册端口号,49152~65535 的端口号是动态端口号。

端口号只具有本地意义,端口号只在本地主机中具有唯一性,不同主机中的端口号可以相同,在因特网中,不同计算机中的端口号是没有联系的。


复用是指多个应用层进程可以使用同一个运输层协议,分用是指运输层协议可以将收到的分组交付到正确的应用层进程。

在发送方中:

使用 UDP 协议封装的数据报是 UDP 复用,协议号为 17,使用 TCP 协议封装的数据报是 TCP 复用,协议号为 6。

IP 复用是指多个应用层进程可以使用同一个 IP 地址,IP 分用是指 IP 协议可以将收到的数据报交付到正确的主机。

在接接收方中:

使用 UDP 协议封装的数据报是 UDP 分用,使用 TCP 协议封装的数据报是 TCP 分用。

常用的端口号

UDP 协议使用的端口号:

端口号服务
520RIP (路由信息协议)
161SNMP (简单网络管理协议)
69TFTP (简单文件传输协议)
53DNS (域名系统)
67/68DHCP (动态主机配置协议)

TCP 协议使用的端口号:

端口号服务
80HTTP (超文本传输协议)
25SMTP (简单邮件传输协议)
21/20FTP (文件传输协议)
179BGP (边界网关协议)
443HTTPS (安全超文本传输协议)

UDP 与 TCP 的对比

UDPTCP
无连接面向连接
不可靠可靠
不提供拥塞控制提供拥塞控制
不提供流量控制提供流量控制
不提供差错恢复提供差错恢复
适用于实时应用适用于可靠传输的应用
支持一对一、一对多、多对一、多对多的通信只支持一对一的通信
首部开销小首部开销大

TCP 流量控制

一般,我们希望数据传输的速度尽可能的快,但是如果发送方的发送速度过快,接收方的接收速度跟不上,那么接收方的缓冲区就会溢出,这就是流量控制的问题。

TCP 通过滑动窗口机制来解决流量控制的问题,滑动窗口是接收方告诉发送方自己的缓冲区还有多少空间,发送方根据接收方的滑动窗口大小来发送数据。

TCP 拥塞控制

拥塞控制是指当网络中的数据包过多时,网络的性能就会下降,这就是拥塞控制的问题。

TCP 通过拥塞窗口来解决拥塞控制的问题,拥塞窗口是发送方告诉接收方网络的拥塞程度,接收方根据发送方的拥塞窗口大小来接收数据。

有4种算法可以用来解决拥塞控制的问题:

  • 慢开始算法

  • 拥塞避免算法

  • 快重传算法

  • 快恢复算法

一般,第一种算法与第二种算法结合使用,第三种算法与第四种算法结合使用。

我们创造一个理想环境

  1. 数据单向传输,另一方只传送确认

  2. 接收方有足够大的缓冲区,而发送方发送窗口大小由网络拥塞程度决定

  3. 以 TCP 最大报文段长度 MSS 个数为单位计算

慢开始算法

慢开始算法是指发送方在开始发送数据时,先将拥塞窗口的大小设置为 1,然后每经过一个往返时间 RTT 就将拥塞窗口的大小加倍,直到拥塞窗口的大小达到一个阈值,然后进入拥塞避免算法。

拥塞避免算法

拥塞避免算法是指发送方在拥塞窗口的大小达到一个阈值之后,每经过一个往返时间 RTT 就将拥塞窗口的大小加 1,直到拥塞窗口的大小达到一个阈值,然后进入快重传算法。

快重传算法

快重传算法是指接收方在接收到一个失序的数据包时,就立即发送一个重复确认,发送方在接收到 3 个重复确认时就立即重传丢失的数据包。

快恢复算法

快恢复算法是指发送方在接收到 3 个重复确认时,就将拥塞窗口的大小减半,然后进入拥塞避免算法。

TCP 超时重传的时间选择

超时重传是TCP协议中的一个重要机制,当发送方发送数据后,如果在一个往返时间 RTT 内没有收到接收方的确认,那么发送方就会重传数据。

RFC 6298 中提出了一个计算超时重传时间的算法:

RTO = RTT + 4 * RTTVar

RTT 是一个往返时间,RTTVar 是一个往返时间的方差,RTO 是一个超时重传时间。

RTT 的计算公式如下:

RTT = (1 - α) * RTT + α * SampleRTT

RTTVar 的计算公式如下:

RTTVar = (1 - β) * RTTVar + β * |SampleRTT - RTT|

α 和 β 是两个参数,一般取值为 0.125。


出现超时重传时无法准确计算 RTT 的问题,Karn 算法是解决这个问题的一个方法,在计算加权平均 RTT 时,只要报文段重传了,就不计算这个报文段的 RTT。也就是说,出现重传时,不计算 RTT。而超时重传时间RTO也不会被更新。

但是这样引发了新的问题:如果报文段的时延突然增大了许多,并且长时间不变,那么这个时延就会被忽略,在原来的重传时间内,不会收到确认,导致重传。重传时间无法更新,导致报文段反复重传。

所以要对 Karn 算法进行改进,当报文段重传时,把超时重传时间RTO增大一些,经典的做法是将 RTO 增大一倍。