TCP 包头详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP 包头详解相关的知识,希望对你有一定的参考价值。

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。当应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,TCP则把数据流分割成适当长度的报文段,最大传输段大小(MSS)通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)限制。之后TCP把数据包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。

技术分享图片
src port:源端口,2个字节,是一个大于1023的16位数字,由基于TCP应用程序的用户进程随机选择

dst port:目的端口,2个字节,指明接收者所用的端口号,一般由应用程序来指定

Sequence number:顺序号,4个字节,用来标识从 TCP 源端向 TCP 目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号。如果将字节流看作在两个应用程序间的单向流动,则 TCP 用顺序号对每个字节进行计数。序号是 32bit 的无符号数,序号到达 (2^32) - 1 后又从 0 开始。当建立一个新的连接时, SYN 标志变 1 ,顺序号字段包含由这个主机选择的该连接的初始顺序号 ISN ( Initial Sequence Number )

Acknowledgement number:确认号,4个字节,包含发送确认的一端所期望收到的下一个顺序号。因此,确认序号应当是上次已成功收到数据字节顺序号加 1 。只有 ACK 标志为 1 时确认序号字段才有效

Offset:报头长度,4位,给出报头中 32bit 字的数目。需要这个值是因为任选字段的长度是可变的。这个字段占 4bit , 即TCP 最多有 60(15*4) 字节的首部

Resrvd:保留区域,6位,保留给将来使用,目前必须置为 0

Control Flags(6位)控制位包括

**URG**:为 1 表示紧急指针有效,为 0 则忽略紧急指针值

**ACK**:为 1 表示确认号有效,为 0 表示报文中不包含确认信息,忽略确认号字段

**PSH**:为 1 表示是带有 PUSH 标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满

**RST**:用于复位由于主机崩溃或其他原因而出现错误的连接。它还可以用于拒绝非法的报文段和拒绝连接请求。一般情况下,如果收到一个 RST 为 1 的报文,那么一定发生了某些问题

**SYN**:同步序号,为 1 表示连接请求,用于建立连接和使顺序号同步( synchronize )

**FIN**:用于释放连接,为 1 表示发送方已经没有数据发送了,即关闭本方数据流

Window Size:窗口大小,2个字节,表示从确认号开始,本报文的源方可以接收的字节数,即源方接收窗口大小。窗口大小是一个 16bit 字段,因而窗口大小最大为 65535(2^16 - 1)

Checksum:校验和,2个字节,对整个的 TCP 报文段(包括 TCP 头部和 TCP 数据),以 16 位字进行计算所得。这是一个强制性的字段,要求由发送端计算和存储,并由接收端进行验证

Urgent Pointer:紧急指针,2个字节,是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。 只有当URG 标志置 1 时紧急指针才有效

Option and Pad:选项和填充,n*4字节,常见的可选字段是最长报文大小 MSS(Maximum Segment Size) 。每个连接方通常都在通信的第一个报文段(为建立连接而设置 SYN 标志的那个段)中指明这个选项,它指明本端所能接收的最大长度的报文段。选项长度不一定是 32 位字的整数倍,所以要加填充位,使得报头长度成为整字数

Data:数据,不定长度,为上层协议封装好的数据

以上是关于TCP 包头详解的主要内容,如果未能解决你的问题,请参考以下文章

FastDFS通信协议详解

tcp包头的udp包头arp

TCP协议数据传输的基本机制:滑动窗口运行过程详解

TCP/IP协议栈概述及各层包头分析

wireshark抓包图解 TCP三次握手/四次挥手详解

Linux网络编程--wireshark分析TCP包头的格式