网络TCP三次握手四次挥手

2019-04-02  本文已影响0人  王哈哈哈哈哈

java_basic

1 TCP 三次握手 (建立连接)

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。

通俗理解1:   
            一次: 客户端发送报文,我们俩要传输数据,我们要连接
            两次: 服务端收到通知,回复好的,
            三次: 客户端收到服务端的答复,开始建立连接  客户端开始发送数据给服务端
        
        
通俗理解2:   买手机的时候试通话功能的时候:

            老机打给新机 : 喂 , 听到了吗 ?
            新机回复老机 : 听到了 , 你听到了吗 ?
            老机 : 听到了听到了 …

2 一次握手,两次握手,四次握手 行不行

一次握手  服务端可能们没有收到响应, 两个没有建立连接
二次握手  客户端也可能没有正确响应   两个无法建立连接
四次握手  多余了

3 TCP 四次挥手 (关闭连接)

第一次挥手: 客户端发送一个FIN,用来关闭客户端到服务器的数据传送,也就是客户端告诉服务器:我已经不 会再给你发数据了
          (当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,客户端依然会重发这些数据),
           但是,此时客户端还可 以接受数据。
           
第二次挥手: 服务器收到FIN包后,发送一个ACK给对方并且带上自己的序列号seq,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)
          此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,
          即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,
          也就是整个CLOSE-WAIT状态持续的时间。
          
第三次挥手:服务器发送一个FIN,用来关闭服务器到客户端的数据传送,也就是告诉客户端,我的数据也发送完了,不会再给你发数据了。由于在半关闭状态,
          服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
          
第四次挥手:主动关闭方收到FIN后,发送一个ACK给被动关闭方,确认序号为收到序号+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。
          注意此时TCP连接还没有释放,必须经过2∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。                   

通俗理解1:   
        一次  客户端发送报文给服务端 我要关闭了
        两次  服务端收到通知就回复我知道了,然后服务端通知应用进程关闭
        三次  服务端告诉客户端我已经处理完毕了 没有数据发送给你了,进入半关闭状态
        四次  客户端收到答复,过2*MSL时间自动关闭,服务端收到客户端的回复 马上就关闭
        
通俗理解2:  
            我走了,下次再约
            好的,下次再约
            拜拜
            拜拜       

4 为什么客户端最后还要等待2MSL?

害怕客户端发出的最后一次ACK在发送的过程中丢包,导致服务器没有关闭连接,浪费服务器的资源

5 为什么建立连接是三次握手,关闭连接确是四次挥手呢?

 TCP 三次握手    TCP 四次挥手  讲解清楚           
上一篇下一篇

猜你喜欢

热点阅读