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
iOS Shadowrocket震动功能全解析:从入门到精通的终极指南
在当今数字化浪潮中,网络安全与隐私保护已成为每个互联网用户的首要关切。作为iOS平台上备受推崇的网络代理工具,Shadowrocket以其卓越的性能和丰富的功能赢得了全球用户的青睐。本文将深入剖析Shadowrocket中一个看似简单却极为实用的功能——震动反馈系统,带领读者全面了解其工作原理、配置方法以及使用技巧,帮助您在保护网络隐私的同时,获得更加智能化的使用体验。
Shadowrocket:iOS网络隐私保护的利器
Shadowrocket是一款专为iOS设备设计的高级网络代理工具,它支持包括Shadowsocks、HTTP、HTTPS、SOCKS5等多种协议,能够有效突破网络限制,实现安全、稳定的科学上网体验。不同于普通的VPN应用,Shadowrocket提供了更为精细化的网络控制能力,用户可以自定义路由规则、代理策略,甚至对特定应用进行单独设置,这种灵活性使其成为技术爱好者和隐私重视者的首选工具。
在众多功能中,震动反馈系统虽然看似不起眼,却在实际使用中发挥着重要作用。想象一下,当您正在处理重要工作,突然网络连接中断却毫无察觉,可能导致严重后果。Shadowrocket的震动功能正是为解决这类问题而生,它通过触觉反馈即时通知用户网络状态变化,让您无需频繁查看手机也能掌握连接情况。
震动功能深度解析:不只是简单的振动
Shadowrocket的震动反馈系统绝非简单的"振动一下"那么简单,它是一个经过精心设计的用户交互体系。系统会在三种关键场景下触发震动提示:连接成功时的短促振动让您知道代理已就绪;断开连接时的两次连续振动警示网络中断;连接失败时的长振动则提示您需要检查配置或网络状况。这种差异化的震动模式让用户仅凭触觉就能辨别不同状态,体现了设计者的用心。
从技术角度看,震动功能的实现依赖于iOS系统的触觉引擎(Taptic Engine),这种先进的线性马达能够产生精准、细腻的振动效果。Shadowrocket巧妙地利用了这套系统,在适当的时机调用相应API触发振动,既保证了反馈的及时性,又不会过度消耗系统资源。值得注意的是,震动功能与视觉提示(如状态栏图标变化)和听觉提示(可选)共同构成了一个多维度的状态通知系统,满足不同环境下用户的需求。
逐步指南:激活并优化您的震动体验
要让震动功能发挥最大效用,正确的配置至关重要。以下是详细设置步骤:
基础准备:首先确保您已从官方渠道获取最新版Shadowrocket。由于中国区App Store可能无法直接下载,许多用户选择通过海外账号或TestFlight获取。安装完成后,初次启动时会请求VPN配置权限,务必选择"允许"。
导航至震动设置:进入应用后,点击右下角的"设置"图标(齿轮状),在菜单中找到"通知设置"选项。这里汇集了所有与状态提醒相关的配置项,震动功能便位于其中。
精细调节:在震动设置界面,您会发现多个可定制选项:
- 全局开关:启用或禁用所有震动反馈
- 连接成功震动:单独控制连接成功时的振动
- 断开连接震动:自定义断开时的振动模式
- 连接失败震动:设置失败提醒的振动强度
- 振动模式:可选择预设振动节奏或创建自定义模式
情景模式设置(进阶功能):在最新版本中,用户甚至可以创建基于时间或位置的情景模式。例如,设置工作日9:00-18:00启用强烈震动,其他时间则使用温和提醒,或者当连接到家庭WiFi时完全关闭震动以节省电量。
测试与校准:配置完成后,建议使用界面底部的"测试震动"按钮验证效果。如果感觉振动过于强烈或微弱,可返回调整强度参数,直到找到最适合的触感。
专业级使用技巧:让震动功能事半功倍
掌握了基本设置后,以下进阶技巧将帮助您将震动功能的价值最大化:
多设备协同策略:如果您同时使用iPhone和iPad,可以在两台设备上设置不同的震动模式。例如,iPhone使用标准模式便于外出时感知,iPad则采用更轻微的振动适合安静环境。这种区分让您立即知道是哪个设备出现了连接问题。
状态组合识别:配合状态栏图标颜色变化(绿色表示连接中,红色表示断开),震动反馈形成了双重确认机制。当感觉到振动时,只需瞥一眼状态栏颜色就能完全确认当前状态,无需打开应用界面。
省电优化方案:虽然震动本身耗电极少,但长期使用仍需注意。建议开启"仅在充电时震动"选项,或设置每日震动次数上限(最新版本支持)。结合iOS的专注模式,可以实现在会议、睡眠期间自动关闭震动,避免干扰。
故障排查锦囊:若发现震动功能异常,可按照以下步骤排查:检查系统静音开关是否关闭;确认iOS设置中Shadowrocket的通知权限已开启;尝试重启应用或设备;如问题依旧,考虑重置应用偏好设置或重新安装应用。
常见疑问权威解答
Q:震动功能会显著消耗电池吗? A:经过专业测试,即使全天候启用震动功能,对iPhone电池的影响也不到1%。现代iOS设备的Taptic Engine经过高度优化,单次震动能耗极低,用户完全无需担心电量问题。
Q:为什么有时连接变化却没有震动? A:这通常由以下原因导致:系统处于低电量模式自动禁用非必要振动;应用被iOS强制休眠;或者用户误开启了"仅WiFi下震动"选项。检查这些设置后,问题通常都能解决。
Q:能否自定义特殊的震动节奏? A:目前Shadowrocket尚未开放完全自定义震动模式的功能,但提供了5种预设节奏可选。越狱设备用户可以通过修改配置文件实现更复杂的震动序列,但不建议普通用户尝试。
Q:震动功能是否涉及隐私风险? A:绝对安全。震动功能完全运行在本地设备上,不会收集或上传任何用户数据。所有触发逻辑都在设备端完成,符合Shadowrocket一贯的隐私保护原则。
专业点评:小功能背后的大智慧
Shadowrocket的震动反馈系统堪称人机交互设计的典范。在表面简单的功能之下,蕴含着对用户需求的深刻洞察和精巧的技术实现。从交互设计角度看,它完美遵循了"不打扰但总在"的原则——通过触觉而非视觉或听觉传递信息,既确保了及时性,又避免了不必要的干扰,这种设计哲学值得所有工具类应用借鉴。
从技术实现层面分析,震动功能展示了Shadowrocket团队对iOS系统特性的娴熟掌握。他们不仅利用了基础的振动API,还针对不同机型(如配备Taptic Engine的新款iPhone和采用传统马达的老款设备)做了差异化适配,确保在各种设备上都能提供一致的优质体验。这种对细节的执着正是Shadowrocket在竞争激烈的VPN市场中脱颖而出的关键。
尤为难得的是,震动功能虽然技术含量高,但使用门槛却极低。开发者通过精心设计的默认设置和直观的调节选项,让技术小白也能轻松享受专业级的功能体验,这种"复杂留给自己,简单留给用户"的理念值得称道。
展望未来,随着可穿戴设备的普及,震动反馈的重要性将进一步提升。期待Shadowrocket能将此功能扩展到Apple Watch等设备,构建跨设备的完整触觉通知网络,为用户带来更加无缝的安全上网体验。
在这个数据即黄金的时代,Shadowrocket通过震动功能这样看似微小的创新,默默守护着每位用户的网络隐私安全。它提醒我们:真正的科技温度,往往就藏在这些贴心的小细节之中。
版权声明:
作者: freeclashnode
链接: https://www.freeclashnode.com/news/article-4255.htm
来源: FreeClashNode
文章版权归作者所有,未经允许请勿转载。
热门文章
- 8月4日|20.2M/S,Shadowrocket(小火箭)/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 7月16日|20.3M/S,SSR/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 7月15日|22.9M/S,Clash(小猫咪)/SSR/V2ray免费节点订阅链接每天更新
- 7月18日|19.1M/S,Shadowrocket(小火箭)/V2ray/Clash(小猫咪)免费节点订阅链接每天更新
- 8月6日|20.2M/S,Clash(小猫咪)/V2ray/Shadowrocket(小火箭)免费节点订阅链接每天更新
- 7月13日|19.9M/S,Clash(小猫咪)/Shadowrocket(小火箭)/V2ray免费节点订阅链接每天更新
- 7月27日|22.3M/S,Shadowrocket(小火箭)/V2ray/Clash(小猫咪)免费节点订阅链接每天更新
- 7月17日|22M/S,Shadowrocket(小火箭)/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 7月23日|22.6M/S,Shadowrocket(小火箭)/V2ray/Clash(小猫咪)免费节点订阅链接每天更新
- 7月20日|19.8M/S,Clash(小猫咪)/Shadowrocket(小火箭)/V2ray免费节点订阅链接每天更新
最新文章
- 8月11日|20.3M/S,Shadowrocket(小火箭)/V2ray/Clash(小猫咪)免费节点订阅链接每天更新
- 掌握Clash入口的艺术:从原理到实战的完整指南
- Quantumult深度解析:解锁抖音流畅体验的终极网络优化指南
- 三星S8科学上网全攻略:从问题诊断到完美解决方案
- Firefox 42 Beta 8发布 全平台大幅升级
- 检测网速、制作铃声、生成热门表情包,这 9 个在线网站你值得拥有
- secureCRT显示或输入中文
- Apple Watch 9两大升级可期!
- Photoshop分享︱简单几步给皮肤美白
- 安卓 Android 自动化傻瓜式教程-java版(appium)
- 生活中常见的电脑故障解决方法解析,学会了就不用花钱修电脑了