zoukankan      html  css  js  c++  java
  • TCP三次握手和四次挥手

       我们知道,TCP是主机对主机层的传输控制协议,提供可靠的连接服务,需要三次握手建立连接,而终止一个连接要经过四次挥手。

    三次握手

    第一次握手:客户端申请连接(SYN=1),发送seq=x的数据包,等待服务器确认。
    第二次握手:服务器端申请连接(SYN=1),确认收到客户端的申请(ACK=1).;服务器期望下次收到x+1数据包(ack=x+1),发送seq=y的数据包。
    第三次握手:客户端确认收到请求(SYN=1),发送服务器期望的数据包(y+1),完成连接。
          

    四次挥手

    第一次挥手:客户端请求断开连接(FIN=1),发送数据(seq=u)。
    第二次挥手:确认收到请求(ACK=1),期望收到数据包(ack=u+1),发送数据(seq=v)。
    第三次挥手:服务器申请断开连接(FIN=1),确认收到你之前的请求(ACK=1);期望收到数据(ack=u+1),发送数据(seq=w)。
    第四次挥手:确认收到请求(ACK=1),发送数据(seq=u+1),断开连接。
          

    为什么需要三次握手?

       如果不采用“三次握手”,那么只要服务器发出确认,新的连接就建立了。由于现在客户端并没有发出建立连接的请求,因此不会理睬服务器的确认,也不会向服务器发送ACK包,但是服务端确认为新的连接开始了,等待客户端发数据,这样就会白白浪费资源。而经过三次握手,客户端和服务器都有应有答,这样可以确保TCP正确连接。

    为什么需要四次挥手?

       在TCP建立连接时,服务器端的SYN和ACK向客户端发送是一次性发送的,而在断开连接的过程中,服务器端向客户端端发送的ACK和FIN是是分两次发送的。因为在服务器端接收到客户端的FIN后,客户端可能还有数据要传输,所以先发送ACK,等客户端处理完自己的事情后就可以发送FIN断开连接了。

    为什么四次挥手后有2MSL的时间等待?

       MSL(Maximum Segment Lifetime),最大报文段生存时间,2个MSL是报文段发送和接收的最长时间。假定网络不可靠,那么第四次发送的ACK可能丢失,即服务器端无法收到这个ACK,如果服务器端收不到这个确认ACK,服务器端会定时向客户端重复发送FIN,直到服务器端收到客户端的确认ACK。所以这个2MSL就是用来处理这个可能丢失的ACK的。

  • 相关阅读:
    RMQ
    LCA 笔记
    LUCAS 定理
    topcoder 643 DIV2
    BZOJ 1071组队
    Codeforces Round #283 (Div. 2)
    topcoder 642
    Codeforces Round #278 (Div. 2)
    树链剖分
    Codeforces Round #277 (Div. 2)
  • 原文地址:https://www.cnblogs.com/flylinux/p/7642657.html
Copyright © 2011-2022 走看看