ping - 发送 ICMP ECHO_REQUEST 到网络主机
当我ping host
在终端中运行时,是ping
ICMP 客户端吗?
是否ping
连接到运行在 上的 ICMP 服务器host
? ICMP服务器程序是什么?
是否ping
连接到 上的端口host
,该端口号是 ICMP 服务器的端口号吗?
答案1
PING确实是一个客户端。
ping 命令还使用 ICMP 协议的一部分,即 echo-reply(ICMP 类型 0 消息)和 echo-request(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.c
Linux 内核源代码中找到,如下所示https://github.com/torvalds/linux/blob/master/net/ipv4/icmp.c
至于ICMP数据包请参见下图:
至于更多的内核定义:
linux/icmp.h
#define ICMP_ECHOREPLY 0 /* Echo Reply */
#define ICMP_ECHO 8 /* Echo Request */