Mac下 查询网络ip状态的原理与指令

操作系统拥有一套通用的实用程序来查明本地主机的有线或者无线链路状态和IP的连接情况。如果本机有IP连接,那么就意味着有线或者无线是正常工作的。在Mac OS X系统中,有以下几个实用的程序来确认连接状态:
ifconfig: 查找本机IP地址和网络接口。
netstat: 使用-r来找到特定网络接口的默认网关。
ping: 用来测试本机之间的端对端的IP连接。
arp: 管理本地的ARP缓存。

以下是连接状态和IP连接的例子:

打开Terminal(译者附:可以通过Spotlight或者实用工具->终端“)

输入ifconfig命令,来查找特定网络接口的IP地址。在这个例子中这个无线网络接口(en1)的地址是:192.168.128.253。

myhost:/usr/bin someuser$ ifconfig
en1: flags=8863(UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST)
inet 192.168.128.253 netmask 0xffffff00 broadcast 192.168.128.255
ether 00:17:f2:e8:ac:0a
media: autoselect status: active
supported media: autoselect

输入netstat -r 来寻找实用网络接口en1 的默认网关。在本例子中en1 的默认网关地址是:192.168.128.1。

myhost:/usr/bin someone$ netstat -r
Routing tables
Internet:
Destination Gateway > Flags Refs Use Netif Expire
default 192.168.128.1 > UGSc 90 2 en1

局域网的数据交互在OSI模型的第2层(即数据链路层)。主机在同一个局域网中发送数据给局域网中的用户使用的第二层的地址(即MAC地址),每一个主机都有一个动态的MAC地址转化为IP地址的列表映射到ARP表中,该表是通过ARP协议 来找到哪个MAC地址对应的是局域网中的哪个IP地址(IP地址在OSI的第三层网络层中)。ARP是十分详细的,同时为了更好的表达ARP,其中的许多内容被删除。以下是ARP的简要介绍:

每次一个主机需要发送数据到另一台主机中的时候,他都会检查本机的ARP表,如果在ARP表中存在相关的映射,那么数据就会直接发送到该IP地址的MAC地址中。如果不存在映射,为了获得接收数据的IP地址对应的MAC地址,本机的将会发送一个ARP请求广播到局域网,查看已知局域网中的所有IP地址。当对应IP地址的主机收到这个ARP请求后,将会以单播的方式发送ARP响应报文给请求方,告诉请求方自己的IP地址和自己相关联的MAC地址。当请求方收到这个ARP响应报文后,它将更新自己的ARP表同时使用它自己的MAC地址直接发送帧到目的主机上。为了防止ARP缓存的老化,主机将会频繁的发送ARP请求来更新自己的ARP缓存。

为了使用Terminal(终端) 手动的重新刷新你的ARP表,我们使用以下命令:

mycomputer:/usr/bin someuser$ arp -d -a

ping默认网关或局域网上另一台主机的IP地址来测试IP的连通性。在Mac OS X上,ping命令是连续的(译者附:不使用终端命令,ping程序在默认参数下是不会停止的)。

mycomputer:/usr/bin someuser$ ping 192.168.128.1

如果本地连接是同的并且目的主机也是在线上并且是可以达到的,你将会输出每个ICMP(Internet Control Message Protocol)回显请求来显示每个ICMP回显应答。

格式如下:

PING 192.168.128.1 (192.168.128.1): 56 data bytes

64 bytes from 192.168.128.1: icmp_seq=0 ttl=64 time=3.255 ms
64 bytes from 192.168.128.1: icmp_seq=1 ttl=64 time=0.897 ms
64 bytes from 192.168.128.1: icmp_seq=2 ttl=64 time=0.897 ms
64 bytes from 192.168.128.1: icmp_seq=3 ttl=64 time=0.905 ms

7 . 如果ICMP请求超时并被ICMP回显应答,那么最有可能的是本地主机与目标主机中间的电缆存在问题,或者目的主机太过繁忙而无法回应。在这种情况下,你可以尝试ping其他局域网中的主机。如果ping的过程中超时不存在,那么就说明本地连接是好的,同时你需要检修问题主机的故障。
情况如下

PING 192.168.128.1 (192.168.128.1): 56 data bytes

64 bytes from 192.168.128.1: icmp_seq=0 ttl=64 time=3.255 ms
64 bytes from 192.168.128.1: icmp_seq=1 ttl=64 time=0.897 ms
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
64 bytes from 192.168.128.1: icmp_seq=4 ttl=64 time=0.897 ms
64 bytes from 192.168.128.1: icmp_seq=5 ttl=64 time=0.905 ms
Request timeout for icmp_seq 6

如果你的连接是好的但是对方的防火墙拒绝了你的ICMP回显请求,那么你讲收到ICMP请求超时的消息。如果目的主机确实响应你的ARP请求,那就意味着你的本地连接是好的同时网络状态是好的。那么就应该尝试关闭目的主机的防火墙,并再次发送PING请求,或者尝试PING一个其他的主机。

PING 192.168.128.1 (192.168.128.1): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 5

如果目的主机没有响应ARP请求,或者目的主机不在线,你将会接收到“Host is down”这样的消息。这样你就需要尝试ping其他主机,如果还是收到Host is down”这样的消息,那么就说明你的IP地址是配置错误的或者你的上行链路是好的,但是局域网中的其他部分是有问题的。造成这个问题的可能的原因是 上行链路的管理不当,VLAN不匹配,电缆上游存在损坏。

PING 192.168.128.1 (192.168.128.1): 56 data bytes
ping: sendto: No route to host
ping: sendto: Host is down
ping: sendto: Host is down
ping: sendto: Host is down
ping: sendto: Host is down

如果你的本地连接是有问题的,那么你将会收到”No route to host“这样的消息,这种状态下你就需要确认你的适配器已启用,或者重新把茶以太电缆(网线),或者重启你的无线连接。
PING 192.168.128.1 (192.168.128.1): 56 data bytes
ping: sendto: No route to host
ping: sendto: No route to host
ping: sendto: No route to host
ping: sendto: No route to host
ping: sendto: No route to host

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用C语言编写程序来查询Linux系统的网络状态。在Linux中,可以使用系统调用或者库函数来获取网络信息。以下是一个简单的示例程序,用于查询网络状态: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <netinet/udp.h> #include <netinet/if_ether.h> int main() { int sock; struct ifreq ifr; // 创建原始套接字 sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP); if (sock < 0) { perror("socket"); exit(1); } // 设置接口名称 strcpy(ifr.ifr_name, "eth0"); // 获取接口索引 if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) { perror("ioctl"); exit(1); } // 获取接口IP地址 if (ioctl(sock, SIOCGIFADDR, &ifr) < 0) { perror("ioctl"); exit(1); } struct sockaddr_in* sin = (struct sockaddr_in*)&ifr.ifr_addr; printf("IP Address: %s\n", inet_ntoa(sin->sin_addr)); // 获取接口MAC地址 if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0) { perror("ioctl"); exit(1); } unsigned char* mac = (unsigned char*)ifr.ifr_hwaddr.sa_data; printf("MAC Address: %02X:%02X:%02X:%02X:%02X:%02X\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); close(sock); return 0; } ``` 这个示例程序使用了原始套接字来获取网络信息,需要以root权限运行。你可以根据需要修改接口名称(比如eth0)和查询的信息(比如IP地址、MAC地址等)。编译并运行该程序后,它会输出网络状态的相关信息。请确保你了解并遵守相关的法律和网络安全规定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值