您现在的位置是:亿华云 > 应用开发
让人迷糊的 Socket UDP 连接问题
亿华云2025-10-09 03:25:52【应用开发】3人已围观
简介公司内部的一个 golang 中间件报 UDP 连接异常的日志,问题很明显,对端的服务挂了,自然重启下就可以了。哈哈,但让我疑惑的问题是 udp 是如何检测对端挂了?err: write udp 17
公司内部的让人一个 golang 中间件报 UDP 连接异常的日志,问题很明显,迷糊对端的连接服务挂了,自然重启下就可以了。问题
哈哈,让人但让我疑惑的迷糊问题是 udp 是如何检测对端挂了?
err: write udp 172.16.44.62:62651->172.16.0.46:29999: write: connection refused
err: write udp 172.16.44.62:62651->172.16.0.46:29999: write: connection refused
err: write udp 172.16.44.62:62651->172.16.0.46:29999: write: connection refused
...UDP 协议既没有三次握手,又没有 TCP 那样的连接状态控制报文,那么如何判定对端的问题 UDP 端口是否已打开?
通过抓包可以发现,当服务端的让人端口没有打开时,服务端的迷糊系统向客户端返回 icmp ECONNREFUSED 报文,表明该连接异常。连接
通过抓包可以发现返回的问题协议为 ICMP,但含有源端口和目的云服务器提供商让人端口,客户端系统解析该报文时,迷糊通过五元组找到对应的连接 socket,并 errno 返回异常错误,如果客户端陷入等待,则唤醒起来,设置错误状态。
(上面是 udp 异常下的 icmp,下面是正常 icmp)
当 UDP 连接异常时,可以通过 tcpdump 工具指定 ICMP 协议来抓取该异常报文,毕竟对方是通过 icmp 返回的 ECONNREFUSED。
使用 tcpdump 抓包
请求命令:先找到一个可以 ping 通的主机,然后用 nc 模拟 udp 客户端去请求不存在的端口,出现 Connection refused。
[root@ocean ~]# nc -vzu 172.16.0.46 8888
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 172.16.0.46:8888.
Ncat: Connection refused.抓包信息如下:
[root@ocean ~]# tcpdump -i any icmp -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
17:01:14.075617 IP 172.16.0.46 > 172.16.0.62: ICMP 172.16.0.46 udp port 8888 unreachable, length 37
17:01:17.326145 IP 172.16.0.46 > 172.16.0.62: ICMP 172.16.0.46 udp port 8888 unreachable, length 37
17:01:17.927480 IP 172.16.0.46 > 172.16.0.62: ICMP 172.16.0.46 udp port 8888 unreachable, length 37
17:01:18.489560 IP 172.16.0.46 > 172.16.0.62: ICMP 172.16.0.46 udp port 8888 unreachable, length 37还需要注意的是亿华云计算 telnet 不支持 udp,只支持 tcp,建议使用 nc 来探测 udp。
各种case的测试
case小结当 ip 无法连通时,udp 客户端连接时,通常会显示成功。当 udp 服务端程序关闭,但系统还存在时,对方系统会 `icmp ECONNREFUSE 错误。当对方有操作 iptables udp port drop 时,通常客户端也会显示成功。IP 无法联通时:
[root@host-46 ~ ]$ ping 172.16.0.65
PING 172.16.0.65 (172.16.0.65) 56(84) bytes of data.
From 172.16.0.46 icmp_seq=1 Destination Host Unreachable
From 172.16.0.46 icmp_seq=2 Destination Host Unreachable
From 172.16.0.46 icmp_seq=3 Destination Host Unreachable
From 172.16.0.46 icmp_seq=4 Destination Host Unreachable
From 172.16.0.46 icmp_seq=5 Destination Host Unreachable
From 172.16.0.46 icmp_seq=6 Destination Host Unreachable
^C
--- 172.16.0.65 ping statistics ---
6 packets transmitted, 0 received, +6 errors, 100% packet loss, time 4999ms
pipe 4
[root@host-46 ~ ]$ nc -vzu 172.16.0.65 8888
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to 172.16.0.65:8888.
Ncat: UDP packet sent successfully
Ncat: 1 bytes sent, 0 bytes received in 2.02 seconds.另外再次明确一点 udp 没有类似 tcp 那样的状态报文,所以单纯对 UDP 抓包是看不到啥异常信息。
那么当 IP 不通时,为啥 NC UDP 命令显示成功?
netcat nc udp 的逻辑
为什么当 ip 不连通或者报文被 DROP 时,返回连接成功?
因为 nc 默认的探测逻辑很简单,只要在 2 秒钟内没有收到 icmp ECONNREFUSED 异常报文,那么就认为 UDP 连接成功。
源码下载很赞哦!(93)
相关文章
- 2、定期提交和投标域名注册。例如,益华网络点击“立即预订”后,平台会抢先为客户注册域名。当然,一个域名可能会被多个客户预订,所以出价最高的人中标。
- 数据中心转型背后的动力
- 浪潮计算机:守好每道品质关卡,打造高可靠的计算产品
- 股票购买计划让员工赚翻了!曝英伟达:78%员工是百万富翁,每两人就有一个资产过亿!黄仁勋:不裁员,自愿上班
- 互联网其实拼的也是人脉,域名投资也是一个时效性很强的东西,一个不起眼的消息就会引起整个域名投资市场的动荡,因此拓宽自己的人脉圈,完善自己的信息获取渠道,让自己能够掌握更为多样化的信息,这样才更有助于自己的域名投资。
- 普洛斯东莞谢岗数据中心高分通过Uptime M&O认证
- 英特尔重磅发布至强 6 能效核处理器, 加速数据中心能效升级
- 服务器之 ECC 内存的工作原理
- 记住那句话,域名向来不属于任何人,谁先买就归谁,购买期过后,域名又不再属于任何人。
- 推荐好用的 DNS 公共服务器