专注、坚持

计算机网络核心笔记

2021.05.22 by kingcos
Preface · 序
计算机网络是学习计算机的必修课,虽然我们可能很少深入底层,但有些内容了解更多才能支撑我们走的更远。

基础知识

计算机连接

  • 计算机之间通信需要知道对方的 IP 地址,并最终通过 MAC 地址(网卡地址),输送数据到网卡,由网卡判断接收(非目标 MAC 地址将丢弃数据)。
  • 因特网(Internet)是最大的互联网(internet)。
  • 两台计算机直接连接需要交叉线(非直通线)。
  • 冲突域(Collision Domain):在同一个冲突域中,一个节点发送的帧将可以到达任意一个节点。
  • 广播域(Broadcast Domain):在同一个广播域中,一个节点可以通过广播的方式到达任意一个节点。
  • 冲突域一般来说小于或者包含在广播域中。
  • 网线直连、同轴电缆、集线器、网桥、交换机连接的设备必须在同一网段,且连接的设备处在同一广播域。
连接方式 通信模式 特点 参考模型
同轴电缆(Coaxial) 半双工通信 容易冲突(形成冲突域);安全性低 物理层
集线器(Hub) 半双工通信 容易冲突(形成冲突域);安全性低 物理层
网桥(Bridge) 半双工通信 通过内置表存储各个接口对应的 MAC 地址;隔绝冲突域 数据链路层
交换机(Switch) 全双工通信 相当于接口更多的网桥 数据链路层
路由器(Router) 全双工通信 可以在不同网段之间转发数据;隔绝广播域 网络层

网络分类

  • 按照网络的范围进行分类,可以分为:局域网(LAN)、城域网(MAN)、广域网(WAN)。
  • 局域网中使用最广泛的网络技术为以太网(Ethernet),即以太网是一种技术规范而非具体的网络。
  • 无线局域网,即 Wireless LAN,即 WLAN。
  • 常见的网络接口:FastEthernet(快速以太网接口,100M),GigabitEthernet(千兆以太网接口)、Serial(串行接口)。
  • 电话线入网:即 ADSL 电话拨号上网;非对称数字用户线路,提供上下行不对称的传输带宽;猫(Modem),调制解调器,进行数字信号和模拟信号的转换。
  • 光纤入户:光猫(Optical Modem),光调制解调器,进行数字信号和光信号的转换。
  • 网线入户:网线直连即可上网。
  • 家用无线路由器 = 路由 + 交换机 + 无线 AP(Access Point)。

Reference

MAC 地址

  • MAC 地址,全称 Media Access Control Address,译为媒体访问控制地址。
  • MAC 地址 共 6 个字节,即 48 位,以十六进制表示;其中前三个字节为组织唯一表示符号(OUI),由 IEEE 的注册管理机构分配给厂商;后三个字节为网络接口标识符(NIC),由厂商自行分配。
  • 当 MAC 地址 48 位全为 1 时,代表广播地址,即 FF:FF:FF:FF:FF:FF

Reference

ARP 协议

  • ARP,全称 Address Resolution Protocol,译为地址解析协议,用于通过 IP 地址获取 MAC 地址。
  • RARP,全称 Reverse Address Resolution Protocol,译为逆地址解析协议,用于将 MAC 地址转换为 IP 地址,后被 BOOTP、DHCP 取代。
  • ARP 的获取结果将会缓存为 IP 地址与 MAC 地址的映射,即 ARP 缓存。
  • 通过 ARP 广播获取的 MAC 地址属于动态(Dynamic)缓存,存储时间较短(默认 2 分钟),过期将自动删除;手动设定(arp -s)的则为静态。
  • ARP 与 RARP 均位于参考模型中的网络层。
➜  ~ arp
usage: arp [-n] [-i interface] hostname
       arp [-n] [-i interface] [-l] -a
       arp -d hostname [pub] [ifscope interface]
       arp -d [-i interface] -a
       arp -s hostname ether_addr [temp] [reject] [blackhole] [pub [only]] [ifscope interface]
       arp -S hostname ether_addr [temp] [reject] [blackhole] [pub [only]] [ifscope interface]
       arp -f filename

➜  ~  arp -nla
Neighbor                Linklayer Address Expire(O) Expire(I)    Netif Refs Prbs
169.254.33.244          14:2d:27:f1:27:7b expired   1m38s          en0    2
192.168.199.1           d4:ee:7:5b:22:96  2m54s     2m54s          en0    1

过程

详见 ICMP 一节 ping 的过程

ARP 欺骗

TODO.

Reference

ICMP 协议

  • ICMP,全称 Internet Control Miressage Protocol,译为互联网控制消息协议。
  • IPv4 中的 ICMP 被称作 ICMPv4,IPv6 中的 ICMP 则被称作 ICMPv6。
  • ICMP 常用于返回错误信息,比如 TTL 值过期、目标不可达;我们熟悉的 ping 命令本质就是使用了 ICMP 以探测主机是否可以通信。
  • ICMP 也位于参考模型中的网络层。

ping 的过程

这里我们尝试 ping 一台位于同一个 Wi-Fi 局域网下的 iPhone 的 IP。在开始 ping 之前,首先需要打开 Wireshark(m1 芯片的 Mac 也可正常使用 Intel 版本的 Wireshark)并开启抓包,并在命令行中查询 ARP 缓存是否已经记录了这台 iPhone IP 的 MAC 地址,如果已经记录了,我们可以使用 sudo arp -d 命令强制删除记录:

➜  ~ arp -nla | grep 192.168.199.138
192.168.199.138         8a:3b:15:74:f5:3f 1m50s     1m51s          en0    1

➜  ~ sudo arp -d 192.168.199.138
192.168.199.138 (192.168.199.138) deleted

➜  ~ arp -nla | grep 192.168.199.138

接下来我们使用 ping 命令,并在 3 次后停止 ping 和 Wireshark 抓包,并再次查询 ARP 缓存:

➜  ~ ping 192.168.199.138
PING 192.168.199.138 (192.168.199.138): 56 data bytes
64 bytes from 192.168.199.138: icmp_seq=0 ttl=64 time=63.348 ms
64 bytes from 192.168.199.138: icmp_seq=1 ttl=64 time=175.668 ms
64 bytes from 192.168.199.138: icmp_seq=2 ttl=64 time=8.581 ms
^C
--- 192.168.199.138 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 8.581/82.532/175.668/69.549 ms

➜  ~ arp -nla | grep 192.168.199.138
192.168.199.138         8a:3b:15:74:f5:3f 2m39s     2m39s          en0    1

整体的流程如下图:

5

我们也可以在 Wireshark 中看到这一过程(左 ARP,右 ICMP):

Reference

IP 地址

  • IP 地址,全称 Internet Protocol Address,互联网上的每一个主机都有一个 IP 地址。
  • IP 地址分为两个版本,IPv4 与 IPv6;IPv4 使用 32 位(4 字节)地址,地址空间共计 232 个地址;IPv4 使用 128 位(16 字节)地址,地址空间共计 2128 个地址;未明确情况下,本文提及 IP 默认为 IPv4 内容。
  • IP 地址由两部分组成,网络标识(网络 ID)、主机标识(主机 ID),可以通过子网掩码(Subnet Mask)得知网络 ID、主机 ID。
  • 同一网段的计算机,网络 ID 相同;主机所在网段 = IP 地址 & 子网掩码(规律:按位和 1 与,则保持原值,和 0 与则为 0)。
  • 计算机之间通信时,会先判断目标主机和自己是否在同一网段(⚠️:使用自身的子网掩码计算):若位于同一网段:不需要由路由器进行转发;若位于不同网段,交由路由器(网关)进行转发。

以我的 MacBook 的 IP 地址与子网掩码为例,计算如下:

          192.      168.      199.      200
    1100 0000.1010 1000.1100 0111.1100 1000

          255.      255.      255.      0
    1111 1111.1111 1111.1111 1111.0000 0000

    1100 0000.1010 1000.1100 0111.1100 1000
&   1111 1111.1111 1111.1111 1111.0000 0000
--------------------------------------------
    1100 0000.1010 1000.1100 0111.0000 0000
          192.      168.      199.        0

即我的 MacBook 的 IP 地址 192.168.199.2001100 0000 1010 1000 1100 0111 为网络 ID,1100 1000 为主机 ID,该 IP 地址属于 192.168.199.0 网段。

IP 地址的分类:

分类 前缀 默认子网掩码 最大可容纳主机数
A 类地址 0,范围 1~126 255.0.0.0
(8 + 24)
224 - 2
B 类地址 10,范围 128~191 255.255.0.0
(16 + 16)
216 - 2
C 类地址 110,范围 192~223 255.255.255.0
(24 + 8)
28 - 2
D 类地址(多播) 1110,范围 224~239 - -
E 类地址(保留) 1111,范围 240~255 - -
  • IP 地址前 8 位全 0 以及除首位全 1 作为保留网段也不可使用,其中 127.0.0.1 是本地环回地址(Loopback),代表本机地址。
  • 计算最大可容纳主机数时,主机 ID 部分全 1(广播地址)和全 0(网段)不可分配给主机,因此均需要 - 2
  • IP 地址分为:公网 IP、私网 IP。
  • Internet 上的路由器中只有到达公网的路由表,没有到达私网的路由表。
  • 公网 IP:由 Inter NIC 统一分配和管理,ISP 需要向 Inter NIC 申请公网 IP。
  • 私网 IP:主要用于局域网,以下是保留的私网网段:
    • A 类:10.0.0.0/8,1 个 A 类网络
    • B 类:172.16.0.0/16 ~ 172.31.0.0/16,16 个 B 类网络
    • C 类:192.168.0.0/24 ~ 192.168.255.0/24,256 个 C 类网络

Reference

子网掩码

  • CIDR,全称 Classless Inter-Domain Routing,译为无类别域间路由。
  • 子网掩码的 CIDR 表示方法:192.168.199.200/24,表示该 IP 地址的子网掩码前 24 位为 1,即 255.255.255.0

子网划分

  • 目的:避免浪费 IP 地址资源。
  • 原理:借用主机位作为子网位,划分出多个子网。
  • 等长子网划分(Fixed Length Subnet Mask):每个子网的可用 IP 地址数量相同
  • 变长子网划分(Variable Length Subnet Mask):每个子网的可用 IP 地址数量不同,子网掩码也不同。
  • 规律:若子网段地址范围是原网段的 (1/2)^n,那么该子网的子网掩码在原网段的子网掩码上增加 n1(二进制)。

合并网段

  • 与子网划分相反,合并网段指将多个连续网段合并为一个网段,合并后的网段称作超网(Supernetting)。
  • 判断子网还是超网:根据 IP 地址的分类,若其子网掩码位数比默认多,则为子网,反之超网(eg. 25.100.0.0/16 是 A 类子网)。
  • 规律:当 2^k=n (k>=1),子网掩码左移动 k 位可以合并 n 个网段。

路由

  • 在不同网段之间转发数据,需要有路由器的支持,非直连网段可以通过路由表来到达;路由表的内容可以静态配置或动态学习,分别称为静态路由与动态路由。
  • 静态路由:管理员手动添加路由信息;适用于小规模网络。
  • 动态路由:通过路由选择协议(eg. RIP、OSPF)自动获取路由信息;适用于大规模网络。

NAT ★

  • NAT,全称 Network Address Translation,译为网络地址转换。
  • 私网 IP 访问 Internet 需要进行 NAT 转换为公网 IP,这一步可以由路由器完成。
  • 特点:
    • 节约公网 IP 资源;
    • 隐藏内部真实 IP。
NAT 分类 特点
静态转换 手动配置 NAT 映射表;
一对一转换
动态转换 定义外部地址池,动态随机转换;
一对一转换
PAT 全称 Port Address Translation,译为网络地址转换;
多对一转换,最大程度节约公网 IP 资源;
采用端口多路复用方式,通过端口号标识不同的数据流;
目前应用最广泛的 NAT 实现方式

参考模型

1

物理层

  • 物理层定义了接口标准、线缆标准、传输速率、传输方式等。
  • 网线不能超过 100 米。
  • 模拟信号(Analog Signal):连续的信号,适合长距离传输;抗干扰能力差,受到干扰时波形变形很难纠正。
  • 数字信号(Digital Signal):离散的信号,不适合长距离传输;抗干扰能力强,受到干扰时波形失真可以修复。

9

  • 信道:信息传输的通道,一条传输介质(比如网线)上可以有多条信道。
分类 特点 举例
单工通信 信号只能往一个方向传输,任何时候都不能改变信号的传输方向 无线电广播、有线电视广播
半双工通信 信号可以双向传输,但必须是交替进行,同一时间只能往一个方向传输 对讲机
全双工通信 信号可以同时双向传输 手机打电话

数据链路层

  • 链路:从 1 个节点到相邻节点的一段屋里线路(有线或无线),中间没有其他交换节点(集线器不算)。
  • 数据链路:在一条链路上传输数据时,需要有对应的通信协议来控制数据的传输。
  • 数据链路层的 3 个基本问题:封装成帧,透明传输,差错校验。

10

  • MTU,全称 Maximum Transfer Unit,译为最大传输单元。
  • 每一种数据链路层协议都规定了所能够传送的帧的数据长度上限,以太网的 MTU 为 1500 字节。

11

  • 广播信道:eg. CSMA/CD 协议(同轴电缆、集线器等之间)。
  • CSMA/CD,全称 Carrier Sense Multiple Access with Collision Detection,译为载波侦听多路访问 / 冲突检测。
  • 使用了 CSMA/CD 的网络为以太网,传输的是以太网帧;用交换机组建的网络已经支持全双工通信,不再需要 CSMA/CD,但传输的仍是以太网帧,因此也仍称作以太网。
  • 以太网帧的格式:Ethernet V2 标准(使用最多)、IEEE 802.3 标准。
  • 为了能够检测正在发送的帧是否产生了冲突,以太网帧至少要 64 字节,至多 1518 字节(目标 MAC + 源 MAC + 网络类型 + 数据 MTU + FCS)。

12

  • 点对点信道:eg. PPP 协议(Point to Point Protocol,2 个路由器之间)。
  • PPP 中,Address 字段(例如图中的 0xFF)形同虚设,因为点对点无需源 MAC、目标 MAC 地址。
  • 网卡接收到一个帧,首先会进行差错校验,若校验通过则接收并由硬件去掉帧尾的 FCS,否则丢弃;也因此 Wireshark 无法抓到差错校验失败的帧。

网络层

13

传输层 ★

TCP UDP
连接性 面向连接 无连接
可靠性 可靠传输,不丢包 不可靠传输,尽最大努力交付,可能丢包
传输速率
资源消耗
应用场景 浏览器、文件传输、邮件发送 音视频通话、直播
应用层协议 HTTP、HTTPS、FTP、SMTP、DNS DNS、QUIC(HTTP/3)

UDP

14

  • UDP 首部中端口占用为 2 个字节,取值范围为 0 ~ 65535。

TCP

15

  • TCP 首部的数据偏移占 4 位,取值范围 0x0101 ~ 0x1111,数据偏移乘以 4 为首部长度(Header Length),即 20 ~ 60 字节;保留位目前全为 0
  • UDP 首部中有 2 字节记录整个 UDP 报文段(首部 + 数据)的长度,但 TCP 中仅有 4 位数据偏移记录首部长度而无 TCP 报文段的总长度;UDP 首部中的长度字段也是冗余的,只是为了保证首部是 32 位对齐。
  • 传输层(eg. TCP/UDP)数据长度 = 网络层总长度 - 网络层首部长度 - 传输层首部长度。
  • 标志位(Flags):
    • URG(Urgent):当 URG = 1 时,紧急指针字段才有效,表明当前报文段中有紧急数据,应优先尽快传送。
    • ACK(Acknowledge):当 ACK = 1 时,确认号字段才有效。
    • PSH(PUSH)
    • RST(Reset):当 RST = 1 时,表明连接中出现严重差错,必须释放连接,然后再重新建立连接。
    • SYN(Synchronization):当 SYN = 1,ACK = 0 时,表明这是一个建立连接的请求;若对方同意建立连接,则回复 SYN = 1,ACK = 1。
    • FIN(Finish):当 FIN = 1 时,表明数据已经发送完毕,要求释放连接。
  • 序号(Sequence Number):在传输过程的每一个字节都会有一个编号,在建立连接后,序号代表该次传给对方的 TCP 数据部分的第一个字节的编号。
  • 确认号(Acknowledge Number):建立连接后,期望对方下一次传过来的 TCP 数据本分的第一个字节的编号。
  • 窗口(Window):流量控制,用以告知对方下一次允许发送的数据大小(单位:字节)。
  • TCP 要点:可靠传输、流量控制、拥塞控制、连接管理。

16

端口

  • 客户端的源端口是临时开启的随机端口。
协议 默认端口号
HTTP TCP + 80
HTTPS TCP + 443
FTP TCP + 21
MySQL TCP + 3306
DNS TCP/UDP + 53
SMTP TCP + 25
POP3 TCP + 110

Reference