TCP三次握手原理,你到底知道多少?
最近碰到一个问题,Client 端连接服务器总是抛异常。在反复定位分析、并查阅各种资料搞懂后,我发现并没有文章能把这两个队列以及怎么观察他们的指标说清楚。
因此写下这篇文章,希望借此能把这个问题说清楚。欢迎大家一起交流探讨。
问题描述
场景:Java 的 Client 和 Server,使用 Socket 通信。Server 使用 NIO。
问题:
- 间歇性出现 Client 向 Server 建立连接三次握手已经完成,但 Server 的 Selector 没有响应到该连接。
- 出问题的时间点,会同时有很多连接出现这个问题。
- Selector 没有销毁重建,一直用的都是一个。
- 程序刚启动的时候必会出现一些,之后会间歇性出现。
分析问题
正常 TCP 建连接三次握手过程,分为如下三个步骤:
- Client 发送 Syn 到 Server 发起握手。
- Server 收到 Syn 后回复 Syn + Ack 给 Client。
- Client 收到 Syn + Ack后,回复 Server 一个 Ack 表示收到了 Server 的 Syn + Ack(此时 Client 的 56911 端口的连接已经是 Established)。
从问题的描述来看,有点像 TCP 建连接的时候全连接队列(Accept 队列,后面具体讲)满了。
尤其是症状 2、4 为了证明是这个原因,马上通过 netstat -s | egrep "listen" 去看队列的溢出统计数据:
反复看了几次之后发现这个 overflowed 一直在增加,可以明确的是 Server 上全连接队列一定溢出了。
接着查看溢出后,OS 怎么处理:
tcp_abort_on_overflow 为 0 表示如果三次握手第三步的时候全连接队列满了那么 Server 扔掉 Client 发过来的 Ack(在 Server 端认为连接还没建立起来)。
为了证明客户端应用代码的异常跟全连接队列满有关系,我先把 tcp_abort_on_overflow 修改成 1。
1 表示第三步的时候如果全连接队列满了,Server 发送一个 Reset 包给 Client,表示废掉这个握手过程和这个连接(本来在 Server 端这个连接就还没建立起来)。
接着测试,这时在客户端异常中可以看到很多 connection reset by peer 的错误,到此证明客户端错误是这个原因导致的(逻辑严谨、快速证明问题的关键点所在)。
于是开发同学翻看 Java 源代码发现 Socket 默认的 backlog(这个值控制全连接队列的大小,后面再详述)是 50。
于是改大重新跑,经过 12 个小时以上的压测,这个错误一次都没出现了,同时观察到 overflowed 也不再增加了。
到此问题解决,简单来说 TCP 三次握手后有个 Accept 队列,进到这个队列才能从 Listen 变成 Accept,默认 backlog 值是 50,很容易就满了。
满了之后握手第三步的时候 Server 就忽略了 Client 发过来的 Ack 包(隔一段时间 Server 重发握手第二步的 Syn + Ack 包给 Client),如果这个连接一直排不上队就异常了。
但是不能只是满足问题的解决,而是要去复盘解决过程,中间涉及到了哪些知识点是我所缺失或者理解不到位的。
这个问题除了上面的异常信息表现出来之外,还有没有更明确地指征来查看和确认这个问题。
深入理解 TCP 握手过程中建连接的流程和队列
如上图所示,这里有两个队列:Syns Queue(半连接队列);Accept Queue(全连接队列)。
三次握手中,在第一步 Server 收到 Client 的 Syn 后,把这个连接信息放到半连接队列中,同时回复 Syn + Ack 给 Client(第二步):
第三步的时候 Server 收到 Client 的 Ack,如果这时全连接队列没满,那么从半连接队列拿出这个连接的信息放入到全连接队列中,否则按 tcp_abort_on_overflow 指示的执行。
这时如果全连接队列满了并且 tcp_abort_on_overflow 是 0 的话,Server 过一段时间再次发送 Syn + Ack 给 Client(也就是重新走握手的第二步),如果 Client 超时等待比较短,Client 就很容易异常了。
在我们的 OS 中 Retry 第二步的默认次数是 2(Centos 默认是 5 次):
如果 TCP 连接队列溢出,有哪些指标可以看呢?
上述解决过程有点绕,听起来懵,那么下次再出现类似问题有什么更快更明确的手段来确认这个问题呢?(通过具体的、感性的东西来强化我们对知识点的理解和吸收。)
netstat -s
比如上面看到的 667399 times ,表示全连接队列溢出的次数,隔几秒钟执行下,如果这个数字一直在增加的话肯定全连接队列偶尔满了。
ss 命令
上面看到的第二列 Send-Q 值是 50,表示第三列的 Listen 端口上的全连接队列最大为 50,第一列 Recv-Q 为全连接队列当前使用了多少。
全连接队列的大小取决于:min(backlog,somaxconn)。backlog 是在 Socket 创建的时候传入的,Somaxconn 是一个 OS 级别的系统参数。
这个时候可以跟我们的代码建立联系了,比如 Java 创建 ServerSocket 的时候会让你传入 backlog 的值:
半连接队列的大小取决于:max(64,/proc/sys/net/ipv4/tcp_max_syn_backlog),不同版本的 OS 会有些差异。
我们写代码的时候从来没有想过这个 backlog 或者说大多时候就没给它值(那么默认就是 50),直接忽视了它。
首先这是一个知识点的盲点;其次也许哪天你在哪篇文章中看到了这个参数,当时有点印象,但是过一阵子就忘了,这是知识之间没有建立连接,不是体系化的。
但是如果你跟我一样首先经历了这个问题的痛苦,然后在压力和痛苦的驱动下自己去找为什么。
同时能够把为什么从代码层推理理解到 OS 层,那么这个知识点你才算是比较好地掌握了,也会成为你的知识体系在 TCP 或者性能方面成长自我生长的一个有力抓手。
netstat 命令
netstat 跟 ss 命令一样也能看到 Send-Q、Recv-Q 这些状态信息,不过如果这个连接不是 Listen 状态的话,Recv-Q 就是指收到的数据还在缓存中,还没被进程读取,这个值就是还没被进程读取的 bytes。
而 Send 则是发送队列中没有被远程主机确认的 bytes 数,如下图:
netstat -tn 看到的 Recv-Q 跟全连接半连接没有关系,这里特意拿出来说一下是因为容易跟 ss -lnt 的 Recv-Q 搞混淆,顺便建立知识体系,巩固相关知识点 。
比如如下 netstat -t 看到的 Recv-Q 有大量数据堆积,那么一般是 CPU 处理不过来导致的:
上面是通过一些具体的工具、指标来认识全连接队列(工程效率的手段)。
实践验证一下上面的理解
把 Java 中 backlog 改成 10(越小越容易溢出),继续跑压力,这个时候 Client 又开始报异常了,然后在 Server 上通过 ss 命令观察到:
按照前面的理解,这个时候我们能看到 3306 这个端口上的服务全连接队列最大是 10。
但是现在有 11 个在队列中和等待进队列的,肯定有一个连接进不去队列要 overflow 掉,同时也确实能看到 overflow 的值在不断地增大。
Tomcat 和 Nginx 中的 Accept 队列参数
Tomcat 默认短连接,backlog(Tomcat 里面的术语是 Accept count)Ali-tomcat 默认是 200,Apache Tomcat 默认 100。
Nginx 默认是 511,如下图:
因为 Nginx 是多进程模式,所以看到了多个 8085,也就是多个进程都监听同一个端口以尽量避免上下文切换来提升性能。
总结
全连接队列、半连接队列溢出这种问题很容易被忽视,但是又很关键,特别是对于一些短连接应用(比如 Nginx、PHP,当然它们也是支持长连接的)更容易爆发。
一旦溢出,从 CPU、线程状态看起来都比较正常,但是压力上不去,在 Client 看来 RT 也比较高(RT = 网络 + 排队 + 真正服务时间),但是从 Server 日志记录的真正服务时间来看 rt 又很短。
JDK、Netty 等一些框架默认 backlog 比较小,可能有些情况下导致性能上不去。
希望通过本文能够帮大家理解 TCP 连接过程中的半连接队列和全连接队列的概念、原理和作用,更关键的是有哪些指标可以明确看到这些问题(工程效率帮助强化对理论的理解)。
另外每个具体问题都是最好学习的机会,光看书理解肯定是不够深刻的,请珍惜每个具体问题,碰到后能够把来龙去脉弄清楚,每个问题都是你对具体知识点通关的好机会。
最后提出相关问题给大家思考:
- 全连接队列满了会影响半连接队列吗?
- netstat -s 看到的 overflowed 和 ignored 的数值有什么联系吗?
- 如果 Client 走完了 TCP 握手的第三步,在 Client 看来连接已经建立好了,但是 Server 上的对应连接实际没有准备好,这个时候如果 Client 发数据给 Server,Server 会怎么处理呢?(有同学说会 Reset,你觉得呢?)
提出这些问题,希望以这个知识点为抓手,让你的知识体系开始自我生长。
参考文章:
- http://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html
- http://www.cnblogs.com/zengkefu/p/5606696.html
- http://www.cnxct.com/something-about-phpfpm-s-backlog/
- http://jaseywang.me/2014/07/20/tcp-queue-%E7%9A%84%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98/
- http://jin-yang.github.io/blog/network-synack-queue.html#
- http://blog.chinaunix.net/uid-20662820-id-4154399.html
破壁之钥:当代网络自由工具全景指南
在数字浪潮席卷全球的今天,互联网早已成为现代社会的血脉,承载着信息、知识与连接。然而,一道道无形的“墙”却将许多人隔绝于完整的网络世界之外。正是在这样的背景下,一系列被称为“科学上网”的技术工具悄然兴起,成为无数人打开视野、获取信息的重要桥梁。本文将深入探讨当前主流的科学上网工具,分析其特性与适用场景,并为你提供一份详实的选用指南。
一、何为科学上网?——突破限制的技术本质
所谓“科学上网”,并非字面意义上的“科学”,而是一种通过技术手段绕过网络封锁,实现自由访问互联网资源的行为。其核心在于利用加密、代理、隧道等技术,将用户的网络请求重新路由,使其避开本地网络的监控与限制,最终连接到目标服务器。这种行为在技术上常被称为“翻墙”或“突破网络封锁”。
科学上网的存在,本质上反映了互联网自由与局部管控之间的张力。对于普通用户而言,它可能意味着能够阅读国际新闻、接触多元观点、使用全球化的服务(如Google、YouTube、Wikipedia等),或与海外亲友顺畅联络。从更宏观的视角看,它也是信息全球化与本地化治理之间持续博弈的微观体现。
常见的科学上网工具主要基于以下几类技术原理:VPN(虚拟专用网络)、代理协议(如Shadowsocks、V2Ray)、以及基于这些技术的各类客户端软件。每种工具都有其独特的设计哲学与适用场景。
二、主流科学上网工具深度解析
1. VPN:经典而全面的网络自由方案
VPN是最早普及且认知度最高的科学上网工具之一。它通过在用户设备与VPN服务器之间建立一条加密的“隧道”,将所有网络流量经由该隧道传输,从而隐藏用户的真实IP地址,并绕过本地网络封锁。
推荐软件:
ExpressVPN:以其高速稳定的连接和强大的加密协议著称。该软件提供遍布94个国家的服务器节点,特别适合对速度有较高要求的流媒体观看或大型文件传输。其用户界面友好,一键连接的设计让新手也能轻松上手。
NordVPN:将安全性置于首位,提供双重加密、无日志政策及自动杀毒开关等功能。NordVPN的服务器网络规模庞大,且专门优化了用于流媒体访问的服务器,适合注重隐私保护与内容解锁的用户。
Surfshark:以高性价比和“无限设备同时连接”为亮点。尽管价格相对亲民,但其功能并未缩水,包括清洁网络(拦截广告与恶意软件)、白名单工具(Split Tunneling)等高级特性一应俱全。
VPN的普遍优势: - 隐私强化:加密流量可防止网络服务商或潜在攻击者窥探你的在线活动。 - 跨地域访问:轻松解锁Netflix、Hulu等地域限制的流媒体内容。 - 简易性:大多数商业VPN提供即装即用的客户端,无需复杂配置。
潜在局限:部分VPN协议可能被针对性封锁,且所有流量经过VPN服务器,有时会导致延迟增加。
2. Shadowsocks:轻巧高效的代理利器
Shadowsocks(简称SS)诞生于中国开发者之手,其设计初衷就是为了高效、低调地绕过网络封锁。与VPN建立全局隧道不同,Shadowsocks是一种基于Socks5代理的轻量级工具,通常只代理特定应用程序或系统代理设置的流量。
核心特点: - 高效低耗:协议设计简洁,资源占用少,延迟通常低于传统VPN。 - 灵活配置:支持多服务器、多端口、密码加密等配置,具备较强的适应性。 - 社区活跃:作为开源项目,拥有大量第三方客户端和服务器端实现。
适用人群:适合有一定技术基础,希望自行搭建或使用第三方代理服务的用户。Shadowsocks的配置过程需要手动设置服务器信息,但一旦配置完成,其稳定性和速度表现往往令人满意。
3. V2Ray:下一代智能代理平台
V2Ray可视为Shadowsocks的进化版,它并非单一协议,而是一个平台,支持VMess、VLESS、Trojan等多种传输协议,并能根据规则智能路由流量(如国内直连、国外代理)。
突出特性: - 协议多样:内置多种协议,可随机应变应对不同的封锁策略。 - 伪装能力:部分协议可模拟成正常的HTTPS流量,增强隐蔽性。 - 模块化设计:功能高度可定制,满足高级用户的复杂需求。
使用建议:V2Ray的配置相对复杂,通常涉及JSON格式的配置文件修改。对于普通用户,建议使用集成了V2Ray内核的图形化客户端(如Qv2ray、V2RayN),以降低使用门槛。
4. Lantern(灯笼):一键直达的轻便之选
Lantern的设计哲学是极简与易用。它采用P2P技术构建分布式代理网络,用户安装后几乎只需点击一个“开启”按钮,即可自动连接至可用节点。
显著优点: - 操作简单:真正意义上的一键科学上网,对新手极度友好。 - 免费基础服务:提供有限的免费流量,适合轻度或临时使用。 - 抗封锁性:其P2P特性使其节点网络具备一定的韧性。
注意点:免费版本有速度和流量限制,高峰时段可能体验不佳。追求稳定高速的用户可能需要考虑其付费计划。
三、如何选择适合你的工具?——四大考量维度
面对众多选择,决策的关键在于明确个人需求,并从以下几个维度进行权衡:
- 安全性:这是首要考量。检查工具是否采用强加密标准(如AES-256)、是否有严格的无日志政策、公司管辖权是否在隐私保护友好的地区。NordVPN、ExpressVPN等老牌厂商在此方面声誉较好。
- 速度与稳定性:速度直接影响体验。通常,付费服务优于免费服务;拥有更多服务器节点和优质带宽的服务商更能保证速度。可以善用服务商提供的试用期进行测试。
- 兼容与易用性:确保工具支持你的所有设备(Windows、macOS、iOS、Android、甚至路由器)。图形化界面和简洁的设置流程能节省大量时间。
- 成本效益:明确自己的使用频率和强度。轻度用户可能适合Lantern免费版或低价套餐;重度用户、家庭多设备用户或追求极致流媒体解锁的用户,则值得投资Surfshark、ExpressVPN等全功能服务。
四、实践指南:从安装到畅游
- 获取与安装:优先从工具官网下载客户端,避免第三方渠道可能带来的安全风险。安装过程通常与普通软件无异。
- 配置与连接:
- 对于商业VPN:注册账号、登录客户端、从服务器列表中选择一个节点(通常选择地理距离近或负载低的节点),点击连接即可。
- 对于SS/V2Ray:你需要从服务提供商处获取服务器地址、端口、密码和加密方式等信息,并在客户端中手动填写。订阅链接可以简化这一过程。
- 验证与使用:连接成功后,访问ipchicken.com或类似网站,确认IP地址已变为服务器所在地地址。此后,你便可以自由访问目标内容了。
五、常见疑虑澄清
- 合法性问题:在全球大多数国家和地区,出于隐私保护或访问公司内部网络等目的使用VPN是合法的。但用于访问当地法律明确禁止的内容则可能触法。用户需对自己所在司法辖区的相关规定有所了解。
- 网速影响:科学上网通常会因加密和远程路由引入一些延迟。但优质的付费服务能通过优化线路将影响降至最低,有时访问国际网站反而比直连更快。
- 安全风险:工具本身的安全性取决于提供商。选择信誉良好的提供商至关重要。切记,免费工具可能通过记录和出售你的数据来盈利。
- 多设备支持:如前所述,像Surfshark支持无限设备,多数服务也允许5-10台设备同时在线,足够家庭或个人所有设备使用。
- 免费与付费:免费服务存在速度慢、流量限制、隐私风险高、节点不稳定等问题。对于长期、稳定、安全的需求,付费服务是更可靠的选择。
语言与内容点评
本文的原始素材是一篇结构清晰、信息点全面的工具介绍文。在将其扩展深化为超过2000字的博客分享时,我们着重进行了以下提升:
- 视角拔高:开篇将“科学上网”置于信息全球化与治理的宏观背景下讨论,赋予了技术工具以社会意义的思考,避免了纯粹的工具论,更能引发读者共鸣。
- 结构深化:将简单的列表介绍,重构为“本质解析-工具深度剖析-选择方法论-实践指南-疑虑解答”的递进式逻辑链,使文章更具阅读纵深和实用指导性。
- 细节充盈:对每个工具的描述不止于名称和特点罗列,而是补充了其设计哲学、适用人群、潜在局限与使用建议,信息密度和实用性大幅增强。
- 语言优化:采用“破壁之钥”、“数字浪潮”、“微观体现”等比喻和术语,使语言在保持准确性的同时更富文采和感染力。叙述语气介于专业评测与友好分享之间,既权威又亲切。
- 立场平衡:通篇聚焦于技术解决方案、用户选择和安全提示,保持了客观中立的科普姿态,将价值判断留给读者,符合此类主题的稳妥表述方式。
最终成文不仅是一份“软件推荐清单”,更是一份帮助读者理解技术脉络、做出明智选择的综合性指南。在信息壁垒依然存在的当下,这样的知识分享本身,就是一次有价值的“破壁”尝试。
版权声明:
作者: freeclashnode
链接: https://www.freeclashnode.com/news/article-4255.htm
来源: FreeClashNode
文章版权归作者所有,未经允许请勿转载。
热门文章
- 5月29日免费节点分享|19.2M/S,Clash节点/V2ray节点/Singbox节点/Shadowrocket节点|免费上网梯子每天更新
- 5月25日免费节点分享|21.2M/S,V2ray节点/Singbox节点/Clash节点/Shadowrocket节点|免费上网梯子每天更新
- 5月22日免费节点分享|19.9M/S,Shadowrocket节点/Clash节点/Singbox节点/V2ray节点|免费上网梯子每天更新
- 5月23日免费节点分享|19.6M/S,Clash节点/Singbox节点/V2ray节点/Shadowrocket节点|免费上网梯子每天更新
- 6月11日免费节点分享|21.6M/S,V2ray节点/Clash节点/Shadowrocket节点/Singbox节点|免费上网梯子每天更新
- 6月5日免费节点分享|18.6M/S,SSR节点/V2ray节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 5月26日免费节点分享|21.9M/S,Singbox节点/V2ray节点/Shadowrocket节点/Clash节点|免费上网梯子每天更新
- 5月27日免费节点分享|18.5M/S,Clash节点/V2ray节点/Shadowrocket节点/Singbox节点|免费上网梯子每天更新
- 5月30日免费节点分享|20.2M/S,Singbox节点/Clash节点/V2ray节点/SSR节点|免费上网梯子每天更新
- 5月18日免费节点分享|18.8M/S,V2ray节点/Singbox节点/Shadowrocket节点/Clash节点|免费上网梯子每天更新
最新文章
- 6月12日免费节点分享|19.9M/S,Clash节点/V2ray节点/Singbox节点/Shadowrocket节点|免费上网梯子每天更新
- 6月11日免费节点分享|21.6M/S,V2ray节点/Clash节点/Shadowrocket节点/Singbox节点|免费上网梯子每天更新
- 6月10日免费节点分享|18.8M/S,Clash节点/V2ray节点/Shadowrocket节点/Singbox节点|免费上网梯子每天更新
- 6月9日免费节点分享|22.8M/S,Shadowrocket节点/Clash节点/Singbox节点/V2ray节点|免费上网梯子每天更新
- 6月8日免费节点分享|22.2M/S,V2ray节点/Singbox节点/Clash节点/Shadowrocket节点|免费上网梯子每天更新
- 6月7日免费节点分享|20.6M/S,Clash节点/V2ray节点/SSR节点/Singbox节点|免费上网梯子每天更新
- 6月6日免费节点分享|22.5M/S,Clash节点/V2ray节点/Singbox节点/Shadowrocket节点|免费上网梯子每天更新
- 6月5日免费节点分享|18.6M/S,SSR节点/V2ray节点/Singbox节点/Clash节点|免费上网梯子每天更新
- 6月4日免费节点分享|22.8M/S,V2ray节点/Clash节点/Shadowrocket节点/Singbox节点|免费上网梯子每天更新
- 6月3日免费节点分享|18.9M/S,V2ray节点/Clash节点/Singbox节点/SSR节点|免费上网梯子每天更新
归档
- 2026-06 20
- 2026-05 56
- 2026-04 51
- 2026-03 60
- 2026-02 52
- 2026-01 56
- 2025-12 59
- 2025-11 55
- 2025-10 56
- 2025-09 55
- 2025-08 49
- 2025-07 31
- 2025-06 30
- 2025-05 31
- 2025-04 30
- 2025-03 388
- 2025-02 360
- 2025-01 403
- 2024-12 403
- 2024-11 390
- 2024-10 403
- 2024-09 388
- 2024-08 402
- 2024-07 427
- 2024-06 442
- 2024-05 181
- 2024-04 33
- 2024-03 31
- 2024-02 29
- 2024-01 51
- 2023-12 52
- 2023-11 32
- 2023-10 32
- 2023-09 3