ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

tcping:比ping更实用的TCP端口连通性测试工具

tcping:比ping更实用的TCP端口连通性测试工具 1. 为什么需要tcping普通ping解决不了的事干运维和搞开发的朋友肯定都有过这种经历明明服务器能Ping通但业务就是连不上或者反过来对方说服务挂了你一Ping发现IP完全正常于是陷入“到底谁的问题”的拉扯。传统ping基于ICMP协议测试的是主机层面的连通性它只能告诉你“这机器在不在线”却完全无法回答“这机器上的某个服务到底能不能访问”。举个例子你部署了一个Web服务监听在8080端口。你Ping服务器的IP通了延迟很低但用户反馈网页打不开。这时候你用ping去排查永远查不出所以然——ICMP通不代表TCP 8080通。反过来有些服务器出于安全考虑会禁ICMP你Ping不通但服务其实跑得好好的。这种场景下ping给你的结论不仅没用甚至会产生误导。tcping就是来解决这个问题的。它的思路很直接对一个IP的指定TCP端口发起真实的TCP连接尝试能建立连接就算通建立不了就报失败。说白了它测的是“我能不能跟这台机器的这个端口握上手”而不是“这机器在不在线”。这比ICMP的ping更接近业务真实状态因为绝大多数业务都是基于TCP的——HTTP、SSH、数据库、消息队列全是TCP端口。我在实际工作中tcping的使用频率甚至超过普通ping。每次新服务上线、防火墙策略变更、容器端口映射排查我第一件事就是tcping一下目标IP和端口先确认链路层和端口层是通的再去查应用本身的问题。省下来的排查时间真的不是一星半点。2. 三种主流系统下的安装方法tcping不是系统自带的命令需要额外安装。好消息是这东西的安装非常简单每个平台都有现成方案我分别说下。2.1 Windows下安装tcpingWindows下最常用的是elifulkerson这个版本的tcping官网提供免安装的exe文件下载下来就能用。我一般习惯把它放到C:\Windows\System32目录下这样在任意路径下直接敲tcping就能调用不用每次指定完整路径。下载的时候注意选对版本64位系统就下64位的exe别下错了。解压出来的tcping.exe文件很小一两百KB的样子没有任何依赖不需要安装.NET或VC运行库。如果你不想丢进System32也可以单独放在一个工具目录里用的时候拼上路径执行或者把该目录加入系统的PATH环境变量。验证是否安装成功直接打开CMD或PowerShell输入tcping回车如果看到一大段用法说明就说明没问题了。提示Windows系统如果提示“无法加载文件因为在此系统上禁止运行脚本”那是PowerShell的执行策略问题。直接用CMD命令提示符跑tcping就不会有这个限制或者用cmd /c tcping ...的方式调用。2.2 Linux下编译安装tcpingLinux下没有统一的包管理源能直接装tcping主流方式是从源码编译。GitHub上有个比较活跃的项目cloverstd/tcping以及更早期的wireshark社区分支版本它们的用法大同小异。我给一个我实测过多次的编译流程# 先确认系统有gcc和make which gcc which make # 如果没装CentOS/RHEL系用 yum install -y gcc make # Ubuntu/Debian系用 apt-get install -y gcc make # 克隆源码 git clone https://github.com/cloverstd/tcping.git cd tcping # 编译 make # 把编译出来的二进制放到PATH目录下 cp tcping /usr/local/bin/编译过程十几秒就完成依赖只有gcc和make几乎没有坑。装完后同样可以用tcping -h验证。有些发行版如果对网络有代理限制git clone拉取失败的话可以直接去GitHub页面下载zip包解压后再make效果一样。CentOS 7上编译的时候我踩过一个小坑老版本系统的gcc默认版本比较低个别新版本tcping源码用了较新的C语法会有警告但基本不影响编译结果。真碰到编译错误的话加上-stdc99或者-stdgnu99的编译参数通常能解决。2.3 macOS下的安装方案macOS用户就省事多了如果你装了Homebrew一行命令搞定brew install tcpingHomebrew仓库里有现成的formula安装的是同一个核心工具。如果没装Homebrew也可以走源码编译的路线流程跟Linux差不多因为macOS本身就自带gcc和make的兼容层实际是clang。不过Xcode Command Line Tools需要先装好否则终端里执行gcc会提示你安装开发者工具按提示操作即可。3. tcping核心参数详解与使用逻辑tcping看着简单但参数其实不少。我不打算把每个参数都念一遍说明书我只讲实际工作中真正会用到的那些以及它们的适用场景。3.1 最核心的探测参数最基本也是最常用的命令格式就一行tcping IP地址 端口号比如探测一台Web服务器的80端口tcping 192.168.1.100 80默认情况下它会持续不断地探测直到你按CtrlC手动停止每次探测会显示连接耗时。这种模式适合长期监控判断网络是否稳定、是否有丢包或超时。如果你只想测一次结果用-c参数指定次数tcping -c 5 192.168.1.100 80这个我在写自动化脚本时用得非常多测5次就可以拿到一个成功率不需要一直挂在那边。-t参数在某些版本中代表持续ping但在大部分Windows版tcping里默认就是持续模式所以这个参数可加可不加。Linux版本需要显式加-t才能持续探测。这里要特别提醒不同版本的tcping参数会有差异最好先跑一次不带参数的命令看一下帮助说明确认参数含义后再执行。3.2 对探测行为有影响的参数几个我常用的参数参数作用使用场景-c 次数指定探测次数定量测试脚本集成-i 间隔秒数每次探测间隔调整频率默认1秒-w 超时秒数连接超时时间网络差时防止长时间卡住-p 端口指定端口部分版本端口作为独立参数时不需要-h查看帮助忘记参数时使用-w这个参数特别重要。默认的超时时间在某些版本里可能比较长当目标端口不通时探测要等很久才返回失败结果效率很低。我习惯把它设成3秒既能覆盖正常的网络延迟又不会等太久。如果是跨地域的弱网环境再适当放宽到5秒。一个比较实用的组合是持续探测一个不稳定的端口每2秒测一次超时3秒这样既能及时发现服务断连又不会因为探测太频繁给服务器造成压力tcping -t -i 2 -w 3 192.168.1.100 33063.3 参数背后的原理与设置逻辑为什么探测间隔和超时时间会影响结果这要从TCP连接建立的过程说起。tcping做的事情本质上是完成一次TCP三次握手发送SYN包等待对端返回SYN-ACK再回复ACK。如果对端端口是开放的这个握手过程会非常快通常几十毫秒内完成。如果端口关闭对端会返回RST包tcping立刻知道端口不通。但如果对端网络不可达或者防火墙静默丢弃了SYN包tcping就只能等超时。理解了这一点你会发现一个有意思的推论端口关闭和端口被防火墙屏蔽在tcping看来是不同的。端口关闭时对端会主动拒绝连接Connection refused防火墙屏蔽时连接请求石沉大海timed out。后者在排查问题时要特别警惕因为很多服务器出于安全考虑会在防火墙层面静默丢弃不必要端口的请求这时候tcping报的是超时而不是拒绝。另外探测间隔不宜设得太小。小型服务器对大量并发连接很敏感如果每0.1秒就发起一次TCP连接虽然没有发送数据但也会在服务器上产生半开连接次数多了会占用连接资源。我在生产环境里默认间隔就是1秒特殊场景也不会低于0.5秒。4. 真实场景下tcping的典型用法与踩坑记录工具本身很简单但用在不同场景下会碰到各种奇奇怪怪的问题。我挑几个真实工作中遇到过的场景把完整排查过程写出来这样比单纯的命令教学更有参考价值。4.1 判断端口通但业务报错的情况有一次我们部署了一个Java应用监听在8085端口进程正常起来了日志也没有报错但从调用方访问总是Connection refused。我第一反应就是tcping一下tcping 10.0.3.21 8085结果竟然通了而且延迟只有0.5毫秒。这就说明网络链路完全正常端口确实在接受连接。既然端口是通的问题肯定出在应用层——后来检查发现是应用的server.address配置绑定了127.0.0.1只监听了本机回环地址没有监听外部网卡。外部请求虽然到了服务器但操作系统层面根本没有对应的监听socket所以直接拒绝了连接。这个案例说明了一个重要经验tcping通了只能证明目标IP:端口可以完成TCP握手不能证明业务真的健康。端口通和业务可用之间还隔着应用层的健康检查。所以我在判断服务状态时tcping通过后再用curl或实际接口验证一次双保险。4.2 排查跨网段防火墙策略问题还有一次是公司内部网络调整两个业务系统之间需要开放特定的TCP端口。网络同事说策略已经加好了但业务方一直反映连不上。我从应用服务器上tcping对端的9090端口tcping -c 3 172.16.8.50 9090三次全部超时。网络同事坚持策略没问题双方僵住了。后来让网络组的同事在防火墙设备上抓包发现SYN包确实到了防火墙但防火墙上配置的源地址范围写错了只放行了源IP的某个网段而我们的服务器IP不在范围内。这个场景里tcping的超时结果帮助快速定位了问题层级——不是应用问题不是端口监听问题而是链路中间设备拦截。排查网络问题一定要有分层思维先确认物理链路ping通不通、再确认端口链路tcping通不通、最后才是应用层业务通不通。每一层工具只能回答这一层的问题。4.3 批量端口探测脚本日常巡检时我经常会写一个小脚本把一批服务的IP和端口整理成一个文本然后用循环批量tcping把结果汇总出来。Linux下一般这样写#!/bin/bash while read ip port; do if tcping -c 1 -w 2 $ip $port /dev/null 21; then echo $ip:$port OK else echo $ip:$port FAIL fi done port_list.txtport_list.txt的格式很简单每行一个“IP 端口”。脚本跑完哪些服务正常、哪些异常一目了然。Windows环境下用PowerShell写也是一样的思路或者直接用for循环在CMD里跑。这种批量探测思路在服务发布前或大版本上线后的全量检查中非常好使。4.4 关于DNS解析失败的那些事很多人在用tcping时习惯填域名而不是IPtcping www.baidu.com 80这时候tcping先要做DNS解析如果DNS解析出问题就会报类似“temporary failure in name resolution”或“name or service not known”的错误。很多人会误以为是网络断了其实只是DNS没解析出来。我遇到过一台CentOS 7的机器突然所有域名都解析不了ping www.baidu.com直接报temporary failure in name resolution。但直接用IP去tcping是通的比如tcping 39.156.66.10 80完全正常。这就排除了网络问题锁定到DNS配置上。检查/etc/resolv.conf发现nameserver指向了一个失效的DNS服务器改成114.114.114.114或者8.8.8.8后立刻恢复。这是个很典型的排查思路域名不通先别急着怀疑网络先测试IP直连。IP直连通了问题大概率在DNSIP直连也不通再往下查路由和防火墙。5. 常见问题与排查技巧整理下面这几个问题是我在带新人或者自己踩坑时反复遇到的整理出来做个速查表。5.1 tcping的返回结果怎么读懂Windows版tcping的成功输出形如Port is open - 192.168.1.100:80失败的输出分两种Port is closed - 192.168.1.100:80和Timed out - 192.168.1.100:80前者表示对端返回了RST包明确拒绝连接——端口没监听或者被主动拒绝。后者表示SYN包发出后没有收到任何回应——网络不可达、防火墙丢弃、或者对端负载过高导致响应丢失。这两种结果指向的排查方向完全不同一定不能混为一谈。当结果中包含耗时统计时默认显示的是“连接建立的毫秒数”。这个数值如果很大比如上千毫秒说明网络链路质量差或者中间经过的防火墙/NAT设备处理慢。即使端口通大延迟也会严重影响业务体验。5.2 关于端口被占用的排查思路热词里提到的“端口被占”也是运维经常碰到的。如果新启动的服务总是提示端口被占用可以先用tcping确认端口是不是真的有人在监听再结合netstat -ano | findstr 端口号找到占用进程的PID去任务管理器或ps -ef里定位到具体进程。tcping在这里的作用是快速判断“端口是否可访问”但具体查进程还是要靠系统命令。Windows上查端口占用的完整命令netstat -ano | findstr 8080Linux上是ss -tlnp | grep 8080有的Linux发行版没有ss命令的用netstat -tlnp | grep 8080替代。找出PID后再用tasklistWindows或ps -ef | grep PIDLinux查进程名。5.3 telnet能不能替代tcping很多人习惯用telnet测端口telnet 192.168.1.100 80telnet确实能干类似的事但体验差不少连接成功后是一段黑屏没有明确的结果提示超时机制也比较迷经常要等很久而且现代Windows系统默认不装telnet客户端。tcping的优势是输出明确、支持持续探测和精细的超时控制还能把结果交给脚本处理。两者原理都是TCP连接但tcping更适合脚本化和自动化场景。如果系统里实在不方便装tcping也没有telnet还有一个用bash内置能力实现端口探测的方法利用/dev/tcp这个特殊文件timeout 3 bash -c echo /dev/tcp/192.168.1.100/3306 2/dev/null echo open || echo closed这条命令在大多数Linux发行版上都能用不需要额外安装任何工具适合临时应急。它的原理是bash的/dev/tcp虚拟文件会发起真实的TCP连接。5.4 ping通但tcping不通时我一般怎么查如果你遇到ping正常但tcping超时的情况我建议按下面的顺序排查确认端口号是否正确。很多时候是端口号填错了比如服务实际监听在8080你测的是8000。Linux下用ss -tlnp或netstat -tlnp确认一下真实监听端口。确认服务是否监听在正确的网卡上。前面举过Java应用的例子绑定了127.0.0.1就会导致外部访问被拒。检查服务的监听地址是不是0.0.0.0或具体的外网IP。检查服务器防火墙。Linux下用iptables -L -n或firewall-cmd --list-allCentOS 7及以上确认相关端口是否放行。常见的企业服务器默认防火墙策略很严格新服务开了端口但忘记放行防火墙就会出现ping通但tcping不通的情况。检查云安全组。如果服务器在云上即使本机防火墙完全开放云平台的安全组规则也会拦截流量。安全组的优先级非常高有时候你以为放行了实际规则顺序写错了导致未生效。检查中间设备。交换机ACL、负载均衡策略、公司出口防火墙都可能成为拦截点。这一步通常需要网络组配合排查但如果你前面的步骤都确认过就能给网络组提供非常明确的排查方向。6. 基于tcping结果的一些实用经验最后分享一些基于tcping的监控扩展思路。tcping本身是个命令行工具但它的输出结果可以被各种脚本解析用来做简单的服务健康监控。比如在一个Shell脚本里循环执行tcping把失败次数累计连续失败3次就触发告警或者自动重启服务。这种方式虽然简单但实测下来比很多重量级监控工具更稳定可靠适合那种不想搭监控平台的小团队。Windows下可以用计划任务配合批处理脚本来实现类似的功能每5分钟执行一次tcping失败时写日志或发送邮件提醒。我在维护一些老项目时就用过这种方案非常省心不用引入额外的依赖组件。再说一个小技巧tcping不仅可以测端口某些版本还支持对域名做端口探测这对排查CDN节点是否正常很有用。CDN服务商通常会有多个节点通过tcping不同节点IP的80/443端口可以判断哪些节点是健康的帮助快速定位部分用户访问异常的问题。我一直觉得网络排查工具不在多而在于理解每个工具背后的原理以及它能回答什么样的问题。ping负责回答“主机是否在线”tcping负责回答“端口是否可连接”业务层的健康检查负责回答“应用是否正常”。把这三层工具用好了90%以上的连接问题都能在几分钟内定位出来。tcping虽然不是系统自带的工具但值得花两分钟装一个它绝对是你排查网络问题时最顺手的那把扳手。
返回列表