• 计算机网络 | TCP 连接的建立 和 TCP 连接的断开


    TCP 连接的建立过程

    img

    一开始,客户端和服务端都处于 close 状态。

    先是服务端监听某个端口,此时服务端处于 listen 状态。

    这个时候客户端就可以发送连接请求报文了。


    第一次握手

    客户端会主动发送连接请求报文,随机初始化序列号为 x,并把 SYN 标志位设置为 1,表示 SYN 报文。

    客户端发送 SYN 报文后,客户端进入 syn_sent 状态。


    第二次握手

    服务端收到 SYN 报文后,服务端会发送 SYN-ACK 报文,用于「对客户端发送的 SYN 报文进行应答」和「服务端被动请求建立连接」。

    服务端会随机初始化序列号为 y,确认序列号设置为 x + 1,并把 SYN 标志位、ACK 标志位设置为 1。

    服务端发送 SYN-ACK 报文后,服务端进入 syn_receive 状态。


    第三次握手

    客户端收到 SYN-ACK 报文后,客户端会发送 ACK 报文,用于对服务端发送的报文进行应答。

    客户端会将序列号设置为 x + 1,确认序列号设置为 y + 1,ACK 标志位设置为 1。

    客户端发送 ACK 报文后,客户端处于 established 状态。

    当服务端收到 ACK 报文后,服务端进入 established 状态。


    此时 TCP 连接就建立完成了,客户端和服务端就可以相互发送数据了。

    TCP 连接的断开过程

    img

    双方都可以主动请求断开连接,断开连接后,主机中的资源将被释放。

    一开始,客户端和服务端都处于 established 状态。


    第一次挥手

    如果客户端打算断开连接,那么客户端会发送一个 FIN 标志位为 1 的报文,即 FIN 报文。

    客户端发送 FIN 报文后,客户端进入 finish_wait_1 状态。


    第二次挥手

    服务端收到 FIN 报文后,服务端会发送 ACK 应答报文,用于对客户端发送的 FIN 报文进行应答。

    服务端发送 ACK 应答报文后,服务端进入 close_wait 状态。

    客户端收到 ACK 应答报文后,客户端进入 finish_wait_2 状态。


    第三次挥手

    等待服务端处理完数据,服务端被动请求断开连接。

    服务端发送 FIN 报文后,服务端进入 last_ack 状态。


    第四次挥手

    客户端收到 FIN 报文后,客户端会发送 ACK 应答报文,用于对服务端发送的 FIN 报文进行应答。

    客户端发送 ACK 报文后,客户端进入 time_wait 状态。

    当服务端收到 ACK 报文后,服务端进入 close 状态,至此服务端已经完成连接的关闭。

    客户端在经过 2MSL 时间后,自动进入 close 状态,至此客户端也完成了连接的关闭。

    MSL 是 Maximum Segment Lifetime 英文的缩写,中文可以译为“报文最大生存时间”。

  • 相关阅读:
    业务前端界面报错504排查思路和解决办法
    Hadoop总结
    Java爬虫实战系列——常用的Java网络爬虫库
    老问题了:idea中使用maven archetype新建项目时卡住
    八数码+魔板——BFS(最小步数模型)
    记录IFA2023上的中国8K摄像机
    JVM——二、内存结构
    程序设计一_实训4_循环语句训练
    「Java开发指南」MyEclipse如何支持Spring Scaffolding?(三)
    prometheus+nacos服务发现
  • 原文地址:https://www.cnblogs.com/feiyu2/p/tcp_connect.html