![TCPDUMP——TCP 标志](https://linux22.com/image/710532/TCPDUMP%E2%80%94%E2%80%94TCP%20%E6%A0%87%E5%BF%97.png)
为什么 PUSH 数据包总是设置 ACK 标志?为什么不直接 PUSH?
三次握手后,客户端发送的第一个数据包应该只有 PUSH。这个 ACK 来自哪里?
19:14:58.013699 IP 10.201.98.71.59454 > 10.201.208.15.ssh:标志[S],序列号 1794644890,win 29200,选项[mss 1460,sackOK,TS val 18876032 ecr 0,nop,wscale 7],长度 0 19:14:58.014613 IP 10.201.208.15.ssh > 10.201.98.71.59454:标志[S.],序列号 176446139,ack 1794644891,win 29200,选项[mss 1460,nop,nop,sackOK,nop,wscale 7],长度0 19:14:58.014651 IP 10.201.98.71.59454 > 10.201.208.15.ssh:标志[.],ack 1,win 229,长度0
19:14:58.019507 IP 10.201.208.15.ssh > 10.201.98.71.59454:标志 [P.],序号 1:391,确认 1,获胜 229,长度 390
19:14:58.019541 IP 10.201.98.71.59454 > 10.201.208.15.ssh:标志[.],ack 391,win 237,长度0
答案1
为了使 TCP 正常工作,必须确认每个数据包。如果缺少 ACK,则另一端的重新传输计时器最终会超时,数据包将被重新发送。在您的 tcpdump 中,第四个数据包的 ACK 让另一端知道,您的 tcpdump 的第三个数据包已收到。“ACK 1”让另一端知道“我正在等待 #1,之前的所有数据包都已收到”。
无论有没有 PUSH 标志,只要数据包来回发送,您就应该始终看到 ACK。不发送 ACK 意味着“自从我向您发送最后一个数据包以来,我还没有看到您发送的新数据包”。