计算机网络杂记-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 协议使用的端口号:
| 端口号 | 服务 |
|---|---|
| 520 | RIP (路由信息协议) |
| 161 | SNMP (简单网络管理协议) |
| 69 | TFTP (简单文件传输协议) |
| 53 | DNS (域名系统) |
| 67/68 | DHCP (动态主机配置协议) |
TCP 协议使用的端口号:
| 端口号 | 服务 |
|---|---|
| 80 | HTTP (超文本传输协议) |
| 25 | SMTP (简单邮件传输协议) |
| 21/20 | FTP (文件传输协议) |
| 179 | BGP (边界网关协议) |
| 443 | HTTPS (安全超文本传输协议) |
UDP 与 TCP 的对比
| UDP | TCP |
|---|---|
| 无连接 | 面向连接 |
| 不可靠 | 可靠 |
| 不提供拥塞控制 | 提供拥塞控制 |
| 不提供流量控制 | 提供流量控制 |
| 不提供差错恢复 | 提供差错恢复 |
| 适用于实时应用 | 适用于可靠传输的应用 |
| 支持一对一、一对多、多对一、多对多的通信 | 只支持一对一的通信 |
| 首部开销小 | 首部开销大 |
TCP 流量控制
一般,我们希望数据传输的速度尽可能的快,但是如果发送方的发送速度过快,接收方的接收速度跟不上,那么接收方的缓冲区就会溢出,这就是流量控制的问题。
TCP 通过滑动窗口机制来解决流量控制的问题,滑动窗口是接收方告诉发送方自己的缓冲区还有多少空间,发送方根据接收方的滑动窗口大小来发送数据。
TCP 拥塞控制
拥塞控制是指当网络中的数据包过多时,网络的性能就会下降,这就是拥塞控制的问题。
TCP 通过拥塞窗口来解决拥塞控制的问题,拥塞窗口是发送方告诉接收方网络的拥塞程度,接收方根据发送方的拥塞窗口大小来接收数据。
有4种算法可以用来解决拥塞控制的问题:
慢开始算法
拥塞避免算法
快重传算法
快恢复算法
一般,第一种算法与第二种算法结合使用,第三种算法与第四种算法结合使用。
我们创造一个理想环境
数据单向传输,另一方只传送确认
接收方有足够大的缓冲区,而发送方发送窗口大小由网络拥塞程度决定
以 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 增大一倍。