Stanford CS144 学习笔记 (一):初探互联网的底层逻辑 导语接下来的几周我们将系统学习关于互联网的一切了解什么是互联网以及 IP 协议如何进行互联网交互。这些看似底层的知识实际上是当今网络世界最核心、最前沿的基石特别是 TCP/IP 架构。Main Topics四层网络模型网络设计架构互联网通过 packet (数据包) 来传输数据Layering (分层原则)通过封装 (Encapsulation) 来实现上述两点Internet Protocol (IP 协议)TCP 协议1. A Day in the Life of an Application (应用程序的一天)我们在电脑和手机上使用的绝大多数网络应用本质上都在做一件事通过网络读写数据。1.1 Network Applications通信方式字节流 (Byte Stream) 是目前网络中最常用、最主流的通信方式。1.2 Byte Stream Model (字节流模型)在这个模型下应用程序不需要关心数据在网络中是如何被切分或路由的它只需要像读写本地文件一样向网络连接中写入或读取连续的字节序列。1.3 World Wide Web (万维网)机制经典的客户端-服务器 (C/S) 架构。常用命令客户端发送GET请求获取网页。状态码服务器返回200 OK表示成功404 NOT FOUND表示页面丢失400 Bad Request表示请求错误等。1.4 BitTorrent (BT 下载)机制经典的 P2P (点对点) 架构。将庞大的文件分割成无数个小片段 (Pieces)。Tracker 服务器Tracker 不存储文件而是作为一个“红娘”告诉 Client (客户端) 应该去连接哪些其他客户端来获取缺少的文件片段。1.5 Skype (音视频通话)基础模式Client A --Internet-- Client B理想情况下的端到端直连。1.5.1 Skype with Complication (复杂情况)现实中用户的电脑大多藏在家庭路由器的 NAT (网络地址转换) 防火墙之后。Skype 会使用Rendezvous (会合)技术通过第三方服务器协助双方穿透防火墙建立直连。1.5.2 Skype with More Complication (更复杂情况)如果防火墙极其严格导致无法直连Skype 会退而求其次使用Relay (中继)服务器来替双方转发流量。2. The Four Layer Internet Model (四层互联网模型)数据从源主机 (Source End-Host) 发出自上而下经过这四层再通过物理网络传输Application (应用层)产生业务数据。Transport (传输层)负责端到端的传输控制。Network (网络层)将数据封装为 Packet (数据包包含头部信息)负责选路。Link (链路层)选择合适的物理链路将数据“逐跳 (hop-by-hop)”传输到下一个相邻节点。2.1 The Network Layer is “Special” (网络层的特殊性)绝对核心在网络层我们必须且只能使用IP (Internet Protocol)协议。传输层 (Transport)则有选择权TCP(Transmission Control Protocol)保证可靠送达。UDP(User Datagram Protocol)不提供送达保证但速度极快。对等通信四层模型中的每一层逻辑上只和目标主机的同一层进行“对等通信”。实际传输路径数据在底层的链路层实际传输中间逐跳经过路由器路由器通常只解析到网络层最后到达目标主机自下而上返回给应用层。2.2 IP is the “Thin Waist” (IP 是细腰模型)TCP/IP 模型呈沙漏状上下两端十分宽广底层支持以太网、WiFi、5G上层支持 HTTP、FTP、SMTP而中间极其狭窄——所有流量都必须通过 IP 协议这一道“细腰”。2.3 The 7-Layer OSI Model (OSI 七层模型)与实际应用的四层模型相比理论上的 OSI 模型分得更细Physical (物理层)电路、光纤、电平信号。Link (链路层)Network (网络层)Transport (传输层)Session (会话层)管理会话控制。Presentation (表示层)数据格式转换、加密。Application (应用层)3. The IP Service Model (IP 服务模型)3.1 Property Behavior (属性与行为)Datagram (数据报文)IP 将数据封装为独立的数据包包含 Payload (数据)、DIP (目标 IP 地址)、SIP (源 IP 地址)然后逐跳送达。Unreliable (不可靠)包有可能会丢失。IP 不保证数据一定到达目的地不提供任何送达保证。Best effort (尽力而为)IP 会尽最大努力传输但仅在“必要时”如网络严重拥堵才会丢弃数据。IP 不知道数据是否丢失也绝不会主动重新发送。Connectionless (无连接)发送数据前不需要和目标主机建立连接。3.2 Why is the IP service so simple? (为什么 IP 服务如此简单)快速、低成本保证协议最小化使得路由器只需做最简单的转发极大降低了硬件构建和维护成本 (lower cost to build and maintain)。端到端原则 (End-to-End Principle)把纠错、重传等复杂逻辑推给网络两端的终端电脑处理避免核心网络因处理复杂逻辑而拥堵僵化。普适性IP works over any link layer可以运行在任何链路层光纤、铜缆、无线电之上。3.3 The IP Service Model (Details) (IP 服务模型的细节)虽然简单但 IP 头部依然包含了几个必不可少的机制防止循环发生措施添加TTL (Time-to-Live, 生存时间)字段。原理相当于一个跳数计数器。数据包每经过一个路由器 TTL 减 1减到 0 如果还没到目的地就会被丢弃防止数据包在网络中陷入死循环。对长数据进行切片 (Fragmentation)措施避免链路层 MTU (最大传输单元) 限制导致长数据无法承载。原理使用一些头部字段如标识、标志、片偏移保证路由器能正确切分终端能正确重组。校验和 (Checksum)用来校验 IP 头部防止因为位翻转导致送达错误的地址。适用不同版本的 IPIPv432 bit 地址目前最常用但资源已面临枯竭。IPv6128 bit 地址正在全球范围内逐步转变和普及。可扩展性允许在必要时 (when necessary) 添加新的 Options 字段。4. Life of a Packet (数据包的一生)4.1 TCP Byte Stream (TCP 字节流生命周期)Client — Internet — Server在传输实际数据前TCP 需要通过三次握手 (3-way handshake)建立连接SYN客户端向服务器发送一个同步消息请求建立连接。SYN/ACK服务端响应同步消息同时确认收到了客户端的请求。ACK客户端再次确认至此连接建立。网络上的数据传输需要两套地址协同Network layer addressIP address决定送到哪台电脑。Transport layer addressTCP port决定送到这台电脑的哪个软件/进程。数据包在网络中经过多次跳跃 (hops)每一次 hop 都在连接两个相邻的路由器。4.2 Inside Each Hop (每一跳的内部操作)当数据包到达路由器时路由器会检查当前包的 TTL 跳数校验数据包头部是否损坏并读取 DIP (目标 IP)。随后查表决定将其送往哪个端口。5. Principle: Packet Switching (原则分组交换)Packet (数据包)自包含的数据单元携带着使其能够到达目的地的所有必要信息就像一封写好收件地址的信。5.1 两种转发模式源路由 (Source Routing, 现已极少使用)源主机预先计算好整条路径并把所有中间节点记录在包头。路由器只需按图索骥。转发表转发 (Forwarding Table, 主流模式)路由器内部维护一张状态表包含目标地址前缀和对应的下一跳接口。这种模式极大加强了交换机的效率路由器只需要专注转发数据而不用记录整条路径。5.2 No Per-Flow State Required (无需维护流状态)数据包通常以“流”的形式出现比如你看视频的一连串包。但交换机/路由器不需要关心数据的“流 (Flow)”它不会为某次 TCP 连接存储状态。交换机专注于高效的转发独立对待每一个包它也不关心连接是否故障故障由端到端负责。5.3 Efficient Sharing of Links (高效的链路共享)数据的传输是间歇性的你不可能时刻占满带宽。路由器可以根据实际使用情况合理地动态分配数据传输容量。这被称为Statistical Multiplexing (统计多路复用)。6. Principle: Layering (原则分层)分层的系统具有以下特征层级分明每一层负责具体的任务和提供特定的服务。层级之间的交流尽量不要跨层而是邻层交流。6.1 层级之间不跨层关心好处每一层只需要和上下相邻层通信。这种设计使得每一层可以高度专注于自己的任务比如写 Web 网页的人完全不需要懂光纤原理。坏处有时候为了追求极致的性能或者特定的功能我们不得不打破分层结构跨层访问。6.2 Reasons for layering (分层的理由)Modularity模块化。Well defined service定义明确的服务接口。Reuse重用性比如 HTTP 和 FTP 都可以重用 TCP 层。Separation of concerns关注点分离。Continuous improvement持续提升升级物理链路不影响上层软件。Peer-to-peer communications对等通信逻辑清晰。7. Principle: Encapsulation (原则封装)封装是实现 Layering (分层) 的重要手段。分层原则告诉我们无需关心跨层通讯原理而封装通过把细节全部进行黑盒化来实现这一点。7.1 Encapsulation把上层传下来的数据成段封装套上本层的头部变成一个新的数据包。这样底层只需要知道这段数据代表一个“Payload (有效载荷)”而完全不需要关心里面到底写了什么。ExampleVirtual Private Network (VPN)。VPN 的原理就是一种极端的封装它把一个原本要发往内网的 IP 数据包整体作为 Payload再在外面套上一个发往 VPN 服务器的新 IP 头部从而实现数据的隐蔽传输隧道技术。8. Byte Order (字节序)8.1 Computer Memory (计算机内存)计算机在内存中存储多字节数据时存在端序字节排列顺序的差异。8.2 Endian (端序分类)Big Endian (大端序)高位字节存储在内存的低地址端符合人类阅读习惯如 0x123412 存在前面。Little Endian (小端序)低位字节存储在内存的低地址端如 x86 架构常用。8.3 Network Byte Order (网络字节序)端序对于跨网络通信影响巨大。如果一台大端序电脑和一台小端序电脑通信不加转换的话数据会完全错乱。业界规定网络传输一律采用大端序 (Network Byte Order)。如果你电脑是小端序发送前必须进行 Byte Order 转换。8.4 Portable Code (可移植代码)为了保证 C 语言代码在任何架构的电脑上都能跑我们使用标准库提供的结构体和 Helper functions 进行转换htons(): “Host to Network Short” (主机转网络用于 16 位如 Port)。ntohs(): “Network to Host Short”。htonl(): “Host to Network Long” (主机转网络用于 32 位如 IP)。ntohl(): “Network to Host Long”。(注意处理网络数据时要千万小心忘记转换或者错误地 Convert twice都会引发致命 Bug。)8.5 Packet Formats (数据包格式分析工具)要直观观察上述的网络包、十六进制字节序老师强烈推荐的抓包软件叫Wireshark。网络协议有严格的格式规定Wireshark 可以帮你逐层剥开协议的“封装”。9. Name and Addresses: IPv4 (名称与地址IPv4)路由器根据 IP 地址来决定数据包发向何处。9.1 Goal of Internet Protocol Addresses使得连接在互联网上的计算机能够互相通信。需要全局唯一的标识符。9.2 Internet Protocol, Version 4IPv4 地址由32 bits (4 个字节/octets)组成。Netmask (子网掩码)用来判断两台机器是否在同一个子网。如何判断(Quiz 解析)将双方的 IP 地址分别与子网掩码进行按位与运算 (Bitwise AND)。如果得到的结果完全相同说明源地址和目标地址在同一个子网。结论如果同子网可以通过交换机直接进行通讯如果不同必须要把包发给路由器网关来跨网段转发。遇到255.255.255.224这种非标准掩码必须转化为二进制动手算9.3 如今的地址结构为了高效寻址和管理现在普遍采用CIDR (Classless Inter-Domain Routing, 无类别域间路由)格式。分配地址块的形式IP Address / Count。例如192.168.0.0 / 16指前 16 位是固定的网络前缀后 16 位可分配给主机。由于 IPv4 地址可能会被耗尽专门有机构如 IANA负责统筹分配避免冲突。10. Longest Prefix Match (最长前缀匹配)当数据包到达路由器路由器该选择哪条链路进行转发10.1 转发表 Forwarding table转发表中记录了各种目标地址的通配规则及其对应的下一跳链路 (link)。查找规则时通常采用的是最长前缀匹配法。10.2 方法 (深入解析)(注解决原笔记没听懂的问题)本质原理路由表里的每一项都是一个 CIDR 网段如/24、/16。当一个目标 IP写为 32 bits 形式匹配转发表时可能会同时符合好几条规则。如何决断路由器会比较这些匹配项的子网掩码长度。匹配位数越多前缀越长说明该规则越“精确”。路由器一定会选择最精确最长前缀的那条链路转发。如果前面所有的具体字节都匹配不上最后会匹配一条通配符规则即走Default Link (默认路由/默认网关)。11. Address Resolution Protocol (ARP 地址解析协议)解决了“如何知道目的地址的下一跳 MAC 地址是啥”的问题。11.1 地址层 (IP 与 MAC 的精妙比喻)网络层 (IP) 和链路层 (MAC) 本质上是解耦但又协同工作的需要 ARP 协议进行映射解析。IP 地址属于网络层MAC 地址属于链路层。网络层的数据被封装在 Link 层的外部封包中。绝佳的比喻网络层 (IP)就像是快递公司它负责把包裹从一个城市源 IP 地址送到另一个城市目标 IP 地址。IP 地址就是快递单上的宏观地址信息。链路层 (MAC)可以更加接近数据的物理目的地。它就像是快递公司的派送员只负责在同一个小区局域网里派送包裹。MAC 地址就像是小区里的门牌号派送员通过门牌号把包裹精确送到你家门口。11.2 ARP 的工作机制ARP 可以将设备的 IP Address 和 MAC Address 进行映射并缓存起来便于局域网内收发数据。获取未知 MAC在已知目标 IP但未知其 MAC 时发动 ARP Simple request-reply protocol。设备会在局域网内大喊一声广播 Request“谁是 192.168.1.5”此时局域网内所有节点都会收到。对应的设备会悄悄回复单播 Reply“是我我的 MAC 是 XX”。动态缓存如果映射永久存在会占用过多内存且无法应对设备换网。因此所有现存的 ARP 都采用动态缓存机制固定时间过期后会自动清空映射情况重新请求。11.3 通讯的块 (Packet 结构)ARP 的报文块包含了丰富的字段信息用于精确指明发送方和目标方的硬件类型、协议类型、IP 和 MAC 地址等确保局域网内的通信严丝合缝。