计网-TCP可靠传输
TCP(传输控制协议)的可靠传输是通过一系列机制保证数据准确、有序、不丢失地到达接收方。以下是TCP可靠传输的详细过程及核心机制:
1. 数据分块与序列号(Seq)
分块:应用层数据被分割成适合传输的TCP报文段(MSS,通常1460字节)。
序列号(Seq):每个字节都被编号,Seq表示该报文段第一个字节的序号。
例如:发送一个1000字节的数据,若Seq=1,则下一个报文段的Seq=1001。
2. 确认应答(ACK)
ACK机制:接收方收到数据后,必须发送ACK确认报文,告知发送方已成功接收。
ACK号 = 期望收到的下一个字节的序号(即最后一个成功接收的字节序号 +1)。
例如:收到Seq=1、长度=1000的数据,则返回ACK=1001。
累积确认:TCP通常对按序到达的连续数据批量确认(如ACK=1001表示1000及之前的所有字节已接收)。
3. 超时重传(Retransmission)
RTO(Retransmission Timeout):发送方为每个报文段启动定时器,若超时未收到ACK,则重传。
RTO动态计算:基于RTT(往返时间)自适应调整(如Karn算法、Jacobson算法)。
快速重传:如果收到3个重复ACK(如连续收到ACK=1001),说明后续数据可能丢失,立即重传而不等待超时。
4. 滑动窗口(Flow Control)
窗口大小(Window):接收方通过TCP头部的
Window
字段告知可用缓冲区大小,控制发送方的速率(流量控制)。发送方只能发送窗口内未被确认的数据。
窗口动态滑动:随着ACK的到达,窗口向前移动。
5. 顺序控制与重排序
乱序处理:接收方通过Seq号对乱序报文段排序,仅对连续数据返回ACK。
SACK(选择性确认):可选机制,显式告知发送方哪些数据块已接收(解决非连续ACK的问题)。
6. 连接管理与状态维护
三次握手:建立连接时同步初始序列号(ISN),确保双方准备好传输。
过程:SYN → SYN-ACK → ACK。
四次挥手:可靠释放连接,确保数据全部传输完毕。
过程:FIN → ACK → FIN → ACK。
7. 拥塞控制(Congestion Control)
慢启动(Slow Start):窗口从1个MSS开始,按指数增长(每RTT翻倍)。
拥塞避免(AIMD):达到阈值后,窗口线性增长。
快速恢复:发生拥塞时(如丢包),窗口减半并进入线性增长阶段。
可靠传输全过程示例
假设主机A向主机B发送数据:
发送数据:
A发送Seq=1、长度=1000的数据。
B收到后返回ACK=1001,窗口大小=3000。
滑动窗口:
A收到ACK=1001后,窗口向右滑动,继续发送Seq=1001、2001、3001的数据。
丢包处理:
若Seq=2001丢失,B仍返回ACK=1001(重复ACK)。
A收到3个ACK=1001后,快速重传Seq=2001。
拥塞控制:
网络拥塞时,A检测到丢包,将窗口从4000减半至2000,进入拥塞避免阶段。
关键点总结
机制 | 作用 |
---|---|
序列号(Seq) | 标识数据字节顺序,解决乱序问题。 |
确认应答(ACK) | 接收方反馈成功接收的数据范围。 |
超时重传 | 确保丢失数据被重新发送。 |
滑动窗口 | 流量控制,防止接收方缓冲区溢出。 |
拥塞控制 | 动态调整发送速率,避免网络过载。 |
连接管理 | 通过握手/挥手确保传输的可靠启动和关闭。 |
为什么TCP是可靠的?
无丢失:通过ACK和重传保证。
无重复:序列号去重。
无乱序:序列号和滑动窗口排序。
无错误:通过校验和(Checksum)验证数据完整性。