【计算机网络】TCP如何保障传输可靠性_笔记
文章目录
- 一、传输可靠性的6方面保障
- 二、分段机制
- 三、超时重传机制
- 四、流量控制
- 五、拥塞控制
提示:以下是本篇文章正文内容,下面案例可供参考
源网站
按TCP/IP 4层体系,TCP位于传输层,为应用层提供服务
一、传输可靠性的6方面保障
- 基于数据块的传输:待传输的数据被分割成TCP认为合适的数据块(报文段或段),再向下传给网络层
- 基于序号的数据包去重和重排:每个包有一个序列号,通过这个序列号进行排序和去重
- 校验和:保持头部和数据的校验和,防止数据中传输过程中发生变化。基于伪头部+反码计算。
- 超时重传机制:丢包或延迟的情况下重发数据包,直到接收到对方的ACK。重传机制主要有:基于计时器的重传、快速重传、选择性重传SACK和重复选择性重传D-SACK
- 流量控制:利用滑动窗口实现流量控制
- 拥塞控制:当网络拥塞时减少数据发送。TCP在发送数据时主要考虑1.接收方的接收能力;2.网络的拥塞程度。接收能力由滑动窗口表示,量化了接收方的剩余缓冲区的大小;拥塞程度由拥塞窗口表示,量化了发送方认为可以在网络中传输的数据量
三次握手和四次挥手机制也是保障可靠性的基础机制,有这个机制才能有上面的6个方面。
TCP报文头部:
二、分段机制
分段机制是将应用层数据分割成适合网络传输的报文段,分割逻辑是基于Maximum Segment Size(MSS,单个TCP报文段能携带的应用层数据最大长度)和滑动窗口动态调整的。
MSS的典型值:以太网(MTU=1500字节)下,MSS=MTU-IP(20)-TCP(20)=1460字节
MSS的作用:避免IP层分片,减小传输开销和丢包风险;确保报文段能适配路径上的最小MTU,避免在传输的时候被IP协议分片
分段的具体流程如下:
- 应用层程序调用send将数据存入发送缓冲区
- 按MSS分割数据:假设MSS=1460字节,应用层存入数据是3000字节,报文段1=1460字节,seq=1;报文段2=1460字节,seq=1461;报文段3=80字节,seq=2921;
- 给上面的报文段123添加TCP头部(如序列号、ACK号、窗口大小)
- 滑动窗口发送:在窗口内的报文段立即发送,窗口外的存在缓冲区内等待发送
影响分段的动态因素: 路径MTU发现;拥塞窗口;接收窗口;
TCP分段是必要的机制,但是IP层分片则是需要尽可能避免的
三、超时重传机制
超时重传触发条件:发送方发送一个数据段后启动重传计时器RTO Timer,如果在RTO时间内没有收到对应的ACK就重传这个数据段。
重传的关键组件和流程:
- RTO Timer组件:每个已发送但未确认(未收到ACK)的报文段都会关联一个独立的RTO计时器。计时器到期后出发重传,重置计时器并将超时时间设置为上一次RTO的2倍。其中RTO最小在Linux系统里是1秒。
- 动态RTO计算:使用Jacobson/Karels算法,基于往返时间RTT动态调整RTO
常见重传场景:
- 首次超时重传:重传丢失报文段,并重置 RTO 计时器,将超时时间设置为上一次RTO的2倍。
- 快速重传:收到3个重复ACK时,立即重传丢失报文(不用等待RTO超时)
发送方发送 Seq=1,2,3,4,5
接收方收到 Seq=1,3,4,5(Seq=2 丢失)
接收方连续回复 3 个 ACK=2
发送方立即重传 Seq=2 - 选择性重传SACK:通过 SACK 选项明确通知发送方哪些数据已接收,哪些缺失。ACK=5001, SACK=6001-7000 (表示5000之前的数据已收到,但5001-6000丢失,6001-7000已接收)
- 重复选择性重传D-SACK:在 SACK 的基础上,额外携带信息,告知发送方有哪些数据包自己重复接收了
四、流量控制
TCP 利用滑动窗口实现流量控制。流量控制涉及到发送方和接收方的发送缓冲区和接收缓冲区,双方都维护一个发送窗口和接收窗口。
发送窗口: TCP发送窗口可以分成4部分
- 已经发送并且确认的 TCP 段(已经发送并确认);
- 已经发送但是没有确认的 TCP 段(已经发送未确认);
- 未发送但是接收方准备接收的 TCP 段(可以发送);
- 未发送并且接收方也并未准备接受的 TCP 段(不可发送);
TCP 接收窗口可以划分成三个部分:
已经接收并且已经
- 确认的 TCP 段(已经接收并确认);
- 等待接收且允许发送方发送 TCP 段(可以接收未确认);
- 不可接收且不允许发送方发送 TCP 段(不可接收)。
五、拥塞控制
为了进行拥塞控制,TCP 发送方要维持一个 拥塞窗口(cwnd) 的状态变量。拥塞控制窗口的大小取决于网络的拥塞程度,并且动态变化。发送方让自己的发送窗口取为拥塞窗口和接收方的接受窗口中较小的一个。TCP拥塞控制算法有4种:
- 慢开始:主机开始发送数据的时候,通过对cwnd加倍的方法从小到大增大发送窗口
- 拥塞避免:每经过一个往返时间 RTT, 就把发送方的cwnd加1, 让拥塞窗口 cwnd 缓慢增大
- 快重传和快恢复:当发送方连续收到3个重复的ACK时,立即重传丢失的报文段,而不等待RTO到期;在快重传触发后,不立即将cwnd降为1MSS,而是通过半窗恢复策略平滑过渡,避免吞吐量断崖式下降。