zoukankan      html  css  js  c++  java
  • 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”报文都能正确地被接收(包括错误重传时间),防止因个别报文传输错误导致连接释放失败。

  • 相关阅读:
    阿里笔试题—战报交流
    2 基于梯度的攻击——PGD
    1 基于梯度的攻击——FGSM
    0 对抗样本
    自然语言处理 复习笔记 3
    自然语言处理 复习笔记 2
    自然语言处理 复习笔记 1
    GRU
    1*1卷积核的作用
    BP原理
  • 原文地址:https://www.cnblogs.com/GuixinChan/p/10591593.html
Copyright © 2011-2022 走看看