基础-tcp如何实现可靠传输


为实现可靠传输,需要考虑数据破坏,丢包,重复以及分片顺序混乱等问题。TCP通过序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠传输。

重传机制

  • 超时重传
    • 发送数据时设定一个定时器,指定时间后没有收到对方ACK,就会触发超时重传。
    • 超时重传RTO应该略大于报文往返RTT的值。
    • 如果超时重发的数据再次超时,又需要重传,TCP的策略是超时时间加倍。
  • 快速重传
    • 不以时间为驱动,以数据为驱动。
    • 当收到3个相同的ACK报文是,会在定时器过期之前,重传丢失的报文段。
    • 解决了超时时间问题,但是不知道重传时需要重传一个还是重传所有。
  • ASCK
    • 选择性确认。在TCP头部字段里加一个SACK,将已收到的数据信息发送个发送方,这样发送方就可以知道哪些数据没收到,进而重发。
  • Duplicate SACK
    • 使用SACK告诉发送方有哪些数据被重复接收

滑动窗口

  • 引入窗口概念的原因
    • 一收一发传输方式有缺点,数据包往返时间越长,通信效率越低。

引入窗口后,即使在往返时间较长的情况下,也不会降低网络通信的效率。窗口大小,指的是无需确认应答,而可以继续发送数据的最大值。发送方机器在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。

  • 窗口大小有哪一方决定
    • 接收方,发送方发送的数据大小不能超过接收方的窗口大小,否则接收方无法正常接收大奥数据。

流量控制

发送方不能无脑的发送数据给接收方,要考虑接收方的处理能力。如果一直无脑发送给对方,但对方处理不过来,那么就会触发重传,从而导致网络流量无端浪费。

拥塞控制

只要发送方没有在规定时间内接受到ACK报文,也就是发生了超市重传,就会认为网络出现了拥塞。

  • 慢启动
    • 指数性增长
    • 慢启动门限前使用慢启动算法,门限后使用拥塞避免算法
  • 拥塞避免
    • 线性增长
  • 拥塞发生
    • 超时重传:门限设为cwnd/2,cwnd重置为1。激进,会造成网络卡顿
    • 快速重传:cwnd=cwnd/2,门限=cwnd
  • 快速恢复

  目录