我试图从 TCP/IP 数据包中的序列号了解 acks。AFAIK,来自传输包的 ack 由以下 [1] 计算。在 [2] 中,我有一个对站点的 HTTP 请求。
- 让我们看看 TCP 握手。我们可以看到客户端发送的SYN包的ack是934031638(934031637+0+1)。但是随后客户端向服务器发送了一个值为 1 的 ack?不应该是934031639吗?
- 握手后,客户端使用 seq 1:205 和 ack 1 请求站点。为什么 seq 使用值 1:205 而不仅仅是 205?如果请求是第一个开始获取站点的请求,为什么该请求具有 ack 值?
- 然后回复有 ack 205 而不是 206。为什么会发生这种情况?
- 如果我们看终止通信的部分,客户端发送 2 个 FIN 请求,seq 为 205 和 1242。为什么需要发送 2 个 FIN 请求而不是 1 个?
[1]
ack=seq from the sender + length of the packet + 1.
[2]
13:38:34.092700 IP 10.0.2.15.49288 > 10.152.138.125.8080: Flags [S], seq 934031637, win 29200, options [mss 1460,sackOK,TS val 68040338 ecr 0,nop,wscale 7], length 0
13:38:34.097142 IP 10.152.138.125.8080 > 10.0.2.15.49288: Flags [S.], seq 2912700929, ack 934031638, win 65535, options [mss 1460], length 0
13:38:34.097175 IP 10.0.2.15.49288 > 10.152.138.125.8080: Flags [.], ack 1, win 29200, length 0
13:38:34.097685 IP 10.0.2.15.49288 > 10.152.138.125.8080: Flags [P.], seq 1:205, ack 1, win 29200, length 204: HTTP: GET http://www.site.com/ HTTP/1.1
13:38:34.098435 IP 10.152.138.125.8080 > 10.0.2.15.49288: Flags [.], ack 205, win 65535, length 0
13:38:34.377601 IP 10.152.138.125.8080 > 10.0.2.15.49288: Flags [P.], seq 1:1242, ack 205, win 65535, length 1241: HTTP: HTTP/1.1 200 OK
13:38:34.377631 IP 10.0.2.15.49288 > 10.152.138.125.8080: Flags [.], ack 1242, win 31025, length 0
13:38:34.379531 IP 10.0.2.15.49288 > 10.152.138.125.8080: Flags [F.], seq 205, ack 1242, win 31025, length 0
13:38:34.379755 IP 10.152.138.125.8080 > 10.0.2.15.49288: Flags [.], ack 206, win 65535, length 0
13:38:34.381469 IP 10.152.138.125.8080 > 10.0.2.15.49288: Flags [F.], seq 1242, ack 206, win 65535, length 0
13:38:34.381494 IP 10.0.2.15.49288 > 10.152.138.125.8080: Flags [.], ack 1243, win 31025, length 0