TCP协议(三次握手,四次挥手)

TCP三次握手建立连接:

第一次握手:

建立连接时,客户端发送SYN包到服务器,并进入SYN_SENT状态,等待服务器的确认。

第二次握手:

服务器收到SYN包,必须确认客户端的SYN,同时自己也发送一个SYN包,即SYN+ACK包握手,此时服务器进入SYN_RECV状态。

第三次握手:

客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK ,此包发送完毕,客户端和 服务器都进入ESTABLISTED状态,完成三次 握手。

 TCP四次挥手断开连接:

第一次挥手:

客户端发送一个FIN,用来关闭客户端到服务器的数据传输,客户端进入FIN_WAIT_1状态。

第二次挥手:

扫描二维码关注公众号,回复: 2872662 查看本文章

服务器收到FIN后,发送一个ACK给客户端,服务器进入CLOSE_WAIT状态。

第三次挥手:

服务器发送一个FIN,用来关闭服务器到客户端的数据传输,服务器进入LAST_ACK状态。

第四次挥手:

客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务器,服务器进入CLOSED状态,完成四次挥手。

客户端为什么在TMIE_WAIT后还要等待2MSL时间后才CLOSED ? !
1.为了保证客户端发送的最后一个ACK报文段能够到达服务器。因为这个ACK有可能丢失,从而导致处在LAST_ACK 状态的服务器收不到对FIN-ACK的确认报文 。服务器会超时重传这个FIN-ACK,接着客户端在重传一次确认,重新启动时间等待计时器。最后客户端和服务器都能正常的关闭。假设客户端不等待2MSL,而是在发送完ACK之后直接释放关闭。一但这个ACK丢失的话,服务器就无法正常的进入关闭连接状态。

2.防止已失效的报文段。客户端在发送最后一个ACK之后,再经过2MSL,就可以使本连接在持续时间内所产生的所有报文段都从网络中消失。从而保证在关闭连接后不会有还在网络中滞留的报文段去骚扰服务器。

为什么TIME_WAIT的时间是2MSL?

MSL是TCP报文的最大生存周期,因此TIME_WAIT持续存在2MSL的话,就能保证在两个传输方向上的尚未被接受或迟到的报文段都已经消失否则服务器立刻重启,可能会收到来自上一个进程的迟到的数据,但是这种数据很可能是错误的。

为什么建立连接是三次握手?而关闭连接却是四次挥手?

解释:1)服务器在listen状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到客户端的FIN报文时,仅仅表示对方不再发送数据了但是还能接受到数据,服务器也未必把全部数据都发送给对方了,所以 服务器可以立即关闭,也可以发送一些数据给对方,再发送FIN报文来表示同意现在关闭连接,因此,服务器ACK和FIN一般都会分开发。

        2)因为TCP通信它是全双工的,在服务器收到FIN回复ACK后,此时TCP处于“半关闭”状态,为保证服务器可以继续发送数据,所以第二个FIN并不会伴随着ACK发送,所以连接时多一个报文。

TCP三次握手最后一次连接失败(ACK)如何处理?

答:服务端发给发送方发送一个重制连接RST,就关闭了。

猜你喜欢

转载自blog.csdn.net/ZY_20181010/article/details/81489680