需要具备的基础TCP协议的四次挥手

【目的】 验证FIN_WAIT_2的超时时间

【环境】Ubuntu 20.04 LTS
【工具】python, wireshark
【命令】ss,nc

首先通过python写一个服务端代码

开始接收客户端连接

然后通过nc命令连接服务端

通过wireshark观察到三次握手过程


通过ss命令也能查看到连接情况

这个时候通过nc给服务端发送个字符串(if you like it)数据

通过wireshark也能看到发送的数据

我们再通过服务端接收客户端发送的数据

以上都是正常的逻辑。

接下来在客户端通过CTRL+C断开连接,即客户端主动断开连接.

通过wireshark也能观察到

客户端发送了FIN, 服务端返回了ACK, 客户端进入到FIN_WAIT_2的状态,服务端进入到CLOSE_WAIT状态

通过ss命令也能看到对应的状态

但是过了一小会你再执行ss命令时,你会发现FIN_WAIT_2的状态没有了.

服务端都没有发送FIN, 也没有看到客户端的TIME_WAIT状态. 客户端直接进入到了CLOSED

【原因】
主动关闭连接的一方在进入到FIN_WAIT_2状态之后,在n秒的时间内没有收到对端的FIN包,则主动关闭一方会强制将socket关闭,状态直接进入到CLOSED

查看FIN_WAIT_2的默认超时时间

细心的读者可能会注意到, 服务端会进入到CLOSE_WAIT状态. 再仔细看的话


Recv-Q队列里面有一个字节的数据没有读取.
那么我们读取这个字节看一下是什么

读取到的是空字节,这个空字节产生的原因是之前客户端通过CTRL+C断开连接的时候,服务端内核收到客户端的FIN包之后, 服务端内核通知应用程序, 向应用程序’追加’的一个空字节,表示客户端断开了连接.服务端程序根据读取到的是空字节,就可以知道对端断开了连接.于是服务端也需要断开连接.


再执行ss命令查看

发现之前的CLOSE_WAIT也没有了,正常关闭了.

但是呢,通过wireshark观察


服务端调用close方法后,服务端向客户端发送了FIN,但是客户端已经在FIN_WAIT_2超时时间之后已经关闭了连接,状态已经是CLOSED了.服务端这个时候向一个已经不存在的连接发送FIN,于是客户端向服务端响应了一个RST包.

关于RST的相关知识,可以阅读我的另一篇文章


个人站点
语雀

公众号

FIN_WAIT_2的超时时间相关推荐

  1. TCP套接口的FIN_WAIT_2状态超时

    PROC文件tcp_fin_timeout默认为60秒,内核中相应的变量为init_net.ipv4.sysctl_tcp_fin_timeout,不过其以jiffies表示,默认值为TCP_FIN_ ...

  2. c#程序设定使用期限_C# 给某个方法设定执行超时时间

    在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死. 在这时.我们可以通过Thread.Thread + Invoke(UI)或者是 delegate.Begin ...

  3. ajax默认超时时间多久,请问chrome浏览器的默认超时时间是多久?

    测试时间:2019/02/26 MacOS 环境下,timeout在各浏览器默认值为(以下浏览器都为当前时间最新版本) chrome 72.x 为4min safari 12 为8min firefo ...

  4. Feign Client的各种超时时间设置

    在Spring Cloud微服务架构中,大部分公司都是利用Open Feign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务要进行比较繁杂的业务计算,那 ...

  5. C# 的tcp Socket设置自定义超时时间

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  6. ribbon设置url级别的超时时间

    为什么80%的码农都做不了架构师?>>>    ##序 ribbon的超时设置,只能按转发的serviceId来分的,无法像nginx那样直接在每个转发的链接里头设置超时时间.这里h ...

  7. sudo 密码超时时间

    Centos 没有默认超时时间,所以用一次sudo就需要输入密码. vi /etc/sudoers 添加下面的内容,2表示分钟数(看自己需求更改). Defaults timestamp_timeou ...

  8. nginx+FastCGI到底是谁影响超时时间

    需求: 一个php程序要跑一段时间,但是时间不确定. 问题: 当该php程序运行超过一段时间被强制断开连接. PHP本身超时处理 在 php.ini 中,有一个参数 max_execution_tim ...

  9. 为jQuery的$.ajax设置超时时间

    jQuery的ajax模块封装了非常强大的功能,有时候我们在发送一个ajax请求的时候希望能有一个超时的时间,想让程序在一段时间请求不到数据时做出一些反馈.幸运的是jQuery为我们提供了这样的参数: ...

最新文章

  1. CodeForces 321A Ciel and Robot(数学模拟)
  2. python array 使用创建10万浮点数
  3. 【转】坐标系变换矩阵推导
  4. 计算机和网络老是断开,电脑插上网线还是显示断开连接怎么办
  5. Using Oracle Data Integrator Open Tools
  6. 关于开源产业的5个真相
  7. mysql5.0 linux安装包,LINUX下MYSQL5.0的安装!
  8. Windows Mobile 获取来电号码和屏蔽来电
  9. java初学者,应该怎么去学习?
  10. IDEA 常用快捷键
  11. 腾讯云短信设置流程图文介绍
  12. matlab圆锥曲线,Matlab软件在高中数学圆锥曲线学习过程中应用.doc
  13. 24V转5V降压芯片,24V转3.3V的稳压芯片,中文规格书
  14. QTreeWidgetItem添加自定义数据
  15. python 数据shape的理解
  16. Laravel 上传文件大小改为200M
  17. 二叉树 | 前序遍历
  18. 关于adb shell 检测不到手机的问题解决方案
  19. Immersionbar学习笔记
  20. 苹果十大耐玩单机游戏推荐,粉丝众多,值得玩玩

热门文章

  1. 沈阳大学计算机李华,计算机自适应考试曝光率控制-数学专业毕业论文.pdf
  2. 今日金融词汇---法定许可护城河
  3. 过会10个月,保荐机构主动要求撤销上市保荐,IPO终止
  4. 7种流行PHP编辑器的比较(PHP IDE)
  5. 2019年7月28日 恶心人
  6. 【原创】关于企业或组织实行OKR的心得
  7. java:编写10个线程,第一个线程从1加到10,第二个线程从11加到20……第十个线程从91加到100, 最后再,10个线程结果相加
  8. 【微信开发】---- 公众号支付
  9. 教你“如何巧看黑马测试视频,悄悄成为测试高手?”
  10. 爱你,是一种流泪的幸福