网络基础与网络设备
网络是把计算机"连起来"的科学:两台电脑之间,数据到底是怎么送过去的?从 1969 年的四台主机,到今天地球上的几十亿台设备,网络靠的是一套地址、协议和一件件硬件设备。这篇笔记从整体上认识网络,重点讲清楚那些每天都在干活、却很少被注意的设备——交换机、路由器。
1 什么是网络
网络(Network)就是多台计算机互相连接、交换信息的系统。上网的本质,是把数据从一台机器送到另一台机器。这件事要解决两个核心问题:
- 怎么找到对方——需要"地址"
- 怎么把数据送过去——需要"路径"和"规则"
围绕这两个问题,诞生了地址体系(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 字节) |
物理地址,烧录在网卡里,出厂唯一 |
| 端口 | 传输层 | 80、443、22 |
标识"主机上的哪个程序" |
打个比方: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):局域网的交通管理员
交换机工作在数据链路层,是局域网的核心设备:
- 从某个端口收到一个帧,先看源 MAC 地址,记进一张 MAC 地址表(哪个 MAC 在哪个端口,靠"学习"建立)
- 查表找到目标 MAC 对应的端口,只把帧从那个端口送出去;表里没有的,才广播给所有端口
好处立竿见影:每个端口独享带宽,支持全双工(同时收发),设备之间互不干扰。家里装修布线、公司组网,用的都是交换机。
路由器(Router):不同网络之间的快递员
路由器工作在网络层,解决交换机解决不了的问题:跨网络转发。局域网内部的通信靠交换机就够了,但访问外网(互联网)、不同网段之间的通信,必须经过路由器。
路由器内部有一张路由表(哪里可以到达、走哪条路,静态配置或由路由协议学习而来):
- 收到 IP 包,解封装,看目标 IP 地址
- 查路由表决定下一跳(next hop)交给谁
- 重新封装后送出
交换机和路由器的本质区别:
| 交换机 | 路由器 | |
|---|---|---|
| 工作层次 | 数据链路层(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["服务器"]
具体步骤:
- 电脑 A 发现目标 IP 不在同一个网段,于是把包交给默认网关(路由器)
- 问一下"网关的 MAC 是什么"(ARP 协议),把帧的目标 MAC 写成网关的 MAC,交给交换机
- 交换机查 MAC 表,把帧送到路由器端口
- 路由器拆开帧,看目标 IP,查路由表找到下一跳,重新封装(目标 MAC 换成下一跳的 MAC)发出去
- 之后每一跳都重复"查路由表 → 换 MAC → 转发",直到到达服务器所在的局域网
- 最后一台交换机把帧送到服务器,服务器逐层解封装,数据交给应用程序
关键点:IP 地址全程不变(标识"找谁"),MAC 地址每一跳都变(标识"下一站是谁")。路由器就像接力赛,MAC 是棒,IP 是终点。
6 局域网、广域网与互联网
| 概念 | 范围 | 典型例子 |
|---|---|---|
| LAN 局域网 | 一个房间/一栋楼 | 家里的 Wi-Fi、公司的内网 |
| WAN 广域网 | 跨城市、跨国家 | 运营商骨干网、专线 |
| Internet 互联网 | 全球互连 | 你正在访问的万维网 |
局域网内通常使用私有 IP 地址(10.x.x.x、172.16~31.x.x、192.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 个字节的二进制数,用点分十进制写出来而已