计算机网络原理——传输层TCP协议的十个重要特性之保证可靠性的机制(确认应答和超时重传)


TCP是有连接,进行可靠传输,面向字节流的协议

TCP报头

先来分析分析每部分的含义和作用
在这里插入图片描述
源端口号/目的端口号:
表示数据从哪个进程来, 到哪个进程去.

32位序号/32位确认序号:
后面的图中解释

4位首部长度:
表示该tcp报头有多少个4字节(32个bit),所以TCP头部最大长度是15*4=60个字节

6位保留: 顾名思义, 先保留着, 以防万一

6位标志位
URG: 标识紧急指针是否有效
ACK: 标识确认序号是否有效
PSH: 用来提示接收端应用程序立刻将数据从tcp缓冲区读走
RST: 要求重新建立连接. 我们把含有RST标识的报文称为复位报文段
SYN: 请求建立连接. 我们把含有SYN标识的报文称为同步报文段
FIN: 通知对端, 本端即将关闭. 我们把含有FIN标识的报文称为结束报文段

16位窗口大小: 看后图

16位检验和:
由发送端填充, 检验形式有CRC校验等. 如果接收端校验不通过, 则认为数据有问题. 此处的校验和不光包含TCP首部, 也包含TCP数据部分.

16位紧急指针:
用来标识哪部分数据是紧急数据.
选项和数据暂时忽略

保证可靠性的机制

确认应答(ACK机制,可靠传输的最核心机制)

确认应答其实就跟我们平时打电话一样,比如韦德今天要约詹姆斯去打球,韦德打电话给詹姆斯,然后詹姆斯回复,詹姆斯的每次回复就是一次确认应答。
在这里插入图片描述
对上述过程有个大致了解后我们再来看看我们TCP协议
在这里插入图片描述

超时重传

确认应答是比较理想的情况.数据在真实情况中传输过程中,可能会丢包的。
举个例子
在这里插入图片描述
实际的传输
在这里插入图片描述
超时的时间如何确定?
最理想的情况下, 找到一个最小的时间, 保证 “确认应答一定能在这个时间内返回”.
但是这个时间的长短, 随着网络环境的不同, 是有差异的.
如果超时时间设的太长, 会影响整体的重传效率;
如果超时时间设的太短, 有可能会频繁发送重复的包;

TCP为了保证无论在任何环境下都能比较高性能的通信, 因此会动态计算这个最大超时时间.
Linux中(BSD Unix和Windows也是如此), 超时以500ms(可以修改内核参数进行改变)为一个单位进行控制, 每次判定超时重发的超时时 间都是500ms的整数倍.
如果重发一次之后, 仍然得不到应答, 等待 2*500ms 后再进行重传.
如果仍然得不到应答, 等待 4 * 500ms 进行重传.
依次类推, 以指数形式递增累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接.

TCP可靠性的保证机制总结

TCP保证可靠性主要依靠下面7种机制:
1、检验和
TCP检验和的计算与UDP一样,在计算时要加上12byte的伪首部,检验范围包括TCP首部及数据部分,但是UDP的检验和字段为可选的,而TCP中是必须有的。计算方法为:在发送方将整个报文段分为多个16位的段,然后将所有段进行反码相加,将结果存放在检验和字段中,接收方用相同的方法进行计算,如最终结果为检验字段所有位是全1则正确(UDP中为0是正确),否则存在错误。
2、序列号
TCP将每个字节的数据都进行了编号,这就是序列号。
序列号的作用:
a、保证可靠性(当接收到的数据总少了某个序号的数据时,能马上知道)
b、保证数据的按序到达
c、提高效率,可实现多次发送,一次确认
d、去除重复数据
数据传输过程中的确认应答处理、重发控制以及重复控制等功能都可以通过序列号来实现
3、确认应答机制(ACK)
TCP通过确认应答机制实现可靠的数据传输。在TCP的首部中有一个标志位——ACK,此标志位表示确认号是否有效。接收方对于按序到达的数据会进行确认,当标志位ACK=1时确认首部的确认字段有效。进行确认时,确认字段值表示这个值之前的数据都已经按序到达了。而发送方如果收到了已发送的数据的确认报文,则继续传输下一部分数据;而如果等待了一定时间还没有收到确认报文就会启动重传机制。
4、超时重传机制
当报文发出后在一定的时间内未收到接收方的确认,发送方就会进行重传(通常是在发出报文段后设定一个闹钟,到点了还没有收到应答则进行重传)
5、连接管理机制
连接管理机制即TCP建立连接时的三次握手和断开连接时的四次挥手。
6、流量控制
接收端处理数据的速度是有限的,如果发送方发送数据的速度过快,导致接收端的缓冲区满,而发送方继续发送,就会造成丢包,继而引起丢包重传等一系列连锁反应。

猜你喜欢

转载自blog.csdn.net/char_m/article/details/107124821