CS2105 Computer Networks
CS2105 Note
Lecture 0 - Welcome to CS2105
0.1 课程核心目标与哲学
CS2105 并不是一门教你如何插网线、配置Cisco router hardware,或者考取网络工程师认证(如 CCNA)的职业培训课。这门课的核心目的是教授计算机网络的核心原理与概念 (Principles and Concepts),并以当今最成功的网络系统——Internet (互联网) 作为主要案例进行深度剖析。
- 不会涉及的内容:底层硬件的具体配置(这属于 CS3103 实验课的内容);移动与无线网络(Mobile and wireless networks,如 3G/4G/5G/WiFi 物理层细节,这部分在高级课程 CS4222 中讨论)。
- 教授的期望:不要只盯着分数(Grades),而是要理解网络架构的演进。现有的网络架构是几十年前的工程师在当时的视野下设计的(可能存在短视),作为新一代的计算机科学家,你们的目标是发现现有架构的缺陷,并思考如何构建更好的下一代网络。
0.2 课程考核分配与政策细则
- 期末考试 (Final Exam):50%。允许携带 Cheat Sheet(备忘单),但不允许开卷带往年真题。
- 期中考试 (Midterm Test):25%。在第 7 周(Week 7)的周五进行。
- 【考试形式深度解析】:教授特别强调,期中考试采用 MRQ (Multiple Response Question, 多项选择题) 而不是传统的 MCQ(单选题)。MRQ 允许答案有 1 个、2 个甚至 0 个正确选项。这是因为在网络工程中,很多时候排除了三个错误答案本身就代表了极高的知识水平。MRQ 采用部分给分制 (Partial Score),严厉打击盲目瞎猜,旨在真实反映学生的知识掌握度。
- 编程作业 (Assignments):20%。共 4 个独立的编程作业,推荐使用 Python。
- 【学术诚信 (Plagiarism Policy)】:网络编程作业严格禁止抄袭。你可以向朋友寻求“定性 (Qualitative)”的建议(例如:“你可能需要在发送消息之间增加延迟”),但绝不能分享、查看甚至讨论具体的代码实现(例如:“你需要定义一个变量 d 并设置倒计时”)。禁止使用在线开源代码,对 AI 辅助工具(如 Co-pilot / ChatGPT)有极其严格的限制。课程组故意不列出所有的 Corner Cases(边缘情况),就是为了让学生在编程中亲身体验网络环境的复杂性并自行踩坑。
- 课堂参与 (Participation):5%。
0.3 终极真理源泉 (Source of Truth)
- 核心教材:《Computer Networking: A Top-Down Approach》(第 9 版 / Global Edition,Kurose and Ross 著)。
- 【学习建议】:网络技术日新月异,如果将所有最新的协议(如 WiFi 6, HTTP/3)都塞进课堂,课程容量会爆炸。因此,课堂上主要教授最基础、最经典的经典协议(如 HTTP 1.0/1.1)。幻灯片无法涵盖所有的细节,如果课堂讲解、幻灯片与教材出现分歧,永远以教材为准 (Textbook is the source of truth)。
Lecture 1 - Introduction
1.1 什么是 Internet?
在课堂上,教授用了一个非常生动的“异世界动漫”比喻来形容这门课的本质:“我转生为 17 世纪的贵族,并与我的未婚妻展开了一场异地恋 (I reincarnated as a 17th century aristocrat in a long-distance relationship with my fiancée)”。 网络通信的本质,就如同 Alice 和 Bob 在 17 世纪通过错综复杂的全球邮政系统传递信件。
从严谨的计算机科学角度,我们可以从两个维度来定义 Internet:
-
硬件与组件视角 (Nuts and Bolts View):
-
Network Edge (网络边缘):指连接在网络边缘的终端系统(Hosts / End Systems)。你的手机、个人电脑、Mac、智能电视,甚至远端的 Facebook 服务器,只要它位于网络的端点并运行网络应用程序,它就是 Host。
-
Network Core (网络核心):由相互连接的路由器(Routers)和交换机组成的网状结构(Mesh),以及各级互联网服务提供商(ISP,如 SingTel, StarHub)。它们就像是邮政系统中的各个中转邮局,负责把数据包裹从源头搬运到目的地。
-
Physical Links (物理链路):连接边缘和核心的媒介。包括有线媒介(Coaxial cable 同轴电缆、Fiber optics 光纤、Unshielded twisted pair 无屏蔽双绞线)和无线媒介(Radio waves 无线电波)。注意,无线电波虽然没有实体质量,但它依然是物理层媒介。

-
-
服务视角 (Service View):
-
Hosts run network applications: Internet 是一种为网络应用程序(如 Web、VoIP、Email、网络游戏)提供通信服务的分布式基础设施。
-
Applications communicate using protocols: 在这个基础设施上,应用程序通过交换 Message 并遵循特定的 Protocols (协议) 来进行通信。(e.g. http, ftp, smtp, tcp, rtp)
-
1.2 网络核心:Packet Switching (分组交换)
(🔗 跨章节参考:这里介绍的 Packet Switching 是后续 Lecture 4 可靠数据传输和 Lecture 6 IP 路由的基础。)
网络核心中的路由器如何转发数据?主要有两种方式,而互联网坚定地选择了第一种:
- Packet Switching (分组交换):
- 原理:发送方将应用层的长报文(Message)切割成一个个独立的数据块,称为 Packet(分组/数据包)。
- Store-and-forward (存储转发) 机制:这是极其重要的考点。路由器在将一个 Packet 转发到下一跳之前,必须先完整地接收并存储该 Packet 的所有比特。如果不完整接收,路由器就无法验证数据是否损坏,也无法决定其转发路径。
- 资源共享 (Resource sharing on demand):链路的带宽被所有用户动态共享。如果有两个用户同时发送大量数据,路由器会把多出来的数据包放入队列(Queue)中排队等待。
- best effort service
- Circuit Switching (电路交换):
- 原理:主要用于传统的电话网络。在通信开始前,网络必须在收发双方之间建立一条端到端的专属连接 (Dedicated allocation)。
- 优缺点:优点是性能有绝对保障,不需要排队;缺点是极度浪费资源。如果 Alice 和 Bob 建立连接后 10 分钟不说话,这条线路的带宽就白白闲置了,别人也无法使用。
1.3 网络结构:网络的网络
互联网是由众多网络连接而成的复杂系统 :
-
Access ISP: 用户连接互联网的第一站(如学校、公司、家庭网络)。StarHub, SingTel都属于这一层。
-
Reginal ISP & Global ISP: access ISP (Tier 3) 连接到regional ISP (Tier 2),再连接到第一层 (Tier-1) ISP(如 AT&T, NTT)。
-
IXP (Internet Exchange Point): 互联网交换中心,让不同的 ISP 可以在此互联和对等传输数据 。

-
content provider network: 像 Google 这样的巨头拥有自己的私人网络,绕过传统的 Tier-1 ISP,直接连接到较低层的网络 。

1.4 网络性能的四大延迟 (Sources of Delay)
packet sending过程:
- sender transmit package onto the link as a sequence of bits.
- Bits are propogated to the next node (e.g. a router) on the link.
- Router stores, processes and forwards the packet to the next link.
- Steps 2&3 repeat till the packet arrives at the receiver.
Router一般有一个queue来储存incoming packages,如果满了会导致丢包。

当一个 Packet 从源头传输到目的地时,它会经历四种不同的时间延迟(End-to-end delay = 处理 + 排队 + 传输 + 传播):
- Processing Delay (处理延迟):路由器检查包头、查找路由表、决定将数据包导向哪个输出链路所需的时间。通常极短(微秒级)。
- Queuing Delay (排队延迟):数据包在路由器的输出队列中等待被推上链路的时间。这个延迟是动态变化的。如果网络拥堵,队列满了,新到达的 Packet 就会被丢弃,这就是 Packet Loss (丢包) 的根本原因。
- Transmission Delay (传输延迟):将整个数据包的所有比特(Bits)推(Push)到物理链路上所需的时间。计算公式:
Packet Size (bits) / Link Bandwidth (bps)。注意:链路的带宽直接决定的是传输延迟,带宽越大,把包推上链路的速度越快。 - Propagation Delay (传播延迟):比特在物理媒介中从一端传播到另一端所需的时间。计算公式:
Link Length / Propagation Speed。信号在光纤中的传播速度接近光速。

End-to-end packet delay:从src到dst的总时间。
吞吐量 (Throughput): 单位时间内成功end-to-end传输的比特数 。
1.5 分层架构与协议 (Layering & Protocols)
-
什么是协议? 就像人类见面先说“Hi”再问时间一样,协议定义了网络实体之间交换报文的格式 (Format)、顺序 (Order),以及在发送/接收报文时应采取的动作 (Actions)。
-
Layering (分层思想):计算机科学中处理复杂系统的终极武器——抽象 (Abstraction)。
- 分层将复杂的网络功能分解,每一层只负责特定的功能(提供 Service),并通过简单的接口与其上下层交互。
- 这样做隐藏了底层的复杂细节(Hide details from each other)。应用层开发者完全不需要知道底层的光纤是如何发送光信号的。
-
互联网五层协议栈:
-
Application (应用层):支持网络应用(HTTP, SMTP, DNS)。
-
Transport (传输层):进程到进程的数据传输(TCP, UDP)。
-
Network (网络层):主机到主机的路由与寻址(IP)。
-
Link (链路层):相邻网络节点间的数据传输。
-
Physical (物理层):在线缆或空气中传输原始比特流。 (注:OSI 模型的 Session 层和 Presentation 层在 Internet 架构中被合并入 Application 层处理)。


-
Lecture 2 - Application Layer
每一个internet application都要用application layer protocol。
2.1 网络应用架构 (Application Architecture)
开发网络应用时,首先要决定采用哪种系统架构:
- Client-Server (C/S 架构,客户端-服务器):
- Server:必须保持永远在线 (Always-on),拥有固定的公网 IP 地址(否则客户端找不到它)。它是服务的被动提供者。
- Client:主动发起通信,客户端之间通常不直接相互通信(例如你的浏览器不会直接和我的浏览器通信)。
- Peer-to-Peer (P2P 架构,点对点):
- 没有永远在线的中心服务器。任意的终端系统(Peers)之间直接通信。
- 优点是高度的可扩展性 (Scalability),用户越多,系统整体的提供能力越强;缺点是难以管理和安全控制。
- Hybrid (混合架构):结合两者优点。用户central server注册IP address,然后establish P2P network。
2.2 传输层服务需求 (Service Requirements)
不同的应用对底层网络提供的服务要求不同:
-
Data integrity:文件传输、邮件必须 100% 可靠;实时音视频可以容忍部分丢包。
-
Timing (时延):在线游戏、实时通讯对延迟要求苛刻。
-
Throughput (吞吐量):流媒体需要最低保障带宽;而网页浏览是弹性的。
-
Security (安全性):机密性需求。

2.3 Application Layer Protocols
1) 应用层协议定义的内容
应用层协议规定了应用程序之间如何进行通信,具体包含以下四个维度:
- 交换的消息类型:例如请求消息(request)和响应消息(response)。
- 交互规则:规定了应用程序在何时以及如何发送消息、如何对消息做出响应。
- 消息语法:定义了消息中包含哪些fields,以及这些fields是如何划分和排列的。
- 消息语义:明确了各个field中所包含信息的具体含义。
2) 协议的分类
根据开放程度,协议被分为两大类:
- 公开协议 (Open Protocols):
- 通常在 RFCs(请求意见稿)文档中进行定义。
- 其最大的特点是支持互操作性(Interoperability),允许不同开发者开发的软件互相通信。
- 典型示例:HTTP(万维网协议)、SMTP(电子邮件协议)。
- 私有协议 (Proprietary Protocols):
- 由特定公司或组织私有,不对外完全公开。
- 典型示例:Skype。

一个packet需要有IP address和port number才能被送到正确的地方。
一个packet由TCP或者UDP处理。(further covered in section 5)
TCP 服务:面向连接、可靠传输、具有flow control (not overwhelming the receiver)和congestion control (throttle sender when the network is overloaded);不保证timing, minimum throughput以及security。
UDP 服务:无连接、不可靠传输;不提供flow和congestion control 。
2.4 Web and HTTP
-
HTTP (Hyper-Text Transfer Protocol) 是 Web 的核心协议。它构建在 TCP 传输层之上。
-
Web 页面由一个 Base HTML 文件和多个对象(Objects,如图片 imgdoge.jpg)组成。
-
Web objects are addressable by a Uniform Resource Locator (URL)
-
HTTP 连接类型:
- Non-persistent (非持久连接 - HTTP 1.0):每次请求一个对象,都要建立一次 TCP 连接(三次握手),传输完毕后立即关闭。如果页面有 10 张图片,就需要建立 10 次独立的 TCP 连接,极度消耗时间和服务器资源。
- Persistent (持久连接 - HTTP 1.1):建立一次 TCP 连接后,可以通过这条已经开启的管道连续发送多个对象的请求和响应,大大降低了延迟。
-
HTTP Request

Connection: close: 告诉服务器在发送完请求的对象后关闭连接 。

curl (Client URL) 是现代互联网开发的标配。它的口号是“利用 URL 语法传输数据”,支持的协议多到数不清(HTTP, HTTPS, FTP, FTPS, SCP, SFTP 等)。
核心特性
- 非交互式: 你给它一个指令,它执行完就返回结果,非常适合放在脚本(Script)里。
- 功能极其强大: 支持 Header 自定义、Cookie 处理、用户代理伪造、文件上传下载、断点续传。
- 安全性: 完美支持 SSL/TLS 加密传输。
常见用法
- 获取网页源码:
curl https://www.google.com - 测试 API:
curl -X POST -d "name=Gemini" https://api.example.com/login - 下载文件:
curl -O https://example.com/file.zip
Non-persistent vs Persistent
HTTP 1.0 (non-persistent)

Rount trip time(RTT): 一个packet从client到server再回来的时间
HTTP 1.0需要2*RTT + file transmission time传输一个文件
HTTP 1.1 (persistent)

pipeline vs sequential vs multiplexing (HTTP 2)
pipeline


Stateless vs Stateful
HTTP 协议本身不保存client的历史信息。为了记住用户登录状态,引入了 Cookies(本质上是保存在client的 Key-value pairs 键值对,每次请求时附带发送给服务器)。

如果一个网页没有任何变动,无需每刷新一次都要下载resources。我们在browser的cache中存If-modified-since: <date>,如果server发现没有任何修改就返回304 Not Modified。

2.4 DNS (Domain Name System)
(🔗 跨章节参考:DNS 完美体现了分层和抽象思想。人们记不住 32 位的 IP 地址,所以我们使用名字。)
-
DNS 是互联网的核心目录服务。它的唯一任务是将人类可读的 Host names(如
www.comp.nus.edu.sg)翻译成机器用于寻址的 IP 地址(如137.132.x.x)。 -
分布式分层数据库:
-
根域名服务器 (Root) 。
-
顶级域名服务器 (TLD):负责 .com, .org, .edu, .sg 等 。
-
权威域名服务器 (Authoritative):组织自身的 DNS 服务器 。

Resource Record (RR):
-
A: 域名 → IP 。
-
NS: 域名 → 该域权威服务器的主机名 。
-
CNAME: 别名 → 规范名称 。
-
MX: 邮件域 → 邮件服务器名称 。

查询方式:
- 递归查询 (Recursive):本地 DNS 服务器直接问根服务器,然后根服务器代劳询问TLD->authoritative,最后把IP原路返回给本地DNS服务器。
- 迭代查询 (Iterative):本地 DNS 服务器询问root,root告诉本地服务器下一个应该问哪个服务器 。
dig指令会输出域名的所有DNS记录,例如dig www.facebook.com anyDNS Caching:
-
一旦学习到了映射关系,它会将其存储在本地缓存中 。
-
下次同样的查询可以直接从缓存获取,无需再走复杂的层级查询流程 。
-
缓存会有过期时间 (TTL),以保证信息不会永久陈旧 。
安全与运行:DNS 运行在 UDP/53 端口 。常见威胁包括 DNS 劫持、中毒/缓存污染。
DNS服务器和路由器是两套系统,DNS是应用层,作用在UDP协议以及网络层之上。
-
Lecture 3 - Socket Programming
3.1 什么是 Socket?
-
应用层进程将底层复杂的 Internet 视为一个“黑盒(Black box)”。进程如果要把数据送到网络上,就像你要把信丢进邮筒。这个“邮筒”就是 Socket。
-
编程层面上,Socket 是一套操作系统提供的 API。
-
Socket 的定位公式:Socket = IP Address (定位主机) + Port Number (端口号,定位该主机上的具体进程)。
-
例如,Web 服务器固定监听 Port 80;一台主机上可以同时运行 Web 服务(Port 80)和邮件服务(Port 25),通过端口号来区分流量。
-
Multiplexing/De-multiplexing
multiplexing:sender的transport layer会给不同socket发出的数据打上不同标签,封装成segment,然后统一从network layer发送出去
demultiplexing:receiver通过查看header的标签将数据交给对应的socket。

-
3.2 UDP Socket 与 TCP Socket 的核心区别
教授在课堂上展示了 Python 代码的运行逻辑,这是 Assignment 1 的核心基础。
-
UDP Socket (Datagram Socket):
- 特征:无连接 (Connection-less)、不可靠。
- 单一 Socket 处理一切:因为没有建立专属连接的概念,UDP 服务器只需要创建一个 Socket。如果有一万个客户端发消息过来,这一个 Socket 就能接收所有人的数据报。
- 寻址要求:正如教授所说,“如果你写了一封长信,你需要把它装进信封并写上地址”。每次调用
sendto()发送 UDP 数据时,必须显式地附带目标 IP 和目标端口号。
-
TCP Socket (Stream Socket):
- 特征:面向连接 (Connection-oriented)、可靠传输。
- 双重 Socket 机制 (Welcome Socket vs Connection Socket):
- TCP 服务器首先创建一个 Welcome Socket (欢迎套接字),绑定在特定端口(如 80)上,专门用于监听(Listen)新客户端的连接请求。
- 当客户端发起连接,Welcome Socket 接收请求后,操作系统会专门为这个客户端 Fork(派生)出一个全新的、专属的 Connection Socket (连接套接字)。
- 此后,服务器与该特定客户端的所有数据交互,都只通过这个专属的 Connection Socket 进行。Welcome Socket 继续监听下一个新客户。
- 由于建立了一条虚拟的“管道”,向 TCP Socket 写入数据时,不再需要附加目标地址,因为管道的另一端已经是固定的了。
3.3 Socket Programming
1. UDP (面向无连接) —— 像寄明信片
在 UDP 中,服务器不需要“接电话”,它只是坐在那里,谁给它发短信它就收着。
UDP Server (接收方)
Python
import socket # 1. 创建 Socket: AF_INET (IPv4), SOCK_DGRAM (UDP) server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 2. 绑定端口 server_socket.bind(('127.0.0.1', 12000)) print("UDP 服务器已启动,等待数据...") while True: # 3. 接收数据: recvfrom 会返回数据和发送者的地址 message, client_address = server_socket.recvfrom(2048) modified_message = message.decode().upper() # 处理数据(转大写) print(f"收到来自 {client_address} 的消息: {message.decode()}") # 4. 发回响应 server_socket.sendto(modified_message.encode(), client_address)UDP Client (发送方)
Python
import socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_addr = ('127.0.0.1', 12000) message = input("请输入要发送给 UDP 服务器的内容: ") # UDP 不需要 connect,直接 sendto client_socket.sendto(message.encode(), server_addr) modified_message, _ = client_socket.recvfrom(2048) print(f"服务器返回: {modified_message.decode()}") client_socket.close()2. TCP (面向连接) —— 像打电话
TCP 严格遵循课件里的流程:服务器必须先
listen,客户端必须先connect(三次握手)。TCP Server (监听方)
Python
import socket # 1. 创建 Socket: SOCK_STREAM (TCP) welcome_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 绑定并监听 welcome_socket.bind(('127.0.0.1', 13000)) welcome_socket.listen(1) # 开始监听,1 表示最大排队连接数,多的被reject print("TCP 服务器已启动,等待连接...") while True: # 3. 接受连接: accept() 会block program,直到有人连进来 # 它返回一个新的 socket (connection_socket) 专门为这个客户服务 connection_socket, addr = welcome_socket.accept() print(f"与 {addr} 建立连接!") # 4. 收发数据 sentence = connection_socket.recv(1024).decode() capitalized_sentence = sentence.upper() connection_socket.send(capitalized_sentence.encode()) # 5. 关闭服务 Socket(欢迎 Socket 继续运行) connection_socket.close()TCP Client (发起方)
Python
import socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP 必须先建立连接(进行三次握手) client_socket.connect(('127.0.0.1', 13000)) message = input("请输入要发送给 TCP 服务器的内容: ") client_socket.send(message.encode()) modified_sentence = client_socket.recv(1024) print(f"服务器返回: {modified_sentence.decode()}") client_socket.close()核心观察点:
- 数据的编码:网络传输的是字节流,所以 Python 字符串必须先
.encode()变成bytes才能发送,接收后要.decode()。 - UDP 的地址感:在 UDP Server 中,
recvfrom必须带回client_address,否则你不知道要把回信寄给谁。 - TCP 的双 Socket 机制:注意 TCP Server 有两个 Socket。
welcome_socket就像是酒店大堂的迎宾员,而connection_socket则是专门带你去房间的服务员。一旦连接建立,后续通信就不再占用迎宾员的时间了。
Lecture 4 - Reliable Protocols
(🔗 跨章节参考:这节课是全书理论的巅峰。正如 Lecture 6 会讲到的,底层的 IP 网络层是“尽力而为(Best Effort)”和不可靠的。我们要如何在不可靠的底层(Unreliable Channel)之上,在传输层构建出像 TCP 这样绝对可靠的服务?这就是 RDT 模型要解决的问题。)
4.1 面对不可靠信道的挑战
network layer是不稳定的,可能导致数据包:
- corrupt packets
- drop packets
- re-order packets
- deliver packets after an arbitrarily long delay
我们的transport layer service应该保证packets被按照原来顺序正确deliver。
4.2 Reliable Delivery Transfer渐进式协议设计

我们只考虑one-directional data transfer,但是control data可能两方流动
前置:Finite State Machine (FSM)
用于描述protocol的sender和receiver。

-
RDT 1.0 (完美信道):假设信道完全可靠。发送方直接发,接收方直接收,不需要任何额外机制。

-
RDT 2.0 (应对比特翻转):
-
引入 Checksum (校验和) 来检测错误。
-
引入 ACK (Acknowledge, 确认) 和 NAK (Negative Acknowledge, 否认)。收到好包回 ACK,收到坏包回 NAK 并触发重传。



- 致命缺陷:如果 ACK/NAK 在传输中本身损坏了怎么办?发送方不知道接收方到底收没收到,如果直接重传,会导致接收方收到重复的数据包 (Duplicate packet) 且无法分辨。

-
-
RDT 2.1 & 2.2 (解决重复包问题):
-
引入 Sequence Number (序列号)。给每个数据包打上编号(在停等协议中,只需要 0 和 1 两个编号交替使用即可)。如果接收方收到同编号的包,就知道是重复包,直接丢弃但依然回复 ACK。


-
在 RDT 2.2 中,我们淘汰了 NAK。如果接收方收到坏包,它会发送一个带有上一个成功接收包序列号的 ACK。发送方收到两个相同序列号的 ACK(Duplicate ACKs),就知道最新发送的包出错了,触发重传。
-
-
RDT 3.0 (应对丢包):
-
引入 Timer (定时器)。发送方发包后启动倒计时。如果在超时时间(Timeout)内没有收到 ACK,就假定包丢了,触发超时重传 (Retransmission)。


-
这被称为top-and-Wait,它在逻辑上完美解决了所有错误,但在性能上存在巨大灾难。

-
4.3 性能瓶颈与 Pipelining
-
Utilization (信道利用率) 极低:在停等协议中,发送方发完一个包后,必须死等一个往返时间(RTT)才能发下一个。如果链路带宽很大,这相当于让一条 8 车道的高速公路上一次只跑一辆车。
-
解决方案 - Pipelining (流水线):允许发送方在收到 ACK 之前,连续发送多个数据包,填满整个链路容量。
-
Go-Back-N (GBN, 回退 N 步):接收方只接受按序到达的包。如果中间丢了一个包,即使后面的包安全到达,接收方也会丢弃它们。发送方超时后,必须重传丢失的包及其之后所有的包。


-
Selective Repeat (SR, 选择性重传):接收方缓存乱序到达的包,并对每个包独立进行 ACK。发送方maintain timer for each unACKed packet,所以只需重传那个真正丢失的包。

-
(注:现实中的 TCP 是 GBN 和 SR 的混合体,既有累积确认,又有选择性重传。)
-
4.4 Summary


Lecture 5 - UDP and TCP
Internet protocols are described in documents known as Request for Comments (RFC).
5.1 多路复用与多路分解 (Multiplexing and Demultiplexing)
这是传输层最核心的功能:将网络层“主机到主机”的通信,细化为“进程到进程”的通信。
- 发送端 (Multiplexing):收集不同 Socket 传来的数据,封装上 Transport 层的头部(加上源端口和目的端口),交给底层的 IP 层。
- 接收端 (Demultiplexing):收到 IP 数据报后,读取传输层头部的端口号,将数据精准投放给对应的 Socket。
5.2 UDP (User Datagram Protocol)
-
极简主义:UDP 除了提供 multiplexing/de-multiplexing 和基础的 Checksum 错误检测外,什么都不做。它不新建立连接,不保证可靠性。
-
Demultiplexing 机制:UDP 仅依赖 2-Tuple(目的 IP,目的 Port) 就能将数据导向 Socket。
-
优点:速度极快,没有三次握手延迟,报文头部开销小(仅 8 bytes),而且没有拥塞控制(可以以应用层期望的最大速度 Blast 轰炸式发送数据,这对于容忍丢包的视频流媒体非常有用)。

校验和 (Checksum) 计算:
- 将段内容视为16位整数序列。
- 进行求和,产生的溢出位需回卷(Wrap-around)加到末尾 。
- 对最终结果取反码(1's complement) 。
- 接收端验证:将所有内容(含校验和)相加,若结果全为“1”则认为无错 。
应用场景:流媒体、实时游戏、以及最新的HTTP/3(QUIC协议基于UDP实现其自身的可靠性) 。
5.3 TCP (Transmission Control Protocol)
-
面向连接与可靠字节流:TCP 提供的是连续的字节流(In-order byte stream),而不是独立的数据报。应用层把数据交给 TCP,TCP 会根据最大报文段长度(MSS)自行将其切割成 Segments。
-
Demultiplexing 机制(核心考点): 与 UDP 不同,TCP 依靠 4-Tuple(四元组:源 IP,源 Port,目的 IP,目的 Port) 来精准定位 Socket。 场景解析:为什么必须是四元组?假设一台 Web 服务器只在 Port 80 监听。如果有 1000 个不同的客户端同时连接这个 Port 80,服务器如何区分它们?因为每一个客户端的 Source IP 或 Source Port 必然不同,服务器通过这四个元素的组合,就能为每一个客户端精确分配之前提到的专属
Connection Socket。 -
TCP 报文段结构:包含 Sequence Number(用于按序重组)、ACK Number(用于确认)。其中还有一个重要的
Offset (偏移量)字段,以 4 bytes(32 bit) 为单位,指示 TCP 头部的长度,因为 TCP 头部可能包含可变长度的 Options 选项。-
Sequence Number: 存储的是这个data segment的第一个byte

-
TCP用cumulative ACK,会有一个字段保存cumulative ACK。保存发送方期望收到的下一个字节的编号(累积确认)


最好结合上面这幅图理解ACK和seq如何变动。
-
-
单工与全双工 (Simplex vs Full-Duplex):TCP 是全双工的,即连接建立后,双方可以同时发送和接收数据(就像打电话)。而单工是指单向通信(就像听 Spotify 广播,服务器发给你,你不能发给服务器)。


-
超时与重传:超时时间(RTO)基于往返时间(RTT)的估计动态调整
是上一次的RTT。
()
这里都使用上一次的RTT更新当前的RTT。Exponential Weighted Moving Average (EWMA)。
-
快速重传:若收到3个冗余确认(Duplicate ACKs),则在超时前立即重传丢失段 。
-
Bits
SYN (Synchronize)
- 含义:用于建立连接时同步序列号。
- 作用:当你想发起一个新连接时,你会发送一个 SYN 包。它告诉对方:“我想和你建立连接,我的起始序列号是从 X 开始的。”
- 场景:只在三次握手的前两步(SYN 和 SYN/ACK)中出现。
ACK (Acknowledgment)
- 含义:用于确认收到数据。
- 作用:当这个位设为 1 时,TCP 头部的“确认号 (Acknowledgment Number)”字段才有效。它告诉对方:“我收到了你发来的 N 字节之前的所有数据,接下来的数据请从第 N+1 个字节开始发。”
- 场景:除了连接建立的第一步(纯 SYN 包)外,几乎所有 TCP 报文段都会把 ACK 位设为 1。
FIN (Finish) —— 终止
- 含义:用于释放连接。
- 作用:它告诉对方:“我已经没有数据要发送了,我打算关闭我这边的传输通道。”
- 场景:出现在四次挥手(Connection Teardown)的过程中。
-
连接管理:
建立连接(三次握手):客户端发送SYN → 服务端回SYN/ACK → 客户端发ACK。

- Attacks:
- SYN Flooding: DoS style attack by sending SYN.
- SYN/ACK Flooding: DoS style to overwhelm network.
关闭连接(四次挥手):双方均需发送FIN位并确认,过程包括FIN、ACK、FIN、ACK 。

-
拥塞控制与流量控制 (Congestion & Flow Control):
- 流量控制:防止发送方发得太快,把接收方的缓存撑爆。所以发送rwnd(receive window)字段告诉对面自己还剩多少buffer可以用。
- 拥塞控制:防止发送方发得太快,把整个网络(中间路由器队列)撑爆。当网络丢包时,TCP 会主动减速(线性增加,乘性减小),以缓解网络拥堵。(注:具体拥塞控制算法属 CS3103 高级课程范畴,本课仅需概念认知)。

Lecture 6 - Network Layer I
6.1 网络层的核心目标与“细腰”模型
(🔗 跨章节参考:如果说应用层是 Alice,传输层是管家,那么网络层就是真正负责跨越千山万水运送信件的邮政系统实体。)
- 核心目标:提供互联网上任意两台主机(Host-to-Host)之间的通信服务。
- 为了实现这个目标,网络层需要解决两大子问题:
- Addressing (寻址):每台主机必须有唯一的地址(IP Address)。
- Routing (路由):必须在相互连接的网状路由器中,找到一条从源到目的地的可行路径。
- The Thin Waist of the Internet (互联网的细腰):
- 互联网是一个沙漏型(Hourglass)架构。最上层有无数种应用(HTTP, FTP, SMTP),最下层有无数种物理链路(WiFi, 光纤, 4G, 以太网)。
- 然而,在网络层,几乎只有一种协议统治着整个互联网:IP (Internet Protocol)。这种“细腰”设计使得互联网极具扩展性——只要你的应用支持 IP,只要你的底层硬件支持 IP,你就能接入互联网。
6.2 路由器 (Router) 到底在做什么?
- Router (路由器) 是连接不同网络的设备(它拥有两个或多个接口/端口,每个接口连接一个不同的子网)。而Switch(交换机)则是在同一个网络内搬运数据,一个端口即可。
- Forwarding (转发) vs Routing (路由):
- Routing (路由):是宏观层面的策略。路由器之间交换信息,运行路由算法,计算出从 A 到 B 的最佳路径,并生成转发表 (Forwarding Table)。
- Forwarding (转发):是微观层面的动作。当一个数据报到达路由器的某个输入端口时,路由器查看包头的目的 IP 地址,查阅转发表,将数据报移送到正确的输出端口。
- 【考点澄清】:教授特别强调,虽然名字叫“Router”,但它在处理数据包时,唯一必须执行的动作是 Forwarding。计算路由策略通常由后台协议或集中式控制器完成。
6.3 IPv4 地址与子网 (Subnets)
-
IP 地址:在 IPv4 中,IP 地址是一个 32 位的二进制数字(例如
137.132.228.5)。 -
谁拥有 IP 地址? 严格来说,IP 地址不是分配给主机或路由器的,而是分配给网络接口 (Network Interfaces) 的。一个拥有一块有线网卡和一块无线网卡的笔记本电脑,可以同时拥有两个 IP 地址。路由器有多个端口,因此必然有多个 IP 地址。
-
Subnet (子网):
- 定义:在不经过任何路由器(Router)的情况下,可以直接通过物理链路(或交换机)相互通信的一组接口的集合。
- 案例分析:如果你用一根网线把两台电脑直连,这两台电脑的接口就构成了一个极小的子网。路由器的一个端口与其连接的局域网设备共同构成一个子网。如果一个路由器连接了 3 个不同的局域网,那么这个路由器就跨越了 3 个子网。

-
层次化编址与聚合:通过系统化的地址分配,可以将具有相同前缀的一组地址聚合在一起(Address Aggregation),从而大幅减小路由器的转发表规模 。

-
确定subnet数量:在每个路由器的接口(Interface)处剪一刀,把路由器这个实体从图上拿走。拿走路由器后,剩下的部分如果还能通过线缆互相连通,它们就属于同一个子网:
- 包含主机的区域: 几台电脑连在一个交换机上,再连到路由器的某个口。撤掉路由器后,这几台电脑和原本连接路由器的线头组成一个孤岛。
- 纯线缆区域: 两个路由器之间只有一根线。撤掉两个路由器后,这根线本身就成了一个孤岛。

这张图是有六个subnets。
6.4 子网与子网掩码 (Subnets & Subnet Mask)
-
子网定义:物理上直接互连、无需经过路由器即可相互通信的一组设备接口集合 。
-
地址结构:IP 地址逻辑上分为**网络前缀(Subnet Prefix)和主机 ID(Host ID)**两部分 。
-
CIDR 表示法:格式为
a.b.c.d/x,其中 x 代表网络前缀的位数 。 -
子网掩码:用于判断 IP 地址属于哪个子网。通过将 IP 地址与子网掩码进行按位“与”(AND)操作,可以得出网络地址 。

-
IP address allocation: organization会购买ISP的address space,ISP从ICANN (Internet Corporation for Assigned Names and Numbers) 购买address space。最终会形成下面的这种hierarchical Addressing形式。

6.5 NAT (Network Address Translation,网络地址转换)
(🔗 跨章节参考:结合 Lecture 5 的端口概念,这里解释了我们为什么能够在局域网共享上网。)
- 动机 (Motivation):IPv4 的 32 位地址空间(约 42 亿个)早已耗尽。你在家里电脑上分配到的通常是
192.168.x.x或172.x.x.x这样的私有 IP 地址 (Private IP)。 - 问题:私有 IP 地址在公网(互联网)上是不可路由的。如果你用
172.26.184.3去请求 Netflix 的服务器,Netflix 的服务器即便想回传视频,互联网的路由器也不认识这个私有地址,数据根本回不来。 - NAT 的解决方案:
- 你家里的路由器(NAT Router)被 ISP 分配了唯一的一个公共 IP 地址 (Public IP),比如
137.132.228.5。 - 当 Alice (
172.26.184.3, 端口3345) 用这个Private IP想访问外部网络时,NAT 路由器会拦截这个数据包。 - NAT 路由器将数据包的主机源 IP 替换为自己的公共 IP,并将源端口替换为一个新的伪装端口(例如
5001)。然后 NAT 在其转换表 (Translation Table) 中记录下这种映射关系。 - 对于外部的 Netflix 看来,它是在和你的 NAT 路由器(
137.132.228.5:5001)通信,而不是和 Alice 通信。 - 当 Netflix 的回包到达时,NAT 路由器查看目的端口
5001,查对转换表,将目的 IP 和端口替换回 Alice 的私有 IP 和真实端口,然后将数据包丢进局域网传给 Alice。
- 你家里的路由器(NAT Router)被 ISP 分配了唯一的一个公共 IP 地址 (Public IP),比如
- 巧妙之处:
- NAT 完美利用了传输层(TCP/UDP)的 16 位端口号 (Port Number) 来作为multiplexing和de-multiplexing的凭证,从而让一个局域网内成百上千台设备,可以只消耗一个公网 IPv4 地址就能同时上网。
- 可以随意重组内部网络而不需要告知外界。
- 可以更改ISP而不影响内部网络IP。
- 由于内部网络不被外部可见,所以更安全。
Lecture 7 - Network Layer II
1. 简介与学习目标 (Introduction & Learning Objectives)
本节课继续探讨网络层,重点关注数据包如何在互联网中导航 。核心学习目标包括:
- 了解路由器中最长前缀转发 (longest prefix forwarding) 的工作原理 。
- 了解互联网上路由协议 (routing protocols) 的用途 。
- 掌握 Bellman-Ford 方程 的原理 。
- 了解 距离向量 (Distance Vector, DV) 算法 的工作机制 。
- 了解 ICMP 协议以及网络层底层操作 。
2. 转发与路由 (Forwarding vs. Routing)
为了在任意两台主机之间提供通信服务,网络层必须解决寻址、路径确定和协议一致性等问题 。这是通过两个截然不同的网络层功能来实现的:
- 转发 (Forwarding / 数据平面 Data Plane): 将数据包从合适的输入链路移动到正确的输出下一跳的本地、每个路由器的操作 。这类似于邮递员将信件分拣到特定的投递箱中。
- 路由 (Routing / 控制平面 Control Plane): 确定数据包所采用的从源到目的地的路径的全局网络过程 。这涉及管理、规划、成本和服务的决策 ,并且在转发操作之前执行 。
3. IP 寻址与转发表 (IP Addressing and Forwarding Tables)
IP 地址是用于标识主机或路由器接口的全球唯一的 32 位标识符 。
- 分层寻址与路由聚合 (Hierarchical Addressing & Route Aggregation): 路由表不是列出每一个 IP 地址,而是将地址分组为块(子网)。这种层次结构允许有效通告路由信息,并显著缩小了转发表的规模 。
- 最长前缀匹配 (Longest Prefix Match): 当路由器收到一个数据包时,它会在其转发表中查找目标地址,并将其与可用的最长地址前缀进行匹配 。例如,如果一个数据包的目的地同时匹配
/16路由和/23路由,路由器将根据/23路由进行转发,因为它更具体。
4. 路由算法 (Routing Algorithms)
路由涉及在网络图中寻找两个顶点之间的最低成本路径 。在这个图中,路由器是顶点,物理链路是边,每条边都有相关的成本(可以代表距离、带宽、拥塞或金钱成本)。
Bellman-Ford 方程
路由器使用 Bellman-Ford 方程在数学上确定最佳路径 。 公式为:
- 是从节点 到节点 的最低成本路径的成本 。
- 是从 到其直接邻居 的链路成本 。
- 最小值是遍历 的所有直接邻居 得到的 。
距离向量 (Distance Vector, DV) 算法
DV 算法在网络环境中应用 Bellman-Ford 方程 。其主要特点是:
-
分布式 (Distributed): 每个节点只与其直接相连的邻居通信,传递其本地距离估计值,并根据回复重新计算自己的路由表 。
-
迭代式 (Iterative): 计算步骤会一直循环,直到没有更多的路由更新或变化需要分享 。
-
异步 (Asynchronous): 节点不需要同步操作 。只要检测到本地链路成本变化或收到邻居的更新消息,它们就会进行更新 。
-
路由信息协议 (RIP): 这是 DV 算法的一个实际实现 。它使用跳数作为成本度量(对网络拥塞不敏感)。每 30 秒通过 UDP 端口 520 交换一次路由表 。如果 3 分钟内没有收到相邻路由器的更新,则认为该邻居已发生故障 。

(注:幻灯片还简要提到了 链路状态 (Link State) 算法 如 OSPF,路由器向所有其他路由器广播链路成本,允许每个路由器使用 Dijkstra 算法在本地计算路径。这需要掌握完整的网络拓扑结构和链路成本 。)
5. 自治域内 (Intra-AS) 与 自治域间 (Inter-AS) 路由
因为互联网是一个庞大的“网络之网络”,路由是通过自治系统 (Autonomous Systems, AS)(如 ISP)分层处理的 。

-
域内路由 (Intra-AS Routing): 负责在单一自治系统 (AS) 内部寻找路径 。由于它由单一管理机构控制,因此不需要策略决策,主要侧重于性能 。常见的协议包括 RIP 和 OSPF。
-
域间路由 (Inter-AS Routing): 处理不同 AS 之间的接口 。在这里,管理策略通常优先于性能,因为管理员希望控制其流量如何路由以及谁通过其网络进行路由 。事实上的标准协议是 BGP 。
为什么BGP是application layer却给定了network layer的标准?
功能上: BGP 的最终目的是交换网络可达性信息,并据此计算出路径,从而更新路由器的网络层转发表 (Forwarding Table) 。因此,从架构功能上看,BGP 毫无疑问是网络层控制平面的核心组件。
载体上: BGP 并没有直接封装在 IP 数据报中,而是作为 Payload 封装在了 TCP 报文中(运行在 TCP 端口 179)。根据 TCP/IP 协议栈的严格分层定义,任何直接构建在传输层(TCP/UDP)之上的协议都被视为应用层协议。
打个比方: 假设你要颁布一项国家法律(相当于网络层路由规则),你选择通过邮政快递(相当于 TCP)将法律文件寄给各个省长。虽然你使用了快递系统(应用层载体),但这并不改变这份文件是用来治理国家(网络层功能)的本质。
6. 互联网控制消息协议 (ICMP)
ICMP 消息封装在 IP 数据报中 ,主机和路由器使用它来传达网络层面的诊断和错误报告
-
常见用途: 错误报告(如主机/网络/端口/协议不可达,或 TTL 过期)以及回显请求/应答。


-
ping命令: 使用 ICMP 回显请求/应答来检查远程主机是否响应,并测量往返时间。
-
traceroute命令: 发送一系列具有不同 TTL (Time-To-Live) 值的小数据包 。当 TTL 在某个路由器处降至 0 时,该路由器丢弃数据包并发送回 ICMP 错误消息,从而揭示数据包走过的路径。
7. 网络服务模型与架构 (Network Service Model & Architecture)
Best-Effort Service Model
互联网采用“尽力而为”的服务模型 。它对以下几点不提供任何保证:
- 数据报是否成功传送到目的地 。
- 交付的时间或顺序 。
- 端到端流可用的带宽 。
尽管缺乏保证(这些由上层协议保证),但这种简单的机制使得互联网得以广泛部署 。可靠性和性能反而通过充足的带宽配置 、弹性的拥塞控制 和分布式应用层服务(如数据中心和 CDN)来实现 。
IP 沙漏模型 (The IP Hourglass)
互联网协议栈呈沙漏状,IP 协议是其“纤细的腰部” (thin waist) 。虽然物理层、链路层、传输层和应用层有众多协议,但通用网络层协议只有一个(IP),数十亿的联网设备都必须实现它 。

路由器架构 (Router Architecture)
路由器在物理上分为两个截然不同的处理平面:
- 控制平面 (Control Plane / 软件): 运行路由和管理协议,通常在路由处理器上以毫秒级的时间框架运行 。
- 数据平面 (Data Plane / 硬件): 处理实际的数据包转发 。它在高速交换结构中以极快的速度(纳秒级)运行 。为了实现这种速度,路由器通常使用 TCAM(三元内容寻址存储器)进行最长前缀匹配,它可以在一个时钟周期内检索出地址,而不管转发表的大小如何 。
Lecture 8 - Link Layer I
1. Link Layer简介与核心概念

Link Layer在网络协议栈中位于网络层和物理层之间,负责在相邻节点之间传输数据 。Link Layer一般作用在局域网中。
- 节点 (Node):交换数据的设备,例如主机 (hosts) 和路由器 (routers) 。
- 链路 (Link):连接相邻节点的通信信道(传输介质),例如铜线、光纤、无线电或卫星。
- 相邻 (Adjacent):两个节点之间通过单跳 (single hop) 直接连接。
- 帧 (Frame):链路层的数据包 。IP 数据报会被封装在链路层的帧中进行传输 。
- 实现位置:链路层(和物理层)主要在网络接口卡(NIC,即网络适配器,如以太网卡或 Wi-Fi 适配器)的芯片上实现,具有半自主性 。
2. 链路层提供的可能服务
不同的链路层协议可能提供不同组合的服务 :
- Framing:将数据报封装到帧中,并添加头部 (Header) 和尾部 (Trailer) 。
- 链路访问控制 (Link Access Control):当多个节点共享同一链路时,需要协调哪些节点可以在特定时间发送帧 。
- 错误检测 (Error Detection):信号衰减或噪声通常会导致错误 。接收方通过检测机制发现错误后,可能会要求发送方重传或直接丢弃该帧 。
- 错误纠正 (Error Correction):接收方不仅能识别错误,还能直接纠正位错误,而无需请求重传 。
- 可靠交付 (Reliable Delivery):通常用于容易出错的链路(如无线链路),很少用于低误码率的链路(如光纤) 。
3. 网络链路的两种主要类型
- 点对点链路 (Point-to-point link):发送方和接收方通过专用链路连接 。不需要多路访问控制 。协议例子包括 PPP 和 SLIP 。
- 广播链路/共享介质 (Broadcast link):多个节点连接到一个共享的广播信道 。当一个节点发送帧时,该信道会广播该帧,所有其他节点都会收到副本(如 Wi-Fi、卫星、早期以太网) 。如果多个节点同时传输,会发生碰撞 (Collision) 。
4. 多路访问协议 (Multiple Access Protocols)
为了解决广播链路中的碰撞问题,需要使用多路访问协议来协调信道的使用 。一个“理想”的多路访问协议应具备四个特性:无碰撞 (Collision Free)、高效 (Efficient)、公平 (Fairness) 以及完全去中心化 (Fully decentralized) 。
协议主要分为三大类:
A. 随机访问协议 (Random Access Protocols)
节点以信道全速传输数据,节点间没有预先协调,因此允许碰撞发生,但协议规定了如何检测和从碰撞中恢复 。
-
时隙 ALOHA (Slotted ALOHA):时间被划分为相等的时隙 。节点只能在时隙开始时传输 。如果发生碰撞,节点会在后续时隙中以概率
p尝试重传,直到成功 。最高效率仅为 37% 。它具有公平性和去中心化,但无法避免碰撞。
-
纯 ALOHA (Pure ALOHA):无需划分时隙,无时间同步 。节点只要有数据就立即发送整个帧 。如果碰撞,等待1个帧的传输时间后,以概率
p重传 。最高效率更低,仅为 18% 。
-
CSMA (载波侦听多路访问):“发前先听” 。信道空闲才发送,信道忙则等待 。但由于传播延迟 (propagation delay),两个节点可能无法立即听到对方的传输,碰撞依然会发生 。在基础的 CSMA 中,即使发生碰撞,节点也会继续把帧发完,浪费信道时间。

-
CSMA/CD (带有冲突检测的 CSMA):对 CSMA 的改进 。节点在发送期间如果检测到碰撞,会立刻中止传输 。

- 二进制指数退避算法 (Binary Exponential Backoff):中止传输后,节点等待随机延迟再重传 。算法根据当前负载估算动态调整等待时间:发生第
m次碰撞后,节点会从 中随机选择一个数K,并等待K个时间单位 。碰撞越多(意味着网络负载越重),潜在的退避等待时间就越长 。 - 最小帧大小限制:CSMA/CD 要求传输时间必须大于等于最大往返传播延迟 (),否则节点可能在完成发送后才收到碰撞信号,导致无法重传。因此以太网规定了最小帧大小(例如 64 字节) 。
- 二进制指数退避算法 (Binary Exponential Backoff):中止传输后,节点等待随机延迟再重传 。算法根据当前负载估算动态调整等待时间:发生第
B. 轮流协议 (Taking-Turns Protocols)
- 轮询 (Polling):由一个主节点 (Master node) 采用轮询方式,依次告知每个从节点可以发送的数据量。优势是无碰撞、完美公平;缺点是有轮询开销,且主节点存在单点故障风险(非去中心化)。
- 令牌传递 (Token Passing):一个特殊的控制帧(令牌)在节点间顺序传递 。节点拿到令牌后,有数据才发送(并限制最大发送量),没数据或发送完毕后把令牌传给下一节点。优点是完全去中心化且高效;缺点是如果令牌丢失,将导致整个网络中断。
C. 信道划分协议 (Channel Partitioning Protocols)
-
TDMA (时分多址):将时间分为多个“轮”,每个节点在每一轮中获得固定长度的时隙供专享使用 。如果有节点不发送数据,该时隙就闲置,导致效率低下(最大吞吐量被限制为 R/N) 。

-
FDMA (频分多址):将信道频谱划分为不同的频段,每个节点分配一个固定的频段 。同样存在未使用的频段被浪费、效率低下的问题 。

5. 错误检测与纠正机制 (Error Detection and Correction)
为了保护数据 (D) 的完整性,通常会附加错误检测和纠正位 (EDC) 。这些机制在多数情况下能捕捉错误,但不能保证 100% 发现所有极端情况下的误码 。
A. 奇偶校验 (Parity Checks)
-
单比特奇偶校验 (Single bit):发送方附加 1 个校验位,使得总数据加上校验位中的“1”的个数保持偶数(偶校验) 。它可以检测出奇数个比特错误,但如果发生偶数个比特错误则无法发现 。在出现“突发错误 (bursts)”时,其未检测出错误的概率可能接近 50% 。
-
二维奇偶校验 (2-D Parity Checking):将数据划分为 行和 列,分别计算每行和每列的奇偶校验位(共 个校验位) 。这种方案不仅能检测出任意的 2 位错误,还能检测并纠正单个比特的错误 。

B. 循环冗余校验 (CRC, Cyclic Redundancy Check)
CRC 是一种常用于链路层(如以太网、Wi-Fi)的强大错误检测码,硬件实现简单且高效 。它基于模 2 算术(加减法均等同于异或 XOR 操作)实现 。
- 工作原理:
- 发送方与接收方预先约定一个 位的生成器 (Generator, 表示为
G) 。 - 发送方将要发送的数据
D后面追加r个0。 - 发送方将追加后的数据除以
G(模 2 除法),得到的余数就是r位的CRC校验码 (表示为R) 。 - 发送方最终发送附加了
R的数据:(D, R)。 - 接收方收到数据后,用收到的
(D, R)除以G。如果余数不为零,则检测出错误 。
- 发送方与接收方预先约定一个 位的生成器 (Generator, 表示为
- 性能:CRC(也称作多项式码 Polynomial code )能够检测出所有奇数个错误、所有长度小于等于
r位的突发错误,以及有 的概率检测出大于r位的突发错误 。
Lecture 9 - Link Layer II
1. 链路层简介 (Introduction to Link Layer)
-
链路层的核心职责是在相邻节点(如主机或路由器)之间,通过单一链路传输数据报。
-
网络层的 IP 数据报在传输前,会被封装到链路层的帧(Frame)中。
-
在不同类型的链路上可能会使用不同的链路层协议,每种协议提供的服务可能有所差异。
-
为了将多个节点通过广播链路互联,链路层需要解决多个关键问题,包括物理寻址、定义通信协议(如成帧和链路接入控制),以及处理传输错误(如错误检测和可靠性保证)。

2. 以太网基础 (Ethernet)
- 以太网技术起源于 20 世纪 70 年代中期,是目前处于绝对统治地位的有线局域网(LAN)技术。
- 相比于令牌环(Token Ring)和 ATM 技术,以太网在设计上更简单且成本更低。
- IEEE 802.3 标准定义了一系列以太网规范,涵盖了从 2 Mbps 到 100 Gbps 的不同传输速率。
- 以太网支持双绞线和光纤等不同的物理层介质,但不同版本始终保持着相同的 MAC 协议和帧格式。
- 以太网提供的是一种“不可靠”的数据交付服务,接收端的网卡(NIC)不会向发送端返回确认(ACK)或否定(NAK)信号。
- 丢失或丢弃的数据必须依赖上层协议(如 TCP中的checksum)来恢复,否则数据将永久丢失。
- 以太网采用带有二进制指数退避算法的 CSMA/CD 技术作为其多路访问协议。
3. 以太网帧结构 (Ethernet Frame Structure)
-
前导码 (Preamble):占用 8 个字节,前 7 个字节的模式为 10101010,最后一个字节为 10101011 。前导码提供了一种“方波”模式,用于同步发送端和接收端的时钟速率,并让接收端识别比特的物理宽度。
-
目的与源 MAC 地址:分别占用 6 个字节 。当网卡收到一个帧时,如果目的 MAC 地址与其自身匹配或为广播地址,则将数据交给网络层;否则直接静默丢弃该帧。
-
类型 (Type):占用 2 个字节,主要用于标识被多路复用的网络层协议(例如 IP、ARP 或 AppleTalk 等)。
-
数据 (Data):负载长度在 46 到 1500 字节之间 。最大限制 1500 字节对应于链路的最大传输单元 (MTU),而 46 字节的最小限制则是为了确保以太网能够有效检测出信道冲突 。
-
循环冗余校验 (CRC):占用 4 个字节,用于错误检测,任何被检测出损坏的帧都将被丢弃 。

4. 局域网物理拓扑 (Physical Topologies)
- 总线拓扑 (Bus Topology):在 90 年代中期之前非常流行,所有的节点都挂载在同一根主干电缆(同轴电缆)上 。它是一个广播型局域网,容易发生严重的数据冲突,且一旦主干电缆损坏,整个网络就会瘫痪,故障排查也十分困难 。
- 星型拓扑 - 早期集线器 (Hub):90 年代末期成为主流,所有节点直接连接到一个中心的集线器上 。集线器是一种物理层设备,它仅负责将收到的比特信号放大并向所有其他接口广播,因此仍无法解决碰撞冲突的问题 。
- 星型拓扑 - 现代交换机 (Switch):自 2000 年代初开始普及,目前占据主导地位 。节点直接连接到交换机,交换机作为真正的存储转发设备,彻底消除了链路上的数据冲突 。
5. 链路层交换机 (Link-layer Switches)

- 交换机是工作在链路层(Layer-2)的局域网设备,专门处理数据帧的存储和转发 。
- 它通过检查输入帧的 MAC 地址,选择性地将帧转发到一个或多个适当的输出链路 。
- 交换机允许多个节点同时进行传输(例如 A 传给 A',B 传给 B')而不会发生冲突 。
- 转发表与自学习 (Switch Table & Self-learning):交换机维护着一个包含 “MAC 地址、对应接口、存活时间 (TTL)” 的转发表 。它通过“监听”到达帧的源 MAC 地址和输入接口来自动学习网络拓扑,无需管理员手动配置(即插即用) 。
- 转发与过滤算法:当交换机收到帧时,先使用目的 MAC 地址查找转发表 。如果目的节点与发送节点在同一网段,交换机将过滤(丢弃)该帧 ;如果转发表中记录了对应的输出接口,则将其转发过去 ;如果转发表中没有记录,交换机将向除输入接口外的所有接口进行泛洪广播 (Flood) 。
- 交换机可以被配置成层次化的层级结构,但必须确保整体物理拓扑不存在环路 (loop-free) 。
6. 交换机与路由器的对比 (Switches vs. Routers)
-
路由器属于网络层设备,它主要检查 IP 地址,并通过计算路由算法来将数据包转发到目标网络。
-
交换机属于链路层设备,它检查的是 MAC 地址,并基于其转发表将帧发送到对应的输出链路或进行广播。
-
这两种设备都依赖于存储并转发 (Store-and-forward) 机制来处理数据流量。

7. IP 地址与 MAC 地址 (IP Address vs. MAC Address)
-
IP 地址长度为 32 比特,是网络层地址,负责将数据报从最初的源主机导航到最终的目的主机 。
-
MAC 地址长度为 48 比特,是链路层地址,专门用于在单条相邻链路间物理地移动数据帧 。
-
IP 地址具有层次化的网络前缀和主机 ID 结构,并且通常是动态分配的,便于网络路由与地址聚合(类似于邮政地址) 。
-
MAC 地址一般是永久烧录在网卡 ROM 中的,结构扁平,用以唯一标识底层物理硬件(类似于不可更改的身份证号) 。
-
MAC 地址常以十六进制形式表示(如 5C-F9-DD-E8-E3-D2),由 IEEE 统一管理,前三个字节通常代表网络适配器的设备制造商 。全 F 的地址 (FF-FF-FF-FF-FF-FF) 作为链路层广播地址保留使用 。

8. 地址解析协议 (ARP: Address Resolution Protocol)
-
ARP 协议的作用是通过已知的目标 IP 地址,查询获取其对应的链路层 MAC 地址 。
-
网络中的每一个 IP 节点内部都维护着一张 ARP 表,记录了同一子网内其他主机的 IP 地址、对应的 MAC 地址以及缓存记录过期时间 (TTL) 。

-
同子网内的 ARP 寻址机制:当主机 A 要发送数据给同子网的主机 B,且 A 的 ARP 表中没有 B 的 MAC 地址时,A 会在局域网内发出一个 ARP 查询广播包(目标 MAC 被设为 FF-FF-FF-FF-FF-FF)。同子网的其他节点会收到这个广播但不会处理,只有目标主机 B 识别出自身 IP,并用包含其 MAC 地址的帧直接回复主机 A。
-
跨子网发送帧的地址变换:当主机 A 向位于另一个子网的主机 B 发送数据时,IP 数据报的源 IP 始终是 A,目的 IP 始终是 B 。然而,数据帧的 MAC 地址会逐跳发生改变。A 发出的帧,其源 MAC 是 A 自身,而目的 MAC 则是其连接的第一跳路由器 (R) 的接口地址。路由器 R 接收并解开该帧,将数据送至网络层处理,接着使用路由器 R 另一端接口的 MAC 作为新的源 MAC,以主机 B 的 MAC 作为目的 MAC,重新封装并发送这个帧。
Lecture 10 - Network Security I
一、 网络安全的核心目标
在理想的通信模型中,发送方(例如 Alice)和接收方(例如 Bob)可以通过互联网直接进行安全对话。然而,现实中的网络充满了威胁,如窃听者 (Eve) 或恶意入侵者 (Trudy) 。
为了保障通信安全,网络安全机制必须实现以下四个核心目标:
- 机密性 (Confidentiality): 确保只有发送方和指定的接收方能够“理解”信息的具体内容 。
- 消息完整性 (Message Integrity): 确保消息在传输过程中或传输后没有被篡改,且任何篡改都能被检测出来 。
- 身份认证 (Authentication): 发送方和接收方需要能够确认彼此的真实身份 。
- 不可否认性 (Nonrepudiation): 能够证明两个实体之间确实发生过某次交易或通信(通常用于法律场景) 。
💡 安全的本质是权衡 (Trade-off) 绝对的安全在现实中是不可能实现的 。优秀的网络安全本质上是风险管理,即在成本、可用性和便利性的限制下,尽可能地提高系统的安全性 。
二、 密码学基础语言
密码学 (Cryptography) 是实现网络安全的底层技术基石。
- 明文 (Plaintext): 消息的原始形式 。
- 密文 (Ciphertext): 经过加密处理后的消息 。
- 密钥 (Key): 输入到加密或解密算法中的一串数字或字符参数 。
根据密钥的使用方式,密码学主要分为两大类:
- 对称密钥加密 (Symmetric Key Cryptography): 发送方和接收方使用相同的密钥 。
- 非对称/公钥加密 (Asymmetric/Public Key Cryptography): 发送方和接收方使用不同的密钥 。
三、 对称密钥加密 (Symmetric Key)
1. 经典替换密码
- 凯撒密码 (Caesar's Cipher): 将字母表进行固定位数的平移(如右移 3 位) 。可以通过暴力破解轻易攻破 。
- 单表替换密码 (Monoalphabetic Cipher): 建立一个包含 26 个字母的乱序映射表 。
- 弱点: 容易受到统计分析攻击。例如,英文中字母 'e' (13%) 和 't' (9%) 的出现频率最高,攻击者可据此破解 。
- 多表替换密码 (Polyalphabetic Encryption): 使用多个替换映射表,并按照一个循环模式(Cycling Pattern)依次对字母进行加密,大大增加了破解难度 。
2. 现代块密码 (Block Ciphers)
现代对称加密通常将消息分成固定长度的块(如 64 位),对每个块独立加密 。
- DES (数据加密标准): 56 位密钥,64 位数据块 。目前已不再安全(可通过暴力破解在一天内攻破) 。改进版为 3DES(使用 3 个不同密钥加密 3 次) 。
- AES (高级加密标准): 替代了 DES。使用 128、192 或 256 位密钥,128 位数据块,极其安全(暴力破解 128 位 AES 需要耗费难以想象的时间) 。
3. 对称加密的致命弱点
密钥分发问题: 通信双方必须在通信前共享同一个密钥 。如果双方从未见过面,如何在不安全的网络上安全地协商并传递这个共享密钥? 这引出了公钥加密。
四、 公钥加密 (Public Key Cryptography)
公钥密码学彻底改变了密钥管理方式:通信双方不需要共享秘密密钥 。
- 公钥 (Public Key, ): 公开给所有人 。用于加密消息。
- 私钥 (Private Key, ): 仅由接收者自己严格保密 。用于解密消息。
- 任何人都可以用 Bob 的公钥向他发送加密信息,但只有 Bob 能用自己的私钥解密 。
RSA 算法原理
RSA 是最著名的公钥加密算法 。它的核心依赖于大数分解的数学难题和模运算 (Modular arithmetic)。
生成密钥对的步骤:
- 选择两个极大的质数 和 。
- 计算 以及 。
- 选择一个与 互质的数 (且 ) 。
- 选择一个数 ,使得 。
- 公钥为 ,私钥为 。
加密与解密过程:
- 加密:
- 解密:
RSA 的重要特性: 先用公钥加密再用私钥解密,或者先用私钥加密再用公钥解密,结果是一样的,即: 。
五、 混合加密与会话密钥 (Session Keys)
在实际应用中,RSA 虽然解决了密钥分配问题,但其底层巨大的指数运算导致计算成本极高 。相比之下,DES/AES 的速度至少比 RSA 快 100 倍 。
解决方案:将两者结合使用 在实际的网络传输(如安全文件传输)中,我们通常采用一种称为“会话密钥”的混合机制:
-
发送方 (Alice) 随机生成一个一次性的对称密钥,称为会话密钥 (Session Key, ) 。
-
Alice 使用接收方 (Bob) 的RSA 公钥对这个会话密钥进行加密,并发送给 Bob 。
-
Bob 收到后,用自己的RSA 私钥解密,提取出会话密钥 。
-
随后,双方即可使用这个极其高效的对称密钥 对庞大的实际文件数据进行加密传输 。
Lecture 10 - Network Security II
1. 核心动机与网络安全目标 (Motivation & Goals)
在互联网中实现安全通信(例如 Alice 和 Bob 之间的通信),需要防范潜在的攻击者(如 Trudy/Eve)。网络安全的核心建立在 CIA 三要素 模型之上 :
- 机密性 (Confidentiality): 只有发送方和预期的接收方能够“理解”消息的内容 。
- 完整性 (Integrity): 发送方和接收方希望确保消息在传输过程中或传输后未被篡改,且如果被篡改能被检测出来 。
- 身份认证 (Authentication): 发送方和接收方希望确认彼此的真实身份 。 (不是CIA三要素之一)
- 可用性 (Availability): 服务必须对用户是可访问且可用的 。
2. 消息完整性 (Message Integrity) 与哈希函数 (Hash Functions)
2.1 错误检测 vs. 恶意篡改
- 早期的错误检测机制(如 Checksum 校验和、Parity 奇偶校验、CRC 循环冗余校验)主要用于检测意外的数据损坏 。
- 例如,互联网校验和(Internet Checksum)极易产生冲突(Collision),不同的消息很容易产生相同的校验和 。
- CRC 的输出对输入存在偏差(输入的微小变化导致输出的微小变化),因此也很容易人为构造出具有相同 CRC 校验和的两个不同句子 。
- 结论:这些机制的设计初衷是为了检测意外错误,而非防范恶意攻击 。
2.2 密码学哈希函数 (Cryptographic Hash Function)
- 哈希函数 接受任意长度的输入 ,并生成固定长度的消息摘要(Message Digest 或 Fingerprint)。
- 它是一种多对一(Many-to-1)的映射。
- 密码学安全性: 在计算上,几乎不可能找到两个不同的消息 和 ,使得它们的哈希值相同(即 )。
- 敏感性: 输入的微小变化会导致哈希输出发生巨大的变化。
- 常见的哈希算法包括 MD5(生成 128 位摘要)和 SHA-1(生成 160 位摘要),但目前这两种算法在密码学上已被破解/弃用(NIST 于 2011 年正式弃用 SHA-1),现多被 SHA-2 或 SHA-3 取代。
- 哈希与加密的区别: 哈希是单向的,无法“解密”;加密同一输入两次会产生不同的密文(除 ECB 模式外),但哈希同一输入两次必然产生相同的哈希值;且哈希的计算速度比加密快。
2.3 消息认证码 (MAC: Message Authentication Code)
- 如果仅仅发送消息 和其哈希值 ,攻击者可以轻易截获、修改消息为 ,并重新计算 发送给接收者,接收者无法察觉 。
- 解决方案: 发送方和接收方共享一个“认证密钥” 。
- 发送方发送 。
- 由于 只有通信双方知道,接收方收到 后,加上自己保存的 重新计算哈希并比对,从而验证消息是否被篡改 。
2.4 哈希的实际应用
- 软件完整性: 验证下载的软件(如 VLC 播放器)是否真实,防范病毒篡改(通过比对 SHA256 校验和)。
- 密码存储: 系统数据库不存储明文密码,而是存储密码的哈希值。因此密码无法被“找回”,只能“重置”。
- 时间戳与数据完整性: 用于区块链(Blockchain)验证区块未被修改,以及存储学位证书(如 OpenCerts)的哈希值以证伪。
3. 数字签名 (Digital Signatures)
数字签名是手写签名的密码学模拟版本 。
3.1 签 名的核心要求
- 可验证性 (Verifiable): 接收者(Alice)能够验证该签名和消息确实是由发送者(Bob)生成的 。
- 不可伪造性 (Unforgeable): 除了 Bob 之外,任何人都不应能生成该签名和消息 。
- 不可否认性 (Non-repudiation): 接收者可以拿着消息和签名在法庭上证明这是发送者签署的 。
3.2 基于 RSA 的数字签名原理
- 重要数学属性: 。即先用公钥加密再用私钥解密,与先用私钥加密再用公钥解密,结果是相同的 。
- 简单签名方案: Bob 用他自己的私钥 加密消息 ,创建签名 。
- 验证: Alice 收到消息 和签名 后,用 Bob 的公钥 应用于签名,检查 是否等于 。如果相等,说明只有拥有 Bob 私钥的人才能生成此签名 。
3.3 签名优化:对哈希值签名
- 使用公钥密码学对超长消息进行加密计算代价非常高昂 。
- 优化方案: 首先使用哈希函数对长消息 生成固定长度的摘要 。
- 然后,Bob 仅用私钥对这个摘要进行加密/签名,即生成 。
4. 公钥基础设施 (PKI) 与数字证书
公钥密码体制存在一个致命弱点:公钥本身也需要被安全地共享 。如果攻击者在交换公钥的阶段介入,就可以伪造身份 。
4.1 证书授权中心 (CA: Certification Authority)
- 为了解决公钥分发问题,引入了 PKI(公钥基础设施),其核心是数字证书和 CA 。
- CA 的作用是将特定的公钥与特定的实体(Entity)绑定在一起 。
- 实体向 CA 注册其公钥并提供身份证明,随后 CA 生成包含该实体公钥的数字证书,并用 CA 自己的私钥对其进行数字签名 。
4.2 数字证书的内容与验证
- 证书包含的信息: 所有者的身份(如域名 google.com)、所有者的公钥、证书的有效时间窗口,以及 CA 的签名 。
- 验证过程: 当 Alice 需要 Bob 的公钥时,她获取 Bob 的证书,然后使用 CA 的公钥()验证证书上的签名。验证通过后,即可安全提取 Bob 的公钥()。
- 信任链问题: 我们如何得知并信任 CA 的公钥?操作系统或浏览器内部预置了一个“受信任的根证书颁发机构”列表,这些 CA 的公钥被视为普遍共识 。
4.3 CA 滥用与安全隐患
- 由于整个体系极度依赖 CA 的可信度,一旦 CA 被攻破或滥用,后果严重。
- 案例 1(DigiNotar): 2011 年该荷兰 CA 遭入侵,签发了超过 500 个针对 Google、Mozilla 等域名的欺诈证书,导致其破产。
- 案例 2(Turktrust): 其下属机构意外签发了针对 gmail.com 的假证书 。
- 案例 3(Lenovo SuperFish): 联想电脑曾预装中间人广告软件,能够破坏 HTTPS 连接并篡改证书 。
5. 防火墙与网络安全运营 (Firewalls)
防火墙用于将组织的内部网络与外部更庞大的互联网隔离,允许特定数据包通过,同时拦截其他数据包 。
5.1 防火墙的作用
- 防止拒绝服务(DoS)攻击,例如 SYN 洪水攻击(消耗 TCP 连接资源) 。
- 防止非法修改或访问内部数据 。
- 只允许授权的用户或主机访问内部网络 。
5.2 无状态数据包过滤 (Stateless Packet Filtering)
- 路由器逐个过滤数据包,根据包头信息决定转发还是丢弃 。
- 判断依据: 源/目的 IP 地址、TCP/UDP 端口号、ICMP 消息类型、TCP 的 SYN 和 ACK 标志位 。
- 访问控制列表 (ACL): 这是一张由 (动作, 条件) 组成的规则表,自上而下应用于传入的数据包。例如可以设置规则:“丢弃所有发往 80 端口的出站数据包”以阻止外部 Web 访问。
5.3 防火墙的局限性
- IP 欺骗 (IP Spoofing): 路由器无法验证数据包是否真的来自其声称的源 IP 地址。
- 性能瓶颈: 繁重的检查规则可能使防火墙成为网络拥堵的瓶颈。
- 在与外界的通信自由度和安全级别之间存在权衡(Tradeoff)。
6. 综合案例研究:安全电子邮件 (Secure E-mail)
要设计一个既能保证机密性,又能提供发送者认证和消息完整性的电子邮件系统,Alice 和 Bob 需要综合使用以上技术:
- 机密性 (Confidentiality):
- Alice 生成一个随机的对称私钥 。
- Alice 使用 加密邮件正文,得到 (为了效率采用对称加密) 。
- Alice 使用 Bob 的公钥 加密这个对称密钥,得到 。
- 发送者认证与完整性 (Authentication & Integrity):
- Alice 使用哈希函数对消息求摘要 。
- Alice 用自己的私钥 对摘要进行签名,得到 。
- 最终发送:
- Alice 将加密后的消息 、加密后的对称密钥 ,以及数字签名 组合发送给 Bob 。
- 这个过程总共使用了三种密钥:Alice 的私钥、Bob 的公钥以及新创建的对称密钥 。
7. 总结
网络安全并非单一层面的问题,现代计算机网络在不同的 OSI 层级都部署了相应的安全协议 :
- 应用层 (Application): HTTPS
- 传输层 (Transport): SSL/TLS
- 网络层 (Network): IPsec, VPN
- 链路层 (Link): WiFi (802.11) 安全协议
核心机制映射:
-
机密性 依赖对称加密和公钥加密(RSA)。
-
完整性 依赖哈希(Hashing)和 MAC 。
-
身份认证 依赖数字签名和 CA 证书 。
Exam notes
- router will not establish TCP or UDP connections. It does not have transport layers.
- TCP uses Go-Back-N
- MSS does not include header length
- remember to reverse at the last when calculating checksums.
- TCP: 主要使用累积确认 (Cumulative ACK)。虽然 TCP 有 SACK(选择性确认)选项,但在基础理论和标准模型中,它的核心机制是累积确认(即期待收到的下一个字节序号)。可以缓存 (May buffer)。虽然 TCP 协议规范没有强制要求,但为了效率,几乎所有的现代 TCP 实现都会选择缓存失序的数据包,而不是丢弃它们。
Comments
No comments yet.