当前位置:网站首页>TCP协议如何确保可靠传输

TCP协议如何确保可靠传输

2020-11-08 09:45:17 osc_7vovprrl

关于“tcp协议如何确保可靠传输”这个问题,网上的资料参差不齐。近期开始在图书馆读一些教材,带着问题读了以下书目的关于TCP的章节,总结记录了下来。

  • 德国波茨坦大学《internetworking Technische Grundlagen und Anwendungen》/《网络技术基础与应用》(christoph meinel,harald sack)
  • 《深入理解计算机网络》(王达)
  • 《计算机网络教程自顶向下的方法》(Behrouz A.Forouzan Firouz Mosharraf)
  • 《计算机网络》(张曾科、阳宪惠)
  • 《计算机网络》第7版(谢希仁)

为什么TCP需要可靠传输呢

  • 网络层是不可靠。网络层的任务仅仅是选择合适的网间路由和交换结点, 确保数据及时传送。
  • 传输层性质所致,上层需要可靠性。因而传输层的主要任务是根据通信子网的特性最佳的利用网络资源,并以可靠和经济的方式,为会话层之间,提供建立、维护和取消传输连接的功能,负责可靠地传输数据。
  • UDP通过牺牲可靠性,换取尽力交付、通信效率高、确保数据的实时性的特点。自然需要TCP的出现,来对使用需求互补完善

因而以上3点,可靠传输的重担交予到了TCP之上。

 

TCP怎么做到可靠传输呢

为了实现可靠传输的目的,TCP使用4个解决方案:面向连接的传输机制、超时重传控制、可变滑动窗口流量控制、 拥塞控制。

 

面向连接的传输机制

使用了三次握手、四次挥手,这个比较常见,大家一般都熟悉了,就不冗余赘述了。

校验和,确认应答(ACK),序列号。

并对重复无效的ACK进行处理,收下后并丢弃,实现自动重传请求。

 

超时重传控制

当报文发出后在一定的时间内未收到接收方的确认,发送方就会进行重传。每发送一个分组,就设置一个超时重传计时器,当收到对方返回的ack,就撤销已设置的超时计时器。为实现这一步,有三个注意点:

  • 发送后保留副本,以备重传时使用,收到对方返回的ack后,才清除副本。
  • 编号。
  • 超时重传计时器的时间设置适考虑时延、拥塞的等不确定因素,因而重传时间设置会比数据分组的平均往返时间更长一些。

 

可变滑动窗口流量控制

窗口分为发送窗口和接收窗口。简单而言,接收方把能接受的数据大小(接受窗口大小),通过ACK反馈予发送方,从而设置协调发送内容大小。细节有以下几点:

  • 当发送数据超出接收方窗口大小时,超出部分重传; 
  • 当发送数据小于接收方窗口大小时,发送方继续发送内容;
  • 并不是对每一个报文段都有ACK的回复,可能时一至多个报文段,发送一个ACK;
  • 当收到的报文段个数缺失,收到的报文段会存入缓存,等待发送方重传缺失的报文段;合并完整,再返回ACK;如果长时未收到缺失的报文段,则缓存中的报文段会被一并清空。

 

 拥塞控制

拥赛控制的算法有四种:慢开始、拥塞避免、快重传和快恢复。

  • 慢开始:由小到大逐步增加拥塞窗口数值。

       拥塞窗口初始值 = 1至两个发送方最大报文段的数值;

       拥塞窗口每次增加量 = min(新收到确认报文的字节数,发送方最大报文段的数值)。

  • 拥塞避免:让拥塞窗口换慢增大。

      每经过一个RTT就滑动窗口大小就只加1;

  • 快重传:接收方收到的数据后立即确认,一个数据包回一个确认ACK, 以实现尽早知道当中个别报文的丢失。

      例如,当发送过程中M3数据包丢失,接收方只收到了M2与M4数据包时,接收方连续返回3个M2的ACK予发送方(提示发送方漏了M3小兄弟);

      发送方收到3个连续的M2的ACK后,立即重传M3数据包。

  • 快恢复:遇到网络拥塞后,立马减小拥塞窗口。

      设置一个ssthresh作为使用拥塞避免算法的起始点,通过这个ssthresh值为滑动窗口最大门限值的一半。

 

理解以上四个算法思路,看下面这个图就轻而易举了:

 

总结:TCP因为位于传输层,承上启下,解决下层网络层的不可靠问题,为会话层提供提供可靠连接;并实现对UDP使用的互为补充。

TCP可靠性主要通过面向连接的传输机制、超时重传控制、可变滑动窗口流量控制、 拥塞控制实现。

 

版权声明
本文为[osc_7vovprrl]所创,转载请带上原文链接,感谢
https://my.oschina.net/u/4342884/blog/4707936