《Linux高性能服务器编程》读书笔记之tcp协议详解

1.TCP头部结构

TCP头部结构如下图所示,其中的诸多字段为管理TCP连接和控制数据流提供了足够的信息。

技术分享

 16位端口号:告诉主机该报文段是来自哪里以及传给哪个上层的协议或应用程序(目的端口)的。

      32位序号:一次TCP通信过程中某个传输方向上的字节流的每个字节的编号。假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。

      32位确认号:用作对另一方发送来的TCP报文段的相应。其值是收到的TCP报文段值加一。

      4位头部长度:标识该TCP头部有多少个32bit。

      16位窗口大小:是TCP流量控制的一个手段。告诉对方本端的TCP接受缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。


2.TCP连接的建立和关闭

     用tcpdump抓取TCP三次握手与四次挥手的报文如下:

技术分享

      图示如下:

技术分享

      TCP连接是全双工的,所以它允许两个方向的数据传输被独立关闭。也就是说,通信一方可以发送结束报文段给对方,告诉它本端已经完成了数据的发送,但允许继续接受来自对方的数据,直到对方也发送结束报文以关闭连接,TCP称这种状态为半关闭状态,如下图所示:

技术分享

      socket网络编程接口shutdown函数提供了对半关闭的支持。当调用close()函数时,表示读写同时关闭,这时两端同时关闭socket连接。当调用shutdown时,可以指定只关闭写,此时进入到半关闭状态。


3.TCP状态转移

技术分享

      主动关闭TCP连接的一方在接收对方的结束报文段后,并没有直接进入到CLOSED状态,而是转移到TIME_WAIT状态。这个状态,一般持续2MSL(Maximum Segment Life,报文段最大生存时间)的时间,才能完全关闭。这么做主要是保证对方能收到对结束报文段的ACK,确保网络能可靠的终止。我们可以通过socket选项SO_REUSEADDR来强制进程立即使用处于TIME_WAIT状态的连接占用的端口。


4.复位报文段

     有三种情况会使TCP连接的一端向另一端发送携带RST标志的报文段。

(1)访问不存在的端口

      当客户端程序访问一个不存在的端口时,目标主机将给它发送一个复位报文段。

(2)异常终止连接

      TCP提供了一个异常终止连接的方式,即给对方发送一个复位报文段。一旦发送了复位报文段,发送端所有排队等待发送的数据都将被丢弃。

 (3)处理半打开连接

      TCP的一端关闭或异常终止了连接,而对方没有收到结束报文,此时另一端还维持着原来的链接。我们称此时的状态为半打开状态。如果此时往处于半打开状态的连接写入数据,则对方会回应一个复位报文段。


5.TCP超时重传

     TCP为每个TCP报文都维护一个重传定时器,该定时器在TCP报文段第一次被发送时启动。如果超时时间内未收到对方的应答,TCP模块将重传TCP报文段并重置定时器。一般超时一次,TCP定时器的时间会翻一倍。最多重传的次数由内核的参数给出。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。