Skip to content

网络基础知识与配置

Estimated time to read: 11 minutes

需要提前准备的工具:

IP (Internet Protocol)

  • 互联网的前身:ARPANET
  • 最初仅由 4 个节点组成,速度 50 kbps
  • 1969 年 10 月 29 日,第一个数据包从 UCLA 发往 SRI(斯坦福研究所)

1977 年的 ARPANET 网络拓扑

来源: Wikimedia Commons

"We set up a telephone connection between us and the guys at SRI ...", Kleinrock ... said in an interview: "We typed the L and we asked on the phone,

"Do you see the L?"

"Yes, we see the L," came the response.

We typed the O, and we asked, "Do you see the O."

"Yes, we see the O."

Then we typed the G, and the system crashed ...

Yet a revolution had begun" ....

IPv4

  • Internet Protocol version 4
    • v1 至 v3 主要作为实验用途,设计于 1973~1978 年间
  • 由 4 个(octet)组成,每个段 8 位,可以用任何表示 32 位整数的方式表示 IPv4 地址

  • 理论上有 232 个不同的地址,但并非所有都可以使用,有复杂的地址分配机制

  • 2019 年 11 月 25 日,RIPE NCC 宣布 IPv4 地址耗尽

$ ping -c2 10.214.96.145
PING 10.214.96.145 (10.214.96.145) 56(84) bytes of data.
64 bytes from 10.214.96.145: icmp_seq=1 ttl=64 time=0.143 ms
64 bytes from 10.214.96.145: icmp_seq=2 ttl=64 time=0.077 ms

--- 10.214.96.145 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1026ms
rtt min/avg/max/mdev = 0.077/0.110/0.143/0.033 ms

IPv6

  • Internet Protocol version 6
    • 1995 年发明
    • 不存在 IPv5:IPv4 的直接后继就是 IPv6
  • 由 8 个(hextet)组成,每个段 16 位
    • 2001:da8:e000:1620:0:0:0:45
    • 理论上有 2128 ≈ 3.4 × 1038 个不同的地址
    • 极大地简化了 IPv4 存在的地址分配问题
    • 连续的全 0 段可以省略:
    • 也有 IPv4-mapped IPv6 地址:::ffff:10.214.96.145
    • https://test-ipv6.com 测试你的 IPv6 连接
    • Linux 下有 ping6 命令

      $ ping6 -c2 2001:da8:e000:1620::45
      PING 2001:da8:e000:1620::45 (2001:da8:e000:1620::45) 56 data bytes
      64 bytes from 2001:da8:e000:1620::45: icmp_seq=1 ttl=64 time=0.145 ms
      64 bytes from 2001:da8:e000:1620::45: icmp_seq=2 ttl=64 time=0.085 ms
      
      --- 2001:da8:e000:1620::45 ping statistics ---
      2 packets transmitted, 2 received, 0% packet loss, time 1008ms
      rtt min/avg/max/mdev = 0.085/0.115/0.145/0.030 ms
      

广域网与局域网

  • 广域网Wide Area Network:跨越大范围的网络,如互联网

  • 局域网Local Area Network:小范围的网络,如家庭、学校、公司内部的网络

  • 一般来说,局域网之间的主机可以互相访问,但其不能直接访问互联网

    • 需要一个路由器连接不同层级的网络
  • 一台主机可以有多个 IP 地址
    • 例如一个局域网内的主机可能有多个局域网 IP 和公网 IP
    • 一个主机可以有多个网卡,每个网卡可以有多个 IP 地址

回环地址

  • 回环地址Loopback address127.0.0.1IPv4 / ::1IPv6 / localhost主机名
    • 用于主机自身的通信,不会发送到网络上

Note: 实际上整个 127.0.0.0/8 网段都是回环地址;发送给这个网段的任何地址的数据包永远不会离开本地主机

网关与子网掩码

  • 网关Gateway:将不同网络连接起来的设备
    • 例如连接局域网和互联网的路由器
    • 一般来说,局域网内的主机的网关是路由器的 IP 地址
  • 子网Subnet:将一个大的 IP 地址段划分为多个小的 IP 地址段
    • 区分 192.168.1.1 或 192.168.1.0/24 或 255.255.255.0
    • 子网掩码用于判断两个 IP 地址是否在同一个子网内
  • NAT:网络地址转换
    • 用于将局域网内的多个主机共享一个公网 IP 地址
    • 通过修改 IP 数据包的源地址和目的地址来实现

传输层协议 TCP 与 UDP

背景:OSI 模型与 TCP/IP 模型

OSI 七层模型

  • 应用层Application layer:浏览器
  • 表示层Presentation layer
  • 会话层Session layer
  • 传输层Transport layer:TCP 和 UDP
  • 网络层Network layer:IP
  • 数据链路层Data link layer:以太网 / Wi-Fi
  • 物理层Physical layer:网卡 / 路由器

TCP/IP 四层模型

  • 应用层Application layer
  • 传输层Transport layer
  • 网络层Internet layer
  • 链接层Link layer

TCP 与 UDP

  • TCP:传输控制协议Transmission Control Protocol:面向连接的协议
    • 通过复杂的握手、确认、重传等机制保证数据的顺序和可靠性
  • UDP:用户数据报协议User Datagram Protocol:无连接;"send and forget"
    • 更简单且快速;单向传输,不保证顺序,不保证可靠性

来源: lisanne_waifu @ Instagram

端口

  • 软件层面的通信端点,与 IP 地址一起构成网络通信的基础
    • IP 地址识别机器,端口号识别软件(服务)
    • TCP 与 UDP 的端口号是分开的,即同一个端口号可以同时用于 TCP 和 UDP
    • 可以设置只监听(bind)某个 IP 地址的某个端口号
  • 端口号的范围是 0~65535
    • 其中 0~1023 为系统保留端口,一般不用于通用服务
  • 一般情况下,不同的软件使用不同的端口号

试试看!

  • nc 10.214.96.145 39200
  • nc -u 10.214.96.145 39200

域名系统与 DNS

域名

  • 域名Domain Name用于标识互联网上的计算机
    • 由一串用 . 分隔的字符串组成,例如 example.com
    • 最右侧的部分称为顶级域名Top-Level Domain:.com .net .org .cn 等
    • 从右至左依次为二级、三级域名等:www.example.com
  • 如何拥有一个域名?
    • 域名注册商处购买,如阿里云、腾讯云、Cloudflare 等
    • 根据域名的 TLD、长度等因素,价格从几元到几千元不等(每年)
  • 拥有一个域名意味着拥有在互联网上的一个身份
    • 域名并不是只能用于网站,还可以用于很多其他用途,如邮箱
    • 可以设置任意多的子域名,如 blog.example.com 等
  • 只拥有一个域名是不够的!
    • 还需要有东西可以访问(一个服务器)

DNS 协议

$ nslookup www.zju.edu.cn
Server:     10.10.0.21
Address:    10.10.0.21#53

Name:       www.zju.edu.cn
Address:    10.203.4.70

www.zju.edu.cn 的内网 IP 就是 10.203.4.70

$ ping -c2 www.zju.edu.cn
PING www.zju.edu.cn (10.203.4.70): 56 data bytes
64 bytes from 10.203.4.70: icmp_seq=0 ttl=60 time=11.235 ms
64 bytes from 10.203.4.70: icmp_seq=1 ttl=60 time=7.333 ms

--- www.zju.edu.cn ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 7.333/9.284/11.235/1.951 ms

DNS 记录

  • 域名下面可以有任意多条 DNS 记录
    • DNS 服务商可以和域名注册商不同
    • 记录了如何处理对域名的请求,如 IP 地址、邮箱服务器等
    • 将域名映射到 IPv4 的记录称为 A 记录
    • 还有 AAAA(IPv6)、MX(邮箱)、CNAME(别名)、TXT(文本信息)等
    • 记录的 TTL(Time To Live)表示该记录的缓存时间(见下页)
$ nslookup -query=txt 45gfg9.net
Server:     10.10.0.21
Address:    10.10.0.21#53

Non-authoritative answer:
45gfg9.net  text = "v=spf1 include:zohomail.com -all"
45gfg9.net  text = "H14A+B0JdgwyQ8SP0EdEu/yEIo2waYLyApTte3h+Z8O8ej/pFzEYMJNsNl2u7qIpaooULHHIcIypZ5S9Zm94sJL/iyiwr8l9O9Hk3ov9/ZUETKQEFgMe+x2FAg=="

DNS 服务器

  • 访问一个域名时,计算机会向DNS 服务器查询域名对应的 DNS 记录
    • DNS 服务器有可能继续向其他 DNS 服务器查询,直到找到所需的记录(递归查询)
    • 或者,返回另一个 DNS 服务器的地址,让客户端继续查询(迭代查询)
    • 一般来说,DNS 服务器会缓存查询结果,以减少查询时间(TTL)
    • DNS 的分配端口是 TCP/UDP 53


  • 笑点解析:Google 面试官最爱问的问题
    • 请说明从输入一个地址到显示网页的整个过程,越详细越好

Further reading:

应用层协议 HTTP

HTTP 协议

  • 超文本传输协议HyperText Transfer Protocol
  • 是基于文本的协议,用于在客户端和服务器之间传输网页
GET / HTTP/1.1
Host: www.example.com
Connection: close

试试看:nc example.com 80

HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Thu, 09 Oct 2025 16:42:02 GMT
Content-Length: 513
Connection: close

<!doctype html>...

客户端-服务器(C/S)架构

  • 任何一台计算机都可以作为服务器
  • 发起连接的节点是客户端,接受连接的节点是服务器
    • 在这个过程中,客户端和服务器是对等的
    • 服务器不能主动发起连接,只能等待客户端的连接
  • 服务器不一定只能处理 HTTP 请求
    • 如 DNS 服务器
  • 服务器可以同时处理多个客户端的连接
    • 客户端在本地选取一个空闲的高端口号,连接到服务器的 80 端口
    • client:49152 <-> server:80
  • DoS 攻击:通过大量的无效请求占用服务器资源,使得合法请求无法被处理
    • DDoS 攻击:分布式拒绝服务攻击

URL:统一资源定位符

URL Syntax Diagram

来源: Wikimedia Commons

  • URI(统一资源标识符)的一种,用于定位互联网上的资源
    • 格式如上图,重要性由左至右递减

Example

https://www.example.com:443/path/to/resource?query=1#frag

  • 协议:https
  • 主机:www.example.com
  • 端口:443
  • 路径:/path/to/resource
  • 查询:query=1
  • 片段:frag
  • URL 中只能包含 ASCII 字符,由百分号编码定义的字符集

请求方法

试试看:nc httpbin.org 80

GET /get?hello=world HTTP/1.1
Host: httpbin.org
Connection: close

如同直接访问 http://httpbin.org/get?hello=world

  • HTTP/1.x 请求的第一行由请求方法、路径和协议版本组成
    • GET:最常用,用于获取资源,不能有请求体
    • POST:用于提交数据
    • PUT 更新资源;DELETE 删除资源;HEAD 获取资源的头部信息;等等
  • 如何解释请求方法由服务器决定,不同的服务器可能有不同的实现

标头、请求体、响应体

POST /post HTTP/1.1
Host: httpbin.org
Content-Length: 12
Connection: close

hello server
  • HTTP 标头 - MDN Web Docs
  • 标头(Header)是由键值对组成的文本,用于描述请求或响应的属性
    • 以冒号分隔键和值,以换行符分隔不同的键值对
    • 以空行分隔标头和正文(请求体/响应体)
    • 不同标头有不同的含义,如 Content-Length(正文的长度)
  • 可以在浏览器的开发者工具中查看所有的 HTTP 请求及其所有内容

More?

  • nc 直接操作 TCP 流,不会自动处理 HTTP 协议,所以需要手动输入所有内容
    • 有更方便的命令行工具,如 curl、wget 等
    • 也可以使用浏览器的开发者工具
# 默认进行 GET 请求
curl "http://httpbin.org/get?hello=world"

# -i 显示响应头
curl -i http://10.214.96.145:39200

# -v 显示详细信息,-X 指定请求方法,-d 指定请求体
curl -v -X POST http://httpbin.org/post -d 'hello server'

Further reading:

Web 三剑客:HTML、JavaScript 与 CSS

HTML:超文本标记语言

HTML 不是编程语言!

<!DOCTYPE html>
<html>
<head>
    <title>CKC CS Fall 25 Lec5</title>
</head>
<body>
    <h1>Hello, World!</h1>
</body>
</html>

HTML 的基本语法

  • 标签组成,标签用尖括号包围,类似于 XML
<span>里面是 span 标签的内容</span>
<div>
    这是 div 标签的内容
    <p>这是 div 里面的一个段落</p>
</div>
  • 树状结构:所有的 HTML 文档都应该包含在 <html> 标签中
    • 其中分 <head><body> 标签,分别包含文档的元数据和正文
    • 在之前应当有 <!DOCTYPE html> 声明表示这是一个 HTML5 文档
  • 标签可以有属性,用于提供标签的额外信息
<a href="https://example.com">点击前往 example.com</a>
<img src="example.png" alt="这是一个图片">

JavaScript

  • 是编程语言,Web 的核心技术之一
    • JavaScript 是遵循 ECMAScript 标准的脚本语言
    • 与 Java 没有任何关系
    • 现在也可用于通用编程:Node.js
  • 用于实现网页的交互功能,由 <script> 标签引入
<script>
console.log('Hello, World!');

fetch('https://api.example.com')
    .then(response => response.json())
    .then(data => document.body.innerHTML = data.message);
</script>
<script async src="my-super-cool-script.js"></script>

CSS:层叠样式表

  • 不是编程语言,也不是标记语言,而是样式表语言
    • 用于描述网页的样式、布局和呈现方式
    • 字体、颜色、段落间距、边框、背景、位置等一切视觉效果
    • CSS 选择器:规定了 CSS 规则会被应用到哪些元素上
    • 仅用 CSS 也可以实现非常复杂的动画效果
body {
    font-family: "JetBrains Mono", "LXGW WenKai Screen", sans-serif;
    background-image: url('background.png');
}
<link rel="stylesheet" href="custom.css">

搭建自己的网站

  • 静态网页:完全“按原样”呈现给浏览器的网页
    • 由 HTML、CSS 和 JavaScript 组成,可能含有图片、视频等静态资源
    • 需要发送给客户端的所有文件都是用户可以查看源代码的
  • 动态网页:根据用户的请求动态生成内容的网页
    • 通常由服务器端的程序生成,如 Java、PHP、Python、Node.js 等
    • 也即,需要一个能够运行此种程序的服务器
    • 程序的代码对客户端不可见,客户端只能看到生成的结果(HTML)
  • 有不少免费的静态网页托管服务,如 GitHub Pages
  • WordPress:开源、完整的内容管理系统Content Management System,由 PHP 编写
    • 用于构建个人博客、企业网站等,有大量的插件和主题

网页服务器

  • 用于处理 HTTP 请求的软件
    • 例如 Apache、Nginx、IIS 等
    • 也可以使用 Node.js、Python 等编程语言的库

Further reading:

TLS 与现代网络安全

HTTP 与 HTTPS

  • HTTP 的一切都是明文传输
    • 两个节点间的任何一个中间节点都可以窃听并干预通信内容
  • HTTPS:HTTP over TLS

通信安全:对称加密

  • 对称加密算法:如 AES、ChaCha20 等
    • Alice 和 Bob 如何确保他们的消息是安全的?
    • Alice 用密钥 \(K\) 加密消息 \(M\),得到 \(C\),发送给 Bob
    • Bob 用密钥 \(K\) 解密 \(C\),得到 \(M\)
    • 但两人如何协商密钥 \(K\)
      • 通过线下见面交换 \(K\)
      • \(C\) 一起发送 \(K\)
        • 任何拿到 \(K\) 的人都可以用其解密 \(C\)

现代密码学:Diffie-Hellman 密钥交换

  • 1976 年发明,公钥密码学的基础
  • 基于数学假设:离散对数问题(DLP)是困难的
  • Alice 和 Bob 如何确保他们的通信能够保密?
    • 设 Alice 的秘密值 \(a\),Bob 的秘密值 \(b\)
    • 两人事前约定两个公开参数 \(p\)\(g\),所有运算都在模 \(p\) 群上进行
    • Alice 计算 \(g^a\),Bob 计算 \(g^b\)
    • 两人通过公开信道交换 \(g^a\)\(g^b\),在这之间可能存在窃听者 Eve
    • Alice 计算 \((g^b)^a\),Bob 计算 \((g^a)^b\)
    • Eve 可能窃听到 \(g^a\)\(g^b\),她也知道 \(p\)\(g\),如何求解 \(g^{ab}\)
      • 如果 \(p\)\(g\) 很大?

非对称密码学:RSA 与 ECC

  • RSA 公钥密码学
    • 基于数学假设:大整数的因数分解是困难的
    • 有两个很大的质数 \(p\)\(q\),计算 \(pq\) 是非常容易的
    • 但给定 \(pq\),要分解出 \(p\)\(q\) 是困难的
  • ECC 椭圆曲线密码学
    • 基于椭圆曲线上的离散对数问题(ECDLP),类似 Diffie-Hellman 密钥交换
    • \(g\) 是椭圆曲线上的一个公开点,\(a\) 是秘密值,计算 \(a \cdot g\) 是容易的
    • 但给定 \(g\)\(a \cdot g\),要找到 \(a\) 是困难的
    • 相比 RSA,ECC 能够在更短的密钥长度下提供相同的安全性
  • 后量子密码学:基于格、哈希函数、代码等构建的密码学

中间人攻击

  • Diffie-Hellman 密钥交换仍然不能解决中间人攻击
  • Eve 可能伪装成 Bob
    • Alice 一直在和 Eve 通信,而真正的 Bob 从来没有参与过
  • 或者,如果 Eve 能从一开始就截获 Alice 和 Bob 之间的通信
    • Eve 先伪装成 Bob 和 Alice 交换密钥,得到 \(K_1\)
    • Eve 再伪装成 Alice 和 Bob 交换密钥,得到 \(K_2\)
    • Alice 用 \(K_1\) 加密的消息全都被 Eve 截获并解密
    • 然后 Eve 用 \(K_2\) 伪装成 Alice 继续和 Bob 通信
    • Eve 可以在 Alice 和 Bob 之间任意篡改通信内容
    • 在此过程中,Alice 和 Bob 都不知道自己在和 Eve 通信

TLS 证书与 CA

  • 证书:数字签名的公钥
    • 由一个双方都相信的第三者 Charlie 签发,Charlie 就是 CA
    • Charlie 通过其他安全手段验证 Bob 的身份,签发 Bob 的证书
      • 相当于 Charlie 为 Bob 的身份背书
    • Bob 在交换密钥的同时发送自己的证书,以证明自己是真的 Bob
    • 如果 Alice 信任 Charlie,那么她也会信任 Bob 的证书进而信任 Bob
    • Eve 无法伪造 Bob 的证书,因为她无法向 Charlie 证明自己是 Bob
  • 如何确保 CA 是可信的?
    • 由操作系统或浏览器内置的 CA 列表:根证书约 150 个
    • 根证书是自签名的且被信任,其签发一系列中间证书,中间证书签发终端证书
    • 不守规矩的 CA 会被吊销证书,不再被信任(WoSign 违规事件,2016)
    • 证书透明度:公开 CA 签发的证书,防止 CA 恶意签发证书

证书链示例:https://www.zju.edu.cn 的证书链

mTLS

  • 一般来说,服务器需要向客户端证明自己
  • 在有些情况下,客户端也需要向服务器证明自己
    • 例如服务器需要验证客户端是否有权限访问某些资源
  • mTLS:Mutual TLS
    • 客户端和服务器都需要向对方提供证书
    • 相互验证对方的证书
    • 相比于传统的帐密验证,mTLS 更加安全,但设置也更复杂

代理与 VPN

  • 代理服务器:充当客户端和服务器之间的中间人
    • 客户端向代理服务器发送请求,代理服务器再向目标服务器发送请求
    • 目标服务器的响应先返回给代理服务器,再由代理服务器返回给客户端
    • 可以隐藏客户端的真实 IP 地址,绕过网络限制等,但可能没有加密
  • VPN:虚拟专用网络
    • 通过加密隧道将客户端和 VPN 服务器连接起来
    • 所有的网络流量都通过 VPN 服务器转发
    • 更“高级”的代理


  • HTTP 同样具有代理功能 - HTTP Proxy
    • 同样未加密
  • 更复杂的协议:Shadowsocks、V2Ray、Trojan 等
    • 采用不同的加密和混淆技术,提升隐蔽性和性能
    • 这是一个猫捉老鼠的游戏
  • 通过这些协议,与服务提供商建立连接的代理软件:Clash、Quantumult X 等
    • 代理软件本身并不提供代理服务,需要配置代理服务器的信息
  • 分流规则:决定哪些流量通过代理,哪些不通过代理(直接连接)
    • 不同的代理软件可能有不同的规则语法

Google 面试官最爱问的问题是:“请说明从在浏览器地址栏输入一个地址到显示网页的整个过程,越详细越好。”直到有一天,他遇到了一个来自中国的应聘者。

三个小时过去了,面试官已经汗流浃背,但应聘者仍在滔滔不绝地讲解 V2Ray 和 Hysteria 在加密和混淆方面的优缺点和区别,甚至连第一个 HTTP 请求都没有发出。

Beyond

HTTP/2,HTTP/3 与 QUIC

  • HTTP/1.1 是基于 TCP 的文本协议
    • 一个连接只能处理一个请求;请求和响应是串行的
    • 受到 TCP 的慢启动、阻塞等机制的影响

HTTP/1.1 vs. HTTP/2 vs. HTTP/3 Protocol Stack

来源: Wikimedia Commons

超越 JavaScript:WebAssembly

WebAssembly Logo

来源: Wikimedia Commons

  • WebAssembly - MDN Web Docs
  • JavaScript 的缺点:性能不足(解释型)、弱类型
  • WebAssembly(WASM):在浏览器中运行的跨平台字节码格式
    • 由 C、C++、Rust 等编译型语言编译生成
    • 可以直接在浏览器中运行,性能接近原生代码
    • 可以与 JavaScript 互操作
    • 适合于需要高性能的应用,如游戏、图像、视频处理等