怎么优雅的实现 TCP Ping?

2021-06-11 15:07:43 +08:00
 abersheeran

如题。

是计算使用 Raw Socket 手动发送 SYN 包 与收到 SYN+ACK 包的时间差,还是直接使用更上层的 TCP Socket,直接计算连接建立完成的时间?

3158 次点击
所在节点    程序员
11 条回复
yachen
2021-06-11 15:28:52 +08:00
apt install hping3
hping3 -S www.baidu.com -p 80
Jirajine
2021-06-11 15:31:32 +08:00
建立连接
whitehack
2021-06-11 15:41:05 +08:00
https://github.com/rampageX/paping
这有个实现 一直用的这个 非常好用
3dwelcome
2021-06-11 15:49:38 +08:00
nodejs 里也有一个实现 https://www.npmjs.com/package/tcp-ping

理论上 TCP ping 的结果,应该尽可能契合 ICMP ping,然而事实上大部分实现都是简单暴力计算一下 connect time.
kastnerorz
2021-06-11 16:52:18 +08:00
ping 的主要功能有测试连通性,测试延迟等,我觉得可以这样做一个类比:
- ping 发送 ICMP 包保证网络层连通性,延迟为发送 ECHO_REQUEST 与接收 ECHO_RESPONSE 的差值
- TCP ping 建立 TCP 连接保证传输层连通性,延迟为建立连接的时间
- HTTP ping 建立 HTTP 连接保证应用层连通性,延迟为完成整个请求传输的时间

如果需要保证传输层连通性,使用 Raw Socket 手动发送 SYN 与接收 SYN+ACK (两次握手)是不能保证传输层连通性的,三次才可以

个人浅见
abersheeran
2021-06-11 17:10:10 +08:00
@kastnerorz 拨云开雾,感谢。
kastnerorz
2021-06-11 17:17:18 +08:00
@abersheeran 我也因为这个问题思考了很多,不客气
lesismal
2021-06-11 19:11:18 +08:00
一个三层一个四层,通常:
人工排查网络故障普通问题用 ping
业务服务相关并且 ping 不能满足需求(比如某端口是否开启)的软件功能开发用 4 、7 层建连或 req/res

看你实际要做什么,比如云厂的服务端口健康检查或者自家 devops 节点服务状态检查,这本身不是 ICMP 这种三层专用协议能做到的,就需要业务层自己开发
lesismal
2021-06-11 19:14:12 +08:00
楼主玩 python 但不是做 AI 方向,有点可惜人才了,早点全面转 go 会大大提升自己在服务端的上限
cz5424
2021-06-11 23:21:07 +08:00
寻求 go 版本的 ping,用于测延迟
yazoox
2021-06-12 13:52:31 +08:00
为什么要自己实现?是为了嵌入到代码里面使用么?
(楼上分享,已经有很多实现了)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/782913

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX