确认应答机制、超时重传机制
确认应答机制
确认应答机制能够保证TCP协议的可靠性。
主机A发送的第一个TCP数据包中的***是1,发送的长度是1000个字节,说明1~1000个字节都发送过去了。1001表示小于1001序号的数据都已经到达接收端,接下来主机B就应该从1001这个序号开始发送。
确认序号表示的含义:确认序号之前的数据都已经正确被接收到,发送方应该从确认序号的位置继续进行发送。
超时重传机制
为了防止数据报丢失,当TCP发送一个报文时,就会启动重传计时器。当发送端没有收到接收端的确认时,此时就会重新传输数据。
发送方丢包:
主机A发送数据给主机B之后, 可能因为网络拥堵等原因, 数据无法到达主机B; 如果主机A在一个特定时间间隔内没有收到B发来的确认应答, 就会重新发送数据。
接收方丢包:
主机A未收到主机B发送的确认应答,也可能是因为ACK丢失。1~1000的数据在主机B这边,出现了两次,主机B收到很多重复数据,会自动按照消息的序号进行去重。
超时的时间如何确定?
最理想的情况下, 找到一个最小的时间, 保证 “确认应答一定能在这个时间内返回”。但是这个时间的长短, 会随网络环境的不同而不同。如果超时时间设置太长, 会影响整体的重传效率;如果超时时间设置太短, 有可能会频繁发送重复的包。
TCP为了保证无论在任何环境下都能比较高性能的通信,会动态计算这个最大超时时间。
Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制,,每次判定超时重发的超时时间都是500ms的整数倍。如果重发一次之后, 仍然得不到应答, 等待 2* 500ms 后再进行重传。如果仍然得不到应答,等待 4* 500ms 进行重传。依次类推, 以指数形式递增。累计到一定的重传次数, TCP认为网络或者对端主机出现异常, 强制关闭连接。