zoukankan      html  css  js  c++  java
  • 关于3次握手4次挥手总结

    序号:表示发送的数据字节流,确保TCP传输有序,对每个字节编号

        确认序号:发送方期待接收的下一序列号,接收成功后的数据字节序列号加 1。只有ACK=1时才有效。

        ACK:确认序号的标志,ACK=1表示确认号有效,ACK=0表示报文不含确认序号信息

        SYN:连接请求序号标志,用于建立连接,SYN=1表示请求连接

        FIN:结束标志,用于释放连接,为1表示关闭本方数据流

    一.3次握手

    第一次:客户端向服务端发送请求

    syn=1  seq=x

    第二次:服务端回应客户端请求

    syn=1 ACK=1 ack=x+1 seq=y

    第三次:客户端确认连接服务器

    syn=1 ACK=1 ack=y+1 seq=x+1

    二.4次分手

    第一次:客户端向服务端发送分手请求

    Fin=1 seq=x

    第二次:服务器回应分手请求

    ACK=1 ack=x+1 seq=y

    第三次:服务器处理完剩余数据回应分手请求

    FIN =1 ACK=1 ack=x+1 seq=z

    第四次:客户端确认分手

    FIN=1 ACK=1 ack=z+1 seq=x+1

     

    为什么“握手”是三次,“挥手”却要四次?

    TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。

    即SYN建立连接报文与ACK确认接收报文是在同一次"握手"当中传输的,所以"三次握手"不多也不少,正好让双方明确彼此信息互通。

    TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。为何建立连接时一起传输,释放连接时却要分开传输?

    建立连接时,被动方服务器端结束CLOSED阶段进入“握手”阶段并不需要任何准备,可以直接返回SYN和ACK报文,开始建立连接。释放连接时,被动方服务器,突然收到主动方客户端释放连接的请求时并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。

    所以是“三次握手”,“四次挥手”。

  • 相关阅读:
    Fibonacci(斐波那契)数列方法整理
    java数组可遍历但是不能作为Iterable参数传递
    欧几里得算法的证明
    List<? extends Pet>中问号的解释
    P1387 最大正方形
    P1313 计算系数
    P1049 装箱问题
    乘积最大
    P1091 合唱队形
    bsgs
  • 原文地址:https://www.cnblogs.com/kyooo/p/13266423.html
Copyright © 2011-2022 走看看