三次握手:
给个小例子(拨打电话):
A:喂,您好,请问能听到吗?
B:可以,你呢?
A:可以。
...
第一次握手:客户端发送 “同步位SYN=1、初始序号seq=x” 给服务器服务器后,进入 “同步发送状态SYN-SEND”;
(服务器知道:客户端发送、服务器接收 均正常)
第二次握手:服务器接收到客户端请求后,发送 “同步位SYN=1、初始序号seq=y、确认报文ACK=1、确认号ack=x+1” 给客户端,进入 “同步收到状态SYN-RCVD”;
(客户端知道:客户端发送、服务器接收、客户端接收、服务端发送 均正常)
第三次握手:客户端接收到服务器确认后,发送 “序号seq=x+1、确认报文ACK=1、确认号ack=x+1” 给服务器,双方进入 “已建立连接状态ESTABLISHED”;
(服务器知道:客户接收、服务器发送 均正常)
总结:所以只有三次握手才能保证双方的发送和接收功能都是正常的。
四次挥手:
第一次挥手:客户端发出 “释放信号FIN=1、初始序号seq=u” 给服务器后,进入 “终止等待1状态FIN-WAIT-1”;
第二次挥手:服务器接收到客户端释放请求后,发出 “初始序号seq=v、确认报文ACK=1、确认号ack=u+1” 给客户端后,进入 “关闭状态CLOSE-WAIT”;
第三次挥手:客户端接收服务器确认后,进入 “终止等待2状态FIN-WAIT-2”,待服务器已经没有要向客户端发送的数据后,再次向客户端发送 “初始序号seq=w、确认报文ACK=1、确认号ack=u+1、释放信号FIN”,而后进入 “最后确认状态LAST-ACK”。
第四次挥手:客户端接收回复后,向服务器发送 “序号seq=u+1、确认报文ACK=1、确认号ack=w+1”。客户端先进入 “时间等待状态TIME-WAIT”,经过2个最长报文段寿命后才进入到 “关闭状态CLOSE”,而服务器收到确认后立刻进入 “关闭状态CLIOSE”。
客户端经过2个最长报文段寿命后才能进入关闭状态:为了保证客户端最后一次发送的确认报文丢失后,服务器超时重传,客户端能再次接收,再次重传确认报文。
连接的时候只需要三次握手而关闭却要四次挥手:这是因为当服务器收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文(其中ACK报文是用来应答的,SYN报文是用来同步的)。但是关闭连接时,当客户端发送FIN报文仅仅表示它不再发送数据了但是还能接收数据,服务器收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,"你发的FIN报文我收到了"。只有等到我服务器端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。