TCP报文格式

概述

本文讲解TCP数据包的报头格式
TCP报头又称为TCP报文、TCP包头、TCP包首部 等

类比

相当于邮寄 包裹,包裹上面都有一张 邮寄单,如下图:


邮寄单上有 寄件人的姓名、地址、电话号,还有 收件人的姓名、地址、电话号,以及 包裹的类别、是否超重 等信息

包裹 相当于 TCP数据包
邮寄单 相当于 TCP数据包的 报文

TCP报文

格式如下:

  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

  12. 填充:选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍。

  13. 数据部分: TCP 报文段中的数据部分是可选的。
    在一个连接建立和终止时,双方交换的报文段仅有 TCP 报头。如果一方没有数据要发送,也使用没有任何数据的报头来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报头。


原文出处:/show_1EF2YTFiWuhs.html