TCP传给IP的数据单元称作TCP报文段或简称为TCP段(TCP segment)。
IP传给链路层的数据单元称作IP数据报(IP datagram)。
通过以太网传输的比特流称作帧(Frame)。
逐层封装:
- 源端口号
发送端端口号,字段长16位(2字节)
- 目标端口号
目标端端口号,字段长16位(2字节)
- 序列号(sequence number)
指发送数据的第一个字节的编号,字段长度为32位。
TCP是面向字节流的,每个字节都按顺序编号,由于该字段为32位,即序列号可表示2^32(4294967296个字节,4G字节)的数据,序列号到达最大值后,从0重新开始编号。
注意:一个连接的序列号不是从0或者1开始的,而是建立连接时由计算机生成的随机数作为其初始值。
- 确认应答号(acknowledge number)
指期望收到下一个报文段的第一个数据字节的序列号。该字段段长度也是32位。
ack = seq + 数据长度(单位字节)。
若收到的确认号为N,则表明:到N-1个字节的所有的数据均已被收到。 |
比如:A往B发送数据,B收到了A发过来的序列号为501的报文段,该报文长200字节,则表名B收到了(501~700序列号的数据,所以B往A发送的确认号应该是701。
- 数据偏移(data offset,也表示tcp首部长度)
表示tcp报文段的数据距离tcp报文段的起始处有多远。(实际就表示tcp首部的长度)。
该字段长4位,可表示0101~1111 个数,单位:"4字节"。所以tcp首部的长度范围:20字节~60字节
- 保留位(reserved)
该字段长4位,主要为以后tcp扩展使用。一般都为0。
- 控制位(control flag)
该字段长8位。分别如下:
- CWR(Congestion Window Reduced)
CWR标志和ECE标志都是用于IP首部的ECN字段。
- ECE(ECN-Echo)
ECE标志表示ECN-Echo,为1时会通知通信对方,从对方到这边的网络有拥塞。
如果在收到数据包的IP首部(IP协议)中ECN为1,则会将TCP首部中的ECE设置为1.
CWR和ECE控制位是tcp/ip协议随着发展增加的功能:拥塞控制通知(Explict Congestion Notification,简称“ECN". "ECN"是一个对IP协议和TCP协议的扩展,定义于RFC 3168(2001)。ECN允许拥塞控制的端对端通知而避免丢包。 |
- URG
为1时,表示有紧急数据需要处理。发送方会将紧急数据插入到报文段的最前面,而在紧急数据后面的数据仍是普通数据。需要与tcp首部的紧急指针(urgent pointer)配合使用。
- ACK
仅当ACK=1时,确认好字段才有效。当ACK=0时,确认号无效。tcp规定,在建立连接后所有传送的报文段都必须将ACK置为1
- PSH
当PSH=1时,发送方会立即创建一个报文段发送出去。接收方在收到PSH=1的报文段,就尽快地交付给接收方应用进程,而不用等到整个缓存填满了再交付。
- RST
当RST=1时,表示tcp连接出现严重差错,必须释放连接,然后重新建立连接。RST=1还用来拒绝非法的报文段或者拒绝打开一个连接。
- SYN
当SYN=1时,表明这是一个连接请求或者连接接受报文。
- FIN
用来关闭连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,请求释放该tcp连接。
- 窗口大小(window size)
占2字节。表示发送方的通信对方(即接收方)允许发送方发送的数据量(字节为单位)。发送方的发送窗口大小也是依据于此。因为接收方的数据缓存空间是有限的,应用进程也在动态处理数据缓存空间的数据,所以该窗口值经常是动态变化着。
- 校验和(checksum)
占2字节,检验首部和数据两部分。
- 紧急指针(urgent pointer)
占2字节。紧急指针仅当URG=1时才有意义。它支出本报文段中的紧急数据的字节数(紧急数据结束后仍是普通数据)。注意:即使窗口为0时,也可发送紧急数据。
- tcp选项(tcp option)
长度可变,最大40字节。只有"data offset">5时,才会有tcp选项。
tcp选项格式有两种:
1)1字节长的选项(也就是8位),只有Kind。比如:
2)4字节长的选项(也就是32位),有1字节Kind + 1字节Length + 选项数据 + [padding]。比如:
- 填充(padding)
"tcp选项"不足4字节的整数倍时,尾部填充的数据。
抓包样例明细:
参考:
RFC 9293: Transmission Control Protocol (TCP)