TCP的三次握手和四次挥手······详解

1、三次握手

三次握手是建立连接的过程

如图大致为三次握手的流程图:
TCP的三次握手和四次挥手······详解_第1张图片

当客户端对服务端发起连接时,会先发一个包连接请求数据,去询问能否建立连接,该数据包称为 “SYN”包
TCP的三次握手和四次挥手······详解_第2张图片
然后,如果对方同意连接,那么对方将会回复一个 “SYN+ACK”包

TCP的三次握手和四次挥手······详解_第3张图片

客户端收到后,回复一个 “ACK”包,连接就建立了

TCP的三次握手和四次挥手······详解_第4张图片
因为该过程中,互相发送了三包数据,所以称为 “三次握手”

但是为什么是 “三次握手” , 而不是 “两次握手”,明明服务端回复完 “SYN+ACK”包后就能建立连接

这是为了防止已失效的请求报文,忽然又传到服务器,从而引起错误

比如:
当发送请求包时,因为某些原因,该包并没有到达服务器,在某个节点产生了滞留,然而客户端为了建立连接会重新发送 “SYN”包,正常送达后回复 “SYN+ACK”包建立连接,但是,第一个包滞留的包突然恢复,又送达到服务端,这时服务端会误以为客户端发送了一个连接请求,这时,服务端认为是两个连接,二客户端认为只有一个连接,造成了状态不一致。

如果在 “三次握手”的情况下

客户端没有回复 “ACK”包,就无法建立连接,解决了网络信道不可靠的问题

2、四次挥手

四次挥手大致流程图

第一次挥手

客户端向服务端发送 “FIN”包,表示要关闭连接,自己则进入终止等待1状态,这是第一次挥手,如图

TCP的三次握手和四次挥手······详解_第5张图片

第二次挥手

服务端接收到 “FIN”包 ,回复一个 “ACK”包 ,表示自己进入关闭等待状态,而客户端同时进入终止等待2状态,这是第二次挥手,如图

PS:服务端此时还可以发送未发送的数据,而客户端也还可以接收数据

TCP的三次握手和四次挥手······详解_第6张图片

第三次挥手

待服务端发送完数据后,会发送一个 “FIN”包,进入最后确认状态,这是第三次挥手

TCP的三次握手和四次挥手······详解_第7张图片

第四次挥手

客户端收到后,回复 “ACK”包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到 “ACK”包立即关闭连接

为什么客户端需要 “等待超时时间”

这是为了保证 服务端已收到 “ACK”包,因为假设客户端发送完 “ACK”包后就断开连接,一旦 “ACK”包在网络中丢失,服务端就一直停留在最后确认状态。

而有了 “等待超时时间”

服务端会因为没有收到 “ACK”包,会对客户端重新“FIN”包,此时,客户端会对服务端发送 “ACK”包,并且刷新超时时间,这也是为了在不可靠的网络连接中,可以可靠进行地连接断开。

你可能感兴趣的:(tcp/ip,网络,php)