阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

关于TCP连接建立与终止那点事

416次阅读
没有评论

共计 1686 个字符,预计需要花费 5 分钟才能阅读完成。

0. 前言

最近在处理公司遗留项目的时候发现自己对 TCP 协议一点都不懂,所以补了点关于 TCP 连接的建立和终止的内容,这里简单写下自己了解的部分,省略了报文序号确认序号这些无关的字段,主要讨论 TCP 状态的转换以及 Linux 下的一些问题。

对于这篇文章来说,主要是记录自己遇到的一些问题以及学习到的一些东西。

关于 TCP/IP 协议,这里推荐一本书:《TCP/IP 协议详解:卷 1》

1. TCP 连接的建立

学过计算机网络的都知道 TCP 连接的建立需要三次握手,当时在大学也这么听着,但是具体怎么三次还是最近补了才知道这么回事。

对于客户端 / 服务器模型来说:

1. 首先客户端发起连接(发送 SYN 报文,进入 SYN_SENT 状态)

2. 服务器接收到 SYN,然后响应(发送 SYN ACK,进入 SYN_RCVD 状态,注意这个时候连接并没有建立)

3. 客户端接受到后,发送确认报文(发送 ACK,进入 Established 状态)

4. 服务器收到后才进入链路建立(Established)状态。

如下图(图为百度搜出来的)

关于 TCP 连接建立与终止那点事

 

2. TCP 连接的终止

对于 TCP 连接的终止来说,却需要四次挥手来完成,这里以客户 / 服务器模型,客户端主动发起关闭来说明 (这里服务器也可以发起主动发起关闭)。

1. 客户端发送 FIN(进入 FIN_WAIT_1 状态)

2. 服务器接收到 FIN 后对发送 ACK 确认(此时服务器进入 CLOSE_WAIT 状态,客户端接受到该 ACK 后由 FIN_WAIT_1 转为 FIN_WAIT_2 状态)

3. 服务器调用 close 发送 FIN(进入 LASK_ACK 状态)

4. 客户端接收到服务器发送的 FIN 后发送 ACK(进入 TIME_WAIT 状态)

5. 服务器接收到后结束(LASK_ACK 状态转为虚拟的 CLOSED,即已经没有状态了)

如下图所示:

关于 TCP 连接建立与终止那点事

 

3. TCP 状态转换

其实如果看懂了上面连接的建立以及终止的话,很容易就可以看懂下面的状态转换图,上面两个就可以看做由它拆解出来的。

关于 TCP 连接建立与终止那点事

 

4. 遇到 CLOSE_WAIT 状态的一些情况

前面说了,最近在维护一些历史遗留的项目,那代码简直是叼炸天了,直接使用两个进程共用一个 select,在 accept 前加上文件锁,select 只监听服务器端 fd,其它 fd 不监听 ….(此处省略一千字),然后现在出现了大量的 CLOSE_WAIT 状态,我在想难道以前就没出现过?奇葩。不过被 DDoS 攻击有些也会出现这种现象。最后讨论了一下午说怎么样才能少改动原来的代码 …. 最后老大拍板,重写 select 部分~^~,使用 epoll 实现。

上面的状态图可以看出,服务器由于接收到客户端发来的 FIN,会进入 CLOSE_WAIT,如果此时没有监听该客户端 fd 并且没有调用 close,那么这时会导致占用的 FD 没有被释放,资源就这么被泄漏掉了,这样也会导致存在大量的 CLOSE_WAIT 状态,以至于后续 FD 消耗完了的时候(一般系统默认 1024),accept 就会失败。(注:这里 CLOSE_WAIT 状态是由于应用程序没有调用 close 导致的,系统不会释放该资源,即会一直存在)

(注:即使 accept 失败,但是对于链路来说,还是能建立成功的,因为对于 Linux TCP 底层实现来说,存在两个队列,一个为半链路队列,另一个为三次握手成功但是没有被服务器 accept 取走的链接的队列。)

后续对于 Linux 下的服务器来说一般都是使用 epoll 来处理,效率比 select 高。

 

5. 补充

这里看到一些博客说通过设置系统参数来改变 CLOSE_WAIT 的维持等待时间,我查阅了一下,并且也尝试过(其实不用试)。不能够通过设置系统参数来更改的,因为这时应用程序内部导致的,,而且根本就不存在说 CLOSE_WAIT 维持时间一说,该状态只有应用程序调用 close 才会转为其它状态(或者关闭应用程序),这里说通过修改系统参数一般指的时 TIME_WAIT 状态的维持时间。

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2015-09/122777.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计1686字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19349
评论数
4
阅读量
7839398
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
使用1Panel面板搭建属于你的AI项目环境

使用1Panel面板搭建属于你的AI项目环境

使用 1Panel 面板搭建属于你的 AI 项目环境 在 AI 项目越来越火的今天,很多朋友都想自己动手搭建一...
每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站-手机博物馆-CHAZ 3D Experience

每天一个好玩的网站 - 手机博物馆 -CHAZ 3D Experience 一句话介绍:一个用 3D 方式重温...
多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞定

多服务器管理神器 Nexterm 横空出世!NAS/Win/Linux 通吃,SSH/VNC/RDP 一站式搞...
星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛 NAS-2:飞牛配置 RAID 磁盘阵列 前言 大家好,我是星哥之前星哥写了《星哥带你玩飞牛 ...
优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器

优雅、强大、轻量开源的多服务器监控神器 在多台服务器同时运行的环境中,性能监控、状态告警、资源可视化 是运维人...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年0.99刀,拿下你的第一个顶级域名,详细注册使用

每年 0.99 刀,拿下你的第一个顶级域名,详细注册使用 前言 作为长期折腾云服务、域名建站的老玩家,星哥一直...
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...