Table of Contents

IP协议

互联网的核心,计算机网络基干

可以参考谢希任的教材


网络连通性

在这里我们讨论宏观的东西、抽象的、理解性的内容
比如网络设计、是否联通
较少讨论协议细节和通信效率和物理的概念
基本上是网络层和运输层的范围
我们也不讨论历史遗留问题,只讨论当下实用的内容,正在实用的技术

无分类编址CIDR (构造超网)

  1. 【网络前缀】和【网络号】,我不太区分…
  2. CIDR(无分类编址):二级分类,network-prefix + host id/前缀长度(IP由【网络号】+【主机号】组成)
    1. 一台主机号在它前面的网络号所指明的网络范围内必须是唯一的
    2. 网络号在整个互联网的范围内必须是唯一的
  3. 子网掩码(subnet mask)是从「划分子网」这里来的
  4. 子网掩码是一个网络的重要属性
    1. 所有的网络必须要有子网掩码(所以不是IP对应子网掩码,是网络对应子网掩码,只是这个网络中的所有主机都应该知道这个掩码),所以说子网掩码是一个网络/子网的重要属性。
    2. 为什么 IP 后面总是跟一个子网掩码?因为单独一个 IP 地址并不能告诉我们这个地址属于哪个网络段。
    3. 子网掩码是一个网络的属性,网络内部的所有主机必须使用相同的子网掩码,否则它们将无法正确识别彼此是否“在同一个网络中”。
    4. 【网络号】+【子网掩码】,可以确定一个网络,也可以很简单地判断一个IP是否属于此网络。
  5. 网络前缀相同,则属于同一个CIDR地址块
  6. 可以用地址块中的最小地址和网络前缀的位数指明这个地址块
    1. 网络号 + 全0的主机号 = 这个网络本身
    2. 网络号 + 全1的主机号 = 广播地址(反正也是一个特殊IP,一般不用)
  7. 同样,全0 host id和全1 host id一般不同
  8. 虽然 CIDR 不使用子网了,但由于目前仍有一些网络还使用子网划分和子网掩码,因此 CIDR 使用的地址掩码也可继续称为子网掩码
  9. 在路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码

特殊网络号

  1. 第一,网络号字段为全0的IP地址是个保留地址,意思是“本网络”(IP地址中的全0表示「这个 this」)
  2. 第二,网络号为127(即01111111)保留作为本地软件环回测试(loopbacktest)本主机的进程之间的通信之用,整个网络(127.0.0.0/8)都是,地址空间非常的大,需要测试的时候可能会用到(某些网络测试、调试工具、模拟环境中,可能会用多个 127.x.x.x 地址来模拟多主机通信,比如在同一台机器上跑多个容器或虚拟节点),但是一般用127.0.0.1/8就可以了
    1. 注意:虽然整个网络都可以用作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,本意是“桥梁”,用在网络里就是把两个或多个网络连接起来,让它们像同一个网络一样通信。它就像一个聪明的“分流器”,能自动判断数据包应该流向哪里,不会像交换机那样泛泛地广播。

不太理解…

常有误解

  1. 内网是不能嵌套的,比如在一个192.168.1.0/24下面再嵌套一个192.168.1.0/24是不行的,如果要嵌套则应该区分网段,比如使用192.168.2.0/24
    1. 可以自己算一下,在同一个内网中出现了重复IP(即使它们在不同的层级)也是会出错的
    2. AI:“内网嵌套内网”是可以的,但必须每一级的子网地址(IP网段)都不能重复、不能重叠!(一个fa的两个子节点可以使用重复网段吗?还没算过)
  2. 端口是哪一层的概念?是运输层,网络层把主机当成节点,不是端口/应用。网络层报文的头部包括目标地址和源地址,没有端口
  3. 我自己的一个误解:私有IP就是在网关后面,公网IP就是在公网上可以互相连接,实际上公网IP也是属于某个网络的呀
  4. 实际上,一个物理网卡是可以配置多个IP的(虚拟的接口当然也可以绑定多个IP)
    1. 网络接口(Network Interface) = 主机与网络通信的“接入点”,有物理的也有虚拟的,每个网络接口都可以绑定 1 个或多个 IP 地址,系统通过不同接口处理进出的网络数据包,操作系统中的网络协议栈会根据目标IP、路由表决定走哪个接口发送数据。
    2. 绑定的这些IP可以位于同一子网,也可以位于不同子网(比如内网和外网,这是很常见的需求)
    3. IP是绑定在「网络接口」上的,不是绑定到主机
    4. 查看一个接口绑定的ip:ip addr show eth0
    5. 查看所有接口及其IP:ip addr show
  5. 路由器有WAN和LAN,可以理解为有2个网卡
  6. 「配置一个IP」和「拥有一个IP」是不同的概念,配置可以自己随便配置,但是不是被承认是另一回事
    1. 比如我随便绑定一个公网IP 1.1.1.1,执行命令是不会出错的
    2. 但是实际上发送给1.1.1.1的数据不会被路由到我这里来,我自己绑定是没什么用的
  7. 网关(一个网络的出入口)当然也是需要配置IP的
  8. 作为一般用户或普通网络管理员,根本没必要去关心公网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]:

  1. lo0 回环接口(Loopback,127.0.0.1),所有系统都会有的本地通信接口。
  2. en0, en1, en2, en3, en4 物理或虚拟的以太网/Wi-Fi接口。通常 en0 是你的Wi-Fi(在MacBook Air上几乎都是)。
  3. awdl0 Apple Wireless Direct Link,Apple自家设备间直连(AirDrop、Handoff等)。
  4. llw0 Low Latency Wi-Fi,用于某些点对点、低延迟传输。
  5. bridge0 网桥接口,可能你有用过虚拟机(比如Parallels、VMware)、Docker 或网络共享,系统会建立一个 bridge。
  6. utun0, utun1, utun2, utun3 通常是虚拟隧道接口,macOS用来支持VPN、iCloud Private Relay等功能。
  7. if0, stf0, anpi0, anpi1, ap1 这些多半是内置的协议适配器、IPv6 over IPv4、或者Apple自己的网络堆栈的一部分。
  1. flags 设备状态标志,是一组描述当前网络接口状态的“开关”。
  2. mtu 最大传输单元(Maximum Transmission Unit),一次网络包能传的最大字节数,通常以太网是1500。
  3. options 针对网卡的特殊功能或特性开关。
  4. inet / inet6 IPv4/6地址,比如 127.0.0.1, 192.168.x.x
  5. ether 物理MAC地址(网卡的唯一硬件标识)
  6. netmask 子网掩码,决定同一网段的地址范围。
  7. broadcast 广播地址,用于网络内群发数据。
  8. media 显示当前网卡的链路类型与状态,比如autoselect <full-duplex>。
  9. status 是否启用

如何自己创建网络接口?
TODO

路由表

  1. 如何查看、理解
  2. 如何配置、测试
  3. 不需要在意路由表是如何计算的
  4. 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

历史遗留

这里提到的内容基本上已经不用了,仅供参考,不必太在意

  1. A、B、C的网络分类(比如A网络为8位网络号network id + 24位的主机号host id):以前的IP地址分为A、B、C三类,但是现在已经基本不用这种分类方式了(现在用【无分类IP地址】)
  2. 划分子网:二级划分(net id + host id) → 三级划分(net id + sub-net id + host id),虽然已经不用了,但是「子网掩码」的说法保留了下来
  3. 划分子网之后,IP地址变为3级的结构:网络号 + 子网号 + 主机号
  4. 子网掩码:主机号的区域对应0,其余是1(1对应「网络号」或者「网络号 + 子网号」)
  5. 电话网络提供可靠传输(基于虚电路),因为电话没有容错能力
  6. 计算机网络提供高速、灵活的传输(基于报文):网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务
  7. 由于历史的原因,许多有关 TCP/IP 的文献曾经把网络层使用的路由器称为网关

资料

  1. 一篇全文让你彻底理清IP地址、子网掩码、网关 https://hoochanlon.github.io/helpdesk-guide/enhance/net/neta.html
  2. 10分钟速通计算机网络 每个开发者都具备的计算机常识 https://www.youtube.com/watch?v=_R0F8P-lOew
  3. 【建议收藏】一个视频讲清楚家庭网络通信流程,折腾软路由前必看的计算机网络通识教程,DHCP DNS ARP 子网掩码 NAT 路由器 交换机 https://www.youtube.com/watch?v=P38FmPAq09E