TCP 协议

TCP 协议处于四层参考模型的第三层,即传输层。同一层的还有 UDP 协议。TCP 和 UDP 的区别是:TCP 是可靠的,面向连接的,基于字节流的服务;UDP 是不可靠的,无连接的,面向数据块的服务

解释如下:

TCP 报头的格式

图中各字段含义解释如下:

TCP 连接的建立

TCP 通过建立一条全双工的通信链路来保证数据的可靠传输。建立连接的过程即为三次握手和四次挥手。

TCP 通信的两端都处于某些状态之中,通过在各种不同状态间的切换来完成数据传输。

示意图如下:

图中绿色大写部分标注出来的是 TCP 的状态转移过程,橙色小写部分标注出来的是客户端和服务器各自所调用的函数。

TIME_WAIT 状态

TIME_WAIT 状态存在的原因有两个:

如果没有 TIME_WAIT 状态,那么当客户端发送的最后一个确认报文在网络上丢失时,对客户端而言连接已经完全断开,没有任何问题。但对服务器来说,并没有收到确认报文,所以在超时之后会再次发送 FIN 报文给客户端,而此时客户端会认为这是一个非法的报文,会回复一个带 RST 标志的报文,所以就产生了『僵死连接』。所以主动断开连接的一方需要维护一个 TIME_WAIT 定时器,在定时器到期之前,如果再次收到了服务器的 FIN 包,表明自己的最后一个确认报文已经丢失,此时会再次发送确认报文并重置该定时器。

另一种情况,如果客户端的最后一个确认报文并没有丢失,而是阻塞在某个路由器节点上了。此时若没有 TIME_WAIT 状态,那么服务器和客户端均可以完全关闭连接,然后重新建立一个相似的 TCP 连接,在此之后,刚才那个确认报文到达了服务器,也会导致服务器认为是非法的,但服务器还维持着原来的 TCP 连接。

TCP 的四个定时器

TCP 协议为每个 TCP 连接规定了四个定时器,分别是重传定时器,持久定时器,保活定时器和时间等待定时器。

重传定时器

用于数据应答机制中。当一端发送出一个数据包时,就启动一个重传定时器。当定时器超时时,就重发该报文并重置该定时器。这是 TCP 可靠性的基础。

持久定时器

设想这么一种情况,发送端哗哗哗地发送数据,将接收端的接收窗口占满了,此时会收到一个宣布接收窗口大小为 0 的确认报文,此时发送端就会启动一个持久定时器,若在定时器未到期期间收到了宣布接收窗口有空闲的报文,就撤销该持久定时器,继续发送数据。否则在定时器到期后,就发送一个探测报文,告诉接收端『你的窗口有空闲了没?快点告诉我!』。

若没有持久定时器,可能接收端想通知发送端自己的接收窗口有空闲可以继续发送了,但该报文在半路丢失了,此时会发送端在等待这个已经丢失的报文,接收端在等待发送端的数据,就会造成死锁。

保活定时器

若发送端发送了某些数据后突然就沉默了,也许是出故障了,在这种情况下,这个链接将永远处于打开状态下。

解决方法就是当接收端没接受到一个报文,就重置保活定时器。当保活定时器到期后,也就是超过了规定的阈值,发送端会发送探测报文。若发了若干个探测报文还是没有收到响应的话,就认为对端出现了故障,就关闭连接。

时间等待定时器

刚才说了,时间等待定时器的作用是为 TIME_WAIT 状态计时。

TCP 超时重传机制

TCP 的超时重传机制就是发送端发出一个数据包后,立即启动一个重传定时器。若在定时器到期之前收到了确认报文,就撤销该定时器并继续发送数据。否则就认为该数据包在传输途中丢失,重发该数据包并重置定时器。因此这样保证了数据包一定能被对方收到,也就是 TCP 的可靠性之一。

【完】