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

    TCP的三次握手/四次挥手

    建立TCP连接的三次握手

    TCP连接的三次握手分别为:

    • 客户端发送一个带SYN标志的TCP报文到服务器,表示告诉服务器我想建立一个连接。
    • 服务器收到客户端的带SYN标志的文后,就给客户端回复一个带ACK标志和带SYN标志的报文,ACK表示回复客户端:OK,我准备好了建立连接;然后SYN表示服务器又问客户端:你准备好建立连接了么?
    • 然后客户端又要发送一个带ACK标志的TCP报文,回答服务器说:我准备好了。
      然后一个TCP连接就建立起来了。

    SYN相当于询问的标志,ACK相当于回复的标志。
    这里有一个问题:为什么最后客户端还要发送一次确认呢?这主要是防止已经失效了的请求报文段突然又传到了服务器,因而产生错误。
    “已经失效了的请求报文段”大致是这样产生的:A发出第一个连接请求报文段并没有丢失,在一些网络结点上面长时间滞留,以致延误到连接释放以后的某个时间才到达B。本来这是一个早已失效的报文段。但B收到这个失效的报文段后,就误以为是A发出的又一次新的连接请求,于是就向A发出确认报文段,同意建立连接,如果不采用三次握手,那么只要B发出确认后,新的连接就建立了。

    简化理解:

    C问:我想和你建立连接可以吗?(SYN标志的报文)

    S答问:可以啊!(ACK标志的响应报文)   那你现在准备好了吗?(SYN标志的报文) 

    C答:准备好了! (ACK标志的响应报文)

    三次: 客户端请求报文    服务端确认询问报文    客户端确认报文

    释放TCP连接的四次挥手

    由于TCP是全双工的,所以在释放TCP连接时,要双方都得单独关闭。意思就是服务器和客户端都要释放连接。原则是某一方主动关闭时,先发一个FIN报文来表示终止这个方向的连接,收到一个FIN报文就意味着这个方向不再有数据流动,但另一个方向仍可以有数据流动,当这一个方向也发送了FIN报文后,那么这一方的连接也可以关闭了。
    释放TCP连接相对于要复杂点,具体释放TCP连接的四次挥手流程如下:

    • A发送一个FIN给B,说:我这边要传给你的数据已经传完了,我要关闭连接了。A进入FIN-WAIT-1状态,等待B确认。
    • B收到了上面的FIN报文后,回复一个ACK报文说:OK。A就关闭了A->B的连接。但是此时B还能给A发送数据,A也能接收B发来的数据。(此时A收到确认后进入FIN-WAIT-2状态。TCP处于半关闭状态)
    • 当B也发送完数据后,就给A发送一个FIN报文说:我这边要传给你的数据也已经传完了,我也要关闭连接了。(B进入LAST-ACK状态,等待A确认)
    • A收到了上面的报文后,回复一个ACK报文说:OK。A进入TIME-WAIT状态。现在TCP连接还没有释放掉,然后经过等待计时器(TIME-WAIT timer)设置的时间2MSL后,A才进入CLOSE状态。

    然后,当A撤销相应的传输控制块TCB后,一个TCP连接就关闭了。

    简化理解:

    C:我要关闭了,发送询问报文。然后开始等待。。。

    S:收到。 然后C就关闭了C ----> S的连接。

    S: 我要关闭了,发送询问报文。然后开始等待。。。

    C:收到。然后S就关闭了S ---> C的连接。      TCP连接关闭。

          但TCP连接还没有释放掉,然后经过等待计时器(TIME-WAIT timer)设置的时间2MSL后,C才进入CLOSE状态。

    转载自:http://www.jianshu.com/p/1f512687ea19

  • 相关阅读:
    大数据量分表时 两个表查询比较快的方式
    开启SQL Server执行占用时间显示和逻辑读取次数显示
    【转】SQL Server海量数据库的索引、查询优化及分页算法
    Exchange无法发送邮件 未找到匹配的连接器来路由外部收件人解决办法
    HTML介绍&常用的标签
    关于HTML文件、JS文件、CSS文件
    python命名空间和作用域
    pymysql
    存储过程、视图、触发器、函数
    多表查询
  • 原文地址:https://www.cnblogs.com/njqa/p/6419632.html
Copyright © 2011-2022 走看看