TCP报文格式详解
TCP报文格式
TCP头部
- 固定首部部分
- 一共20个字节,在图中分为五行,每行四个字节,也就是32位。
- 长度不定的可选字段
- 可选字段的长度不定,意味着TCP头部的长度是可变的。
字段详解
第一行:源端口和目的端口
- TCP源端口(Source Port):源计算机上的应用程序的端口号,占16位(bit)
- TCP目的端口(Destination Port):目标计算机的应用程序端口号,占16位(bit)
第二行:序列号
- TCP序列号(Sequence Number):占32位(bit),表示本报文段所发送数据的第一个字节的编号。在TCP连接中,所传送的字节流的每一个字节都会按顺序编号。
- 比如分组的第一个数据包由文件的14个字节数据组成,那么该数据包所添加的序号就是1。
- 同理,第二个数据包由文件的59个字节数据组成,那么该数据包所添加的序号就是5。
第三行:确认号
- TCP确认号:占32位(bit),表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。
- 比如接收端收到由文件14个字节数据+TCP首部组成的数据包后,删除首部提取14个字节数据,返回的确认号为5,即告诉发送端下一次应该发送文件的第5个字节及其之后字节组成的数据包过来。
第四行:(顺序如图从左到右)
- 数据偏移(即首部长度,Header Length):
- 占4位(bit),它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远,也就是TCP首部的长度。
- “数据偏移”的单位是 32 位字(以 4 字节为计算单位),最大1111表示15x4=60个字节,即表示TCP首部最大长度为60个字节,因此TCP首部的“可选字段”部分最多40个字节。
- 保留字段(Reserved):
- 占 4 位。为 TCP 将来的发展预留空间,目前必须全部为 0。
- 标志位字段:
- CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置 ECE 标志的 TCP 包。并且,发送方收到消息之后,通过减小发送窗口的大小来降低发送速率。
- ECE==ECN(ECN Echo):用来在 TCP 三次握手时表明一个 TCP 端是具备 ECN (显式拥塞通告)功能的。在数据传输过程中,它也用来表明接收到的 TCP 包的 IP 头部的 ECN 被设置为 11,即网络线路拥堵。
- URG(Urgent):表示本报文段中发送的数据是否包含紧急数据。URG=1 时表示有紧急数据。当 URG=1 时,后面的紧急指针字段才有效。
- ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1。
- PSH(Push):告诉对方收到该报文段后是否立即把数据推送给上层。如果值为 1,表示应当立即把数据提交给上层,而不是缓存起来。
- RST:表示是否重置连接。如果 RST=1,说明 TCP 连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。
- SYN:在建立连接时使用,用来同步序号。
- 当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段。
- 当 SYN=1,ACK=1 时,表示对方同意建立连接。
- SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。
- FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。
- 窗口大小字段(Window Size):
- 占16位,TCP流量控制,表示目前还有多少空间,能接收多少数据量。
第五行:
- TCP 校验位(TCP Checksum):
- 占 16 位。它用于确认传输的数据是否有损坏。发送端基于数据内容校验生成一个数值,接收端根据接收的数据校验生成一个值。两个值必须相同,才能证明数据是有效的。如果两个值不同,则丢掉这个数据包。
- 紧急指针(Urgent Pointer):
- 占 16 位。仅当前面的 URG 控制位为 1 时才有意义,它指出本数据段中为紧急数据的字节数,当所有紧急数据处理完后,TCP 就会告诉应用程序恢复到正常操作。即使当前窗口大小为 0,也是可以发送紧急数据的,因为紧急数据无须缓存。
第六行:可选项字段
可以自定义头部字段,长度不定,但长度必须是 32bits 的整数倍,最多40个字节。
第七行:TCP数据
数据部分(可以不发送任何数据)。
学习参考: