1. 网络发展历程
网络源于人的需求——让计算机之间能够协作。发展路径由局部(局域网)到整体(广域网)。
新技术(需求)带来新设备。
LAN(局域网)
![LAN 图示]
局域网的覆盖范围有限(一栋楼、一个校园),通过交换机等设备连接。
WAN(广域网)
![WAN 图示]
将多个局域网互连起来,形成更大范围的网络,即广域网。
2. 协议
本质是约定,用于形成共识,减少通信成本。协议需要先有约定,然后让多方共同遵守。
统一的网络协议标准由 ISO 制定,称为 OSI(开放系统互连) 模型。ISO 只制定标准,不写代码实现。
协议分层
协议也是软件,所有软件都是分层的。
OSI 七层模型
由于实现复杂度问题,实际工程中合并为 5 层(简化为 TCP/IP 协议 4 层,物理层一般不计入讨论)。
![OSI 七层模型与 TCP/IP 四层模型对照]
| 应用层 | 应用层 | HTTP, FTP, DNS, SSH |
| 表示层 | ↑ | SSL/TLS(实现在应用层库中) |
| 会话层 | ↑ | — |
| 传输层 | 传输层 | TCP, UDP |
| 网络层 | 网络层 | IP, ICMP, ARP |
| 数据链路层 | 数据链路层 | 以太网, MAC 地址, 交换机 |
| 物理层 | (不计) | 集线器, 网线, 光纤 |
TCP/IP 协议的意义
本地通信:所有本地硬件通过"线"连接起来(设备到设备)。冯诺依曼体系本身就是一个网络结构(CPU ↔ 内存 ↔ I/O)。
网络通信:本质是多台主机之间的设备(网卡)与设备(网卡)之间的通信,只是单纯的点之间的距离变长了,从而引发新的问题:
- 数据丢失怎么办?
- 如何定位目标主机?
- 如何找到通往目标的路径?
- 如何处理收到的数据?
![局域网 → 跨网络的问题]
解决问题的方案就是 TCP/IP 协议栈。
协议分层的一个重要原因:不同层用于解决不同种类、不同性质的问题。
| 应用层 | 如何组织和处理数据 |
| 传输层 | 数据是否可靠到达(丢包重传、流量控制) |
| 网络层 | 目标主机在哪里(寻址、路由) |
| 数据链路层 | 当前下一步去哪(相邻节点之间的帧传输) |
TCP/IP 协议与 OS 之间的关系
![协议与 OS 关系图]
协议的不同层其实是在主机的不同层次实现的:
- 数据链路层:在网卡驱动(硬件/固件)中实现
- 传输层(TCP) 和 网络层(IP):在操作系统内核中实现
- 应用层:在用户态进程中实现
TCP 和 IP 给上层提供系统调用(Socket API)。
可以说,协议分层既是基于处理不同问题的需要,也是顺应计算机体系结构(分层结构)的结果。
![分层实现对应关系]
不同操作系统(Linux, Windows, macOS)在网络部分都遵循相同的 TCP/IP 协议,因此网络部分的代码逻辑本质一致,从而能够互相通信。
协议到底是什么
从计算机角度看,协议的本质是约定好的结构体(报文头部格式)。
![协议报文结构]
各层的主要职责和关键概念:
- 物理层:负责光/电信号的传递方式。集线器(Hub,信号中继器)工作在物理层。
- 数据链路层:负责设备之间的数据帧传送和识别。标准有以太网、令牌环网、无线 LAN(都是局域网技术)。交换机(Switch) 工作在这一层。
- 网络层:负责地址管理和路由选择。例如 IP 协议中通过 IP 地址 标识一台主机(更准确地说是网络接口),并通过路由表规划两台主机之间的数据传输线路(路由)。路由器(Router) 工作在这一层。
- 传输层:负责两台主机之间端到端的数据传输。如 TCP(传输控制协议),能确保数据可靠地从源主机发送到目标主机;UDP 则提供不可靠但低延迟的传输。
- 应用层:负责应用程序之间的沟通。网络编程主要针对应用层。
局域网可以有多种(以太网、令牌环网、WiFi),但整体的广域网只能有一个统一的网络层(IP)。因此网络的构成为:多种局域网通信标准 + 一个广域网通信标准。
多种局域网连接起来变成广域网,局域网是广域网的基础。
3. 局域网网络传输
![局域网拓扑示意]
ifconfig(或 ip addr)是一个查看网络接口信息的命令。eth0 是以太网接口的名称,ether 表示以太网,后面的值是网卡的 MAC 地址(全球唯一)。
在局域网中,数据是公开的(总线型或共享介质)。每一台主机的网卡用 MAC 地址 保证自己在局域网内的唯一性。
![MAC 地址帧结构]
工作原理:
- 主机 A(MAC_A)给主机 E(MAC_E)发送数据帧。
- 局域网内的所有主机都会收到这个帧。
- 各主机检查帧头中的 目标 MAC 地址(dst MAC),如果不是自己的,直接丢弃该帧。
- 以太网中,任何时刻只允许一台机器向网络中发送数据(半双工模式)。
- 如果多台主机同时发送,会产生数据干扰,称为数据碰撞。
- 所有发送数据的主机需要执行碰撞检测和碰撞避免算法(CSMA/CD):发送前监听,碰撞后随机等待一段时间再重试。
- 在没有交换机(只有集线器)的情况下,一个以太网就是一个碰撞域。
局域网通信的过程中,主机通过目标 MAC 地址判断收到的报文是否是发给自己的。
以太网的本质是共享临界资源(共享信道)。而令牌环网则是:只有持有令牌的主机才能发言。
两个主机之间的通信本质就是两个协议栈在通信
![协议栈通信示意]
- 同层之间都以为自己在与对方直接通信(因为同层双方处理的数据相同——头部格式是一致的)。
- 每一层报文中的第一个头部叫协议报头,剩下的所有部分叫有效载荷。
- 自顶向下不断加报头的过程叫封装。
- 自下向上不断分离报头和有效载荷的过程叫解包(也叫分用)。
任何协议都必须满足两个基本能力:
底层收到数据但目标不是自己的,直接在数据链路层丢弃。
封装过程可以看作协议报头的不断入栈,解包就是不断出栈。因此一台主机的通信过程叫 协议栈。
不同层报文的叫法:
| 应用层 | 请求 / 应答(消息) |
| 传输层 | 数据段(Segment) |
| 网络层 | 数据报(Datagram / Packet) |
| 数据链路层 | 数据帧(Frame) |
网卡有一种模式叫混杂模式(Promiscuous Mode),在这种模式下网卡会接收所有经过的报文,无脑向上层传递(Wireshark 抓包就是基于此)。
报头中记载了传输给上层的协议是哪一个(如 Ethernet Type 字段标识上层是 IP 还是 ARP)。
4. 跨网络传输
IP 地址
IP 地址:默认使用 IPv4(4 字节,32 位),用于标识全球范围内网络接口的唯一性(公网 IP)。私网 IP(如 192.168.x.x, 10.x.x.x)可在不同局域网内重复使用,通过 NAT(网络地址转换)映射为公网 IP 访问互联网。
IP 与 MAC 之间的关系
一个形象的比喻:
- srcIP 和 dstIP 可以看作公交车的始发站和终点站(全程不变)。
- srcMAC 与 dstMAC 可以看作公交车的当前站与下一站(逐跳变换)。
- dstIP 是路由器转发决策的参照依据。
![IP vs MAC 示意]
路由器本身就是一台主机(有网络层),因此具备路由功能。
关键判断逻辑:
- 如果 dstIP 与 srcIP 在同一个子网内(通过子网掩码判断),src 主机直接将报文发送到目标主机。
- 如果 dstIP 不在同一子网,src 主机会将报文的 dstMAC 设为该局域网中默认网关(路由器) 的 MAC 地址,因为 src 主机不知道该 dstIP 在哪里。
- dstIP 用于判断该报文下一步是直接发给目标主机,还是发给路由器。
MAC 地址是在数据链路层封装的(网络层封装后交给数据链路层,数据链路层加上 MAC 头部)。
报文的传输过程
核心意义:
路由器重新封装(重写 MAC)的功能解决了不同局域网之间数据链路层协议不兼容的问题。因此从网络层往上看,所有网络都叫作 IP 网络。






