“ping”是否连接到 ICMP 服务器?

“ping”是否连接到 ICMP 服务器?

ping - 发送 ICMP ECHO_REQUEST 到网络主机

当我ping host在终端中运行时,是pingICMP 客户端吗?

是否ping连接到运行在 上的 ICMP 服务器host? ICMP服务器程序是什么?

是否ping连接到 上的端口host,该端口号是 ICMP 服务器的端口号吗?

答案1

PING确实是一个客户端。

ping 命令还使用 ICMP 协议的一部分,即 echo-r​​eply(ICMP 类型 0 消息)和 echo-r​​equest(ICMP 消息类型 8)。

许多专业人员和网络监控软件使用回显请求/回复成功的 ICMP 消息处理作为系统运行/关闭的指示器。然而,这是一个约定,并不是严格强制的。例如,我可以在 Nagios 中定义,我将使用 SSH TCP/22 端口而不是使用 PING 来监视我的 Linux 服务器。

TCP 连接中本身不存在已建立连接的概念。 ICMP 不是面向连接的协议。

如前所述,端口的概念也不存在 - Linux 内核处理 ICMP 数据包,并相应地抛出一个答案,然后忘记该行为(例如忽略其他机制,例如速率限制)。

Ping 也可供没有特殊权限的用户使用,或者必须是 setuid 二进制文件,因为它使用 RAW 套接字来生成 ICMP 数据包。

您还可以使用 sysctl/proc 设置来定义内核是否应答 ICMP 回显请求消息。

要禁用对 ICMP ping 的应答,请执行以下操作:

echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all    

或者再次启用它:

echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_all

至于内核中负责处理 ICMP 消息的部分,可以在icmp.cLinux 内核源代码中找到,如下所示https://github.com/torvalds/linux/blob/master/net/ipv4/icmp.c

至于ICMP数据包请参见下图:ICMP

至于更多的内核定义:

linux/icmp.h

#define ICMP_ECHOREPLY      0   /* Echo Reply           */
#define ICMP_ECHO           8   /* Echo Request         */

相关内容