TCP的协议负责计算机之间的网络连接,下面就以一个客户端一个服务器端为例子分析它们之间是如何建立连接和断开连接的。同时也通俗的以小扎和小美谈恋爱和分手为例子进行讲解。
三次握手:
1.第一次握手是客户端发送SYN数据包,并设置seq序列号为j,客户端进入SYNC_SENT状态。
(小扎给小美写信表白)
2.第二次握手是服务器端收到数据包后,返回一个SYN包设置seq=k,同时返回一个ACK的包设置seq=j+1,进入SYN_RCVD状态。
(小美给小扎回信同意建立恋爱关系,小扎收到信后,确认他们之间的通信没有问题)
3.第三次握手是客户端收到ACK后,表示客户端到服务器端的单向连接成功,客户端的状态变为ESTABLISED,同时客户端会对服务器端的SYN包进行应答,返回一个ACK包,seq为k+1。服务器端收到客户端的ACK包后,进入ESTABLISED状态,表示服务器端到客户端的连接成功。
(小扎给小美的回信表示收到了小美的信了,小美收到信后,确认他们之间的通信没有问题)
其中为什么要三次握手,而不是二次呢。这是因为第二次握手只能确认客户端到服务器端的连接是成功,而第三次握手是为了确保客户端能收到服务器端的发送的信息,服务器端到客户端的连接是连接成功。
四次挥手:
1.第一次挥手是客户端发送一个FIN包,表示要断开连接,并设置seq序列号为m到服务器端,客户端进入FIN_WAIT_1状态。
(小扎写分手信给小美,进入等待回信的状态)
2.第二次挥手是服务器端收到客户端的FIN包后,就知道客户端想要断开连接了,于是返回一个ACK包,设置seq为m+1,服务器端进入CLOSE_WAIT状态。服务器端对客户端说,我知道你想要断开连接了,不过先等等,我这还有些数据没发完,你等我发完再关闭。
客户端收到服务器端的确认后,进入FIN_WAIT_2状态,客户端现在只接收服务器端的数据,不再发送数据。
(小美回信给小扎,同意分手,但是东西要整理下再寄给小扎,小扎进入等待包裹状态)
3.第三次挥手是服务器端发送完所有数据之后,发送一个FIN报文,设置seq序列号为n,进入LAST_ACK状态,表示我的数据都已经发送完了,你可以断开连接了。
(小美给小扎寄回包裹,表示我们已经两清了,你收到之后给我回个信,就可以滚蛋了)
4.第四次挥手是客户端收到服务器端的FIN包后,返回一个ACK包,设置seq序列号为n+1,客户端就进入了TIME-WAIT(时间等待)状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态,关闭的连接。
(小扎回信给小美说,你的包裹我收到了,我们以后不用再联系了)
其中为什么要四次挥手呢,第一次挥手表示客户端已经停止发送数据到服务器端了,而第二次挥手是确保服务器端已经知道客户端不会再发送数据,第三次挥手是确保服务器端已经停止发送数据了,最后一个挥手是确保客户端已经知道服务器端不会再发送数据了。