问题标签 [icmp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
erlang - 在 Erlang 中检测 UDP 的不可达端口
我正在寻找一种方法来检测 Erlang 中传出 UDP 数据包的“端口不可达”错误,因此我可以急切地向应用程序报告传输层错误。即,我想捕获 ICMP 类型 3 数据包以向更高层报告该数据包尚未到达目的地。
目前我知道两种方法:
- 使用未记录
gen_udp:connect/3
的 . 但是,这似乎需要为每个新的目标对地址打开一个新套接字:端口。优点是这不需要任何特权。 - 使用gen_icmp,它需要 setuid 帮助程序或打开原始套接字的能力。
我还缺少其他变体吗?
windows - 为什么在没有管理员权限的情况下 ping 可以工作?
您可能知道,如果没有管理权限,则无法使用Windows 套接字创建 RAW 套接字。问题是,我需要发送 ICMP 消息,因此我需要 RAW 套接字。问题:我的程序需要在没有管理权限的情况下运行。
这让我想到了一个问题,ping 工具如何在没有管理权限的情况下发送 ICMP 消息?
c - cygwin下编译icmp相关代码(缺少“icmp”struct)
我正在使用 cygwin 编译网络工具(iffinder)。
之后./configure
,make
我有一个问题,我猜与struct icmp
. icmp
头文件中的结构在哪里。我在 cygwin 头文件中搜索它,但我没有找到任何东西。
如何icmp
在 cygwin 中编译需要的源代码?
如果有帮助,你可以在这里找到iffinder的源代码
注意:我ip_icmp.h
在 cygwin 的头文件中有。
编译错误:
iffinder.c:1059:警告:在参数列表中声明“struct icmp”
iffinder.c:1059:警告:它的范围只有这个定义或
声明,这可能不是你想要的 iffinder.c: In
函数“handle_icmp_error”:iffinder.c:1069:错误:取消引用
指向不完整类型的指针
...
c - 如何从linux上c中的icmp回复中提取mac地址
我试图在发送原始数据包后找出交换环境中机器的mac地址。我正在尝试实现 traceroute 命令。我想知道当我收到 ICMP 超时消息时如何提取该机器的 mac 地址。我是网络编程的新手,所以很困惑什么套接字调用将帮助我提取 mac 地址。
谢谢 。
ipv6 - 如何使用 libnet 构建 ICMPv6 数据包?
是否可以使用 libnet 构建 ICMPv6 数据包?我看到的唯一功能是关于 ICMPv4 ( libnet_build_icmpv4_xxxxx() )。谢谢你。
ruby - Ruby 中的 ICMP / PING“服务器”
是否可以用 Ruby 编写 ICMP 服务器?如果我们在 192.168.1.4 上安装此服务器,并且在 192.168.1.6 上安装 am/c ping 192.168.1.4,那么自定义 Ruby ICMP 服务器将发送响应,而不是内置的 ICMP 服务器。
wireshark - 跟踪路由中的第一个重复数据包是什么意思?
当我执行跟踪路由时,我发送的第一个数据包的 ttl=1 并且来自我的路由器的回复总是“空”“超时”。这是我不明白的第一件事:为什么我的路由器不向我发送时间超过 icmp 消息?
使用wireshark我观察到第一个paket至少有2个重复(ttl = 1的那个),只有一个来自路由器的空回复。
我认为这是我的代码的问题,但是 youtube 上有很多视频,其中 wireshark 显示了相同的内容:PC 在收到超时 icmp 消息并将 ttl 增加到 2 之前发送 2 或 3 个 ttl=1 的数据包。
你能解释一下吗?
编辑:我犯了一个错误:路由器没有发送“空”或“超时”数据包;这是一条来自 pc 的消息,尚未收到任何数据包。所以 ttl 没有增加。现在我可以提出正确的问题:为什么第一个数据包不能到达目的地?这不是 ttl 的问题(我可以将其设置为 2-3-4,而且我在第一次发送时总是有相同的副本)。
也许这是一个碎片问题?但为什么?一些wireshark 的日志强调,在第一次传输后mss(或mtu..can't rememebr)发生了变化。
c - 为什么 Linux TAP 设备不处理 ARP 或 ICMPv6 数据包
我正在使用打开一个 TAP 设备
我面临的问题是,当应用程序(例如 mozilla)想要通过 tap 设备发送数据包时,它需要获取 dst mac 地址。所以内核发出一个ARP请求。我正在编写的应用程序转发 arp 请求(通过物理 eth 设备上的原始套接字)并获得 arp 回复。这个 arp 回复被转发回 tap 设备,但内核拒绝接受。如果我手动添加 arp 条目,则不会生成 arp 请求,并且有两种方式的 ip 数据包交换(mozilla 很高兴)。
Wireshark 能够接收数据包并且没有发现错误。ICMPv6 数据包(邻居请求和广告)也是如此。在设备上侦听的任何应用程序都会完整地获取数据包。但是内核不会为 ARP/ICMP 处理它。
我的问题是,为什么内核不接受 arp 回复/ICMPv6 msgs?我们需要调用一些 ioctl 调用吗?
编辑:
这是在分接设备“ethgress”上捕获的数据包(tshark 输出)的详细信息
这是“ethgress”的 ifconfig 输出
可以看出,内核拒绝接受收到的 ICMPv6 数据包。但是 tx 数据包会增加。
Tap 设备“ethgress”配置了 IPv6 地址 fc00:1::2,应用程序想要与 fc00:1::1 通信。fc00:1::1 与 fc00:1:100 位于同一接口,后者使用正确的 MAC 地址响应邻居广告(该数据包中的目标 IP 是 fc00:1::1)。Tcpdump 能够捕获它,而 wireshark/tshark 能够在没有它的情况下对其进行解码,并说它是一个格式正确的数据包。但内核不会增加 Rx 计数器,也不会更新其 arp 缓存。ARP 数据包也是如此。
编辑2:
网络看起来像这样。有两个外部盒子被配置为冗余。其中只有一个会处于活动状态。它们每个都通过一个物理网卡连接到一台电脑。我正在编写的应用程序在这台电脑上运行,并在每个 NIC 上打开一个原始套接字。它还会打开一个 TAP 设备。NIC 未配置 IP 地址。TAP 设备配置了 IPv4 和 IPv6 地址。一个标准应用程序,比如 mozilla,通过 tap 设备打开一个套接字并希望连接到活动框。为此,内核会在 Tap 设备上生成 ARP 请求/邻居请求消息。应用程序读取此消息并将其转发到两个 NIC。活动框使用 ARP 回复响应 ARP 请求,应用程序读取该回复并将其写入 TAP 设备。这个arp回复包被tcpdump捕获,但内核不会更新其 arp 缓存。网卡和TAP设备的mac地址相同。
要求的其他参数。
linux - ICMP 套接字 (Linux)
是否可以在 IP 协议下使用 ICMP 套接字?也许是这样的:
socket(PF_INET, <type>, IPPROTO_ICMP)?
我应该在<type>
场上放什么?我看到了一些使用的示例SOCK_RAW
,但这不会阻止操作系统完成处理 IP 协议的工作吗?
还有一件事。操作系统如何知道他应该将 ICMP 数据报发送到哪个进程,因为该协议不涉及端口?
php - Apache 和 CAP_NET_RAW
我有一个 php 脚本,它在不使用 system() 的情况下执行跟踪路由。它使用 SOCK_RAW 和 ICMP。
我已经设法让这个脚本在没有 root 用户或使用 CAP_NET_RAW 更改 sudoers 中的任何内容的情况下运行。
问题是,脚本仅在通过 shell 调用时才有效,而不是通过浏览器。当我浏览浏览器时,出现错误:socket_create(): Unable to create socket [1]: Operation not allowed 。所以这里有一些事情会错过。
在谷歌和谷歌搜索之后,我无法弄清楚为什么通过 apache 调用相同的脚本不起作用。我是否还需要将 CAP_NET_RAW 添加到 apache 配置文件中?
对此的任何建议将不胜感激。
杰森