-
本节介绍如何实现TCP的可靠传输
-
目录
5.6.1 以字节为单位的滑动窗口
5.6.2 超时重传时间选择
5.6.3 选择确认 SACK
TCP使用的4种计时器
-
重传计时器、持续计时器、保活计时器和时间等待计时器
-
1、重传计时器
当TCP发送一个报文段时,就会创建一个针对这个报文段的重传计时器
。
若在重传计时器截止时间
到来之前就收到了对此特定报文段的确认
,就撤销此计时器。
若在收到对此报文段的确认
之前计时器截止期
到,则会重传此报文段,并将计时器复位重新计时。 -
2、持续计时器
用于发送方TCP
收到零窗口大小通知
后的处理。
若接收方TCP
发出了窗口大小为0的报文段
,发送方TCP
就会停止传送报文段,直到接收方TCP
发送确认并给出一个非零的窗口大小。
但这个确认可能会丢失。
在TCP中,对于确认报文段
是不需要发送确认的。
若这个非零窗口大小的确认
丢失了,接收方TCP
无从得知,会一直等待发送方TCP发送数据;而发送方TCP
由于未收到次确认也会等待接收方TCP发送确认来通知接收窗口大小。
要打开这种死锁
,TCP为每一个连接
使用了一个持续计时器
。
当发送方TCP收到一个零窗口的确认
时,就会启动该连接的持续计时器
。当持续计时器期限到时,发送方TCP
就发送一个探测报文段
(此报文段只有一个字节的数据
,探测报文段的有一个序号,但这个序号不需要确认)。探测报文段
提醒接收方TCP:确认已丢失,请重传。
持续计时器的值
设置为重传时间的数值
。若第一个探测报文段
的持续计时器到期也未收到从接收方TCP的响应,那么需要发送另一个探测报文段
,并将持续计时器的值加倍和复位,知道这个值增大到门限值
(通常是60秒)为止。
此后发送端每隔60秒就发送一个探测报文段,直到窗口重新打开。 -
3、保活计时器
用于防止TCP连接出现长时间的空闲。
若客户端
打开了到服务器的连接,传送了一些数据,然后就保持静默了(也许是故障了)。
此时需要服务器
设置保活计时器
。每当服务器收到客户端的信息,就将计时器复位。
保活计时器超时时间
一般设置为2小时。
若服务器超过2小时还没有收到客户的信息,服务器就开始发送探测报文段。若发送了10个探测报文段(每一个相隔75秒)还没有响应,就假定客户出了故障,服务器终止该连接。 -
4、时间等待计时器
用于连接终止阶段
。
当TCP关闭一个连接时,它并不认为这个连接马上就关闭了。
在时间等待期间
,连接还处于一种中间过渡状态
。
为了保证A发送的最后一个ACK报文段
能够到达B。这个ACK报文段可能丢失,B收不到对自己向A发送的FIN+ACK报文段
的确认(B无法进入CLOSED状态
),B就会超时重传这个FIN+ACK报文段,而A在此延时状态下便能收到这个报文段,A也重传一次确认,重新启动时间等待计时器。
防止已失效的连接请求报文段
出现在本连接中。A发送完最后一个ACK报文段
后,等待给定的时间
。可以使本连接持续的时间内
所产生的的所有报文段都从网络中消失。
此计时器的值通常设置为一个报文段寿命期待值
的两倍。