网络连接状态

网络连接状态(11种)非常重要这里既包含三次握手中的也包括四次断开中的,所以要熟悉。

  • LISTEN 被动打开,首先服务器需要打开一个socket进行监听,监听来自远方TCP端口的连接请求,等于服务器端执行socket、bind、listen三个函数之后阻塞在accept处。
  • SYN_SENT 表示主动连接,客户端能通过应用程序调用connect()函数进行active open。于是客户端TCP发送一个SYN以请求建立一个连接,之后状态为SYN_SEND,表示已发送一个SYN到服务器端,等待SYN 1+ACK 0响应。
  • SYN_RECV 服务器端收到客户端的SYN 1,然后状态变为SYN_RECV。表示服务器收到了客户端发来的SYN,然后自己也响应了给客户端一个SYN 1+ACK 1,然后等待客户端确认。 这时候客户端过来的连接(属于半连接状态)被放在一个SYN队列里面,SYN泛洪***也是这样的,就是服务器响应了SYN+ACK之后,客户端就不在发送ACK了,然后继续发送SYN,直到把服务器的最大连接数量耗尽。 半连接队列长度是由内核参数tcp_max_syn_backlog来决定的。
  • ESTABLISHED 代表一个打开的连接,客户端收到服务器发送的SYN 1+ACK 1,就变为这个状态,然后向服务器发送ACK,如果服务器收到这个ACK,那么它也变为这个状态。这个状态就是表示连接以及建立,正在或即将传输数据。服务器收到ACK以后就会把半连接从上面提到的SYN队列中删除,然后放到ACCEPT队列中,这时这个半连接的状态就变成了ESTABLISHED。
  • FIN_WAIT1 主动关闭端(可以是服务器也可以是客户端)应用程序调用了close,于是其TCP发出FIN主动关闭请求,也就是四次断开的第一次,之后就进入了FIN_WAIT1状态,等待远程主机的ACK请求。
  • CLOSE_WAIT 被动关闭端(可以是服务器有可以是客户端)收到了对方发来的FIN后,进入该状态,然后发出ACK+1以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序)。这个状态实际上是说客户端告诉服务器我没有请求或者数据要发送了,等待看看服务器或者说是进程还有没有数据要发送,如果有则继续发送,如果没有的话,就发送反向关闭指令。如果服务器大量连接是这个状态就要去查看程序,很有可能是程序设计的问题。
  • FIN_WAIT2 主动关闭端收到ACK+1后,就进入的FIN_WAIT2状态,也就等服务器是否还有数据发来,如果服务器没有数据了,那么服务器就发送的反向关闭指令。也就是反向关闭连接指令FIN1+ACK1。实际上是告诉客户端我的数据发送完了,可以关闭连接了。
  • LAST_ACK 被动关闭端,发送反向结束连接请求FIN 1+ACK 1,然后进入LAST_ACK状态,等待主动关闭端发送ACK。
  • TIME_WAIT 主动关闭端收到FIN 1 +ACK 1后,并进入TIME_WAIT状态,然后发送ACK+1,等待一段时间(2MSL)以确保服务器收到了ACK+1,然后自己进入CLOSED状态。这个阶段主要是客户端为了再次确认一下服务器是否可以关闭连接,因为网络毕竟是不可靠的。对于服务器有大量TIME_WAIT这个问题通常调整sysctl来解决。
  • CLOSING 比较少见,表示等待远程TCP对连接中断的确认。
  • CLOSED 被动关闭端在收到ACK包以后,就进入closed状态,连接结束。

四次断开过程

客户端:发送FIN给服务器表示主动请求断开连接,然后自己进入FIN_WAIT1阶段,等待服务器响应
服务器:收到客户端的FIN请求,发送ACK给客户端表示自己同意断开连接,服务器告诉上层【应用程序】有一个连接要请求断开并且进入CLOSE_WAIT阶段,等待应用程序做好关闭准备,其实就是把还没有传送完的数据传送完毕。
客户端:收到ACK以后进入FIN_WAIT2状态等待服务器发送FIN。
服务器:当应用程序做好关闭连接的准备后则发送FIN给客户端,并且服务器进入LAST_ACK阶段,等待客户端最后确认。
客户端:收到服务器的FIN以后发送ACK表示确认,此时客户端进入TIME_WAIT阶段,它并不是等什么确认而是等一段时间保证ACK可以有足够的时间被服务器收到,这个时间为1-4分钟。之后连接关闭。
服务器:收到客户端的ACK以后关闭连接。

关于MSL时长

任何TCP实现必须选择一个MSL值,有两种规范一种是一个MSL是2分钟,另外一种是30秒,所以这就意味着TIME_WAIT状态的持续时间为1-4分钟。MSL也是IP数据包在互联网上能存活的最长时间。另外我们追踪一个IP包的时候会有跳数概念,最大跳数255,所以即便到达最大跳数也不能超过一个MSL时间。

那为什么等2个MSL而不是1个或者3个呢?

IP数据包的最大存活时长是1个MSL,如果1个MSL内客户端发送的ACK丢了那么服务器肯定会重发最后一个FIN,而最后一个FIN这个数据包的最大存活时间也是1个MSL,所以客户端如果在2MSL时间内又收到服务器发来的FIN,就表示之前客户端发送的ACK确实丢了,这时候客户端会再次发送ACK。所以设置为1个太短,3个没必要。

关于TIME_WAIT的作用

  1. 客户端发送最后的ACK以后,如果服务器端收不到那么服务器会重发FIN,所以在1一个MSL时间内是为了确保客户端可以收到服务器重发的FIN(如果有必要)
  2. 如果在1MSL内服务器没有重发FIN,表示服务器已经收到客户端最后的ACK,那么也就表示双方都正常关闭了连接
  3. 在TIME_WATI阶段,主动关闭的一方不能重新建立一个和之前一样的连接,这是为了避免造成属于上一个连接的数据被归属到这次新连接,所以经过2MSL之后属于之前连接的数据包能到的也就到了不能到的也就被丢弃了,同时对于服务器来说它的应答数据也最多存活1MSL。

为什么上图的主动关闭是客户端

其实任何一方都可以主动关闭,只是我们在实际过程中双方通信肯定有一方作为客户端角色一方作为服务器角色存在,所以这里只是一个角色并不是说服务器不能主动关闭。在这里你需要牢记的是主动关闭和被动关闭的一方各自都会有什么状态。

转载于:https://www.cnblogs.com/rexcheny/p/9573136.html

TCP/IP 四次断开相关推荐

  1. OSI七层与TCP/IP四/五层网络架构

    一.模型 (1)OSI七层模型 开放系统互连参考模型 (Open System Interconnect 简称OSI)是国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的开放系统 ...

  2. 基础(网络知识 二)——OSI七层与TCP/IP四/五层网络架构

    1.  OSI七层理论模型 OSI是Open System Interconnect的缩写,意为开放式系统互联.开放系统互连参考模型 (Open System Interconnect 简称OSI)是 ...

  3. TCP/IP / 四次挥手之状态转换图、过程说明和原因

    一.状态转换图 二.过程说明 1.Client:我要断开连接啦! 2.Server:好的!稍等,我这还有一些数据需要发送给你,等完事我再断开连接哈. --(server 向 client 发送数据) ...

  4. 什么是TCP/IP?-四张图解释TCP/IP四层协议模型

    什么是四层模型 第一层:应用层,主要有负责web浏览器的HTTP协议, 文件传输的FTP协议,负责电子邮件的SMTP协议,负责域名系统的DNS等. 第二层:传输层,主要是有可靠传输的TCP协议,特别高 ...

  5. Effective TCP/IP Programming读书笔记

    技巧1 理解基于连接和无连接协议之间的差异 TCP/IP分为四层,分别是接口层/物理层/链路层-->网络层-->传输层-->应用层 网络层主要就是IP层,该层提供了一个很好的高效的, ...

  6. HTTP—TCP/IP—SOCKET理解及浅析

    一个完整的HTTP请求的过程 此举例为抛砖引玉,引导大家进入思考状态. 当你按输入www.baidu.com ,浏览器接收到这个消息之后,浏览器根据自己的算法识别出你要访问的URL,为您展示出来搜索页 ...

  7. OSI七层协议和TCP/IP四层协议比较

    网络协议设计者不应当设计一个单一.巨大的协议来为所有形式的通信规定完整的细节,而应把通信问题划分成多个小问题,然后为每一个小问题设计一个单独的协议.这样做使得每个协议的设计.分析.时限和测试比较容易. ...

  8. 数据连接linux网络编程之TCP/IP基础(四):TCP连接的建立和断开、滑动窗口

    在写这篇文章之前,xxx已经写过了几篇关于改数据连接主题的文章,想要了解的朋友可以去翻一下之前的文章 一.TCP段格式: TCP的段格式如下图所示 源端口号与目标端口号 源端口号和目标端口号,加上IP ...

  9. TCP/IP协议三次握手与四次握手流程解析

    原文链接地址:http://www.2cto.com/net/201310/251896.html TCP/IP协议三次握手与四次握手流程解析 TCP/IP协议的详细信息参看<TCP/IP协议详 ...

最新文章

  1. NOIP模拟题——dun
  2. 搜索引擎设计实用教程(3)-以百度为例 之三:对百度分词算法的进一步分析
  3. mysql启动错误排查-无法申请足够内存
  4. 应“云”而生--云时代的运维新理念
  5. 二维数组的最大联通子数组和
  6. SpringBoot指南(四)——RESTful风格
  7. Python 使用turtle在画布的随机位置绘制颜色随机的五角星
  8. 佛理(引用别人的东西,怕忘记了不好找,拿来了,哈哈)
  9. 手机4g网速测试用什么软件,测手机4g网速(4g手机上网速度测试)
  10. gst-inspect-1.0 命令详解
  11. youtube打开显示服务器更新,youtube-dl更新出错解决办法
  12. 如何把握云计算时代风口 怎么能掌握云计算技术
  13. 揭秘中国球员十大豪宅
  14. 使用Wifi pineapple(菠萝派)进行Wi-Fi钓鱼攻击
  15. rknn3399pro 2小时入门指南(八)详细教程指导你一步到位训练得到yolov3 rknn模型
  16. 牛客-Mysql实战-按热度排序(前20)
  17. Stetman读paper小记:BackdoorBench - A Comprehensive Benchmark of Backdoor Learning
  18. Win7/8.1免费升级Win10-三种秘钥
  19. 大厂架构师经验分享!致Android高级工程师的一封信,架构师必备技能
  20. 中国名人名言网今天在天csdn开通了

热门文章

  1. 上海交通大学c语言章节作业,上海交通大学级C语言测试题.doc
  2. 不从事编程、学python有用吗-没想到,学会Python即使不做程序员都能月入过万!...
  3. python项目-你肯定想学习的顶级Python项目(附代码)
  4. python基础教程多少钱-厦门厦禾路Python基础教程培训费用多少-泰兴市新闻
  5. python就业方向有哪些-目前Python这么火,Python有哪些就业方向?
  6. python3.6安装教程-Ubuntu16.04安装python3.6详细教程
  7. python好用-Pyzo -- 好用的 Python 轻量级 IDE
  8. python代码大全表解释-python实现顺序表的简单代码
  9. 用python的turtle画圆-怎么用python画圆
  10. php和python哪个工资高-python和php哪个更有前景