题目
TCP 首部包含哪些字段
答案
![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/img/20210107172335.png) TCP 报文段 = TCP 首部 + 数据部分 **TCP 首部包含可选项,所以总体长度可变,但包含 20 字节的固定部分(和 IP 首部一样)** 固定部分中比较重要的几个字段如下: - **源端口和目的端口**:各占 2 个字节,分别写入源端口和目的端口。IP 地址 + 端口号就可以确定一个进程地址 - **序号/序列号**:在建立连接时由计算机生成的随机数作为其初始值(也称为**初始序号 Init Sequense Number, ISN**),通过 SYN 包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题 > 简单理解,ISN 就表示初始数据偏移量,后续的序列号就表示当前要发送的字节流的偏移量 > > 抓个包,下图中的 Seq 就是序列号,其中橙色框和绿色框住的分别是客户端和服务端各自生成的初始序列号 > > ![TCP 抓包图](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230324211348182.png) > > ![客户端第一次握手的 SYN 报文中的 Seq](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20230324211508728.png) - **确认号 ack**:期望收到对方下一个报文段的第一个数据字节的序号。若确认号为 N,则表明:到序号 N-1 为止的所有数据都已正确收到。 保留位的右边有 6 个各占 1 bit 的控制位(重要),这是TCP 用来说明该报文段性质的: - **确认 ACK**:仅当 ACK = 1 时确认号字段 ack 才有效。TCP 规定,TCP 规定除了最初建立连接时的 `SYN` 包之外该位必须设置为 1 - **推送 PSH**(Push):当两个应用进程进行交互式的通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应。在这种情况下,TCP 就可以使用推送(push)操作。这时,发送方 TCP 把 PSH 置为 1,并立即创建一个报文段发送出去。接收方 TCP 收到 PSH = 1 的报文段,就尽快地交付接收应用进程。而不用等到整个缓存都填满了后再向上交付。 - **复位 RST**(Reset):当 RST = 1 时,表明 TCP 连接中出现了严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接 - **同步 SYN**:SYN = 1 表示这是希望建立连接 - **终止 FIN**(Finish):用来释放一个连接。当 FIN = 1时,表明此报文段的发送发的数据已发送完毕,并要求释放连接