TCP协议之四次挥手
2024-09-08 18:53:37
参考文章 这里
四次挥手过程
四次挥手的过程是全双工的,因此每个方向都必须要进行单独的关闭,这样原则是当一方完成数据发送后发送一个FIN信号给对方,对方收到FIN后就知道这个方向不会再有数据发送过来了,但是仍旧可以发送数据。首先关闭的一方执行主动关闭,另一方执行被动关闭。
- 第一次挥手: Client发送一个FIN,用来关闭比Cient->Server方向数据传输。Client进入FIN_WAIT_1状态。
- 第二次挥手: Server收到FIN后,发送一个ACK给client,确认序号+1 ,随后进入close_wait 状态。
- 第三次挥手: Server 发送一个FIN,用来关闭Client到Server的数据传送, Client进入LAST_ACK状态。
- 第四次挥手: Client收到FIN后,Client进入TIME_WAIT 状态,接着发送一个ACK给Server, 确认收到序号+1,Server进图CLOSED状态完成四次挥手
同时挥手
参考同时关闭的情况
为什么是四次挥手。
客户端再LISTEN状态下,收到简历连接的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。而关闭连接时,收到对方的FIN后仅仅表示对方不再发送数据但是还能接受数据,所以在这之后还可以发送数据给对方,因此在关闭时候ACK和FIN一般都分开发送。
TIME_WAIT状态
a) 主动关闭的一方在发送完对对方的FIN报文确认后会进入TIME_WAIT状态。 TIME_WAIT,页脚2MSL状态。
b)什么是2MSL,MSL是最大报文生存时间。MSL是任何报文被丢弃前报文段在网络中最长的生存时间。2MSL也就是这个时间的两倍。
c) 为什么要使用2MSL时间。主要有两个原因:2MSL
其一,保证发送的ACK会成功发送到对方,如何保证?最后的ACK一旦丢失还会有重传的机会。
其二,防止老旧的报文出现在新的连接当中。如果原来连接的报文在网络内游荡时后在相同的两个端口之间建立起新的连接,这时候报文容易被误解,这时候等待这个时间是让旧的报文赶快小时,防止捣乱。
推荐阅读:
【1】 http://blog.csdn.net/hacker00011000/article/details/52319111
【2】 http://www.jianshu.com/p/a1ebc61ce141
最新文章
- MySQL索引简述
- OpenLayers 3 中Layers的相关知识
- asp.net MVC中使用entity framework出现从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值”的处理
- C++11之thread线程
- Web 使用PostMan提交特殊格式数据
- JavaScript ES6 的 let 和 var 的比较
- jquery 现实多状态控件 (status &; power(2,0)) = power(2,0)
- 在excel批量更改单元格类型后的批量刷新显示
- Apache 日志分析(二)
- thinkphp URL相关
- 【转】IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)
- js获取get方式提交的参数返回json格式数据
- Qt 学习之路:QML 基本元素
- 集合ArrayList案例
- WIZnet推出串口转以太网模块WIZ550S2E
- Warensoft Stock Service Api客户端接口说明
- Spark 1.6升级2.x防踩坑指南
- Java多线程:ThreadLocal
- react-native-android之初次相识
- php判断是否为命令行模式
热门文章
- 一文详解 Linux Crontab 调度任务
- 可持久化栈学习笔记 | 题解 P6182 [USACO10OPEN]Time Travel S
- (9)go-micro微服务Redis配置
- 【Azure Developer】在Github Action中使用Azure/functions-container-action@v1配置Function App并成功部署Function Image
- 学习ASP.NET Core Blazor编程系列二十二——登录(1)
- SpringBoot项目动态定时任务之 ScheduledTaskRegistrar(解决方案一)
- java入门与进阶P-2.3
- vue3 | slots
- Vditor文件上传跨域
- JAVA虚拟机23---JAVA与线程