• TCP三次握手具体过程


     

    四次挥手

    1)客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN_WAIT_1(终止等待1)状态。TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。

    2)服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE_WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE_WAIT状态持续的时间。

    3)客户端收到服务器的确认请求后,此时,客户端就进入FIN_WAIT_2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据,版关闭状态,skynet就支持这种半关闭状态,redis,nginx,memeched均不支持)。

    4)服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST_ACK(最后确认)状态,等待客户端的确认。

    5)客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME_WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(报文最大生存时间)(有的是2分钟,有的30s,1s等)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。

    6) 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

     

    (1)三次握手是什么或者流程?四次握手呢?答案前面分析就是。

    (2)为什么建立连接是三次握手,而关闭连接却是四次挥手呢?

    这是因为服务端在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,当收到对方的FIN报文时,

    仅仅表示对方不再发送数据了但是还能接收数据,己方也未必全部数据都发送给对方了,所以己方可以立即close,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送

  • 相关阅读:
    一棵完全二叉树的第7层(根节点为第0层)有12个叶子节点,求整棵树最多有多少个节点和最少有多少个节点
    如何制作rpm离线安装包
    Python 实例教学_ 08_优先队列(Priority Queue)
    npm命令--安装依赖包--用法/详解
    【算法题】反转链表(头插法、C++实现、力扣第206题、剑指offer第24题)
    editplus如何批量删除包含某个字符串的行
    Android 12修改usb tp触摸唤醒
    Linux 常用命令
    Java密码学之数字签名
    【Spring Boot】DataSource数据源的自动配置解析
  • 原文地址:https://blog.csdn.net/m0_49471668/article/details/134062695