Skip to content

IP

IPv4

ARP

ARP (地址解析协议):解决“最后一步”的交付核心任务: 根据 IP 地址获取对应的 MAC 地址。必学重点:广播与单播: * ARP Request(请求): 是“广播”,目标 MAC 是 \(FF:FF:FF:FF:FF:FF\),局域网内所有设备都能收到。ARP Reply(响应): 是“单播”,只有发起请求的人能收到。ARP 缓存表 (ARP Cache): 操作系统会暂时记住 IP-MAC 的映射,避免每次都发广播。命令练习: arp -a 查看缓存,arp -d 删除缓存。代理 ARP (Proxy ARP): 当两个主机虽然逻辑上在同一网段,但物理上被路由器隔开时,路由器会“骗”发起者说自己就是目标,从而代为转发。免费 ARP (Gratuitous ARP): 电脑刚开机或改 IP 时,会发一个询问自己 IP 的 ARP 包。如果没有人回应,说明 IP 没冲突;如果有回应,说明 IP 冲突了。

ICMP

由于 IPv4 和 IPv6 都在使用,我们需要把 ICMPv4 和 ICMPv6 结合起来看。

ICMP 的本质:网络层的“反馈机制”ICMP 并不传输用户数据,它传输的是控制信息。它封装在 IP 报头之后(协议号为 1)。

核心报文类型

类型 名称 场景
Type 8 / 0 Echo Request / Reply ping 使用的报文
Type 3 Destination Unreachable 最重要! 告诉源端“路断了”。可能是端口没开(Code 3)或网络不可达(Code 0)
Type 11 Time Exceeded Traceroute 的基石。当 TTL(IPv4)或 Hop Limit(IPv6)减到 0 时触发
Type 5 Redirect 路由器告诉主机:“别找我了,隔壁那台路由器离目的地更近。”

Ping 的工作原理

Ping 本身是基于 ICMP 协议(网络层)工作的,但在发包之前,ARP 必须先解决“路怎么走”的问题。

场景一:Ping 同一局域网内的设备 假设 A(192.168.1.1)要 Ping B(192.168.1.2)。

  1. 检查子网掩码: A 发现 B 的 IP 地址和自己在同一个网段。

  2. 查找 ARP 缓存: A 检查自己的 ARP 表,看有没有 192.168.1.2 对应的 MAC 地址。

  3. ARP 请求(如果没有记录):

  4. A 发出一个 ARP 广播包:“谁是 192.168.1.2?请告诉 192.168.1.1.”

  5. 交换机将此包发给所有人。

  6. ARP 响应:

  7. B 收到后,回复一个 ARP 单播包:“我是 192.168.1.2,我的 MAC 地址是 BB:BB...。”

  8. A 收到后,把这个对应关系存入自己的 ARP 缓存表。

  9. 发送 ICMP 请求:

  10. A 构造一个 ICMP Echo Request 包。

  11. 源 IP: 192.168.1.1,目的 IP: 192.168.1.2。

  12. 源 MAC: A 的 MAC,目的 MAC: B 的 MAC。

  13. ICMP 响应: B 收到后,回一个 ICMP Echo Reply,Ping 成功。

场景二:Ping 跨网段设备(比如 Ping google) 假设 A(192.168.1.1)要 Ping google(142.251.143.14),网关是路由器(192.168.1.254)。

  1. 检查子网掩码: A 发现 google IP 地址和自己不在同一个网段,必须把包发给缺省网关(路由器)。

  2. 获取网关 MAC:

  3. A 检查 ARP 表,看有没有网关 192.168.1.254 的 MAC 地址。

如果没有,通过 ARP 广播找到网关的 MAC。

  1. 构造并发送封包(关键点):

IP 层(逻辑地址): 源 IP 是 A,目的 IP 是 google。

链路层(物理地址): 源 MAC 是 A,目的 MAC 是网关的 MAC。

注意:包里的目的 IP 始终是 google,但目的 MAC 是下一跳的地址。

  1. 路由转发:

路由器收到包,发现目的 MAC 是自己,于是拆开看 IP 层。

路由器根据路由表,把包发给运营商。

在每一跳路由中,IP 始终不变,但 MAC 地址每经过一个路由器都会更换一次。

  1. 目标响应: google收到后,按原路返回一个 ICMP Reply。

Traceroute

Traceroute 的工作原理

过程拆解:

  • 第一步: 源主机发送一个探测包(可能是 UDP 或 ICMP),将 TTL 设置为 1。

  • 第一跳: 第一台路由器收到后将 TTL 减 1(变为 0),丢弃该包,并回传一个 ICMP Type 11 (Time Exceeded)。源主机记录下这台路由器的 IP。

  • 第二步: 源主机发送 TTL 为 2 的包。第一台路由器通过,第二台路由器将其减为 0,回传 ICMP。

  • 以此类推: 直到包到达目的地。目的地会回一个 Echo Reply(如果是 Ping)或 Port Unreachable(如果是 UDP 探测),探测结束。

实际问题:

ICMP 速率限制 (Rate Limiting): 为了防攻击,很多路由器会限制 ICMP 包的响应速度。这会导致 Traceroute 出现 * * *(请求超时),但不代表网络断了。

防火墙封杀: 很多公司会禁止入站的 ICMP。这种情况下,Ping 不通并不代表服务不可用。

MTU 黑洞: 如果网络路径中某个设备丢弃了“Packet Too Big”的 ICMP 包,会导致大包永远发不出去,表现为“小网页能开,大图片打不开”。

面试官问: “如果有一台 Meta 的服务器可以被 ping 通,但是无法建立 ssh 连接(TCP 22 端口),请从 ICMP 的角度给出一个可能的排查方向。”

理想回答思路:

确认连通性: Ping 通说明网络层 (L3) 基础路径是好的。

检查端口状态: 尝试连接时,如果收到 ICMP Type 3 Code 3 (Destination Port Unreachable),说明目标主机在线,但 SSH 服务没起或者被防火墙拦截。

MTU 问题: 如果 SSH 连接在握手阶段卡死,可能是因为 SSH 数据包较大,路径中某个节点 MTU 较小且由于防火墙策略拦截了 ICMP "Packet Too Big" 消息,导致 Path MTU Discovery 失效。

ICMPv6

ICMPv6:不只是诊断,更是生存基础 在 IPv6 的环境中,ICMPv6 的地位极高,因为它承担了 IPv4 中多个协议的功能:

  • 取代 ARP: 通过 NS (Neighbor Solicitation) 和 NA (Neighbor Advertisement) 报文进行地址解析。

  • 无状态自动配置 (SLAAC): 通过 RS (Router Solicitation) 和 RA (Router Advertisement) 报文,让机器自动获得 IPv6 地址。

  • 路径 MTU 发现 (PMTUD): IPv6 不允许中间路由器分片。如果包太大,路由器会回一个 ICMPv6 "Packet Too Too Big" 报文。

DHCP

DHCP(动态主机配置协议,Dynamic Host Configuration Protocol)是让网络“即插即用”的核心功臣。如果没有它,你每到一个地方连 Wi-Fi,都得手动输入一串复杂的 IP 地址、掩码和网关。为了让你快速上手,我们将 DHCP 的工作过程拆解为四个关键步骤,业界通俗地称之为 DORA 过程。

1. DHCP 的核心工作流程:DORA

当你的电脑或手机连接网络时,它会经历以下四个阶段: - D - Discover(发现): 客户端大喊一声:“我是新人,谁是 DHCP 服务器?我需要个 IP!”(以广播形式发送)。 - O - Offer(提供): 服务器响应:“我在呢!我这儿有个 IP \(192.168.1.10\) 还没人抽,你要吗?” - R - Request(请求): 客户端反馈:“太好了,我就要这个 \(192.168.1.10\) 了,请帮我登记一下。” - A - Acknowledge(确认): 服务器拍板:“没问题,租给你了!租期 24 小时,拿走不谢。”

DORA 细节

DHCP 运行在 UDP 协议之上,服务器监听端口 67,客户端监听端口 68。

  1. Discover (发现阶段) —— “全网广播找爸爸” 当你的设备(客户端)刚插上网线或连上 Wi-Fi 时,它还没有 IP 地址,所以它必须发一个“全网寻人启事”。

源 IP: 0.0.0.0 (代表我还没地址)

目的 IP: 255.255.255.255 (受限广播地址,发给局域网内所有人)

关键细节: * 这个包里包含客户端的 MAC 地址(这是服务器识别你的唯一凭证)。

还会包含一个 Transaction ID (事务 ID),用来匹配后续的回复包,防止认错“爸爸”。

  1. Offer (提供阶段) —— “地主家余粮展示” 网络里的 DHCP 服务器收到广播后,会去自己的“地址池”里搜寻一个空闲的 IP。

源 IP: DHCP 服务器自己的物理 IP。

目的 IP: 仍然是 255.255.255.255(或者直接发给客户端的 MAC,取决于具体实现)。

关键细节:

Yiaddr (Your IP Address): 这里面装着服务器准备分给你的 IP(比如 192.168.1.50)。

选项字段 (Options): 这里会预告子网掩码、网关、DNS 以及租约时长 (Lease Time)。

注意:此时这个 IP 只是“预留”给你,还没正式成交。

  1. Request (请求阶段) —— “我就要这一家了” 如果局域网里有多个 DHCP 服务器,客户端可能会收到好几个 Offer。客户端通常会选择最先到达的那个。

源 IP: 依然是 0.0.0.0(此时虽然收到了 Offer,但还没正式生效)。

目的 IP: 255.255.255.255 (广播)。

为什么还要广播?

为了告诉选中的服务器:“我要你的 IP”。

同时也礼貌地告诉其他服务器:“谢谢你们,我已经选好家了,你们把预留的 IP 收回去给别人吧”。

关键细节: 报文里会明确写入 Server Identifier (选中的服务器 IP)。

  1. Acknowledge (确认阶段) —— “签字画押,成交” 选中的服务器收到 Request 后,做最后的确认登记。

源 IP: 服务器 IP。

目的 IP: 255.255.255.255。

关键细节:

服务器发送最后的 ACK 包,把所有的网络参数(IP, 掩码, DNS, 路由)正式发给客户端。

ARP 探测: 在发 ACK 之前或客户端收到 ACK 之后,通常会发一个免费 ARP (Gratuitous ARP) 报文,确认一下局域网里是不是真的没人用这个 IP,防止冲突。

2. DHCP 分配的不仅仅是 IP

除了 IP 地址,DHCP 服务器还会打包发送一份“网络大礼包”,确保你能正常上网: - 子网掩码(Subnet Mask): 确定你所在的局域网范围。 - 默认网关(Gateway): 告诉你出口在哪(通常是路由器的 IP)。 - DNS 服务器: 把网址(如 www.google.com)转换成 IP 的“翻译官”。 - 租约时间(Lease Time): 规定这个 IP 你能用多久。

3. 为什么需要 DHCP?

  • 自动化: 避免了手动配置的繁琐。
  • 防止冲突: 服务器会记录谁用了哪个 IP,防止两个设备抢同一个地址(IP 冲突)。
  • 地址回收: 当你离开咖啡店或关闭电脑,IP 会被收回分配给下一个人,提高了 IP 利用率。

4. 进阶概念:中继代理 (DHCP Relay)

在大型企业网络中,服务器可能在 A 办公室,但员工在 B 办公室(跨子网)。由于 DHCP 广播包无法穿过路由器,这时候就需要 DHCP 中继代理 来充当“快递员”,把请求转发给远端的服务器。

IPv6

IPv6 不仅仅是“地址变长了”,更是为了去掉 NAT 的复杂性和提升路由效率

1. 地址格式与压缩规则

IPv6 地址长度为 128 位,用 8 组十六进制数表示。

压缩规则:

每组前导的 0 可以省略。

连续全为 0 的组可以用 :: 代替(但整个地址只能出现一次 ::)。

地址类型:

  • Global Unicast (2000::/3): 相当于公网 IP。

  • Link-Local (fe80::/10): 极其重要! 仅在同一个物理链路有效。即使没有路由器,设备也会自动生成它。

  • Multicast (ff00::/8): IPv6 没有广播,全部靠组播。

2. 报头结构 (Header):化繁为简

相比 IPv4,IPv6 的报头更加精简,这大大提升了路由器的转发效率。

移除 Checksum: 路由不再计算校验和,交给二层和四层去做。

移除分片字段: 中间路由器不再负责分片。如果包太大,路由器直接丢弃并回传 ICMPv6 "Packet Too Big"。

固定长度: 基本报头固定为 40 字节,可选功能放在“扩展报头”中。

3. NDP (邻居发现协议)

  1. NS 与 NA (取代 ARP 的功能) 在 IPv6 中,获取物理地址(MAC)的过程称为“地址解析”。

NS (Neighbor Solicitation, Type 135): “邻居请求”。

发送方式: 组播。

逻辑: 并不是广播给所有人,而是发送到一个特定的被请求节点组播地址 (Solicited-Node Multicast Address)。只有 IP 后几位相同的设备才会监听,极大地减少了对不相关主机的干扰。

NA (Neighbor Advertisement, Type 136): “邻居通告”。

发送方式: 单播。

逻辑: 目标主机回复自己的 MAC 地址。

  1. 路由发现:RS 与 RA (SLAAC 的基础) 这是 IPv6 实现“插推即用”的关键。服务器不需要 DHCP 就能上网。

RS (Router Solicitation, Type 137): “路由器请求”。

主机刚上线时,主动发 RS 问:“这儿有路由器吗?”

RA (Router Advertisement, Type 138): “路由器通告”。

关键点: 路由器定期发送(或响应 RS)。它包含:

Prefix (网络前缀): 告诉主机在这个网段用什么前缀(通常是 /64)。

Flags (标志位): 告诉主机是自己生成地址(SLAAC),还是去找 DHCPv6 服务器。

MTU: 告诉主机这条链路的最大传输单元(防止分片)。

  1. DAD (Duplicate Address Detection):重复地址检测 IPv6 地址是自己生成的,怎么保证不冲突?

逻辑: 在一个接口正式启用 IP 之前,主机会先发一个 NS 询问自己的拟用 IP。

结果: 如果有人回了 NA,说明 IP 冲突了,该接口会进入 tentative(实验性)状态,不能通信。

这是面试的高频考点。在 IPv4 中我们用 ARP,而在 IPv6 中,所有的链路层发现都靠 ICMPv6 承载的 NDP。

  • 地址解析 (Address Resolution): * 使用 NS (Neighbor Solicitation) 询问 MAC。

  • 使用 NA (Neighbor Advertisement) 回复 MAC。

  • 无状态自动配置 (SLAAC): * 电脑连上网,发个 RS (Router Solicitation) 问:“这儿有路由器吗?”

  • 路由器回个 RA (Router Advertisement) 说:“有,前缀是 2001:db8::/64,你自己编个后缀吧。”

  • 重复地址检测 (DAD): 在启用地址前,先发个 NS 问有没有人用这个 IP,确保地址唯一。

4. PMTUD (路径最大传输单元发现)

由于 IPv6 不支持中间分片,PMTUD 变得至关重要。

1. 源端发送一个 1500 字节的包。

2. 路径中间有个链路只能通过 1280 字节。

3. 路由器丢包并回复 ICMPv6 Type 2 (Packet Too Big)。

4. 源端收到后,根据报文里的 MTU 值缩小发包尺寸。

NPE 思考题: 如果防火墙拦截了所有的 ICMPv6 报文,会发生什么?(答案:MTU 黑洞,连接会超时卡死)。

5. IPv4 到 IPv6 的过渡技术

Meta 内部虽然是 IPv6,但互联网还有很多 IPv4。你需要知道它们怎么共存:

Dual Stack (双栈): 设备同时拥有 IPv4 和 IPv6 地址。

NAT64 / DNS64: 让纯 IPv6 的客户端能访问纯 IPv4 的服务器。

6in4 Tunneling: 把 IPv6 包封装在 IPv4 隧道里传输。

场景: 你在新部署的一台服务器上输入 ping6 google.com,发现 Network is unreachable。但你检查发现网卡已经有一个 fe80:: 开头的地址了。

问题: 为什么有了地址还是出不去?

核心提示: Link-Local 地址 (fe80::) 的作用范围仅限本地链路。你需要检查是否有 RA (Router Advertisement) 报文下发的全局前缀,或者是否有默认路由指向网关的 Link-Local 地址。