TCP连接作为一种可靠连接,需要两个端点都发送请求和收到确认才可以进行数据通信。
——————————————————————————————————————
建立连接图示:
如图所示,首先客户端需要发送连接请求(Syn为同步报文),服务端接受请求后返回收到确认(Ack为确认报文)。然后客户端收到了服务端返回的ACK报文后也向服务端返回ACK报文,分配资源,至此TCP连接就形成。
断开连接图示:
如图所示,首先客户端需要发送关闭请求(FIN为关闭连接报文),服务端接受请求后返回收到确认(Ack为确认报文)。但此时很可能不会立刻关闭Socket连接,因为很可能服务端有尚未传送完毕的数据。只有等待服务端所有的报文发送完毕后,才向客户端发送FIN报文。 在这个过程中,客户端接收到服务端的ACK报文后,进入等待服务端完成剩余报文传输状态,然后在接受到服务端的FIN报文后,返回一个ACK报文给服务端。但是由于网络是不可靠的,我们必须保证连接关闭,所以此时客户端需要等待最大报文段生存时间,在这段时间内如果没有再收到来自服务端的请求,则说明ACK回复报文发送成功,连接结束。否则说明报文丢失,需要再次重发ACK报文。
举个很好理解的例子: 其实就像是古代和邻国(客户端)通信约好一起打另一个国家一样,邻国写信通知我这件事“我攻打左部,你攻打右部”,我要回信告诉他“你的请求我已经知道了”,同时邻国也需要返回一次来告诉我“现在出兵!” 至此我们完成一次通信,我当然也可以继续给邻国发送确认回信,为了一直确认降低风险无数次都可以,但是最少需要三次。
而结束战争的时候,我们需要进行四次挥手,是因为邻国告诉我“他已经拿下敌国左部,准备收兵”而我在右部还剩下少量敌军尚未解决,我只能告诉他“我收到你的信息了”。那这时候他就需要等待我结束战斗,等到我结束了战斗以后我就告诉他“我已经解决右部了,现在收兵”,然后邻国就回信告诉我“收到”。但是邻国因为担心信使在路上被拦截,所以需要等待多一段时间(最大报文段生存时间),如果在这个时间中,我没回信则说明通讯皆成功,大捷收兵。
这样,应该可以很简单易懂地理解为什么TCP连接需要三次握手,四次挥手了吧。
|