当连接建立时,有:
Client ------SYN-----> Server
Client <---ACK/SYN---- Server ----①
Client ------ACK-----> Server
当终止到来时,有:
Client ------FIN-----> Server
Client <-----ACK------ Server ----②
Client <-----FIN------ Server ----③
Client ------ACK-----> Server
我的问题是为什么②和③不能像①一样设置在同一个包中,就是ACK和SYN设置在一个包中???
最佳答案
经过大量谷歌搜索后,我认识到四次实际上是两对双向握手。
如果终止是一个真正的四向 Action ,那么 2 和 3 确实可以在同一个数据包中设置为 1。
但这是一个两阶段的工作:第一阶段(即第一次双向握手)是:
Client ------FIN-----> Server
Client <-----ACK------ Server
此时client一直处于FIN_WAIT_2状态等待Server的FIN。作为一种双向全双工协议(protocol),目前一个方向已经中断,不再发送数据,但接收仍然有效,客户端必须等待另一个“半双工”终止。
Server 发送 FIN 给 Client,Client 响应 ACK 终止连接。
结束语:2和3不能合并为一个包,因为它们属于不同的状态。但是,如果服务器在收到来自客户端的 FIN 时没有更多数据或根本没有数据要发送,则可以将 2 和 3 合并到一个包中。
引用资料:
关于tcp - 为什么 tcp 终止需要 4 次握手?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46212623/