TCP(Transmission Control Protocol,传输控制协议)报文段的首部格式
+----------------+----------------+----------------+----------------+
| 源端口 | 目的端口 | 序号 | 确认号 |
| 2字节 | 2字节 | 4字节 | 4字节 |
+----------------+----------------+----------------+----------------+
| 数据偏移 | 保留字段 |URG|ACK|PSH|RST|SYN|FIN| 窗口 |
| 0.5字节 | 0.75字节 | 0.75字节 | 2字节 |
+----------------+----------------+----------------+----------------+
| 检验和 | 紧急指针 | (选项部分) |
| 2字节 | 2字节 | (长度可变,最长40字节) |
+----------------+----------------+-------------------------------------+
TCP报文段首部格式
TCP报文段的首部由固定的20个字节和可选的、最多40个字节的选项部分组成。因此,TCP报文段首部的最小长度为20个字节,最大长度为60个字节。
1. 源端口(Source Port):2字节
- 源端口字段用于标识发送方的端口号。
2. 目的端口(Destination Port):2字节
- 目的端口字段用于标识接收方的端口号。
3. 序号(Sequence Number):4字节
- 序号字段用于标识TCP报文段中携带的用户数据的第一个字节的编号。这个编号是以字节为单位的,并且在整个TCP连接中是唯一的。
- 序号字段的取值范围是0到232-1后,下一个序号会回到0。
4. 确认号(Acknowledgment Number):4字节
- 确认号字段用于标识期望收到对方下一个TCP报文段的数据载荷的第一个字节的序号。
- 确认号字段也是对之前收到的所有数据的确认。若确认号为N,则表示N-1之前的数据已经收到了。
5. 数据偏移(Data Offset):4位(0.5字节)
- 数据偏移字段用于指出TCP报文段的数据载荷部分距离TCP首部的距离,实际上它就是TCP报文段首部的长度。
- 数据偏移字段的单位是32位字(即4字节)。因此,数据偏移字段的最大值是15,对应的TCP首部最大长度为60字节(包括选项部分)。
6. 保留字段(Reserved):6位(0.75字节)
- 保留字段用于今后使用,目前应置为0。
7. 控制位(Control Bits):共6位(0.75字节),包括以下几个标志位:
- URG(Urgent Pointer):紧急指针有效标志,占1位。当URG=1时,表明紧急指针字段有效,告诉系统此报文段中有紧急数据,应尽快传送。
- ACK(Acknowledgment):确认标志位,占1位。仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有的传送的报文段都必须把ACK置为1。
- PSH(Push):推送标志位,占1位。当PSH=1时,接收方TCP会尽快地将报文段交付给接收端进程,而不用再等到整个缓存都填满了后再向上交付。
- RST(Reset):复位标志位,占1位。当RST=1时,表明TCP连接中出现了严重错误,必须释放连接,然后再重新建立传输连接。RST置为1还用来拒绝一个非法的报文段或拒绝打开一个连接。
- SYN(Synchronize):同步标志位,占1位。在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段;当SYN=1而ACK=1时,表明这是一个连接接受报文段。
- FIN(Finish):终止标志位,占1位。用来释放一个连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
8. 窗口(Window):2字节
- 窗口字段用于指出发送本报文段的一方的接收窗口的大小,即接收方目前允许对方发送的数据量(以字节为单位)。这个字段是接收方让发送方设置其发送窗口的依据,称为流量控制。
9. 检验和(Checksum):2字节
- 检验和字段用于检验传输过程中是否出现了误码。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。
10. 紧急指针(Urgent Pointer):2字节
- 紧急指针字段仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数(紧急数据结束后就是普通数据)。
11. 选项(Options):长度可变,最长可达40字节
- 选项字段用于增加TCP的功能。常见的选项包括最大报文段长度MSS、窗口扩大选项、时间戳选项等。