Transport Layer: 考虑怎样在网络进程间提供可靠的数据传输服务
拥塞控制
Lecture 3
Congestion control
当数据在网络中传输时,如果太多数据同时被发送,网络节点的处理能力可能会被超出,导致延迟增加、数据包丢失等问题 → 网络拥塞
复用
UDP
User Datagram Protocol
- 无连接:没有连接建立过程和拥塞控制机制,用于需要快速传输数据的场景,如视频流、在线游戏等,减少了建立和维护连接的开销。
- 不可靠:不保证数据包的顺序、完整性或可靠传输。丢失的数据包不会被重新发送。
TCP
Transmission Control Protocol
- 面向连接:在数据传输之前,TCP 需要在发送方和接收方之间建立一个连接
- 数据可靠性:若某个阶段莫名中断,TCP 会以相同的顺序发送相同的数据包
- 全双工通信:允许数据同时双向传输
依赖于 IP 协议。TCP/IP 协议是互联网通信的基础协议套件,其中 TCP 用于可靠的数据传输,而 IP 用于数据包的路由和寻址。
三次握手
连接建立过程
Connection-oriented: three-way handshaking → 发送了三包数据
- 客户端首先发送一个带 SYN 标志的数据包给服务器
- 服务器收到后回传一个带 SYN/ACK 标志的数据包以示传达确认信息
- 客户端收到后,再回传一个带 ACK 标志的数据包给服务器,表示建立连接完毕
为什么不能握两次?
一句话概括:防止已失效的请求报文,突然又传到服务器而报错(考虑丢包问题)
网络信道不可靠的情况下,第一个 SYN 包因某种原因在网络中滞留,那么客户端就会重新补发一个 SYN 包。假设服务端已经接收确认了,但可能过了一会,原先的 SYN 包又恢复了传输,服务端会以为客户端又发起了一个新的连接,造成了状态不一致。
如果在三次握手的情况下,服务端没有收到 ACK,自然不会认为连接建立成功。
四次挥手
连接断开过程
- 一个数据包可能被拆为多包发送,要如何处理丢包问题?
- 不同小数据包可能到达的顺序不同,要如何处理乱序问题?
- 客户端发送一个 FIN(Finish)报文,表示它不再有数据要发送给对方(但仍可以接收数据)。
- 服务器收到 FIN 后,发送一个 ACK 报文来确认接收到 FIN(但还未准备好关闭,可能还有数据要发送)。
- 服务器准备好关闭连接后,发送 FIN,表示它不再有数据要发送。
- 客户端收到 FIN 后,发送 ACK 给被动关闭方,完成连接的关闭。
在 TCP 连接断开过程中,经历了 状态。它指在连接断开后,处于等待一段时间的状态。这个等待时间是为了确保在网络中所有的报文都已经传输完成。
- 该状态的持续时间通常为 2 倍的 MSL(Maximum Segment Lifetime,报文最大生存时间),MSL 是一个 TCP 报文在网络中最长的存活时间。
出现过多的 可能是由以下几个原因引起的:
- 网络延迟或不稳定
- 大量的短连接,导致大量连接堆积,消耗系统资源。
- 端口耗尽,导致连接无法及时关闭,进而增加 TIME_WAIT 状态的数量。
为了避免过多的 状态,可以采取以下措施:
- 调整操作系统的参数,减少 状态的持续时间。
- 使用连接池等技术,复用连接,减少连接的建立和断开次数。
为什么不能挥三次?五次?
- 第四次挥手是为了确保双方都完成了数据的传输。(Why: TCP 挥手次数比握手多?)
- 四次挥手已经足够满足双方都能够安全地关闭连接并释放资源的需求,采用更多的步骤会引入不必要的复杂性和延迟。
其它
除了以上两种手段,TCP 还可以怎么保证它的可靠性?
拥塞控制
用来防止网络拥塞,确保网络资源的有效利用,避免出现严重的网络性能下降。
→ 常见算法
- 超时重传:如果发送方在设定的超时时间内没有收到 ACK,就会自动重传数据包。
- 快速重传:当接收方收到失序的数据包时,会立即发送重复的 ACK(即 ACK 序列号不变)。如果发送方连续收到三个相同的 ACK,说明有一个数据包可能丢失,发送方会立即重传该数据包,而不需要等待超时。
- 在 TCP 中,每个数据包都有一个序列号 (Sequence Number),它标识了数据在整个数据流中的位置。接收方按照序列号的顺序来接收和组装数据。如果接收方收到了一个高序列号的数据包,而低序列号的数据包没有到达,这种情况就被认为是失序。
流量控制
→ 常见算法
滑动窗口的大小决定了发送方可以发送而不需要等待确认的数据量。窗口大小可以动态调整,以适应网络状况。
- 发送窗口只有收到发送窗口内字节的 ACK 确认,才会移动发送窗口的左边界。
- 接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。
- 当窗口大小变化时,TCP 会通过报文头中的「窗口大小字段 (Window Size Field) 」来通知对方。接收方根据该字段决定允许的最大接收数据量,从而调整自己的发送策略。