TCP首部

1. 引言

介绍TCP为应用层提供的服务,以及TCP首部中的各个字段。

2. TCP首部

TCP数据被封装在一个IP数据报中,如图:

TCP首部的数据格式,如果不计选项字段,它通常是20个字节:

(1)16位源端口号和16位目的端口号:每个TCP段都包含源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接。

(2)32位序号:用来标示从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的第一个数据字节,TCP用序号对每个字节进行计数。序号是32位无符号数,序号到达2^32-1后又从0开始。当建立一个新的连接时,SYN标示变为1,序号字段包含由这个主机选择的该连接的初始序号ISN(Initial Sequence Number)。该主机要发送数据的第一个字节序号为这个ISN加1,因为SYN标志消耗了一个序号。TCP为应用层提供全双工服务,这意味数据能在两个方向上独立地进行传输,因此,连接的每一端必须保持每个方向上的传输数据序号。

(3)32位确认序号:既然每个传输的字节都被计数,确认序号包含发送确认的一端所期望收到的下一个序号。因此,确认序号应当是上次已成功收到数据字节序号加1。只有ACK=1时确认序号字段才有效。TCP首部中的确认序号标示发方已成功收到字节,但还不包括确认序号所指的字节。当前还无法对数据流中选定的部分进行确认。例如,如果1~1024字节已经成功收到,下一报文段中包含序号从2049~3072的字节,收端并不能确认这个新的报文段。它所能做的就是发回一个确认序号为1025的ACK,它也无法对一个报文段进行否认。例如,如果收到包含1025~2048字节的报文段,但它的校验和错误,TCP接收端所能做的就是发回一个确认序号为1025的ACK。

(4)4位首部长度:首部长度给出首部中32bit(4字节)的数目。需要这个值是因为选项字段长度是可变的,这个字段占4位,因此,TCP最多有(1111)=15*4=60字节的首部,然而,没有选项字段,正常的长度是20字节。

(5)保留(6位):

(6)URG:紧急指针有效

(7)ACK:发送ACK无需任何代价,因为32位的确认序号字段和ACK标志一样,总是TCP首部的一部分。因此,我们看到一旦一个连接建立起来,这个字段总是被设置,ACK标志也总是被设置为1。

(8)PSH:接收方应该尽快将这个报文段交给应用层

(9)RST:重建连接

(10)SYN:同步序号用来发起一个连接

(11)FIN:发端完成发送任务

(12)16位窗口大小:TCP的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接受端正期望接收的字节。窗口大小是一个16位字段,因此窗口大小最大为65535字节。

(13)16位校验和:校验和覆盖整个TCP报文段:TCP首部和TCP数据,这个一个强制性的字段,一定是由发端计算和存储,并由收端进行校验。

(14)16位紧急指针:只有URG=1时紧急指针才有效,紧急指针是一个正的偏移量,和序号字段中的值相加标示紧急数据最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。

(15)选项:最常见的可选字段是最大报文长度MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段中指明这个选项。

(16)数据:TCP实际报文。TCP报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有TCP首部,如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据,在处理超时的许多情况下,也会发送不带任何数据报文段。

2.1 TCP选项

TCP首部可以包含选项部分,最初TCP规范中定义的选项是:(1)选项表结束(2)无操作(3)最大报文段长度
几乎每个SYN报文段中都遇到过MSS选项。
最新的TCP规范中定义了新的TCP选项:(1)选项表结束(2)无操作(3)最大报文段长度(4)窗口扩大因子(5)时间戳
如图:

每个选项的开始是1字节kind字段,说明选项的类型。kind字段是0和1的选项仅占1个字节。
其他选项在kind字节后还有len字节,它说明的长度是指总长度,包括kind字节和len字节。
设置无操作选项的原因在于允许发送方填充字段为4字节的倍数。
比如:<mss 512, nop, wscale 0, nop, nop, timestamp 146647 0>
MSS选项设置为521,本身占用4字节。后面是NOP,接着是窗口扩大选项。第一个NOP用来将窗口扩大选项填充为4字节的边界。
同样,10字节的时间戳选项放在两个NOP后,占12字节。

在比如实际抓包:

3. 小结

尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。

TCP提供一种面向连接的、可靠的字节流服务。

面向连接意味着两个使用TCP的应用在彼此交换数据之前必须先建立一个TCP连接。

原文地址:https://www.cnblogs.com/lujiango/p/10483495.html