http协议之三次握手 四次挥手

三次握手:(只能由客户端发起)
    第一次:客户端向服务器发送syn包 请求建立链接  序号 seq = x
    第二次:服务器接到客户端的请求,向客户端发送syn_ack包 告知客户端 允许建立链接 返回序号 ack = seq + 1 = x+1
    第三次:客户端收到服务器端返回的syn_ack包 向服务器发送一个序列号 确认收到服务器的通知  序号:seq = x+1 返回ack = sql + 1

    客户端开始向服务器发送数据

    为什么需要三次握手:
        是为了防止在第二次握手时 服务器向客户端发送syn_ack包的时候 数据发生丢失的现象 如果我们只握手两次的话 服务器无法得知客户端是否已经接收到允许建立链接的通知  在第二次握手后 如果发生数据丢失 客户端将无法收到服务器端的回信 在等待一定时间后,客户端会默认第一次链接失败 会再次发起链接。如果没有第三次握手的话 服务器也是无法确认客户端是否已经正常链接到服务器 所以第一次的链接请求依旧会被服务器保留 这样就可能造成服务器连接资源浪费 因此需要三次握手

四次挥手:
    客户端数据传输/接收结束(挥手的动作 客户端和服务器端都可以发起,此仅以客户端为例)
    第一次:客户端向服务器返送fin 告诉服务器这边已经发送或接受完数据 需要断开链接
    第二次:服务器收到客户端发送的断开链接请求 向客户端返回一个syn+ack包 告诉客户端服务器同意断开链接
    第三次:服务器向客户端发送fin 告诉客户端 服务器即将断开和客户端的链接
    第四次:客户端在收到服务器的fin信息后 会向服务器发送一个ack包 告知服务器客户端同意断开链接

    发送完成后 等待大约2MSL的时间 以便客户端或服务器可以正常接收最后一次的ack包的发送
    断开链接的动作 由谁发起的 谁先断开
    1MSL:指的是ack包的最大存活时间

    为什么需要四次挥手:
        断开链接的动作 是需要链接双方同意的,故在客户端发送一个FIN 告知服务器端客户端将要断开双方链接的时候,服务器会返回给客户端一个ack包 作为确认信息,同样在服务器端断开连接时 也需要重复上述动作




原文地址:https://www.cnblogs.com/lovecatcher/p/12803164.html