网络基础与网络设备

网络是把计算机"连起来"的科学:两台电脑之间,数据到底是怎么送过去的?从 1969 年的四台主机,到今天地球上的几十亿台设备,网络靠的是一套地址、协议和一件件硬件设备。这篇笔记从整体上认识网络,重点讲清楚那些每天都在干活、却很少被注意的设备——交换机、路由器。

1 什么是网络

网络(Network)就是多台计算机互相连接、交换信息的系统。上网的本质,是把数据从一台机器送到另一台机器。这件事要解决两个核心问题:

  1. 怎么找到对方——需要"地址"
  2. 怎么把数据送过去——需要"路径"和"规则"

围绕这两个问题,诞生了地址体系(IP、MAC、端口)、协议体系(TCP/IP)和硬件设备(交换机、路由器……)。网络之所以是"网络",就是因为它不是把所有电脑一对一接起来,而是让每台设备只连到"网络设备"上,由这些设备负责转发——就像城市的道路系统,而不是每户人家之间直接修一条路。

2 网络的发展史(按时间顺序)

timeline
    title 网络的发展史
    1969 年 : ARPANET 诞生 四台主机互连
    1973 年 : 以太网在施乐实验室发明
    1974 年 : TCP IP 协议论文发表
    1983 年 : ARPANET 全面切换到 TCP IP
    1980 年代 : 局域网普及 集线器时代
    1990 年 : 第一台以太网交换机问世
    1991 年 : WWW 万维网诞生
    1995 年 : 互联网商业化 路由器大规模部署
    1997 年 : 无线局域网 802 11 标准发布

1969:ARPANET,互联网的起点

1969 年 10 月,美国国防部高级研究计划局(DARPA)建立了 ARPANET,最初只有四台主机(加州大学洛杉矶分校、斯坦福研究所等四所机构),用电话线路互连。它是互联网的祖先——"互联网(Internet)"这个名字,指的就是"网络的网络"。

1973:以太网,局域网的开端

1973 年,鲍勃·梅特卡夫(Bob Metcalfe)在施乐帕洛阿尔托研究中心(Xerox PARC)发明了以太网(Ethernet):多台电脑用同轴电缆连成一条"总线",靠"先听后发、冲突重发"的规则共享线路。今天我们家里、公司里用的有线网络,本质都是以太网的进化版。

1974:TCP/IP 提出

1974 年,文特·瑟夫(Vint Cerf)鲍勃·卡恩(Bob Kahn)发表了 TCP 协议论文,后来发展成 TCP/IP 协议族——一套"数据如何打包、如何寻址、如何可靠送达"的规则。它不依赖任何一家厂商、任何一条线路,正是这种开放设计,让后来的网络可以无限扩张。

1983:TCP/IP 成为标准

1983 年 1 月 1 日,ARPANET 从旧的 NCP 协议全面切换到 TCP/IP(这一天被称为 flag day),TCP/IP 从此成为互联网的事实标准,沿用至今。

1990:交换机问世

1990 年,美国 Kalpana 公司推出了第一台以太网交换机。它和集线器外表相似,但内部会"学习"每台电脑的地址并精准转发,让局域网从"大家抢一条线"进化到"各走各的路"。

1991:万维网诞生

1991 年,蒂姆·伯纳斯-李在 CERN 发明了 WWW(万维网),从此网络不再是专家的工具,浏览器让普通人也能上网。1995 年互联网商业化,路由器大规模部署,网络进入千家万户。

3 网络中的地址与协议

三个"地址":IP、MAC、端口

地址 层次 样子 作用
IP 地址 网络层 192.168.1.10(4 字节) 逻辑地址,标识"在哪张网上",会变化
MAC 地址 数据链路层 00:1A:2B:3C:4D:5E(6 字节) 物理地址,烧录在网卡里,出厂唯一
端口 传输层 8044322 标识"主机上的哪个程序"

打个比方:IP 地址是"城市里的门牌号",MAC 地址是"人的身份证号",端口是"楼里的门"。送信先按门牌号找到楼,再按门找到人。

协议分层:OSI 七层与 TCP/IP 四层

网络太复杂,所以把功能拆成,每一层只负责一件事,下层为上层服务。经典的教学模型是 OSI 七层,现实中用的是简化的 TCP/IP 四层:

flowchart LR
    subgraph OSI["OSI 七层模型"]
        direction TB
        L7["7 应用层"]
        L6["6 表示层"]
        L5["5 会话层"]
        L4["4 传输层"]
        L3["3 网络层"]
        L2["2 数据链路层"]
        L1["1 物理层"]
    end
    subgraph TCPIP["TCP/IP 四层模型"]
        direction TB
        T4["应用层<br>HTTP DNS SMTP"]
        T3["传输层<br>TCP UDP"]
        T2["网络层<br>IP ICMP"]
        T1["网络接口层<br>以太网帧"]
    end
    L7 --> T4
    L6 --> T4
    L5 --> T4
    L4 --> T3
    L3 --> T2
    L2 --> T1
    L1 --> T1
TCP/IP 层 典型协议/设备 关键概念
应用层 HTTP、DNS、SMTP 我们直接接触的协议
传输层 TCP、UDP 端口、可靠/不可靠
网络层 IP、ICMP IP 地址、路由器、路由表
网络接口层 以太网 MAC 地址、交换机

记法:哪一层负责什么,可以按设备记——交换机工作在数据链路层(2 层),路由器工作在网络层(3 层),这也是常说的"二层设备""三层设备"。

4 网络硬件设备(重点)

网卡(NIC)

计算机上网的"接口"。有线网卡、无线网卡都是网卡。它负责把数据封装成以太网帧发送到线路上,并从线路接收帧。MAC 地址就烧录在网卡里,出厂时由厂商分配,理论上全球唯一。

集线器(Hub):广播信号的老古董

集线器工作在物理层,功能非常简单:从哪个端口收到信号,就原样转发给其他所有端口。结果是:

  • 所有端口共享带宽,同一时刻只有一台设备能发数据(其他都在等)
  • 收到别人的数据也得照单全收,再由网卡判断"是不是给我的"(凭 MAC 地址过滤)

集线器已经被交换机完全取代,现在了解它主要是为了对比理解"为什么交换机更好"。

交换机(Switch):局域网的交通管理员

交换机工作在数据链路层,是局域网的核心设备:

  1. 从某个端口收到一个帧,先看源 MAC 地址,记进一张 MAC 地址表(哪个 MAC 在哪个端口,靠"学习"建立)
  2. 查表找到目标 MAC 对应的端口,只把帧从那个端口送出去;表里没有的,才广播给所有端口

好处立竿见影:每个端口独享带宽,支持全双工(同时收发),设备之间互不干扰。家里装修布线、公司组网,用的都是交换机。

路由器(Router):不同网络之间的快递员

路由器工作在网络层,解决交换机解决不了的问题:跨网络转发。局域网内部的通信靠交换机就够了,但访问外网(互联网)、不同网段之间的通信,必须经过路由器。

路由器内部有一张路由表(哪里可以到达、走哪条路,静态配置或由路由协议学习而来):

  1. 收到 IP 包,解封装,看目标 IP 地址
  2. 查路由表决定下一跳(next hop)交给谁
  3. 重新封装后送出

交换机和路由器的本质区别

交换机 路由器
工作层次 数据链路层(2 层) 网络层(3 层)
认什么地址 MAC 地址 IP 地址
转发的依据 MAC 地址表(学习而来) 路由表(配置/协议学习)
连接什么 同网段的设备 不同网络
隔离广播域 不能

网关(Gateway)

网关是"出门的那扇门"。局域网内的设备要访问外网,数据包必须先发给默认网关——通常就是路由器的 IP(如 192.168.1.1)。所以"网关"往往不是一台独立设备,而是路由器在局域网里扮演的角色。

无线 AP 与无线路由器

无线 AP(Access Point,接入点)把有线网络变成 Wi-Fi:手机、笔记本通过无线信号接入。很多"无线路由器"其实是三合一设备——路由器 + 交换机 + 无线 AP,一个盒子全包了。

光猫(ONT)

光纤入户的转换设备:把光纤里的光信号转换成网线里的电信号。它是家庭网络的起点,光猫后面再接路由器、交换机、AP。

设备全家福对比

设备 工作层 转发依据 一句话
集线器 物理层 无(广播信号) 老古董,所有人抢一条线
交换机 数据链路层 MAC 地址表 局域网内精准转发
路由器 网络层 IP 路由表 跨网络指路
网关 网络层 局域网出口,通常是路由器
无线 AP 数据链路层 MAC 地址 有线变无线
光猫 物理层 光信号 ↔ 电信号

一个典型家庭网络拓扑

flowchart TD
    WAN[互联网] --- MODEM[光猫<br>光信号转电信号]
    MODEM --- R[路由器<br>拨号 网关 DHCP NAT]
    R --- S[交换机<br>有线口扩展]
    S --- P1[台式机]
    S --- P2[NAS 家庭服务器]
    S --- P3[电视]
    R --- AP[无线 AP<br>Wi-Fi]
    AP --- M1[手机]
    AP --- M2[笔记本]

5 数据包的旅程:IP 不变,MAC 变

理解了设备和地址,就能看懂数据跨网络传输的全过程。以"电脑 A 访问互联网上的服务器"为例:

flowchart LR
    A["电脑 A<br>IP 192.168.1.10<br>目标服务器 IP 8.8.8.8"] --> S1["交换机<br>查 MAC 表 送到网关"] --> R["路由器<br>查路由表 改 MAC<br>发往互联网"] --> NET["互联网<br>逐跳转发 每跳换 MAC"] --> S2["服务器所在交换机"] --> B["服务器"]

具体步骤:

  1. 电脑 A 发现目标 IP 不在同一个网段,于是把包交给默认网关(路由器)
  2. 问一下"网关的 MAC 是什么"(ARP 协议),把帧的目标 MAC 写成网关的 MAC,交给交换机
  3. 交换机查 MAC 表,把帧送到路由器端口
  4. 路由器拆开帧,看目标 IP,查路由表找到下一跳,重新封装(目标 MAC 换成下一跳的 MAC)发出去
  5. 之后每一跳都重复"查路由表 → 换 MAC → 转发",直到到达服务器所在的局域网
  6. 最后一台交换机把帧送到服务器,服务器逐层解封装,数据交给应用程序

关键点:IP 地址全程不变(标识"找谁"),MAC 地址每一跳都变(标识"下一站是谁")。路由器就像接力赛,MAC 是棒,IP 是终点。

6 局域网、广域网与互联网

概念 范围 典型例子
LAN 局域网 一个房间/一栋楼 家里的 Wi-Fi、公司的内网
WAN 广域网 跨城市、跨国家 运营商骨干网、专线
Internet 互联网 全球互连 你正在访问的万维网

局域网内通常使用私有 IP 地址10.x.x.x172.16~31.x.x192.168.x.x),这些地址只在局域网内有效。设备要上网,靠路由器的 NAT(网络地址转换) 把私有 IP 转换成公网 IP——这也是为什么家里所有设备共用一个宽带账号。

7 常用排错命令

命令 作用 典型输出
ipconfig(Windows)/ ip addr(Linux) 查看本机 IP、网关、MAC IPv4 地址: 192.168.1.10
ping 目标 测试到目标是否通、延迟多少 来自 8.8.8.8 的回复: 时间=20ms
tracert 目标(Windows)/ traceroute(Linux) 查看每一跳经过的路由器 逐跳 IP 列表
nslookup 域名 查域名对应的 IP www.example.com → 93.184.216.34

排查思路:先 ping 网关(本地通不通)→ 再 ping 外网 IP(路由通不通)→ 再 ping 域名(DNS 通不通)——三步定位问题出在哪一层。

8 用 Python 跟踪 IP 的路由

tracert 能显示"到达一个 IP 经过了哪些路由器",这就是路由跟踪(traceroute)。用 Python 也能自己实现一套,还能做系统命令做不到的事——比如对比两次跟踪、观察路由变化。

traceroute 的原理:TTL 与 ICMP

核心思路是"让数据包自己报出每一跳":

  • 每个 IP 包里有个 TTL(生存时间) 字段,每经过一个路由器就减 1,减到 0 就丢弃
  • 丢弃时路由器会按 ICMP 协议回一条"超时"通知,告诉发送方"我在这里"
  • 于是:发 TTL=1 的包 → 第一跳路由器回信;发 TTL=2 → 第二跳回信……直到到达目标
sequenceDiagram
    participant PC as 我的电脑
    participant R1 as 路由器 1
    participant R2 as 路由器 2
    participant S as 目标服务器
    PC->>R1: UDP 包 TTL=1
    R1-->>PC: ICMP 超时 通知
    PC->>R2: UDP 包 TTL=2
    R2-->>PC: ICMP 超时 通知
    PC->>S: UDP 包 TTL=3
    S-->>PC: ICMP 端口不可达 通知
    Note over PC: 每一跳的回复地址,就是沿途的路由器

纯 Python 实现

用 UDP 发包(目标端口选一个没人监听的端口),用原始套接字接收 ICMP 回复:

import socket


def traceroute(host, max_hops=30, timeout=2):
    """UDP 方式跟踪到 host 的路由,返回 [(跳数, IP 或 None)]"""
    target = socket.gethostbyname(host)
    print(f'跟踪 {host} -> {target}')
    hops = []
    for ttl in range(1, max_hops + 1):
        # 收 ICMP 回复的套接字
        recv = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
        recv.settimeout(timeout)
        # 发 UDP 包的套接字,TTL 从 1 开始递增
        send = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
        send.setsockopt(socket.IPPROTO_IP, socket.IP_TTL, ttl)
        try:
            send.sendto(b'', (target, 33434 + ttl))
            _, addr = recv.recvfrom(512)
            hop_ip = addr[0]
        except socket.timeout:
            hop_ip = None
        finally:
            send.close()
            recv.close()
        hops.append((ttl, hop_ip))
        print(f'{ttl:2d}  {hop_ip if hop_ip else "* * * 超时"}')
        if hop_ip == target:      # 目标主机回了"端口不可达",到达终点
            print('到达目标主机')
            break
    return hops


traceroute('www.baidu.com')

注意:构造原始套接字需要权限——Windows 要以管理员运行,Linux 要用 sudo

免权限方案:调用系统命令

不想碰原始套接字,直接调用系统的 tracert / traceroute,用 Python 解析输出也行:

import subprocess

result = subprocess.run(
    ['tracert', '-d', '8.8.8.8'],   # -d 不解析主机名,速度更快
    capture_output=True, text=True, timeout=60
)
print(result.stdout)

观察"路由调整"

互联网的路径不是固定的。运营商会持续调整路由:

  • 故障切换:某条线路断了,BGP 自动把流量切到备用线路
  • 负载均衡:同一目标有多条路径时,流量轮流走不同线路
  • 维护调整:运营商割接、扩容后路径变长或变短

所以"刚才 ping 延迟突然变高"往往不是网络坏了,而是路径变了。用 Python 很容易验证——间隔几秒跟踪两次,逐跳对比:

first = traceroute('8.8.8.8')
import time
time.sleep(10)
second = traceroute('8.8.8.8')

for (h1, ip1), (h2, ip2) in zip(first, second):
    state = '相同' if ip1 == ip2 else '变化'
    print(f'第 {h1:2d} 跳  {ip1 or "*"}  vs  {ip2 or "*"}  {state}')

观察要点:

  • 某几跳 IP 不同 → 走了不同的中间路径(负载均衡或路由调整)
  • 跳数变多/变少 → 路径整体调整了
  • 中间出现 * * * → 该路由器不回 ICMP 超时通知(正常现象),不代表链路不通

相关笔记

  • 计算机中的进制:IP 地址 192.168.1.10 就是 4 个字节的二进制数,用点分十进制写出来而已