网络学习-传输层TCP协议(确认应答与超时重发)

概念

在TCP中,当发送端的数据到达数据接收主机时,接收端主机会返回一个已收到消息的通知,这个消息叫做确认应答(ACK);


序列号

TCP数据包中的序列号(Sequence Number)不是以报文段来进行编号的,而是将连接生存周期内传输的所有数据当作一个字节流,序列号就是整个字节流中每个字节的编号。一个TCP数据包中包含多个字节流的数据(即数据段),而且每个TCP数据包中的数据大小不一定相同。在建立TCP连接的三次握手过程中,通信双方各自已确定了初始的序号x和y。

序列号的初始值并不为0,而是在建立连接时由随机数生成。而后面的计算则是对每个字节加一。
序列号也指字节与字节之间的举例。

这里写图片描述


传输过程

1)正常的数据传输

这里写图片描述

当发送端将数据发出后,会等待对端的确认应答,如有确认应答,说明数据已经到达对端。则可以继续发送下一个数据包。

如在图中,第一次发送一个初始序列号为1,长度为1000字节的数据包,当接收端收到数据包,查询数据包TCP首部中的序列号和数据长度,将自己的下一步应该接受的序列号作为确认应答(ACK)返回。就这样可以通过序列号和ACK实现可靠性传输。

TCP数据长度并没有直接写入TCP首部。而是利用公式计算。

扫描二维码关注公众号,回复: 1487476 查看本文章

TCP数据长度=IP首部中数据包长度-IP首部长度-TCP首部长度。

2)数据包丢失情况

当数据包由主机A发出后,由于网络拥塞等原因丢失的话。 当数据包无法到达接收端主机B;

此时ACK就开始起作用了。

如果发送端主机A在一个特定的时间没有收到接收端主机B发来的确认应答。就会进行重发。就解决了数据包丢失问题。

这里写图片描述

3)确认应答(ACK)丢失

未接收到ACK并不全意味着数据包丢失,还有可能是数据包发送过去了,但是ACK丢失了。这种情况也会导致发送端因为没有收到ACK而认为数据没有到达对端。

这里写图片描述

由于主机B返回的确认应答因为网络拥塞等原因丢失了。主机A会等待一段时间。若在特定时间没有收到始终没有收到这个确认应答ACK。主机A就会对此数据包进行重发。此时,主机B将第二次发送已收 此数据的确认应答。由于主机B已经收到过1~1000的数据,当再有相同数据送达时,主机B就会丢弃。

重复数据包识别和处理

主机B会收到很多重复数据. 那么TCP协议需要能够识别出那些包是重复的包, 并且把重复的丢弃掉. 这时候我们可以利用前面提到的序列号, 就可以很容易做到去重的效果.。

序列号即可以识别已经接受的数据,又可以判定是否需要接受。
接收方如果收到了重复的报文,将会丢弃重复的报文,但是必须发回确认信息,否则对方会再次发送。

乱序处理

TCP协议应当保证数据报按序到达接收方。如果接收方收到的数据报文没有错误,只是未按序号,这种现象如何处理呢?
TCP协议本身没有规定,而是由TCP协议的实现者自己去确定。通常有两种方法进行处理:一是对没有按序号到达的报文直接丢弃。二是将未按序号到达的数据包先放于缓冲区内,等待它前面的序号包到达后,再将它交给应用进程。
后一种方法将会提高系统的效率。例如,发送方连续发送了每个报文中100个字节的TCP数据报,其序号分别是1,101,201,…,701。假如其它7个数据报都收到了,而201这个数据报没有收到,则接收端应当对1和101这两个数据报进行确认,并将数据递交给相关的应用进程,301至701这5个数据报则应当放于缓冲区,等到201这个数据报到达后,然后按序将201至701这些数据报递交给相关应用进程,并对701数据报进行确认,确保了应用进程级的TCP数据的按序到达。

超时时间确认

超时是指在重发数据之前,等待确认应答到来的那个特定时间间隔。如果在超过这个时间间隔仍未收到ACK,发送端就进行数据包重发。

那么, 超时的时间如何确定?
最理想的情况下, 找到一个最小的时间, 保证 “确认应答一定能在这个时间内返回”.但是这个时间的长短, 随着网络环境的不同, 是有差异的。如果超时时间设的太长, 会影响整体的重传效率;如果超时时间设的太短, 有可能会频繁发送重复的包。

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

猜你喜欢

转载自blog.csdn.net/zgege/article/details/80445295