我们知道TCP协议是传输层协议,它是可靠传输,有连接的传输协议。那么它是依靠什么才能有这个功能的呢?
确认应答机制(ACK)
TCP将每个字节的数据都进行了编号,即为序列号:
每一个ACK都带有对应的确认序列号,意思是告诉发送者,我们已经收到了哪些数据,下一吃发送数据应该从哪里开始。
如上图,主机A给主机B发送了1-1000的数据,ACK应答,携带了1001序列号。告诉主机A,我已经接受到了1-1000数据,下一次你从1001开始发送数据。
TCP 在传输数据过程中,还加入了超时重传机制:
在传输数据过程中:
1.主机A发送数据给主机B,主机B没有收到数据包,丢包了
2.如果主机A在一个特定时间间隔内没有收到主机B发来的确认应答,就会进行重发
也有这种可能:
主机B收到了数据包,它发送ACK确认包时,主机A未能接收到,丢包了。
这时,主机A认为主机B没有接收到数据包。则会发生重传。数据包1 - 1000 数据包再发送一次。
从上面中,看的出,主机A发送重传,主机B有可能收到几份重复的数据包。那么TCP协议需要识别出那些包是重复的包,并且把重复的包丢弃掉。这就需要我们利用上面提到的序列号,就可以去重。
在复杂的网络环境中,我们的超时时间如何确定?
1.找到一个最小的时间,保证“确认应答一定能在这个时间内返回”
2.这个时间的长短,随着网络环境的不同,有差异
3.超时时间设的太长,会影响整体的重传效率
4.超时时间设的太短,有可能会频繁发送重复的包
ps:TCP动态计算这个最大超时时间
超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍。如果重发一次之后,得不到应答,等待2*500ms后再进行重传。如果任然等不到应答,等待4*500ms进行重传,以指数形式递增。累积到一定的重传次数,TCP认为网络或者对端主机出现异常,强制断开连接。