TCP头部结构包括固定头部结构和头部选项。
TCP固定头部结构
16位端口号(port number):告知主机该报文段是来自哪里(源端口)以及传给哪个上层协议或应用程序(目的端口)的。进行TCP通信时,客户端通常使用系统自动选择的临时端口号,而服务器则使用知名服务端口号。
32位序号(sequence number):一次TCP通信(从TCP连接建立到断开)过程中某一个传输方向上的字节流的每个字节的编号。
假设主机A和主机B进行TCP通信,A发送给B的第一个TCP报文段中,序号值被系统初始化为某个随机值ISN(Initial Sequence Number,初始序号值)。那么在该传输方向上(从A到B),后续的TCP报文段中序号值将被系统设置成ISN加上该报文段所携带数据的第一个字节在整个字节流中的偏移。例如:某个TCP报文段传递的数据是字节流中第1025~2048字节,那么该报文段的序号值就是ISN + 1025。另一个传输方向(从B到A)的TCP报文段的序号值也具有相同的含义。
32位确认号(acknowledgement number):用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1。
假设主机A和主机B进行TCP通信,那么A发送出的TCP报文段不仅携带自己的序号,而且包含对B发送来的TCP报文段的确认号。反之亦然。
4位头部长度(header length):表示该TCP头部有多少个32bit字(4字节)。因为4位最大能表示15,所以TCP头部最长是60字节。
6位标志位包含如下几项:
- URG标志,表示紧急指针(urgent pointer)是否有效。
- ACK标志,表示确认号是否有效。我们称携带ACK标志的TCP报文段为确认报文段。
- PSH标志,提示接收端应用程序应该立即从TCP接收缓冲区读走数据,未接收后续数据腾出空间(如果应用程序不将接收到的数据读走,它们就会一直停留在TCP接收缓冲区中)。
- RST标志,表示要求对方重新建立连接。我们称携带RST标志的TCP报文段为复位报文段。
- SYN标志,表示请求建立一个连接,我们称携带SYN标志的TCP报文段为同步报文段。
- FIN标志,表示通知对方本端要关闭连接了。我们称携带FIN标志的TCP报文段为结束报文段。
16位窗口大小(window size):是TCP流量控制的一个字段。这里说的窗口,指的是接收通告窗口(Receiver Window,RWND)。它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据。这样对方就可以控制发送数据的速度。
16位校验和(TCP checksum):由发送端填充,接收端对TCP报文段执行CRC算法以校验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分。这也是TCP可靠传输的一个重要保证。
16位紧急指针(urgengt pointer):是一个正的偏移量。它和序号字段的值相加表示最后一个紧急数据的下一字节的序号。因此,确切地说,这个字段是紧急指针相对当前序号的偏移,不妨称之为紧急偏移。TCP的紧急指针是发送端向接收端发送紧急数据的方法。
TCP头部选项
TCP头部的最后一个选项字段(option)是可变长的可选信息。这部分最多包含40字节,因为TCP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。
选项的第一个字段kind说明选项类型。有的TCP选项没有后面两个字段,仅包含1字节的kind字段。第二个字段length(如果有的话)指定该选型的总长度,该长度包括kind字段和length字段占据的2字节。第三个字段(如果有的话)是选项的具体信息。
常见的TCP的7种选项:
使用tcpdump观察TCP头部信息
IP 127.0.0.1.38086 > 127.0.0.1.23: Flags [S], seq 3427495496, win 65495, options [mss 65495,sackOK,TS val 52834421 ecr 0,nop,wscale 7], length 0
0x0000: 4510 003c d95c 4000 4006 634d 7f00 0001
0x0010: 7f00 0001 94c6 0017 cc4b 6e48 0000 0000
0x0020: a002 ffd7 fe30 0000 0204 ffd7 0402 080a
0x0030: 0326 3075 0000 0000 0103 0307
此数据包共含60个字节,前20个字节是IP头部,后40个字节是TCP头部,不包含应用程序数据(length值为0)
本文暂时没有评论,来添加一个吧(●'◡'●)