TCP保证可靠性主要依靠下面7种机制:
1、检验和
TCP检验和的计算与UDP一样,在计算时要加上12byte的伪首部,检验范围包括TCP首部及数据部分,但是UDP的检验和字段为可选的,而TCP中是必须有的。计算方法为:在发送方将整个报文段分为多个16位的段,然后将所有段进行反码相加,将结果存放在检验和字段中,接收方用相同的方法进行计算,如最终结果为检验字段所有位是全1则正确(UDP中为0是正确),否则存在错误。
2、序列号
TCP将每个字节的数据都进行了编号,这就是序列号。
序列号的作用:
- 保证可靠性(当接收到的数据总少了某个序号的数据时,能马上知道)
- 保证数据的按序到达
- 提高效率,可实现多次发送,一次确认
- 去除重复数据数据传输过程中的确认应答处理、重发控制以及重复控制等功能都可以通过序列号来实现
3、确认应答机制(ACK)
TCP通过确认应答机制实现可靠的数据传输。在TCP的首部中有一个标志位——ACK,此标志位表示确认号是否有效。接收方对于按序到达的数据会进行确认,当标志位ACK=1时确认首部的确认字段有效。进行确认时,确认字段值表示这个值之前的数据都已经按序到达了。而发送方如果收到了已发送的数据的确认报文,则继续传输下一部分数据;而如果等待了一定时间还没有收到确认报文就会启动重传机制。
正常情况下的应答机制:
4、超时重传机制
当报文发出后在一定的时间内未收到接收方的确认,发送方就会进行重传(通常是在发出报文段后设定一个闹钟,到点了还没有收到应答则进行重传),其基本过程如下:
当然,未收到确认不一定就是发送的数据包丢了,还可能是确认的ACK丢了:
当接收方接收到重复的数据时就将其丢掉,重新发送ACK。而要识别出重复的数据,就要用到前面提到的序列号了,利用序列号很容易就可以做到去重的效果。
重传时间的确定:报文段发出到收到应答中间有一个报文段的往返时间RTT,显然超时重传时间RTO会略大于这个RTT,TCP会根据网络情况动态的计算RTT,即RTO是不断变化的。在Linux中,超时以500ms为单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。其规律为:如果重发一次仍得不到应答,就等待2*500ms后再进行重传,如果仍然得不到应答就等待4*500ms后重传,依次类推,以指数形式递增,重传次数累计到一定次数后,TCP认为网络或对端主机出现异常,就会强行关闭连接。
5、连接管理机制
连接管理机制即TCP建立连接时的三次握手和断开连接时的四次挥手。
5、连接管理机制
连接管理机制即TCP建立连接时的三次握手和断开连接时的四次挥手。
首先三次握手:
重传时间的确定:报文段发出到收到应答中间有一个报文段的往返时间RTT,显然超时重传时间RTO会略大于这个RTT,TCP会根据网络情况动态的计算RTT,即RTO是不断变化的。在Linux中,超时以500ms为单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。其规律为:如果重发一次仍得不到应答,就等待2*500ms后再进行重传,如果仍然得不到应答就等待4*500ms后重传,依次类推,以指数形式递增,重传次数累计到一定次数后,TCP认为网络或对端主机出现异常,就会强行关闭连接。
首先三次握手
---------------------
作者:xuzhangze
来源:CSDN
原文:https://blog.csdn.net/xuzhangze/article/details/80490362
版权声明:本文为博主原创文章,转载请附上博文链接!
2. TCP协议可靠性保证(确认应答机制,超时重传机制,流量控制,拥塞窗口)
来源:https://www.cnblogs.com/sunbines/p/10882255.html