问题提问
先同问提问自己问题,去寻找答案。
怎么找到自己的网关?
nslookup 在不同的场景为什么显示不一样?
telnet 命令的使用方法和作用,什么情况下都可以用吗,和 ping 的区别是什么?
1. route
route
命令是一个用于查看和操作 IP 路由表的命令行工具。你可以把它想象成电脑网络世界的“GPS”或“地图导航”。
路由表:告诉系统如何将数据包发送到目标地址。
- Linux 推荐使用
ip route
- macOS 仍使用
route
和netstat
使用场景
1 | netstat -rn # mac |
- Destination (目标地址):数据包要去的目的地网络或主机。
0.0.0.0
是一个特殊地址,代表“任何网络”,也就是默认路由。 - Gateway (网关):数据包的下一跳地址。如果 Gateway 是
0.0.0.0
(或*
),表示目标地址在本地网络,不需要经过路由器。 - Genmask (子网掩码):与目标地址配合,定义了一个网络的范围。
255.255.255.255
表示一个具体的主机,0.0.0.0
用于默认路由。 - Flags (标志位):
U
:路由是活动的 (Up)。G
:需要通过网关 (Gateway)。H
:目标是一个主机 (Host),而不是一个网络。
- Metric (跃点数):路由的成本或优先级。操作系统会优先选择 Metric 值较小的路由。
- Iface (接口):发送数据包所使用的网络接口,如
eth0
(有线网卡)、wlan0
(无线网卡)。
解读上面的例子:
- 第一条路由(默认路由):如果要去任何地方 (
Destination: 0.0.0.0
),都把数据包发给网关192.168.1.1
,并且从eth0
接口出去。这就是你能够访问互联网的原因。 - 第二条路由:如果要去
192.168.1.0/24
这个网络(即192.168.1.1
到192.168.1.254
),因为网关是0.0.0.0
,所以是直接通过eth0
接口发送到局域网内,不需要路由器转发。
2. traceroute
你可以把 traceroute
想象成一个网络路径的“侦察兵”或“快递追踪系统”。它的核心作用是:追踪一个数据包从你的电脑出发,到达目标服务器所经过的全部路径(即每一个路由器或“跳”)。
使用场景
- 诊断网络延迟和性能问题(最常用):
- 当一个网站或服务访问很慢时,
ping
命令只能告诉你最终的延迟很高,但无法告诉你问题出在哪一环。 traceroute
可以逐跳显示延迟。你可以清楚地看到是在你自己的局域网、你的 ISP(网络服务提供商)网络中,还是在目标服务器的网络中出现了高延迟或丢包。
- 当一个网站或服务访问很慢时,
- 发现网络路径问题:
- 如果数据包在某一跳之后就无法继续前进(显示为
* * *
),这通常意味着那一跳的路由器有问题,或者它后面的网络路径不通。 - 它可以帮助你确定网络故障的具体位置。
- 如果数据包在某一跳之后就无法继续前进(显示为
如何工作的?
它的工作原理非常巧妙,主要利用了 IP 协议中的一个字段——TTL (Time To Live)。
traceroute
首先发送一个 TTL 值为 1 的数据包。这个数据包到达路径上的第一个路由器时,路由器会将 TTL 减 1,变为 0。- 当路由器发现 TTL 为 0 时,它会丢弃这个数据包,并向你的电脑发回一个
ICMP "Time Exceeded"
(超时)的错误消息。 - 你的电脑收到这个消息后,就知道路径上的第一跳是哪个路由器,并记录下往返时间(RTT)。
- 接着,
traceroute
发送一个 TTL 值为 2 的数据包。这个包会顺利通过第一跳路由器(TTL 变为 1),但在第二跳路由器那里 TTL 会变为 0。 - 第二跳路由器同样会发回一个超时消息,于是你的电脑就知道了第二跳的地址和延迟。
- 这个过程不断重复,每次将 TTL 值加 1,直到数据包最终到达目标主机。
- 目标主机收到数据包后,会返回一个不同的消息(通常是
ICMP "Port Unreachable"
或Echo Reply
),traceroute
就知道追踪结束了。
具体例子
1 | $ traceroute google.com |
- 第一列: 跳数(Hop number)。
- 第二列: 路由器的名称和 IP 地址。
- 后面三列: 发送三次数据包到该跳的往返时间(RTT)。这可以帮助你判断该跳的延迟是否稳定。
* * *
: 表示在规定时间内没有收到来自该路由器的响应,可能的原因是路由器繁忙、丢包,或者路由器配置了防火墙阻止 ICMP 响应。
和 route 区别
route
命令来检查和设置你电脑的本地“交通规则”,告诉它数据包出门后第一步该怎么走(例如,去互联网找默认网关)。
用 traceroute
命令来诊断和追踪一个数据包在广阔的互联网上实际走的每一步路,找出哪里堵车了(延迟高)或者哪条路不通(丢包)。
3. ping
ping
是最常用的网络诊断工具,用于测试网络连通性和延迟。一些组织或服务提供商可能会禁用ICMP协议,以防止网络探测和潜在的攻击。
你可以把 ping
命令想象成潜水艇的“声纳”。潜艇发出一个声波(ping!),然后等待回声(pong!)。通过计算声波发出去和收到回声之间的时间,就能知道:
- 前面是否有障碍物(对方是否存在)。
- 障碍物有多远(延迟有多高)。
ping
命令做的就是类似的事情,它发送一个小的网络数据包(称为 ICMP Echo Request)到目标主机,然后等待对方返回一个响应包(ICMP Echo Reply)。
主要作用
- 测试网络连通性(最核心):
- 这是
ping
最基本的功能。如果能ping
通一个设备,就说明从你的电脑到那个设备之间存在一条有效的网络路径。 - 它是你判断“网络断了”还是“某个网站的服务挂了”的第一步。
- 这是
- 测量网络延迟(RTT):
ping
的输出会显示每个数据包的往返时间(Round-Trip Time, RTT),通常以毫秒(ms)为单位。- 这个时间可以告诉你网络连接的质量。玩在线游戏、进行视频通话时,低延迟(low ping)非常重要。
- 检查网络丢包率:
ping
命令结束后会有一个统计摘要,告诉你发送了多少包、收到了多少包、丢失了多少包。- 如果丢包率很高,说明网络连接不稳定,这会导致网页加载不全、视频卡顿、游戏掉线等问题。
- 测试 DNS 解析:
- 你可以
ping
一个域名(如ping google.com
)。如果命令能够显示出对应的 IP 地址,就说明你的 DNS 解析是正常的。如果显示“找不到主机”,但ping
它的 IP 地址却能通,那问题很可能出在 DNS 上。
- 你可以
使用方法
1 | # 指定次数 |
输出解释
1 | PING google.com (142.250.71.206) 56(84) bytes of data. |
PING google.com (142.250.71.206)
: 显示了正在ping
的域名和它解析出的 IP 地址。64 bytes from ...
: 表示收到了一个来自目标的 64 字节的回复。icmp_seq=1
: 这是第一个数据包。ttl=114
: Time To Live,数据包在网络中还能经过多少个路由器。可以粗略判断对方的操作系统类型。time=10.5 ms
: 这是最重要的信息! 表示这次往返花费了 10.5 毫秒。^C
: 我按下了Ctrl + C
来停止。- 统计摘要:
3 packets transmitted, 3 packets received, 0% packet loss
: 发送3个,收到3个,丢包率为0%。非常健康。rtt min/avg/max/mdev
: 显示了最小、平均、最大和标准差延迟。avg
(平均延迟)是最常看的值。
4. telnet
telnet
是一个用于测试 TCP 端口连通性的工具,虽然最初设计用于远程登录,但现在主要用于网络诊断。
telnet
的核心作用是:与远程主机的特定 TCP 端口建立一个连接,并进行交互。
1 | # 测试端口连通性 |
历史背景
telnet
最初被设计用来登录到远程的 Unix 服务器,就像你坐在那台服务器的终端前一样。telnet
所有的通信(包括你输入的用户名和密码)都是以明文形式在网络上传输的! 这意味着任何在网络路径上的人都可以轻易地窃取你的登录凭据。因此,现在绝对不应该使用
telnet
来进行远程登录。它的这个功能已经被更安全的 SSH (Secure Shell) 完全取代。SSH 会对所有传输的数据进行加密。由于 telnet 有安全问题且功能有限,推荐使用以下替代工具:nc
1
2
3
4
5
6# 更强大的网络工具
nc -zv google.com 80 # 测试端口
nc -zv google.com 70-90 # 扫描端口范围
# 发送数据
echo "GET / HTTP/1.0\r\n\r\n" | nc google.com 80
什么情况不能用 telnet?
- HTTPS/SSL 端口: telnet 能用于测试端口是否开放,无法完成一次真正的 HTTPS 通信。 无法处理 SSL 握手,使用 openssl 代替
- UDP: telnet 只支持 TCP, 使用 nc 测试 UDP。
- 需要认证的服务:例如 SSH 等加密协议。
5. host
host
是一个简单易用的 DNS 查询工具,用于将域名解析为 IP 地址,或进行反向 DNS 查询。host
命令的核心作用是:进行 DNS (Domain Name System) 查询。
使用方法
1 | # 基本查询 |
使用场景
网络故障排查:
当你能
ping 8.8.8.8
但不能ping google.com
时,几乎可以断定是 DNS出了问题。这时使用host google.com
就能确认你的电脑是否能成功解析域名。如果失败,说明需要检查你的 DNS 服务器设置。网站/服务部署验证:
你刚给自己的网站
www.mydomain.com
添加了一条新的 A 记录,指向你的新服务器 IP。你可以用host www.mydomain.com
来检查这条记录是否已经生效(DNS 记录在全球生效需要一定时间,称为“传播”)。检查是否使用 CDN
1
2
3# 不同 DNS 返回不同 IP 可能表示使用了 CDN
host www.example.com 8.8.8.8
host www.example.com 1.1.1.1
6. nslookup
nslookup
是一个用于查询DNS(域名系统)记录的命令行工具。它可以帮助你查找域名对应的IP地址,或者反向查找IP地址对应的域名。
使用方法
1 | # 基本查询 |
输出解释
1 | $ nslookup google.com |
和 host 区别是什么
- nslookup 由于其输出不如
host
清晰,且功能不如dig
强大,在 Linux 上不被优先推荐 - nslookup 一般全平台支持
不同网络下显示不一样
根本原因是你使用的 DNS 解析服务器不同,你在公司问路,问的是前台;你在家里问路,问的是小区保安。
很多公司为了安全和管理,会配置内外网使用不同的 DNS 解析。
在公司内网:你查询
internal.service.com
,DNS 返回一个内网 IP,如10.0.0.50
。在公司外(家):你查询同一个域名
internal.service.com
,公共 DNS 可能会返回一个公司的公网入口 IP,或者直接告诉你找不到这个域名。