参考:https://blog.csdn.net/whuslei/article/details/6667471/#commentsedit
socket的建立是全双工的,所以会有三次握手,但是四次挥手的区别。
客户端<------------------------------------------->服务器
握手1,客户端请求服务器建立连接(客户端发);
握手2,服务器同意客户端的请求(客户端发),并要求和客户端也建立连接(客户端收);
握手3,客户端同意服务器的请求(客户端收);
然后,客户端和服务器直接进行数据的收发,
(挥手是客户端和服务器端都可以主动发起的,这里以客户端主动发起为例)
挥手1,客户端告诉服务器要中断客户端发往服务器的这条线(客户端发);
挥手2,服务器应答客户端的中断请求(客户端发),此刻可能存在服务器依旧要给客户端发送数据的可能,所以不能中断服务器发往客户端这条线,因此这里就形成了“三次四次的差别”;
然后,服务器发送数据到客户端,
挥手3,服务器告诉客户端要中断服务器发往客户端的这条线(服务器发);
挥手4,客户端应答服务器的中断请求(服务器发);
四次挥手之后,不是立即断开连接,客户端要等待确认服务器收到了应答信息,即TIME_WAIT。
写过socket程序的人都遇到过,客户端的可执行程序运行结束之后,立刻去再执行这个可执行程序时,会提示这个socket正在被用,过两分钟左右,再执行,就不会有提示了,正是TIME_WAIT的原因。