TCP如何保证“可靠性”(看这一篇就够了~~~)

别说谁变了你拦得住时间么 提交于 2020-03-03 08:14:18

1.校验和机制

TCP检验和的计算与UDP一样,检验范围包括TCP首部及数据部分,但是UDP的检验和字段为可选的,而TCP中是必须有的。计算方法为:在发送方将整个报文
段分为多个16位的段,然后将所有段进行反码相加,将结果存放在检验和字段中,接收方用相同的方法进行计算,如最终结果为检验字段所有位是全1则正确(UDP中为0是正确),否则存在错误。

2.确认应答与序列号

TCP将每个字节的数据都进行了编号,这就是序列号。

序列号的作用:
a、保证可靠性(当接收到的数据少了某个号的数据时,能马上知道)
b、保证数据的按序到达
c、提高效率,可实现多次发送,一次确认
d、去除重复数据
数据传输过程中的确认应答处理、重发控制以及重复控制等功能都可以通过序列号来实现。

TCP通过确认应答机制实现可靠的数据传输。在TCP的首部中有一个标志位——ACK,此标志位表示确认号是否有效。接收方对于按序到达的数据会进行确认,当标志位ACK=1时,确认字段有效。进行确认时,确认字段值表示这个值之前的数据都已经按序到达了。而发送方如果收到了已发送的数据的确认报文,则继续传输下一部分数据;而如果等待了一定时间还没有收到确认报文就会启动重传机制。

3. 超时重传

当报文发出后在一定的时间内未收到接收方的确认,发送方就会进行重传(通常是在发出报文段后设定一个闹钟,到点了还没有收到应答则进行重传)。
一种情况是发送包丢失了,其基本过程如下:
在这里插入图片描述

另一种情况是ACK 丢失,过程如下:
在这里插入图片描述
当接收方接收到重复的数据时就将其丢掉,重新发送ACK。而要识别出重复的数据,前面提到的序列号就起作用了。

4.连接管理

连接管理机制即TCP建立连接时的三次握手和断开连接时的四次挥手。(在下一篇博文中将详细讲述TCP的三次握手和四次挥手机制)。

5. 流量控制

接收端处理数据的速度是有限的,如果发送方发送数据的速度过快或发送量过大,导致接收端的缓冲区已经满,这时发送方继续发送报文,就会造成丢包,继而引起丢包重传等一系列连锁反应。

因此TCP支持根据接收端的处理能力,来决定发送端的发送速度和发送量,这个机制叫做流量控制。

在TCP报文段首部中有一个16位窗口长度,当接收端接收到发送方的数据后,在应答报文ACK中就将自身缓冲区的剩余大小,放入16为窗口中。这个大小随数据传输情况而变,窗口越大,网络吞吐量越高,而一旦接收方发现自身的缓冲区快满了,就将窗口设置为更小的值通知发送方。如果缓冲区满,就将窗口置为0,发送方收到后就不再发送数据,但是需要定期发送一个窗口探测数据段,使接随时更改窗口大小,并把接收端窗口大小告诉发送端。

在这里插入图片描述

注意:窗口大小不受16位窗口大小限制,在TCP首部40字节 选项中 还包含一个窗口扩大因子M,实际窗口大小是窗口字段的值左移M位。

6. 拥塞控制

流量控制解决了两台主机之间因传送速率过快或发送量过大而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。

然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。

为此TCP引入了慢启动机制,先发出少量数据,就像探路一样,先摸清当前的网络拥堵状态后,再决定按照 多大的速度和发送量 来传送数据。

此处引入一个拥塞窗口:
发送开始时定义拥塞窗口大小为1;每次收到一个ACK应答,拥塞窗口加1;而在每次发送数据时,发送量取 拥塞窗口与接收端接收窗口 的最小者。

慢启动:在启动初期以指数增长方式增长;设置一个慢启动的阈值,当以指数增长达到阈值时就停止指数增长,按照线性增长方式增加;线性增长达到网络拥塞时立即“乘法减小”,拥塞窗口置回1,进行新一轮的“慢启动”,同时新一轮的阈值变为原来的一半。

“慢启动”机制可用图表示:
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!