TCP报文格式 作者:马育民 • 2019-01-05 11:03 • 阅读:10260 # 概述 本文讲解TCP数据包的报头格式 TCP报头又称为TCP报文、TCP包头、TCP包首部 等 ### 类比 相当于邮寄 **包裹**,包裹上面都有一张 **邮寄单**,如下图: [](https://www.malaoshi.top/upload/0/0/1EF3P1t2XY7C.jpg) 邮寄单上有 **寄件人的姓名、地址、电话号**,还有 **收件人的姓名、地址、电话号**,以及 **包裹的类别、是否超重** 等信息 **包裹** 相当于 **TCP数据包** **邮寄单** 相当于 TCP数据包的 **报文** ### TCP报文 格式如下: [](http://www.malaoshi.top/upload/0/0/1EF2bnuGKCpT.png) 1. 源端口:表示发送端端口号,16位,共有2^16-1=65535个端口。指明发送端计算机的应用程序。 http://www.malaoshi.top/show_1EF2YXPJGCld.html 2. 目的端口:表示接收端端口号,指明接收端计算机的应用程序。 3. **序号**:也称为顺序号,Sequence Number,简写为SEQ,表示“发送端” 数据包序号。占32位,第一个包的编号由本地随机产生,到达2^32-1后会再回到0。 客户端、服务器端有各自的SEQ序号 4. **确认号**:Acknowledgement Number,简写为ACK,TCP返回报文使用。 **是期望的对方的下一个序号**。 **序号和确认号:是TCP可靠传输的关键部分。** 5. 首部长度:占4位。上图中的“选项”是可选的,因此TCP报头的长度是不确定的,报头不包含“选项”时长度为20字节。 也称 **数据偏移**,由于 **报头的长度不确定** ,首部长度指示了 **数据区** 在报文段中的 **起始偏移值** 。 >首部长度所能表示的最大值为2^4-1=15,由于报头是32位为一组,换算字节是:15*32/8 = 60字节,所以报头最大长度为60字节。 6. 保留:为将来定义新的用途保留,现在一般置0。 7. 控制位(标志位):URG、ACK、PSH、RST、SYN、FIN,共6个,每一个控制位表示一个控制功能。 1. URG:紧急指针标志,为1时表示紧急指针有效,为0则忽略紧急指针。 2. **ACK**:确认标志,为 **1** 时 **确认号有效** ,为 **0** 时 **确认号无效** >与上面的确认号ACK不同 3. PSH:push标志,为1表示是带有push标志的数据,指示接收方在接收到该报文段以后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。 4. RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。 5. **SYN**:同步序号,用于 **建立连接** 过程。 当 **SYN=1,ACK=0** 时表示:这是一个连接请求报文段。 若同意连接,则在响应报文段中 **SYN=1,ACK=1**。 因此,SYN=1表示这是一个 **建立连接请求**,或 **同意建立连接** 报文。SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。 **注意:** - SYN=1的报文 **不能携带数据**,但要 **消耗掉一个序号** - SYN=0、ACK=1的报文 **可以携带数据**,如果不携带数据则不消耗序号,此时下一个报文的序号与当前报文的序号相同 6. **FIN**:finish标志,用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。 8. 窗口:16位长度,滑动窗口大小,接收端告知发送端,本接受端的 **缓存大小**,以此控制发送端发送数据的速率,从而达到流量控制。窗口最大为2^16-1=65535。 9. 校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证。 10. 紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式。 11. **选项**:长度可变,最长40字节,当没有选项时报头长度是20字节。有多个选项,最重要的是 [**MSS**](http://www.malaoshi.top/show_1EF2VK9VXVdc.html "MSS") 12. 填充:选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。 10. 数据部分: TCP 报文段中的数据部分是可选的。 在一个连接建立和终止时,双方交换的报文段仅有 TCP 报头。如果一方没有数据要发送,也使用没有任何数据的报头来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报头。 原文出处:http://www.malaoshi.top/show_1EF2YTFiWuhs.html