![b0e71656c3bdc541cc4ec07ffb17d977.gif](https://i-blog.csdnimg.cn/blog_migrate/4514efa48ecd3804b650d458b58fb5eb.gif)
![d632523907f28767e1cf1db9aff80eb4.png](https://i-blog.csdnimg.cn/blog_migrate/426a2a2f94d818c85ed3bfe55d39563b.png)
慢启动和ACK
服务器发送数据包,当然越快越好,最好一次性全发出去。但是,发得太快,就有可能丢包。带宽小、路由器过热、缓存溢出等许多因素都会导致丢包。线路不好的话,发得越快,丢得越多。
最理想的状态是,在线路允许的情况下,达到最高速率。但是我们怎么知道,对方线路的理想速率是多少呢?答案就是慢慢试。
TCP 协议为了做到效率与可靠性的统一,设计了一个慢启动(slow start)机制。开始的时候,发送得较慢,然后根据丢包的情况,调整速率:如果不丢包,就加快发送速度;如果丢包,就降低发送速度。
Linux 内核里面设定了(常量TCP_INIT_CWND),刚开始通信的时候,发送方一次性发送10个数据包,即"发送窗口"的大小为10。然后停下来,等待接收方的确认,再继续发送。
默认情况下,接收方每收到两个 TCP 数据包,就要发送一个确认消息。"确认"的英语是 acknowledgement,所以这个确认消息就简称 ACK。
ACK 携带两个信息。
期待要收到下一个数据包的编号。
接收方的接收窗口的剩余容量。
发送方有了这两个信息,再加上自己已经发出的数据包的最新编号,就会推测出接收方大概的接收速度,从而降低或增加发送速率。这被称为"发送窗口",这个窗口的大小是可变的。
![2d66c5bcd58d755948f89ee28667ce48.png](https://i-blog.csdnimg.cn/blog_migrate/b57b049e46976561ae84d9ab7a6c6425.png)
(图片说明:每个 ACK 都带有下一个数据包的编号,以及接收窗口的剩余容量。双方都会发送 ACK。)
注意,由于 TCP 通信是双向的,所以双方都需要发送 ACK。两方的窗口大小,很可能是不一样的。而且 ACK 只是很简单的几个字段,通常与数据合并在一个数据包里面发送。
![7d31182c5a1f42df1888fb15549db3cf.png](https://i-blog.csdnimg.cn/blog_migrate/25f572f28b1a20a8377f02895275ac18.jpeg)
(图片说明:上图一共4次通信。第一次通信,A 主机发给B 主机的数据包编号是1,长度是100字节,因此第二次通信 B 主机的 ACK 编号是 1 + 100 = 101,第三次通信 A 主机的数据包编号也是 101。同理,第二次通信 B 主机发给 A 主机的数据包编号是1,长度是200字节,因此第三次通信 A 主机的 ACK 是201,第四次通信 B 主机的数据包编号也是201。)
即使对于带宽很大、线路很好的连接,TCP 也总是从10个数据包开始慢慢试,过了一段时间以后,才达到最高的传输速率。这就是 TCP 的慢启动。
![d632523907f28767e1cf1db9aff80eb4.png](https://i-blog.csdnimg.cn/blog_migrate/426a2a2f94d818c85ed3bfe55d39563b.png)
数据包的遗失处理
TCP 协议可以保证数据通信的完整性,这是怎么做到的?
前面说过,每一个数据包都带有下一个数据包的编号。如果下一个数据包没有收到,那么 ACK 的编号就不会发生变化。
举例来说,现在收到了4号包,但是没有收到5号包。ACK 就会记录,期待收到5号包。过了一段时间,5号包收到了,那么下一轮 ACK 会更新编号。如果5号包还是没收到,但是收到了6号包或7号包,那么 ACK 里面的编号不会变化,总是显示5号包。这会导致大量重复内容的 ACK。
如果发送方发现收到三个连续的重复 ACK,或者超时了还没有收到任何 ACK,就会确认丢包,即5号包遗失了,从而再次发送这个包。通过这种机制,TCP 保证了不会有数据包丢失。
![bbd9f938d4fb478fc01f3fe423700d4a.png](https://i-blog.csdnimg.cn/blog_migrate/fb92f9760f3b596cea015857f4049ba6.png)
(图片说明:Host B 没有收到100号数据包,会连续发出相同的 ACK,触发 Host A 重发100号数据包。)
文章来源于网络,如有侵权联系删除。
![fc62387086719efd4b4bb4db6ff9c944.png](https://i-blog.csdnimg.cn/blog_migrate/7a59efeab181088a62bfc5bb2a17bd28.png)