图解TCP四次握手断开连接
建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它让计算机释放不再使用的资源。如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪忧。
建立连接需要三次握手,断开连接需要四次握手,可以形象的比喻为下面的对话:
- [Shake 1] 套接字A:“任务处理完毕,我希望断开连接。”
- [Shake 2] 套接字B:“哦,是吗?请稍等,我准备一下。”
- 等待片刻后……
- [Shake 3] 套接字B:“我准备好了,可以断开连接了。”
- [Shake 4] 套接字A:“好的,谢谢合作。”
下图演示了客户端主动断开连接的场景:
建立连接后,客户端和服务器都处于ESTABLISED
状态。这时,客户端发起断开连接的请求:
1) 客户端调用 close() 函数后,向服务器发送 FIN 数据包,进入FIN_WAIT_1
状态。FIN 是 Finish 的缩写,表示完成任务需要断开连接。
2) 服务器收到数据包后,检测到设置了 FIN 标志位,知道要断开连接,于是向客户端发送“确认包”,进入CLOSE_WAIT
状态。
注意:服务器收到请求后并不是立即断开连接,而是先向客户端发送“确认包”,告诉它我知道了,我需要准备一下才能断开连接。
3) 客户端收到“确认包”后进入FIN_WAIT_2
状态,等待服务器准备完毕后再次发送数据包。
4) 等待片刻后,服务器准备完毕,可以断开连接,于是再主动向客户端发送 FIN 包,告诉它我准备好了,断开连接吧。然后进入LAST_ACK
状态。
5) 客户端收到服务器的 FIN 包后,再向服务器发送 ACK 包,告诉它你断开连接吧。然后进入TIME_WAIT
状态。
6) 服务器收到客户端的 ACK 包后,就断开连接,关闭套接字,进入CLOSED
状态。
关于 TIME_WAIT 状态的说明
客户端最后一次发送 ACK包后进入 TIME_WAIT 状态,而不是直接进入 CLOSED 状态关闭连接,这是为什么呢?
TCP 是面向连接的传输方式,必须保证数据能够正确到达目标机器,不能丢失或出错,而网络是不稳定的,随时可能会毁坏数据,所以机器A每次向机器B发送数据包后,都要求机器B”确认“,回传ACK包,告诉机器A我收到了,这样机器A才能知道数据传送成功了。如果机器B没有回传ACK包,机器A会重新发送,直到机器B回传ACK包。
客户端最后一次向服务器回传ACK包时,有可能会因为网络问题导致服务器收不到,服务器会再次发送 FIN 包,如果这时客户端完全关闭了连接,那么服务器无论如何也收不到ACK包了,所以客户端需要等待片刻、确认对方收到ACK包后才能进入CLOSED状态。那么,要等待多久呢?
数据包在网络中是有生存时间的,超过这个时间还未到达目标主机就会被丢弃,并通知源主机。这称为报文最大生存时间(MSL,Maximum Segment Lifetime)。TIME_WAIT 要等待 2MSL 才会进入 CLOSED 状态。ACK 包到达服务器需要 MSL 时间,服务器重传 FIN 包也需要 MSL 时间,2MSL 是数据包往返的最大时间,如果 2MSL 后还未收到服务器重传的 FIN 包,就说明服务器已经收到了 ACK 包。
图解TCP四次握手断开连接相关推荐
- Wireshark抓包示范:TCP三次握手建立连接和四次握手断开连接
转载请标注: 披萨大叔的博客 http://blog.csdn.net/qq_27258799/article/details/51379508 如果您觉得这篇文章对您有帮助,请点下文章最下面的赞~ ...
- HTTP 三次握手 建立连接 和 四次握手断开连接
三次握手建立连接 第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机: 第二次握手:主机B收到请求后要确认联 ...
- TCP四次握手释放连接
一.四次握手的过程 TCP需要三次握手才能建立连接,整个过程如下图所示: 假设A运行的是TCP客户端进程,而B运行的是TCP服务端进程.最开始的时候两端的TCP进程都处于ESTABLISHED(已建立 ...
- TCP四次挥手断开连接
四次挥手的流程 1.主动关闭方发送FIN连接释放报文段 客户端调用 close 方法,告诉服务器自己要主动关闭连接,会发送一个 FIN 报文给服务端,客户端进入FIN-WAIT-1状态. 2.被动关闭 ...
- 用wireshark抓包分析TCP协议的三次握手连接、四次握手断开
用wireshark抓包分析TCP协议的三次握手连接.四次握手断开 一.TCP三次握手图解 二.TCP得四次挥手过程 三.用Fiddler抓包,分析验证一个HTTPS网站的TCP连接过程 一.TCP三 ...
- TCP网络编程-三次握手建立连接-四次挥手断开连接
客户端与服务器进行TCP通信连接时,要进行三次握手建立连接. 客户端与服务器进行TCP断开连接时,要进行四次挥手断开连接.
- Wireshark图解TCP三次握手与四次挥手
Wireshark图解TCP三次握手与四次挥手 1. TCP 包头结构 2 三次握手 2.1 图解 2.2 使用 tcpdump 和 wireshark 解读三次握手过程 3 四次挥手 3.1 客户端 ...
- TCP的三次握手建立连接和四次握手释放连接
1.socket中TCP的三次握手建立连接详解 我们知道tcp建立连接要进行"三次握手",即交换三个分组.大致流程如下: 客户端向服务器发送一个SYN J 服务器向客户端响应一个S ...
- TCP三次握手建立连接和四次挥手关闭连接
TCP三次握手 是指建立TCP连接协议时,需要在客户端和服务器之间发送三个包,握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据. 第一次握手:客户端发送第一个包,其中S ...
最新文章
- UI设计培训需要学哪些内容
- C++ - A Simple Calculator Program
- 010_jQuery获取和设置内容属性
- javascript事件模型框架
- Java 数组升序降序排列Arrays.sort( )通俗易懂
- Android自动化测试Uiautomator--UiSelector接口简介
- 数组序列化 java_Java基础之数组序列化、反序列化 小发现(不知道 是不是有问题)...
- 如何将EDM营销与多渠道推广方式相结合
- 9.4 LSMW程序创建操作手册 第8 9 10 11步
- SEO按天关键词计费排名查询系统源码
- 有关malloc的一个小点
- 数据结构之删除线性表中的元素
- [连接]研究MSN的一些参考资料(MSNP15)
- re正则表达式7_{}
- AM335X 3款核心板比较
- (附源码)计算机毕业设计SSM基于java学科竞赛管理系统
- CocoaPods 使用小结
- vscode快捷键实现快速换行
- oracle start with connect by order siblings by用法
- 修改设置 打造安全的个人电脑(转)
热门文章
- vc下c语言网络编程,用VC编写C/S消息传送程序
- linux调用一个函数失败 打印错误,linux下settimeofday函数调用失败,何故?解决办法...
- java8压缩,如何使用Java 8压缩多个列表?
- Cauchy-Schwarz Inequality for Integrals for any two functions clarification
- oracle学习笔记(十八) PL/SQL 游标
- next_permutation(start,end)
- Jmeter连接到Mysql
- 【BZOJ1934】善意的投票(网络流)
- asp.net后台调用javascript的方法
- externn C解析