TCP是可靠的传输协议,主要通过确认机制和超时重传机制来实现可靠传输
确认机制
TCP将要传送的整个应用层报文(这可能要嵌在多个TCP报文段中发送)看成是一个个字节组成的数据流,然后对每一个字节编一个序号。在建立连接时,双方要商定初始序号。TCP就将每一次所要传送的报文段中的第一个数据字节的序号,放在TCP首部的序号字段中
TCP的确认是对接受到的数据的最高序号(即收到的数据流中的最后一个字节的序号)表示确认,但返回的是已收到的数据的最高序号加1.也就是说,确认序号表示期望下次收到的第一个数据字节的序号。
超时重传机制
1.RTT(往返时延)的计算
超时重传机制最关键的因素是重传定时器的定时设置,但是确定合适的往返时延RTT是相当困难的事,因为TCP的下层是一个网际互联网环境,发送的报文段可能经过一个高速率的局域网,但也有可能经过多个低速率的广域网
TCP采用了一种自适应算法。算法思想描述如下:记录每一个报文段发出的时间,以及收到相应的确认报文段的时间,这两个时间之差就是报文段的往返时延。将各个报文段的往返时延样本加权平均,就得出报文段的平均往返时延RTT,RTT的计算如下:
- RTT新值=RTT样本(第一次测量)
- RTT新值=α×RTT旧值+(1-α)×新的RTT样本(第二次以后的测量)
在上式中,典型的α的值为7/8
2.RTTD(RTT的偏差加权平均值)的计算
计算方法如下:
- RTTD新值=RTT样本/2(第一次测量)
- RTTD新值=γ×RTTD旧值+(1-γ)×|RTT新值-RTT样本|(第二次测量之后)
在上式中,典型的γ值为3/4
最后,超时重传时间RTO=RTT新值+4×RTTD新值
3.超时重传机制中的定时器
- 重传定时器:发送方发送数据后,将发送的数据放到缓存中,同时设定重传定时器,如果超时重传时间RTO之内没有收到来自接收方的确认报文段,则将缓存数据重发
- 持续定时器:接受方由于缓存满,就会给发送方发送一个窗口字段0的报文段,当接收方有了空闲时候,会发送窗口更新报文段发送给发送方。持续定时器就是为了防止窗口更新报文段丢失了,但此时接收方有了缓存空间,等待发送方发送数据;而发送方没有收到窗口更新报文段,不能发送数据,也处于等待状态,从而进入死锁状态
- 保活定时器:当一个连接双方空闲了比较长时间后,该定时器即使超时,从而发送一个报文段来查看通信的另一方是否依然存在。如果对方无应答,则连接中止