TCP三次握手四次挥手

拜拜、爱过 提交于 2020-03-02 17:57:30

TCP是一个面向连接的协议。无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。下面将详细讨论一个 TCP连接是如何建立的以及通信结束后是如何终止的。

三次握手过程解析

在这里插入图片描述

  1. 请求端(通常称为客户)发送一个 SYN段指明客户打算连接的服务器的端口,以及初始序号(I S N)。这个S Y N段为报文段1。
  2. 服务器发回包含服务器的初始序号的 SYN报文段(报文段2)作为应答。同时,将确认序号设置为客户的ISN加1以对客户的SYN报文段进行确认。一个SYN将占用一个序号。
  3. 客户必须将确认序号设置为服务器的 ISN加1以对服务器的SYN报文段进行确认(报文段3)。
    这三个报文段完成连接的建立。这个过程也称为三次握手( three-way handshake)。

四次挥手过程解析

在这里插入图片描述
建立一个连接需要三次握手,而终止一个连接要经过 4次握手。这由T C P的半关闭(h a l f -c l o s e)造成的。既然一个T C P连接是全双工(即数据在两个方向上能同时传递),因此每个方向必须单独地进行关闭。

1.Client端发起中断连接请求,也就是发送FIN报文。
2.Server端接到FIN报文后,Client端没有数据要发给Server了,如果Server端还有数据发送,则不必急着关闭Socket,可以继续发送数据。
Server发送ACK,告诉Client接收到,并准备关闭。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。
3.当Server端确定数据已发送完成,则向Client端发送FIN报文,告诉Client可以开始关闭连接。
4.Client端收到FIN报文后,就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态。如果Server端没有收到ACK则可以进行重传。Server端收到ACK后,断开连接。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,Client端也可以关闭连接了。

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?
因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?
虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

【问题3】为什么不能用两次握手进行连接?
三次握手可以确保Client端准备好发送数据和Server端准备好接收数据,并且确定序列号;而两次握手无法完成Client发送请求后Server收到回复,Server端有可能并未准备好接收数据。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!