zoukankan      html  css  js  c++  java
  • TCP协议的3次握手建立连接and4次挥手断开连接

    一:学英语

     

    Client: 客户端

     

    Server: 服务端

     

    CLOSED: 关闭,表示主机的连接处于关闭状态。

     

    LISTEN: 监听,表示主机处于监听状态,等待被连接。

     

    SYN: Synchronize Sequence Numbers,同步序列编号。是TCP/IP建立连接时使用的握手信号。

     

    SYN_SEND: Synchronize Sequence Numbers Send,同步序列号已发送。

     

    SYN_RCVD: Synchronize Sequence Numbers Send Received,同步序列号已接收。

     

    ACK: Acknowledge character,确认字符,表示发来的数据已确认接收无误。

     

    ESTABLISHED: 已经建立连接,TCP:连接成功。

     

    FIN_WAIT: Finish Wait,终止等待,请求关闭连接。是TCP/IP关闭连接时使用的挥手信号。

     

    CLOSE_WAIT: 关闭等待,会被动关闭连接。

     

    TIME_WAIT: 时间等待,会主动关闭连接。

     

    LAST_ACK: Last Acknowledge character,最后的确认,确认后,TCP:连接关闭。

     

    二:半连接池

    客户端发送请求后,服务端会先将SYN请求放进半连接池。
    如果半连接池只能存放5个SYN请求,那么第6个SYN请求会无法进入。
    在连接池内的SYN请求并不会马上获得响应,而是像队列一样,先进先出,一个一个地获得服务端的回应。
     

    三:3次握手

     

    1.纯英文(看不懂)版

    • 一开始:客户端(Client) 和 服务端(Server) 都处于 关闭(Closed)状态,服务端(Server) 处于监听状态(Listen)。

    1.客户端(Client) :我请求连接你(SYN=1),我的身份是Client(seq=J)。

    • 此时,客户端(Client) :关闭状态(Closed) ——> 请求已发送状态(SYN_SEND)

    2.服务端(Server) :我收到你的连接请求了(ACK=1),我确认你的身份了(ack=J+1),你可以连接了;我也要连接你(SYN=1),我的身份是(seq=K)。

    • 此时, 服务端(Server) :监听状态(Listen) ——> 请求已接收状态(SYN_SEND)(半连接状态)

    3.客户端(Client) :我也收到你的连接请求了(ACK=1),我确认你的身份了(ack=K+1),你也可以连接了。

    • 此时, 客户端(Client) : 请求已发送状态(SYN_SEND) ——> 连接已建立状态(ESTABLISHED)
    • 之后, 服务端(Server) :请求已接收状态(SYN_SEND) ——> 连接已建立状态(ESTABLISHED)
     

    2.中文(看得懂)版

     

    3.通俗版

    背景:A区和B区之间交通不太好,需要修高速公路(都是单向的)

    ①A区:我是A区,我想要修一条到B区的(单向)高速公路,可以吗?
    ②B区:我知道了,你修吧!我是B区,我也想修一条到A区的(单向)高速公路,可以吗?
    ③A区:我知道了,你修吧!
     

    四:4次挥手

     

    1.纯英文(看不懂)版

    • 一开始:客户端(Client) 和 服务端(Server) 都处于 连接已建立状态(ESTABLISHED)。

    1.客户端(Client) :我数据传完了 请求断开连接(FIN=1),我的身份是Client(seq=J)。

    • 此时,客户端(Client) :连接已建立状态(ESTABLISHED) ——> 终止等待状态1(FIN_WAIT_1)

    2.服务端(Server) :我收到你断开的连接请求了(ACK=1),我确认你的身份了(ack=J+1),你可以断开连接了;我数据还没传完(seq=K)。

    • 此时, 服务端(Server) :连接已建立状态(ESTABLISHED) ——> 关闭等待状态1(CLOSE_WAIT)
    • 此时,客户端(Client) :终止等待状态1(FIN_WAIT_1) ——> 终止等待状态2(FIN_WAIT_2)

    3.服务端(Server) :好了 我数据传完了 请求断开连接(FIN=1),我的身份是Server(seq=L)。

    • 此时, 服务端(Server) :关闭等待状态1(CLOSE_WAIT) ——> 最后确认状态(LAST_ACK)

    4.客户端(Client) :我收到你的断开连接请求了(ACK=1),我确认你的身份了(ack=L+1),你可以断开连接了。

    • 此时, 客户端(Client) : 终止等待状态2(FIN_WAIT_2) ——> 时间等待状态(TIME_WAIT) ——等待2MSL—— 连接关闭状态(CLOSED)
    • 之后, 服务端(Server) :最后确认状态(LAST_ACK) ——> 连接关闭状态(CLOSED)
     

    2.中文(看得懂)版

     

    3.通俗版

    背景:A区和B区中间要建立开发区了,需要拆除高速公路

    ①A区:我是A区 我高速公路上的车辆都清空了,我要拆高速公路了
    ②B区:好的,你拆吧!我还没清空车辆
    ③B区:我是B区,我高速公路上的车辆也清空了,我要拆高速公路了
    ⑤A区:好的,你拆吧!
    每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)
  • 相关阅读:
    [报错]编译报错:clang: error: linker command failed with exit code 1及duplicate symbol xxxx in错误解决方法之一
    修改UISearBar的文字颜色,placehoder颜色及输入框颜色
    designated initializer和secondary initializer是什么?
    设置UIButton的文字居右显示 去掉点击默认置灰效果
    设置UITextField的placeholder的颜色
    Xcode8和iOS10的适配问题
    [转载]做一个 App 前需要考虑的几件事
    git 常用命令行整理
    Xcode中使用GitHub详解
    截取字符串
  • 原文地址:https://www.cnblogs.com/kylin5201314/p/13508188.html
Copyright © 2011-2022 走看看