如何通俗易懂的理解TCP首部
扫描二维码
随时随地手机看文章
源端口号 (Source Port - 16 bits)
寄件人的门牌号。 发送数据的应用程序在发送方电脑上的“门牌号”(端口号)。就像快递单上的寄件人地址,接收方知道这个数据是从哪个程序发来的,好把回信发给正确的“门牌号”。
目的端口号 (Destination Port - 16 bits)
收件人的门牌号。 接收数据的应用程序在接收方电脑上的“门牌号”(端口号)。就像快递单上的收件人地址,接收方的网络设备(TCP/IP协议栈)根据这个门牌号,把数据包交给正确的程序(比如浏览器)。
序列号 (Sequence Number - 32 bits)
包裹的页码编号(从第几页开始)。 想象你要邮寄一本很厚的书,不得不拆成很多个小包裹。这个编号告诉你当前包裹里装的是这本书的第几页(或者第几块数据), 接收方收到一堆零散的包裹(数据包)后,能按照这个编号把它们按顺序拼回那本完整的书(原始数据)。同时,它也用于识别重复的包裹或丢失的包裹(编号不连续了)。
确认号 (Acknowledgment Number - 32 bits)
回执单上的“下一张期待页码”。 当收件人收到包裹并检查无误后,会发一个回执给寄件人。回执上写着:“我已收到到第 X 页(确认号)为止的所有包裹了,请寄下一页(X+1)给我吧!”,确认对方已收到数据,并告诉对方接下来希望收到哪个编号的数据包。这是 TCP 可靠传输的核心机制!只有当 ACK 标志位(见下面)为 1 时,这个字段才有效。
数据偏移 (Data Offset / Header Length - 4 bits)
这张“发货单”本身有多长? 单位是 4 字节。比如,固定部分 20 字节就是 5 (20/4=5),如果加上选项部分,这个值会变大,告诉接收方,“发货单”(TCP 首部)在哪里结束,后面真正的“货物”(应用层数据)从哪里开始。
保留 (Reserved - 6 bits)
预留的空白格子。 暂时没用,填 0。留给未来可能的新功能,控制位 (Flags - 6 bits, 每个占1位) - 最重要的部分之一!这是 6 个独立的开关(标志位),每个开关要么开(1)要么关(0),表示这个 TCP 包的特殊意图:
URG (Urgent):紧急开关。 “包裹里有加急物品!” 当它打开(1)时,表示这个数据包里有需要优先处理的紧急数据。这时紧急指针字段(见下面)才有效。现在用的比较少。
ACK (Acknowledgment):确认开关。 “这是个回执单!” 当它打开(1)时,表示这个包是用来确认对方发来的数据的。这时确认号字段才有效。绝大多数 TCP 包(除了第一个握手包)这个开关都是开着的!
PSH (Push):推送开关。 “别攒着了,赶紧送货上门!” 发送方打开(1),要求接收方收到这个包后,立刻把数据交给上层应用程序,不要等缓冲区满了再交。接收方打开(1),表示当前数据包里的数据是应用程序要求立即上交的。
RST (Reset):重置开关。 “出大问题了!赶紧断线重连!” 当连接出现严重错误(如端口未打开、连接异常)时,会发送一个打开(1)RST 开关的包,强制立即终止连接。
SYN (Synchronize):同步/连接请求开关。 “你好!我想和你建立连接。” 在建立连接(三次握手)时使用。第一次握手(客户端发起请求)和第二次握手(服务器响应)时,这个开关是开着的(1)。它用来初始化序列号。
FIN (Finish):结束开关。 “我的东西发完了,再见!” 用于正常关闭连接(四次挥手)。当一方数据发送完毕,就会发送一个打开(1)FIN 开关的包,表示它要关闭自己这一侧的连接。
窗口大小 (Window Size - 16 bits)
收件人的仓库还有多大空位? 接收方告诉发送方:“我现在最多还能接收这么多字节的数据(窗口大小值),你别发多了!” 这个值在通信过程中会动态变化,TCP 流量控制的核心机制!防止发送方发得太快,把接收方的缓冲区(仓库)塞爆。
校验和 (Checksum - 16 bits)
包裹的防伪封条/完整性标签。 发送方根据整个 TCP 包(首部+数据)的内容计算出一个“指纹”(校验和)。接收方收到后,按照同样的算法再算一遍,接收方比较自己算的“指纹”和包裹上贴的“指纹”(校验和字段)。如果不一样,说明包裹在运输过程中损坏(比特位出错了)或者被篡改了,这个包就会被丢弃。保证数据传输的完整性。
紧急指针 (Urgent Pointer - 16 bits)
加急物品在包裹里的位置。 只有当 URG 开关打开(1) 时才有效。它指向当前数据包中紧急数据最后一个字节的位置,告诉接收方应用程序,从包的开头到紧急指针指向的位置是紧急数据,需要优先处理。
选项 (Options - 长度可变,0-40字节)
特殊要求/增值服务。 可选的附加信息,用于一些高级功能。常见的选项有:
最大报文段长度 (MSS): 在建立连接(握手)时,双方协商每个 TCP 包最多能装多少数据(不包括首部)。避免在传输路径中被分片。
窗口缩放因子 (Window Scale): 因为基本窗口大小字段只有 16 位,最大只能表示 65535 字节。这个选项允许双方协商一个缩放因子,将实际窗口大小放大(比如左移若干位),用于高速网络。
时间戳 (Timestamp): 用于更精确地计算往返时间和防止序列号回绕,提供 TCP 的扩展功能,优化性能或增加特性。
填充 (Padding - 长度可变)
填空格,凑整。 因为 TCP 首部长度必须是 32 位 (4 字节) 的整数倍。如果选项部分的长度不是 4 字节的整数倍,就需要在最后用 0 填充一些位,把整个首部长度凑齐,确保首部对齐,便于硬件处理。