tcp是面向连接的协议,提供可靠的连接服务,在建立通信前会进行三次握手,以确保双方都能连接通信。在结束通信时,会进行四次挥手。
建立连接,三次握手过程:
首先client给服务器发送一个SYN请求报文;server接收SYN请求后给client发送一个SYN和ACK作为应答,并为此次连接分配空间;client收到ACK后也给server发送一个ACK,并为此次连接分配空间,连接成功,通信开始。
断开连接,四次挥手过程:
注意:关闭端可以是客户端,可以是服务器,这里选客户端。
首先客户端先给服务器发送一个FIN报文(也就是对服务器说:“我这里没有数据发送给你了,我可以随时关闭,但是如果你还有没给我发送的数据,你可以继续发送,等你发送完毕的时候就给我发一个FIN”),然后服务器给客户端发送了ACK确认(“我收到了你的消息”),服务器可以继续传输数据,直到数据发送完成,给客户端发送一个FIN报文(“我也给你发送完成了”),然后客户端也给服务器发送一个ACK确认(“我收到了你的消息”),但是这时客户端仍然有点担心服务器没有关闭连接,所以就进入超时等待模式(TIME_WAIT)(“我还是有点担心你没收到我的消息,我还是等一会吧”),如果服务器没有收到ACK确认可以重传FIN,否则等到等待时间结束,证明服务器已经正常关闭连接了。
分配资源:客户端是在三次握手结束之后分配,服务器是在接受客户端请求再返回一个ACK确认之后分配。
释放资源:客户端是在等待超时(TIME_WAIT)之后释放,服务器是在接收客户端ACK确认信号之后释放(依据以上例子,如果服务器作为关闭端,则结果刚好相反)
问题1:为什么建立连接是三次握手而断开连接是四次挥手?
答:因为建立连接的时候客户端给服务器发送的SYN同步报文,服务器可以立即回复一个SYN+ACK的报文,其中SYN是用来同步的,ACK是用来确认的。但是在关闭的时候,客户端给服务器发送的FIN报文,这时表明客户端已经发送完数据,但是可能服务器还没发送完,就不一定马上关闭socket,而是等到服务器给客户端的数据发送完成之后才关闭。因此需要四步来完成。
问题2:为什么超时等待(TIME_WAIT)是2MSL(报文最大生存时间)?
答:因为发送丢失的报文可能是最后一个ACK报文,所以为了考虑到最糟糕的情况将等待时间设置为最长。所以TIME_WAIT就是为了作为预防传输出错设立的机制。
TCP/IP中的三次握手和四次挥手
最新推荐文章于 2024-09-03 09:58:32 发布