家庭网络拓扑

本文介绍家庭局域网的数据传输过程。

常见家庭网络拓扑如下:

flowchart LR
    A[外网] -->|光纤入户| B[光猫] -->|路由器WAN| C[路由器] --> D[交换机]
    D -->|交换机LAN1| E[电脑]
    D -->|交换机LAN2| F[笔记本]
    D-->|交换机LAN3| G[电视机盒子]

现代的 路由器交换机 其实是一个设备,统称路由器。为了便于理解,我们还是把它们拆开。

一、局域网设备

光猫、路由器、交换机 的连接方法。

1)光猫

光猫一般放在弱电箱,它有一个 WAN 口和多个 LAN 口。我们把路由器插在其中一个 LAN 口上,假设插的是 LAN1

WAN LAN1 LAN2 LAN3 ...
接外网网线 接路由器 空闲 空闲 空闲

2)光猫 接 路由器

然后将网线从光猫 LAN1 接到路由器 WAN

WAN LAN
接光猫 LAN1 接交换机(为了便于理解,虚拟出来的 LAN,实际不存在)

3)路由器 接 交换机

最后将网线从路由器 LAN 接到交换机 WAN

WAN LAN1 LAN2 LAN3 ...
接路由器 LAN 接电脑 接笔记本 接电视机盒子 空闲

二、局域网概念

当我们把网线从光猫到路由器再到设备一路接好,就有了一个 局域网 (Local Area Network,LAN)。由于我们主要关心局域网中发生了什么,因此不画光猫。下图是我们的局域网:

flowchart LR
    C[路由器] --> D[交换机]
    D -->|交换机LAN1| E[电脑]
    D -->|交换机LAN2| F[笔记本]
    D-->|交换机LAN3| G[电视机盒子]

其中,路由器作为局域网的 网关,拥有 DHCP 地址池,并为接入其 LAN 口的所有设备提供 局域网 IP子网掩码

1)网关

网关 (Gateway) 作为局域网的出入口。有协议转换、路由决策等功能。

2)DHCP

动态主机配置协议 (Dynamic Host Configuration Protocol, DHCP) 是一种网络协议,用于在局域网内自动为设备分配 IP 地址、子网掩码、默认网关、DNS 服务器等网络信息。

3)局域网 IP

局域网 IP 属于私有 IP,不会在 Internet 上被路由。我国常见的局域网 IP 地址范围是:192.168.0.0 - 192.168.255.255

4)子网掩码

子网掩码 (Subnet Mask) 用于定义网络设备是否在同一子网中。IP 与 子网掩码 进行按位与运算,如果两 IP 运算结果相同,则属于同一子网。

子网掩码可用以下两种方法表示:

  1. 形如 255.255.255.0:转换成二进制后,为 1 的是网段部分,为 0 的是主机部分。二进制 11111111.11111111.11111111.00000000 可以看出前 3 * 8 = 24 比特为 1,也就是 IP 前三段为网段部分。因此对于该子网掩码,如果两台设备 IP 前三段相同,则两台设备在同一子网中。
  2. 形如 192.168.0.0/16:其中,/16 表示 IP 前 16 比特为网段部分。此时如果 IP 前两段是相同的,说明在同一网段。

为了理解子网掩码的作用,我们来看以下两种情形:

  1. 不同局域网中的两台设备,即使拥有相同的子网掩码,也不属于同一子网,无法直接通信。
  2. 同一局域网中的两台设备,如果其 IP 在子网掩码的定义下属于不同网段,同样无法直接通信。

因此,设备必须在同一局域网,同一子网掩码号段下,才能直接通信。如果不在同一子网,会请网关帮忙转发。

Note: 从光猫中牵出两条网线,分别连接两个路由器。如果两个路由器不做任何特殊配置,它们会创建各自的局域网。

三、DHCP 协议

为了方便描述,我们约定各网络设备的 IP 和 MAC 如下:

flowchart LR
    A["`路由器
        外网 IP: 1.1.1.1
        内网 IP: 192.168.1.1
        MAC: AA:AA:AA:AA:AA:AA`"]
    B[交换机]
    C["`电脑
        IP: 192.168.1.2
        MAC: BB:BB:BB:BB:BB:BB`"]
    D["`笔记本
        IP: 192.168.1.3
        MAC: CC:CC:CC:CC:CC:CC`"]
    E["`电视机盒子
        IP: 192.168.1.4
        MAC: DD:DD:DD:DD:DD:DD`"]

    A --> B
    B -->|LAN1| C
    B -->|LAN2| D
    B-->|LAN3| E

首先,电脑要上网,必须要有本机 IP。通过 DHCP 协议可以自动获取 IP。下面描述了 DHCP 协议的过程。

电脑:发出一个 DHCP 协议数据包,我们用简化的四层结构表示该数据包。

DHCP 协议
应用层 (DHCP) 内容:请给我分配一个 IP
传输层 (UDP) 目标端口:67 源端口:68
网络层 目标 IP:255.255.255.255 源 IP:0.0.0.0
网络接口层 目标 MAC:FF:FF:FF:FF:FF:FF 源 MAC:BB:BB:BB:BB:BB:BB

注:广播 IP 地址 255.255.255.255 和 广播 MAC 地址 FF:FF:FF:FF:FF:FF 是用于向同一子网内所有设备发送数据包的特殊地址。

交换机:转发数据包给其他网络设备,包括路由器

数据包传给交换机,交换机解析网络接口层数据,看到电脑的 MAC 为 BB:BB。于是将接口 LAN1 与 BB:BB 建立映射,并将该映射存储在 MAC 地址映射表 中。

由于这是一条广播数据包,最终子网中所有设备都会收到。但读到目标端口,因为只有路由器开启了 DHCP 服务的 67 端口,因此只有路由器会对该数据包进行处理和响应。如果子网中除路由器外的其他设备也开启了 DHCP 服务,那么网络就会发生故障。

路由器:路由器监听 67 端口,接受请求

路由器从 DHCP 地址池中选择一个未被占用的 IP

DHCP 地址池存储的信息包括:

  • IP
  • 子网掩码
  • 网关地址
  • 剩余租约(剩余时间)

二次确认:路由器分配好 IP 后,将带有 IP 信息的数据包发给电脑。电脑会再次向路由发送请求,确认分配的 IP 有效。

现在,电脑得到了局域网中的局域网 IP。

Note 1: DHCP 请求太长时间没有回应,电脑会认为这个局域网唯一的 DHCP 服务挂了。

此时会自动将 IP 地址设为 169.254.1.1,子网掩码设为 255.255.0.0,这样起码让局域网内可以通信。

Note 2: 也可以不用 DHCP 协议,手动配置 IP,但需要 IP 在局域网的网段内

  • 路由器一般是:192.168.1.1
  • 本机 IP 范围:192.168.1.2 ~ 192.168.1.254
  • 子网掩码默认为:255.255.255.0
  • 默认网关一般为路由器的内网 IP:192.168.1.1
  • DNS 服务器 IP 也是路由器的内网 IP:192.168.1.1

DHCP 也可以通过 MAC 地址绑定内网 IP 做静态 IP 分配

四、ARP 协议

ARP (Address Resolution Protocol) 协议用于知道对方 IP 但不知道 MAC 的情形。假设现在电脑知道了路由器的 IP,但是不知道路由器的 MAC,它需要发起 ARP 请求。

电脑:发起 ARP 请求。

ARP 协议
应用层 我是 192.168.1.1192.168.1.2 的 MAC 是?
网络接口层 目标 MAC:FF:FF:FF:FF:FF:FF 源 MAC:简写为 BB:BB

笔记本:笔记本电脑 192.168.1.3 听到广播,发现数据包不是发给自己的。但是知道了内网 IP 为 192.168.1.2 的电脑的 MAC 地址是 BB:BB,于是将 IP2MAC 的 KV 对 保存在自己 ARP 缓存表中。这样想和 192.168.1.2 通信时,就可以直接发给对应的 MAC 地址,不需要广播了。

路由器:路由器也收到了数据包。它将电脑的 IP2MAC 信息存入自己的 ARP 缓存中,以备下次使用。并对电脑的 ARP 请求作出响应:

ARP 协议
应用层 我是 192.168.1.2,MAC 是 AA:AA
网络接口层 目标 MAC:简写为 AA:AA 源 MAC:简写为 BB:BB

电脑:收到路由器发的数据包,并将路由器的 IP2MAC 信息存入 ARP 缓存。

五、DNS 协议

当我们在导航栏输入 www.baidu.com 并按下回车,网络中发生了什么?

www.baidu.com 的域名是为人类可读设计的,机器并不知道域名对应的地址。机器需要通过 DNS (Domain Name System) 服务获取域名对应的 IP 地址。

电脑:浏览器发起DNS请求

DNS 协议
应用层 (DNS) 内容:www.baidu.com 的 IP 是什么?
传输层 (UDP) 目标端口:53 源端口:9523(随便选的未占用端口)
网络层 目标 IP:路由器 IP 192.168.1.1 源 IP:电脑 IP 192.168.1.2
网络接口层 目标 MAC:路由器 MAC 【? ? ? 源 MAC:电脑 MAC BB:BB

路由器的 MAC 会优先从 ARP 缓存中查询,如果查不到,会发起 ARP 请求。填上目标 MAC 地址后,电脑继续发起 DNS 请求。

路由器:经过交换机转发,数据包到了路由器。路由器 DNS 服务监听的 53 号端口收到请求。将该请求转发给它的上游 DNS 服务器获取百度的 IP 地址。上游通过 PPPoE 拨号 获取运营商提供的 DNS 服务器。以下是路由器发给上游 DNS 服务器的数据包:

DNS 协议
应用层 (DNS) 内容:www.baidu.com 的 IP 是什么?
传输层 (UDP) 目标端口:53 源端口:3691(随便选的未占用端口)
网络层 目标 IP:上游 DNS 服务器 IP 源 IP:路由器外网 IP 1.1.1.1
网络接口层 目标 MAC:上游 DNS 服务器 MAC 源 MAC:电脑 MAC BB:BB

外网行为:省略 … …

路由器:收到上游 DNS 服务器的响应:

DNS 协议
应用层 (DNS) 内容:www.baidu.com 的 IP 是 6.6.6.6
传输层 (UDP) 目标端口:3691 源端口:53
网络层 目标 IP:路由器外网 IP 1.1.1.1 源 IP:上游 DNS 服务器 IP
网络接口层 目标 MAC:电脑 MAC BB:BB 源 MAC:上游 DNS 服务器 MAC

路由器将百度的IP地址存到 DNS 缓存,DNS 缓存是 域名 到 IP 的映射,每行还附有 TTL (Time To Live). 局域网内其他设备再获取百度的 IP 地址就会直接从 DNS 缓存中读取。

路由器发给电脑的 DNS 响应:

DNS 协议
应用层 (DNS) 内容:www.baidu.com 的 IP 是 6.6.6.6
传输层 (UDP) 目标端口:9523 源端口:53
网络层 目标 IP:电脑 IP 192.168.1.2 源 IP:路由器内网 IP 192.168.1.1
网络接口层 目标 MAC:电脑 MAC BB:BB 源 MAC:路由器 MAC AA:AA

电脑:收到 DNS 响应,发现目标 MAC 和目标 IP 都是自己,所以会一层层解封装。

当解封到:目标端口:9523 源端口:53

由于 9523 端口是浏览器开启的,浏览器一直在监听该端口,因此收到了 DNS 响应。此时就获得了百度的 IP 地址,并存储到 DNS 缓存中。

六、HTTP 协议

电脑:拿到百度的 IP 后,会向这个 IP 发起 HTTP 请求。

HTTP 协议
应用层 (HTTP) 内容:请求百度的首页
传输层 (TCP) 目标端口:80 源端口:4026,浏览器开的随机端口
网络层 目标 IP:百度 IP 6.6.6.6 源 IP:电脑 IP 192.168.1.2
网络接口层 目标 MAC:路由器 MAC AA:AA 源 MAC:电脑 MAC BB:BB

当封装进行到网络层时,通过 IP 与 子网掩码 的与运算,发型目标 IP 和自己不在同一网段,会请网关帮忙转发。此时电脑配置的网关 IP 是路由器的内网 IP。从 ARP 缓存中,可以通过路由器的 IP 获取路由器的 MAC。

路由器 拿到 HTTP 请求,发现 MAC 是自己,但是目标 IP 不是自己,而是公网 IP,会将其转发到 WAN 口。

路由器还发现源 IP 是内网 IP,无法在公网上使用,于是会做 网络地址转换 (Network Address Translation, NAT) 将源 IP 地址修改为路由器 WAN 口的公网 IP 地址,同时随机选择一个空闲端口,替换源端口。

然后将映射关系存到 NAT映射表 中:

原IP 映射IP 原端口 映射端口
电脑 IP 192.168.1.2 路由器外网 IP 1.1.1.1 4026 8309(路由器随机空闲端口)

接着封装 MAC 地址,源 MAC 是路由器的 MAC,目标 MAC 是下一跳某个路由设备的 MAC。

路由器给外网的 HTTP 请求如下:

HTTP 协议
应用层 (HTTP) 内容:请求百度的首页
传输层 (TCP) 目标端口:80 源端口:8309,NAT 映射端口
网络层 目标 IP:百度 IP 6.6.6.6 源 IP:路由器外网 IP 1.1.1.1
网络接口层 目标 MAC:下一跳路由设备 MAC 源 MAC:路由器的 MAC AA:AA

外网行为:省略 … …

路由器:拿到 HTTP 响应

HTTP 协议
应用层 (HTTP) 内容:百度首页数据
传输层 (TCP) 目标端口:8309 源端口:80
网络层 目标 IP:路由器外网 IP 1.1.1.1 百度 IP 6.6.6.6
网络接口层 目标 MAC:路由器的 MAC AA:AA 源 MAC:下一跳路由设备 MAC

发现端口 8309 是 NAT 转换端口,将 NAT 映射端口替换为原端口,NAT 映射 IP 换为原 IP,即电脑的内网 IP,再转发给电脑。