IP协议
互联网的核心,计算机网络基干
可以参考谢希任的教材
网络连通性
在这里我们讨论宏观的东西、抽象的、理解性的内容
比如网络设计、是否联通
较少讨论协议细节和通信效率和物理的概念
基本上是网络层和运输层的范围
我们也不讨论历史遗留问题,只讨论当下实用的内容,正在实用的技术
无分类编址CIDR (构造超网)
【网络前缀】和【网络号】,我不太区分…
CIDR(无分类编址):二级分类,network-prefix + host id/前缀长度(IP由【网络号】+【主机号】组成)
一台主机号在它前面的网络号所指明的网络范围内必须是唯一的
网络号在整个互联网的范围内必须是唯一的
子网掩码(subnet mask)是从「划分子网」这里来的
子网掩码是一个网络的重要属性
所有的网络必须要有子网掩码(所以不是IP对应子网掩码,是网络对应子网掩码,只是这个网络中的所有主机都应该知道这个掩码),所以说子网掩码是一个网络/子网的重要属性。
为什么 IP 后面总是跟一个子网掩码?因为单独一个 IP 地址并不能告诉我们这个地址属于哪个网络段。
子网掩码是一个网络的属性,网络内部的所有主机必须使用相同的子网掩码,否则它们将无法正确识别彼此是否“在同一个网络中”。
【网络号】+【子网掩码】,可以确定一个网络,也可以很简单地判断一个IP是否属于此网络。
网络前缀相同,则属于同一个CIDR地址块
可以用地址块中的最小地址和网络前缀的位数指明这个地址块
网络号 + 全0的主机号 = 这个网络本身
网络号 + 全1的主机号 = 广播地址(反正也是一个特殊IP,一般不用)
同样,全0 host id和全1 host id一般不同
虽然 CIDR 不使用子网了,但由于目前仍有一些网络还使用子网划分和子网掩码,因此 CIDR 使用的地址掩码也可继续称为子网掩码
在路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码
特殊网络号:
第一,网络号字段为全0的IP地址是个保留地址,意思是“本网络”(IP地址中的全0表示「这个 this」)
第二,网络号为127(即01111111)保留作为本地软件环回测试(loopbacktest)本主机的进程之间的通信之用,整个网络(127.0.0.0/8)都是,地址空间非常的大,需要测试的时候可能会用到(某些网络测试、调试工具、模拟环境中,可能会用多个 127.x.x.x 地址来模拟多主机通信,比如在同一台机器上跑多个容器或虚拟节点),但是一般用127.0.0.1/8就可以了
注意:虽然整个网络都可以用作loopbacktest,但是不代表默认就能ping通,需要自己开启、然后listen等操作后才能用(127.0.0.1可以直接用)
匿名网络:
路由器和路由器之间相连,可以不分配IP?(不太理解)
IP网络关系图:

计算机网络_ip网络结构.drawio.txt
内网(非公网)网段
私有地址:
| 私有网段 | CIDR表示法 | IP 范围 | 用途说明 |
| A类私有网段 | 10.0.0.0/8 | 10.0.0.0 – 10.255.255.255 | 适用于大型网络 |
| B类私有网段 | 172.16.0.0/12 | 172.16.0.0 – 172.31.255.255 | 中型网络使用 |
| C类私有网段 | 192.168.0.0/16 | 192.168.0.0 – 192.168.255.255 | 小型家庭或企业网络 |
非私有地址(但也不是公网地址,每一段地址都有特殊、明确的用途):
| 地址段 | CIDR | 用途 |
| 127.0.0.0/8 | 回环地址 | 本地回环(localhost) |
| 169.254.0.0/16 | 链路本地地址 | DHCP 失败时自动配置地址 |
| 100.64.0.0/10 | CGNAT | 运营商私网(RFC 6598),简单理解为「运营商级 NAT」 |
| 0.0.0.0/8 | 特殊保留 | 表示默认、未知、本地等 |
桥接
AI: 桥接,英文叫Bridge,本意是“桥梁”,用在网络里就是把两个或多个网络连接起来,让它们像同一个网络一样通信。它就像一个聪明的“分流器”,能自动判断数据包应该流向哪里,不会像交换机那样泛泛地广播。
不太理解…
常有误解
内网是不能嵌套的,比如在一个192.168.1.0/24下面再嵌套一个192.168.1.0/24是不行的,如果要嵌套则应该区分网段,比如使用192.168.2.0/24
可以自己算一下,在同一个内网中出现了重复IP(即使它们在不同的层级)也是会出错的
AI:“内网嵌套内网”是可以的,但必须每一级的子网地址(IP网段)都不能重复、不能重叠!(一个fa的两个子节点可以使用重复网段吗?还没算过)
端口是哪一层的概念?是运输层,网络层把主机当成节点,不是端口/应用。网络层报文的头部包括目标地址和源地址,没有端口
我自己的一个误解:私有IP就是在网关后面,公网IP就是在公网上可以互相连接,实际上公网IP也是属于某个网络的呀
实际上,一个物理网卡是可以配置多个IP的(虚拟的接口当然也可以绑定多个IP)
网络接口(Network Interface) = 主机与网络通信的“接入点”,有物理的也有虚拟的,每个网络接口都可以绑定 1 个或多个 IP 地址,系统通过不同接口处理进出的网络数据包,操作系统中的网络协议栈会根据目标IP、路由表决定走哪个接口发送数据。
绑定的这些IP可以位于同一子网,也可以位于不同子网(比如内网和外网,这是很常见的需求)
IP是绑定在「网络接口」上的,不是绑定到主机
查看一个接口绑定的ip:ip addr show eth0
查看所有接口及其IP:ip addr show
路由器有WAN和LAN,可以理解为有2个网卡
「配置一个IP」和「拥有一个IP」是不同的概念,配置可以自己随便配置,但是不是被承认是另一回事
比如我随便绑定一个公网IP 1.1.1.1,执行命令是不会出错的
但是实际上发送给1.1.1.1的数据不会被路由到我这里来,我自己绑定是没什么用的
网关(一个网络的出入口)当然也是需要配置IP的
作为一般用户或普通网络管理员,根本没必要去关心公网IP之间的“全局路由关系”
硬件
路由器 > 交换机 > Hub(全部转发、广播、群发)
实际上,普通的家用路由器,可以看作是「一个路由器 + 一个交换机」,为什么这么说呢?因为:
A给B发送数据的时候,首先判断目标 IP 是否在“同一个网络”。
如果是,A 会通过 ARP 获得 B 的 MAC 地址,然后直接在以太网层发包给 B。数据确实是通过网线到达了路由器,然后送到了B,但是并没有经过路由器的「路由逻辑」,只是转发而已,这种情况「这个家用路由器」实际上扮演的是「交换机」的作用(交换/转发功能)。
如果不是,则数据包也是先到路由器,但是要经过「路由逻辑」,这才是路由器真正的功能(路由功能)。
网络设备/接口
# MacOS 输出所有的网络设备/接口(当然有很多是虚拟设备)
ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=201<PERFORMNUD,DAD>
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
...
解释[AI]:
lo0 回环接口(Loopback,127.0.0.1),所有系统都会有的本地通信接口。
en0, en1, en2, en3, en4 物理或虚拟的以太网/Wi-Fi接口。通常 en0 是你的Wi-Fi(在MacBook Air上几乎都是)。
awdl0 Apple Wireless Direct Link,Apple自家设备间直连(AirDrop、Handoff等)。
llw0 Low Latency Wi-Fi,用于某些点对点、低延迟传输。
bridge0 网桥接口,可能你有用过虚拟机(比如Parallels、VMware)、Docker 或网络共享,系统会建立一个 bridge。
utun0, utun1, utun2, utun3 通常是虚拟隧道接口,macOS用来支持VPN、iCloud Private Relay等功能。
if0, stf0, anpi0, anpi1, ap1 这些多半是内置的协议适配器、IPv6 over IPv4、或者Apple自己的网络堆栈的一部分。
flags 设备状态标志,是一组描述当前网络接口状态的“开关”。
mtu 最大传输单元(Maximum Transmission Unit),一次网络包能传的最大字节数,通常以太网是1500。
options 针对网卡的特殊功能或特性开关。
inet / inet6 IPv4/6地址,比如 127.0.0.1, 192.168.x.x
ether 物理MAC地址(网卡的唯一硬件标识)
netmask 子网掩码,决定同一网段的地址范围。
broadcast 广播地址,用于网络内群发数据。
media 显示当前网卡的链路类型与状态,比如autoselect <full-duplex>。
status 是否启用
如何自己创建网络接口?
TODO
路由表
如何查看、理解
如何配置、测试
不需要在意路由表是如何计算的
TODO
# 尚未测试的内容
# 查看路由表
ip route show
# 路由表的例子
# 默认路由是一个“兜底规则”,它不绑定任何特定的目标网络,也就不指定 source(源 IP)。
# 实际发送数据时,系统会根据出接口的配置自动选择一个源 IP。
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 metric 100
# 快速测试路由结果
ip route get 8.8.8.8
历史遗留
这里提到的内容基本上已经不用了,仅供参考,不必太在意
A、B、C的网络分类(比如A网络为8位网络号network id + 24位的主机号host id):以前的IP地址分为A、B、C三类,但是现在已经基本不用这种分类方式了(现在用【无分类IP地址】)
划分子网:二级划分(net id + host id) → 三级划分(net id + sub-net id + host id),虽然已经不用了,但是「子网掩码」的说法保留了下来
划分子网之后,IP地址变为3级的结构:网络号 + 子网号 + 主机号
子网掩码:主机号的区域对应0,其余是1(1对应「网络号」或者「网络号 + 子网号」)
电话网络提供可靠传输(基于虚电路),因为电话没有容错能力
计算机网络提供高速、灵活的传输(基于报文):网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务
由于历史的原因,许多有关 TCP/IP 的文献曾经把网络层使用的路由器称为网关
资料