TCP的报文格式
TCP是一种面向连接的,可靠的,基于字节流的传输协议;
- 源端口(Source Port):长度为16 bits(2个字节)。源端口。
- 目的端口(Destination Port):长度为16 bits(2个字节)。目的端口。
- 序列号(Sequence Number):长度为32 bits(4个字节)。指定了当前数据分片中分配给第一字节数据的序列号。在TCP传输流中每一个字节为一个序号。如果TCP报文中flags标志位为SYN,该序列号表示初始化序列号(ISN),此时第一个数据应该是从序列号ISN+1开始。
- 确认序列号(Acknowledgment Number):长度为32bits(4个字节)。表示TCP发送者期望接受下一个数据分片的序列号。该序号在TCP分片中Flags标志位为ACK时生效。序列号分片的方向和流的方向同方向,而确认序列号分片方向和流方向反方向。
- 数据偏移或首部长度(Data Offset/Header Length): 长度为4bits。数据偏移也叫首部长度。因为首部长度实际也说明了数据区在分片中的起始偏移值。它表示TCP头包含了多少个32-bit的words。因为4bits在十进制中能表示的最大值为15,32bits表示4个字节,那么Data Offset的最大可表示15*4=60个字节。所以TCP报头长度最大为60字节。如果options fields为0的话,报文头长度为20个字节。
- 预留字段(Reserved field):长度为6bits。值全为零。预留给以后使用。
- 标志位(Flags): 长度为6bits。表示TCP包特定的连接状态。一个标签位占一个bit,从低位到高位值依次为FIN,SYN,RST,PSH,ACK,URG。新定义的TCP头还扩展了ECE,CWR,NS.
- 窗口(Window):长度16bits(2个字节)。表示滑动窗口的大小,用来告诉发送端接收端的buffer space的大小。接收端buffer大小用来控制发送端的发送数据数率,从而达到流量控制。最大值为65535.
- 校验和(Checksum):长度16bits(2个字节)。用来检查TCP头在传输中是否被修改。
- 紧急指针(Urgent pointer):长度为16bits(2个字节)。表示TCP片中第一个紧急数据字节的指针。只有当URG标志置1时紧急指针才有效。
- 选项和填充(Option和pading):可变长度。表示TCP可选选项以及填充位。当选项不足32bits时,填充字段加入额外的0填充。
- 数据(Data):长度可变。用来存储上层协议的数据信息。可以为空。比如在连接建立和连接中止时。
努力奔跑,是为了追上曾经被寄予厚望的自己。