当连接建立时,有:
客户端------SYN----->服务器
客户端
客户端------ACK----->服务器
当终止到来时,有:
客户端--FIN----->服务器
客户端
客户端
客户端------ACK----->服务器
我的问题是为什么②和③不能像①那样设置在同一个包中,即ACK和SYN设置在一个包中???
经过大量谷歌搜索后,我认识到四次握手实际上是两对双向握手。
如果终止是一个真正的四向操作,则 2 和 3 确实可以在同一数据包处设置为 1。
但这是一个两阶段的工作:第一阶段(即第一次双向握手)是:
Client ------FIN-----> Server
Client <-----ACK------ Server
此时客户端一直处于FIN_WAIT_2状态等待来自服务器的FIN。作为一种双向全双工协议,目前一个方向已经故障,不再发送数据,但接收仍然有效,客户端必须等待另一个“半双工”终止。
当服务器端的 FIN 被发送到客户端时,客户端会响应一个 ACK 来终止连接。
结论:2和3不能合并为一个包,因为它们属于不同的状态。但是,如果服务器在收到客户端的 FIN 后没有更多数据或根本没有数据要发送,则可以将 2 和 3 合并在一个包中。
参考:
- http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm http://www.tcpipguide.com/free/t_TCPConnectionTermination-2.htm
- http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-3.htm http://www.tcpipguide.com/free/t_TCPConnectionEstablishmentProcessTheThreeWayHandsh-3.htm
- http://www.tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF-2.htm http://www.tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF-2.htm
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)