TCP/IP总结(二)

TCP是如何保证可靠传输的

为了保证可靠传输,TCP比UDP多了很多控制协议和算法。

  • 连接管理——3次握手和4次握手
  • 数据破坏——通过校验和
  • 丢包——应答与超时重发机制
  • 分片乱序——***
  • 窗口滑动——提高发送效率,对发送端和接收端流量进行控制
  • 加快通信速度——快速重发,三次收到重发消息进行重发
  • 流控制——避免网络流量浪费
  • 拥塞控制——慢启动算法,拥塞窗口

TCP的重传机制

TCP是可靠的传输协议,意味着必须按序,无差错的传送数据和目的端。通过校验和,确认应答,重传来保证。校验和应答已经介绍过,这里主要讲解重传机制。重传分为两种:超时重传和快速重传。

  1. 超时重传:数据丢失,当定时器超时时,将重传具有最小序号但仍未应答的报文段,并将超时间隔设为先前的两倍。当收到上层应用的数据和收到ACK时,超时时间将重新计算。
  2. 快速重传:当发送方接受到3个冗余ACK时,执行重传。
    冗余ACK:当接受方接受到比期望序号大的失序报文段到达,检测出间隔时,立即发送冗余ACK,指示下一个期待字节的序号(其为间隔的低端的序号)。
    TCP/IP总结(二)

经受时延的确认应答

当一个期望的序号报文到达,延时等待一段时间,如果在这段时间内有新的期望的序号报文到达,则立即发送单个累计ACK,以确认两个按序报文段。如果超时,则发送一个ACK。

Nagle算法

TCP是基于流的传输协议,在Rlogin和Telnet传输中会出现只有一个字节数据的TCP数据包。而一个TCP数据包的首部加上IP首部就有40个字节,很显然发这样的数据包划不来。为了减少这样的数据包,有人提出了Nagle算法。

Nagle算法简单讲就是,等待服务器应答包到达后,再发送下一个数据包。数据在发送端被缓存,如果缓存到达指定大小就将其发送,或者上一个数据的应答包到达,将缓存区一次性全部发送。

Nagle算法是从发送端角度考虑减少了数据包的个数,时延应答从接收端角度考虑减少了数据包的个数。

滑动窗口(流量控制)

1)TCP滑动窗口分为接受窗口,发送窗口
滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的窗口大小,从而控制发送方的发送速度,从而达到防止发送方发送速度过快而导致自己被淹没的目的。
对ACK的再认识,ack通常被理解为收到数据后给出的一个确认ACK,ACK包含两个非常重要的信息:

  • 一是期望接收到的下一字节的序号n,该n代表接收方已经接收到了前n-1字节数据,此时如果接收方收到第n+1字节数据而不是第n字节数据,接收方是不会发送序号为n+2的ACK的。举个例子,假如接收端收到1-1024字节,它会发送一个确认号为1025的ACK,但是接下来收到的是2049-3072,它是不会发送确认号为3072的ACK,而依旧发送1025的ACK。
  • 二是当前的窗口大小m,如此发送方在接收到ACK包含的这两个数据后就可以计算出还可以发送多少字节的数据给对方,假定当前发送方已发送到第x字节,则可以发送的字节数就是y=m-(x-n).

这就是滑动窗口控制流量的基本原理

重点:发送方根据收到ACK当中的期望收到的下一个字节的序号n以及窗口m,还有当前已经发送的字节序号x,算出还可以发送的字节数。

1)对于TCP会话的发送方,任何时候在其发送缓存内的数据都可以分为4类,“已经发送并得到对端ACK的”,“已经发送但还未收到对端ACK的”,“未发送但对端允许发送的”,“未发送且对端不允许发送”。“已经发送但还未收到对端ACK的”和“未发送但对端允许发送的”这两部分数据称之为发送窗口。
TCP/IP总结(二)
当收到接收方新的ACK对于发送窗口中后续字节的确认是,窗口滑动,滑动原理如下图。
TCP/IP总结(二)
当收到ACK=36时窗口滑动。2)对于TCP的接收方,在某一时刻在它的接收缓存内存在3种。“已接收”,“未接收准备接收”,“未接收并未准备接收”(由于ACK直接由TCP协议栈回复,默认无应用延迟,不存在“已接收未回复ACK”)。其中“未接收准备接收”称之为接收窗口。

发送窗口与接收窗口关系

TCP是双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。其中各自的“接收窗口”大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。各自的“发送窗口”则要求取决于对端通告的“接收窗口”,要求相同。
TCP/IP总结(二)

滑动窗口实现面向流的可靠性

  1. 最基本的传输可靠性来源于“确认重传”机制。
  2. TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。
  3. 发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。
  4. 接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。

拥塞控制