TCP 连接的建立过程

一开始,客户端和服务端都处于 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 连接的断开过程

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

一开始,客户端和服务端都处于 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 英文的缩写,中文可以译为“报文最大生存时间”。

最新文章

  1. InnoDB的WAL方式学习
  2. for 循环 正方形
  3. java数据结构
  4. oracle中rownum和rowid的区别
  5. [Unity2D]2D Mobile Joystick
  6. nodejs 5.2.0文档自翻译——HTTP模块
  7. 学习php常用算法
  8. linux date
  9. BZOJ 3533: [Sdoi2014]向量集( 线段树 + 三分 )
  10. javascript笔记整理(数组对象)
  11. Docker 基本核心原理
  12. configparser_配置解析器
  13. 【转载】Office软件自定义功能区不完全显示修复方法
  14. 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结
  15. Python_collections_Counter计数器部分功能介绍
  16. pyquery的使用
  17. Springboot_StringRedisTemplate配置
  18. HDU1045 Fire Net(DFS枚举||二分图匹配) 2016-07-24 13:23 99人阅读 评论(0) 收藏
  19. Mac OS X Yosemite & Arduino安装CH340 USB转串口驱动
  20. JavaScript---通过正则表达式验证表单输入

热门文章

  1. springboot的核心配置文件
  2. springcloud如何实现服务的注册?
  3. 什么是Hystrix断路器?我们需要它吗?
  4. Spring-boot-菜鸟-快速创建应用
  5. Elasticsearch 中的节点(比如共 20 个),其中的 10 个 选了一个 master,另外 10 个选了另一个 master,怎么办?
  6. idea-spring-boot打包jar/var
  7. java-中的代理
  8. 使用conda管理python环境和包
  9. ACM中的位运算技巧
  10. 显示调用C++中构造函数和析构函数(有什么弊端)