探秘TCP可靠传输(2)

87 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

今天接着给大家分享TCP可靠传输的那些事,上一篇中,已经说明了检验和以及序号,本文中接着给大家应答,流量控制,定时器和拥塞控制。

  1. 确认应答

在TCP传输中,当每一次接收方收到数据后,会给接收方一个确认应答数包,每次接收方收到数据后,都会对传输方进行确认应答。但网络上会出现各种各样的情况,如下图所示,从这张图中可以出来,有些数据接收方没有收到数据,因此没有ACK,有些是接收方收到数据,但是ACK丢失,有些是超时(这个后面定时器会说该情况)

1839734150.jpg

在TCP数据结构中,有一个ACK字段,当这个字段是1时,有效,且只有在ACK有效,我们前面说的那个确认序号字段才有效.否则无效确认序号无效。

在此处需要说明下,实际的情况要比图中的情况更为复杂,不是发送一组数据包,等待ACK后才会发送下一包的,感兴趣的,可以自行查看一下流水线技术,滑动窗口,回退N步,选择重传等方面的问题。

说到这大家可能已经明白了,TCP是如何做到有序传送的,这个就是通过序号和ACK来达到的,有这个序号,接收方就知道了保温段的顺序,通过ACK方式,发送方知道哪些数据需要重发,如上图c中重传了pkt1(图中标注有点小出入,可以看文字描述是pkt1),图b中重传了pkt1,图d中重传了pkt1。

上图中没有体现否定确认(NAK),NAK和ACK正好相反,是用来告诉发送方某一个分组未被正确接收到,同时否定确认报文通常会携带着没有被正确接收到的分组的序号。