A -----FIN-----> B
FIN_WAIT_1 CLOSE_WAIT
A <----ACK------ B
FIN_WAIT_2
(B can send more data here, this is half-close state)
A <----FIN------ B
TIME_WAIT LAST_ACK
A -----ACK-----> B
| CLOSED
2MSL Timer
|
CLOSED
需要对 FIN 的 ACK,因为发送 FIN 的一端将重传它,直到它收到 ACK。所以,问题是,如果没有收到 ACK,为什么 TCP 一直发送 FIN?我的理解是,鉴于连接可能处于半关闭状态,接收最后一个 FIN(图中的 A)的一侧可能正在“无限期地”等待数据,从而在没有更多数据时浪费资源已收到。B 需要确保 A 收到 FIN(并关闭连接),因此它需要一个 ACK。
编辑
更准确地说是半关闭。在您的示例中,A 可以关闭其连接的一侧,发送第一个 FIN 并接收第一个 ACK,但 B 可以在关闭连接并发送最后一个 FIN 之前的任何时间段内随意发送更多数据。因此,第一个 FIN/ACK 序列和第二个序列之间的时间无法确定或超时。A 需要最后一个 FIN 以确保 B 已关闭其一侧的连接。
编辑 2
如果从 B 到 A 的最后一个 FIN 丢失了怎么办?然后,B 将不会收到 ACK 并将重传 FIN,直到它收到 ACK。因此,A 最终将获得 FIN 并转换到 TIME_WAIT 状态。
A -----FIN-----> B
FIN_WAIT_1 CLOSE_WAIT
A <----ACK------ B
FIN_WAIT_2
(B can send more data here, this is half-close state)
A (Lost)X<--FIN------ B
FIN_WAIT_2 LAST_ACK
(timeout waiting for ACK)
A <----FIN------ B
TIME_WAIT
A -----ACK-----> B
| CLOSED
2MSL Timer
|
CLOSED
如果最后一个 ACK 丢失会发生什么?然后,B 会认为 A 没有收到 FIN 并会重传 FIN。从 B 的角度来看,这与 FIN 丢失是一样的,从 A 的角度来看,这是不同的,因为 A 现在处于 TIME_WAIT 或 CLOSED 状态。当 A 从 A 接收到新的 FIN 时,如果它处于 TIME_WAIT 状态,它将再次发送 ACK。
A -----FIN-----> B
FIN_WAIT_1 CLOSE_WAIT
A <----ACK------ B
FIN_WAIT_2
(B can send more data here, this is half-close state)
A <----FIN------ B
TIME_WAIT LAST_ACK
A -----ACK-->X(Lost) B
TIME_WAIT LAST_ACK
(timeout waiting for ACK)
A <----FIN------ B
A -----ACK-----> B
| CLOSED
2MSL Timer
|
CLOSED
如果 A 处于 CLOSED 状态,它将发送一个 RESET,在任何一种情况下,B 都将能够关闭其一侧的连接。
A -----FIN-----> B
FIN_WAIT_1 CLOSE_WAIT
A <----ACK------ B
FIN_WAIT_2
(B can send more data here, this is half-close state)
A <----FIN------ B
TIME_WAIT LAST_ACK
A -----ACK-->X(Lost) B
TIME_WAIT LAST_ACK
|
2MSL Timer
|
CLOSED
(timeout waiting for ACK)
A <----FIN------ B
A -----RST-----> B
CLOSED