美文网首页
tcp三次握手以及四次挥手

tcp三次握手以及四次挥手

作者: newway_001 | 来源:发表于2019-06-07 18:43 被阅读0次
    image.png

    三次握手

    三次握手和两次握手相比,优势在哪里?

    第一步: 他要发送一条建立连接的消息告诉对方咱两要通信了
    第二步: 对方收到这个消息后,要回复他一个确认消息
    上面两步(两次握手)做完了,两人才能够通信。

    如果a发给b的请求信息。被阻塞,a收不到b的回信,会再次发送b一个请求通信的信息。

    某一个时间段过后。b收到了a那个阻塞的信息。
    b发送了给a一个确认的信息
    由于此时,a并没有连接请求。所以,a并不会给b通信。
    但是b会一直等待a的信息。。这回浪费cpu资源。
    所以tcp连接中三次握手有其必要性。

    四次挥手

    1.客户端向服务器发送连接释放报文。
    2.服务器接收到后,立刻回一个接收到的请求
    3.等服务器发送完所有数据后,再向服务器发送连接释放报文
    4.客户端收到后,发送最后确认,服务器收到后,进入关闭状态。

    问题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报文。在Client发送出最后
    的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,超时后将会重发FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该
    ACK。 
     Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置
    一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么
    Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL
    (Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时
    间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,
    Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束
    TCP连接。
    

    【问题4】如果已经建立了连接,但是客户端突然出现故障了怎么办?

    TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一
    直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复
    位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的
    任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。
    若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接
    着就关闭连接。
    

    相关文章

      网友评论

          本文标题:tcp三次握手以及四次挥手

          本文链接:https://www.haomeiwen.com/subject/owkvxctx.html