• TCP协议-连接建立和释放


    三次握手:

    (1)客户端向服务器端TCP请求连接,向服务器端发送控制位SYN=1,序号seq=x的请求报文。(x是随机产生的,且不能为0)

    (2)服务器端接收到请求报文后,若同意建立连接,则向客户端发送控制位SYN=1,ACK=1,确认号ack=x+1,序号seq=y的请求确认报文。

    (3)客户端接收到确认报文后,向服务器端发送控制位ACK=1,序号seq=x+1,确认号ack=y+1的确认报文。TCP连接建立完成。

    四次挥手:

      客户端和服务器端都可以主动提出释放请求,下面以客户端为主

    (1)当客户端主动释放TCP连接时,停止发送数据,向服务器端发送控制位FIN=1,序号=u的请求报文。(u等于客户端发送的最后一个字节的序号加1)

    (2)服务器端接收到请求报文后,向客户端发送ACK=1,确认号ack=u+1,序号=v的确认报文。(v等于服务器发送的最后一个字节序号加1)

    (3)当服务器端数据都发送完毕后,服务器会向客户端发送控制位FIN=1,ACK=1,序号为w,ack=u+1的请求报文(w取决于在“半关闭”状态,服务器是否发送过数据报文)

    (4)客户端在接收到请求报文后,向服务器发送ACK=1,序号seq=u+1,确认序号ack=w+1的确认报文。TCP连接释放完毕。

    Q1:为啥要三次握手?两次不可以吗?

      TCP协议通信的双方,都维护着有一个初始序列号,以标识发送出去。 如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认,无法达成一致。

    Q2:四次挥手如果改为三次怎么样?
      TCP连接是全双工,服务器端接收到FIN说明客户端没有数据再发送过来,此时客户端处于半关闭状态。但服务器端自己还可以发送数据或还有数据没发完。前两次只是确认了关闭一个方向的数据,再加上后两次挥手才真正关闭整个TCP连接。

    知识补充:

    TCP连接和释放的工作原理图如下:

     (1)状态的改变

      连接建立:

      客户端状态:      CLOSE(关闭)=>SYN-SEND(准备发送)=>ESTABLISHED(已建立连接)

      服务器端状态:LISTEN(收听)=>SYN-RCVD(准备接收)=>ESTABLISHED(已建立连接)

      连接释放:FIN-WAIT-1(释放等待-1)=> FIN-WAIT-2(半关闭)=>TIME-WAIT(计时等待)=>CLOSE(关闭)

      客户端状态:CLOSE-WAIT(关闭等待)=>LAST-ACK(最后确认)=>CLOSE(关闭)=>LISTEN(收听)

    (2)连接请求报文的序号(ISN)seq值是随机产生的,但是不能为0。

    原因:(1)增加安全性,避免被攻击者猜测到,被第三方伪造的RST报文Reset。

       (2)避免因TCP连接非正常断开而可能引起的混乱。如果在连接突然中断时,可能有一个或两个进程同时等待对方的确认应答,而这个时候有一个新连接的序号也是从0开始,那么接收进程就有可能认为是对方重传的报文,有可能造成连接过程的错误。

    (3)为什么要time wait,为什么是2msl?

      TCP关闭一个连接时,它并不认为这个连接马上就真正地关闭。采用延迟2MSL(最长报文寿命)时间,确保服务器在最后阶段发送给客户端的数据,以及客户端发送给服务器最后一个“ACK”报文都能正确地被接收(包括错误重传时间),防止因个别报文传输错误导致连接释放失败。

  • 相关阅读:
    Linux内核网络协议栈优化总纲
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 判断字符位置
    Java实现 蓝桥杯VIP 算法训练 链表数据求和操作
  • 原文地址:https://www.cnblogs.com/GuixinChan/p/10591593.html
Copyright © 2020-2023  润新知