资讯详情

资讯详情

计算机网络自顶向下复习笔记:时延吞吐量、HTTP/DNS与套接字避坑

简介这份计算机网络期末复习笔记面向高校本科生围绕自顶向下方法梳理从应用层到物理层的核心考点尤其对 TCP/IP 五层协议栈、协议分层与封装关系做了重点归纳。包内仅含 1 个 PDF 文件压缩包约 4.08MB体积轻巧便于打印与在移动端翻阅。已有 1072 人学习下载是不少同学考前冲刺的参考材料。内容按章节组织第一章覆盖主机与端系统、通信链路、分组交换机、ISP、家庭与企业接入方式、引导型与非引导型物理媒体并对比电路交换与分组交换的复用机制和四类时延后续章节延伸至应用层体系结构、套接字与端口寻址、HTTP 非持续与持续连接、RTT 及报文格式等要点。术语中英对照、公式与流量强度推导均有保留便于按考试大纲补充与自测。1. 计算机网络自顶向下复习笔记一份“半成品”资料的正确打开方式期末前一周抱着教材从第一章啃到第五章结果做套卷时发现 TCP 三次握手能背、HTTP 报文里 Host 和 Connection 两个首部行各自管什么却答不上来——这种状态在本科生里相当普遍。这份「计算机网络自顶向下复习笔记」不是一本从第一页读到最后一页的教材它更像一张按自顶向下顺序铺好的地图先把因特网边缘的主机、链路、分组交换机摆清楚再用公式把时延和吞吐量算给你看最后落到 HTTP、FTP、SMTP、DNS 这几类应用协议的连接模型差异上。它适合已经听过一轮课、想在考前把知识点串成链的人如果连五层模型的名字都没印象得先找视频课打底再回来。摘要里也提到应用层到传输层部分内容有缺别把它当唯一底本配合考试大纲补。2. 网络边缘与交换把主机、链路、交换机画成一张能对照的表第一章的概念密度是整份笔记里最高的术语一个接一个读的时候觉得都懂合上书就只剩“主机、链路、交换机”三个模糊的影子。我的处理方式是不按原文顺序读而是先搭一张组件表再把接入方式和交换方式挂上去让每个术语都有位置可放。2.1 从“主机-链路-分组交换机”三件套画起因特网的边缘由三类东西构成端系统主机、通信链路、分组交换机。端系统是跑应用的那一端手机、笔记本、服务器都算通信链路是物理媒介双绞铜线、同轴电缆、光纤、无线电都归这一类分组交换机负责把分组从一条链路推到另一条链路路由器按网络层地址转发链路层交换机按 MAC 地址转发。再往外扩一层是 ISP本地电话公司、有线电视公司、运营商负责把端系统接进因特网。术语之间的关系用一张表固定下来比反复翻原文效率高得多。术语英文一句话职责常见实物端系统/主机host / end system发起或接收通信的设备手机、PC、服务器通信链路communication link承载比特流的物理媒介双绞线、光纤、无线电分组交换机packet switch按首部信息把分组导向下一跳路由器、链路层交换机ISPInternet Service Provider把端系统接入因特网本地电话公司、有线电视公司协议protocol规定报文格式、次序与动作HTTP、TCP、IP协议这个定义值得单独拎出来它约束的是两个或多个通信实体之间交换报文的格式、次序以及发送和接收报文时采取的动作。注意三个要素缺一不可——格式、次序、动作。很多人复习时只记住“协议就是规则”真到选择题里问“协议定义了哪三样”答不出来。TCP/IP 是这套体系里最核心的两个协议TCP 管可靠传输IP 管寻址和路由。因特网标准由标准化组织通过 RFC 文档发布编号一旦定下来基本不再改复习时看到 RFC 791、RFC 793 这类编号对应的是 IP 和 TCP 的原始规范不需要背但要知道它们是标准的载体。从解题角度这一节最容易出的题型是“给一个场景判断哪个是端系统、哪个是分组交换机”。判断标准很朴素端系统跑应用分组交换机只转发。一台跑了 Web 服务的服务器是端系统不是交换机一台家用路由器同时具备交换和路由功能但按它在拓扑里的角色归类为分组交换机。把这条判据记住场景题基本不会错。2.2 接入方式与物理介质对照表接入网这一块原文列得比较散家庭接入五种、企业两种、广域无线两种物理介质又分引导型和非引导型。我复习时把它们压成两张表一张按“谁出钱、带宽多少、有没有专用介质”来记一张按“信号沿什么介质传播”来记。接入方式服务提供方介质特点DSL本地电话公司双绞铜线与电话共用线路速率随距离衰减电缆有线电视公司同轴电缆 光纤共享信道高峰时段速率波动FTTH光纤运营商光纤带宽高、衰减小成本高拨号电话公司双绞铜线56 kbps 量级已基本淘汰卫星卫星运营商无线电覆盖广、时延大以太网企业自建双绞线/光纤局域网主流速率 100 Mbps 起WiFi企业/家庭自建无线电局域网无线延伸3G / LTE移动运营商无线电广域无线覆盖换带宽这张表里有个容易翻车的点电缆接入和 DSL 都走“电话/电视公司”的既有线路但电缆是共享信道DSL 是专用线路。考试里问“哪种接入方式在用户增多时速率下降明显”答案是电缆不是 DSL。另一个点是 FTTH 和卫星都算“高速”但卫星的传播时延是硬伤几百毫秒起步做实时交互类应用时要避开。物理介质那张表按引导型和非引导型分。引导型是电波沿着固体介质前行双绞铜线便宜、短距离、同轴电缆共享、有线电视、光纤高速、长距离、抗电磁干扰。非引导型是电波沿空气或外层空间传播陆地无线信道WiFi、蜂窝、卫星无线信道覆盖广、时延高。判断题型是“给一个场景选介质”判据是距离、带宽、是否移动、成本四项。数据中心内部走光纤办公室布线走双绞线跨洋主干走光纤移动终端走无线电这套对应关系记熟就够用。2.3 电路交换与分组交换的选型判断这一节是整个第一章里最值得花时间对比的部分因为后面时延、吞吐量、甚至传输层的拥塞控制都建立在这个基础上。电路交换的核心动作是“预留资源”通信开始前先在路径上把带宽切片占住用的是频分复用FDM或时分复用TDM。频分是把频带切成若干段每段一路会话时分是把时间切成若干槽每个会话轮到自己那个槽才能发。分组交换不预留来一个分组转发一个用统计复用把链路带宽摊给所有活跃会话。两者的差异用一张表压住对比项电路交换分组交换资源占用会话期间独占按需使用不预留带宽共享无有平均分摊成本高低利用率低静默期也占资源高时延特征稳定无排队有排队时延随负载波动适用场景持续、固定带宽突发性数据流量原文给的分组交换三条优势是“更好的带宽共享、简单有效成本低、利用率高”但要补一句边界分组交换在流量强度接近 1 时排队时延会急剧上升甚至丢包所以它对实时性要求极高的场景比如传统电话不如电路交换稳。判断题型常问“视频会议该用哪种交换”标准答案是分组交换 足够的带宽预留和 QoS 机制因为视频流量本身是突发的电路交换的固定预留反而浪费。复习这一节时我一般会画一张两列对照图左边写电路交换的三步建立连接→传输→释放右边写分组交换的一步直接发然后在分组交换那一列下面标出“排队、丢包、时延抖动”三个副作用。这样后面读到排队时延和流量强度时脑子里的因果链是连着的不用重新捡。3. 时延四件套与吞吐量公式、手算和量级校验时延这一节原文列了五种处理、排队、传输、传播外加端系统和应用引入的额外时延。真正会考、会在工程里用到的其实是前四种而且很多人不是不会公式是单位不统一、节点数数错、把传输时延和传播时延搞混。这一章把四个公式拆开每个配一个手算示例和量级判断最后再讲吞吐量和流量强度的边界。3.1 四个时延各自的物理意义与公式处理时延是分组交换机检查分组首部、决定往哪转发所花的时间跟硬件性能有关通常在微秒级考试里除非专门给参数一般忽略。排队时延是分组在缓冲区里等待链路空闲的时间它不是一个固定值取决于当前流量强度这是四种时延里唯一“会变”的。传输时延是把一个分组的所有比特推上链路所需的时间公式是 L/RL 是分组长度bitR 是链路传输速率bps。传播时延是比特在物理介质上从一端走到另一端的时间公式是 d/sd 是链路长度米s 是信号传播速度米/秒光纤里约 2×10⁸ m/s。这四个里最容易混的是传输时延和传播时延。传输时延跟分组大小、链路速率有关跟距离无关传播时延跟距离、介质有关跟分组大小无关。判断口诀是“传输看分组传播看距离”。给一个具体数字感受一下一个 1000 bit 的分组在 100 Mbps 链路上传输时延是 10 微秒同样的分组在 1000 公里光纤上传播时延是 5 毫秒。传播时延比传输时延大三个数量级这就是为什么长距离链路的瓶颈通常不在发送端而在“路上”。原文里“传输时延为”后面公式被截断了补全就是 L/R。这一条必须记死考试里凡出现“分组大小 L、速率 R”两个参数传输时延就是 L/R没有别的写法。3.2 存储转发下 N 条链路的时延怎么加存储转发store-and-forward是分组交换机的默认工作方式收完整个分组才开始转发不是边收边转。这个机制带来的直接后果是一个分组经过 N 条链路源和目的地之间有 N-1 个分组交换机端到端传输时延不是 L/R而是 N×L/R。多出来的 (N-1)×L/R 就是每一跳“收完再发”多等的时间。举个例子分组 1000 bit链路速率 1 Mbps经过 3 条链路2 个交换机。单跳传输时延 1 ms端到端传输时延 3 ms其中 2 ms 是存储转发引入的额外延迟。如果把传播时延也算进去假设每条链路 1000 km传播速度 2×10⁸ m/s单跳传播时延 5 ms三条链路 15 ms总时延 3 ms 15 ms 18 ms。这个加法看起来简单但有两个坑。第一个坑是“N 条链路”和“N-1 个交换机”的对应关系题目给的是交换机数量公式里用的是链路数量别直接拿交换机数乘 L/R。第二个坑是“总时延”是否包含传播时延题干里如果只问“传输时延”就只算 N×L/R问“端到端时延”才把传播、处理、排队都加上。我一般会在草稿纸上先写一行“已知L…R…N…d…s…”把每个量对应到公式里再动笔算这样不会漏项。3.3 流量强度与吞吐量的边界判断排队时延没法直接算但可以用流量强度traffic intensity判断趋势。定义是 La/R其中 a 是分组到达队列的平均速率包/秒L 是分组大小bitR 是传输速率bpsLa 就是比特到达的平均速率。三种情况要分清La/R → 0几乎不排队排队时延趋近于 0。La/R → 1队列开始明显堆积排队时延急剧上升缓冲区一满就丢包。La/R 1比特到达速率超过链路输出能力队列理论上无限增长实际表现为持续丢包。这里的关键是“接近 1”和“等于 1”的差别。教材里说“流量强度接近 1 时排队时延急剧增加”不是线性增加是指数级恶化。工程上做容量规划流量强度控制在 0.7 以下才比较安全超过 0.9 就得扩容或做限流。这条经验在做网络仿真和实际调优时都成立。吞吐量是另一个维度。瞬时吞吐量是目的主机接收文件的速率bps平均吞吐量是一段时间内的平均。对文件传输类应用时延不是关键指标吞吐量才是对实时音视频时延和抖动比吞吐量更关键。端到端吞吐量的估算取“瓶颈链路”的速率也就是路径上所有链路里最慢的那一条——这个结论在串行链路上严格成立在并行链路或共享链路上要打折扣。P2P 分发时间是这一节常见的计算题。C/S 模型下分发时间 max{NF/u_s, F/d_min}其中 N 是客户数、F 是文件大小、u_s 是服务器上载速率、d_min 是最慢客户下载速率。P2P 模型下分发时间 max{F/u_s, F/d_min, NF/(u_s Σu_i)}多了一项“所有对等方上载速率之和”。这一项的物理意义是文件总共有 NF 比特要分发整个系统能提供的上载能力是服务器加上所有对等方两者相除就是理论下界。做题时三项都算出来取最大少算一项就会得出“P2P 比 C/S 还慢”的反直觉错误结论——这正好是后面避坑章要展开的一条。4. 应用层协议族HTTP / FTP / SMTP / DNS 的连接模型对照应用层是这份笔记里内容最密的一章HTTP、FTP、SMTP、POP3、IMAP、DNS、P2P、套接字全挤在一起。如果按原文顺序一个一个读很容易读完 HTTP 忘了 FTP 用几个连接。我的做法是先按“连接模型”给协议分组再补报文格式和记录类型让每个协议都有“用几个 TCP 连接、谁主动、有没有状态”三个标签。4.1 HTTP 的两类连接与 RTT 计法HTTP 本身是无状态协议短时间请求同一对象也会重新发一次它依赖 TCP 提供可靠传输默认端口 80。连接方式分两类非持续连接和持续连接。非持续连接是每个 TCP 连接只传一个请求报文和一个响应报文请求 10 个对象就建 10 次 TCP。每次建连接有握手开销所以接收一个对象至少需要 2 个 RTT一个 RTT 用于 TCP 三次握手一个 RTT 用于发请求收响应。注意这里说的是“至少”如果响应里还引用其他对象还得再加。持续连接是服务器发完响应后保持 TCP 打开后续请求复用这条连接省掉重复握手。判断何时关闭连接空闲超过一定时间间隔HTTP 服务器主动关。RTT 的定义要记准一个短分组从客户到服务器再返回客户的时间不含传输时延。做题时给“往返时间 RTT”和“对象数量”非持续连接的总时间 2×RTT×对象数 传输时间持续连接的总时间 RTT 对象数×RTT流水线情况下更少。这里有个常见误用把 RTT 当成“单程时间”算结果时间少一半。4.2 报文格式、状态码、Cookie、Web 缓存与条件 GETHTTP 请求报文分四部分请求行、首部行、空行、实体体。请求行包含方法字段GET、POST、HEAD、PUT、DELETE、URL、HTTP 版本。首部行里 Host 指定主机位置Connection: close 表示非持续连接User-agent 标识浏览器类型Accept-language 标识期望语言。响应报文类似第一行是状态行协议版本、状态码、状态信息后面是首部行、空行、实体体。常见的首部行有 Date、Server、Last-Modified、Content-Length、Content-Type。状态码要按“区间”记不要死背数字。2xx 成功200 OK3xx 重定向301 Moved Permanently 表示对象永久转移4xx 客户端错误400 Bad Request 表示请求服务器无法理解404 Not Found 表示资源不存在5xx 服务器错误505 HTTP Version Not Supported 表示版本不支持。原文里写了“401 Not Found”这是一个容易带偏的笔误——401 是 Unauthorized404 才是 Not Found复习时以标准为准别把笔记里的笔误记进去。Cookie 是 HTTP 无状态特性的补丁由四个组件配合响应报文里的 Set-Cookie 首部、请求报文里的 Cookie 首部、用户端浏览器管理的 cookie 文件、Web 站点后端数据库。它解决的是“服务器怎么识别同一个用户”的问题代价是隐私跟踪。Web 缓存器也叫代理服务器是“既是服务器又是客户”的网络实体通常由 ISP 购买安装。它的两个作用是减少客户请求响应时间、减少机构接入链路的流量。缓存带来的新问题是“缓存里的文件是不是最新版本”解法是条件 GET缓存器向初始服务器发请求时带上 If-modified-since 首部初始服务器比对时间没变就返回 304 Not Modified 且实体体为空变了就正常返回 200 和新内容。这一对请求/响应要能默写出来考试里出简答题的频率很高。4.3 邮件与文件传输协议FTP / SMTP / POP3 / IMAP 的连接模型这一类协议最容易混的是“推还是拉”“用几个连接”。FTP 用两个并行的 TCP 连接控制连接端口 21贯穿整个会话数据连接每传一个文件建一次、传完就关。控制连接传命令数据连接传文件内容这种分离设计让 FTP 被称为“带外控制”。FTP 是有状态的服务器要记住用户在远程主机上的当前目录位置和控制信息。注意 FTP 的端口号是控制连接的端口 21不是数据连接的端口数据连接端口是动态协商的。SMTP 是发送方邮件服务器把报文推到接收方邮件服务器端口 25用 TCP是推协议。它一般不用中间服务器报文必须用 7 比特 ASCII 格式非 ASCII 内容要重新编码。所有对象文字、附件都塞在一个报文里。邮件访问协议是反方向把邮件从服务器拉到用户本地主机。POP3端口 110分三个阶段——特许明文发用户名口令、事务处理取报文、做删除标记、更新退出后服务器删除被标记的报文它不在会话过程中携带状态信息。IMAP 比 POP3 多了“远程文件夹”和“会话用户状态维护”两个能力适合多设备同步。网页版邮件走 HTTP不走 POP3/IMAP。按“推/拉”和“连接数”给这四个协议分组记忆负担立刻减半协议方向端口TCP 连接数是否有状态FTP双向21控制2控制数据有SMTP推251无POP3拉1101会话内无IMAP拉1431有4.4 DNS 层次结构、查询方式与四类资源记录DNS 的核心工作是把域名解析成 IP端口 53传输层默认用 UDP这一点后面避坑章会专门讲它是高频错点。除了解析它还负责主机别名到规范主机名的映射、邮件服务器别名解析、负载分配一个规范主机名对应一组 IP。DNS 服务器分四层根 DNS 服务器、顶级域服务器TLD管 com、org、net 和国家顶级域、权威 DNS 服务器记录具体组织的主机名和 IP、本地 DNS 服务器不严格属于层次结构但起代理作用。没有任何一台 DNS 服务器拥有全部映射这是它必须分层的原因。查询方式分两种。迭代查询是“你告诉我下一步问谁”本地 DNS 服务器依次问根、问 TLD、问权威每一层返回下一层的地址递归查询是“你帮我查到底”被问的服务器负责把最终结果拿回来。实际部署里通常是“客户端到本地 DNS 用递归本地 DNS 到上层用迭代”的混合模式。这个组合要能画出来考试里出“描述一次完整 DNS 解析过程”的概率很高。资源记录是四元组 (Name, Value, Type, TTL)TTL 是记录的生存时间。四类 Type 要分清A 记录Name 是主机名Value 是 IP 地址。NS 记录Name 是域Value 是能获取该域主机 IP 的权威 DNS 服务器主机名。CNAME 记录Name 是别名主机名Value 是规范主机名。MX 记录Name 是别名邮件服务器Value 是规范邮件服务器名。DNS 查询报文和回答报文格式相同靠首部里的标志位区分。这一块不用背报文字段但要能说清楚“为什么查询和回答能共用一套格式”——因为字段是通用的只是标志位不同。5. 避坑清单五个复习时最容易翻车的地方附排查路径这一章是我把这份笔记翻了两遍、又做了三套真题之后攒下来的。每一条都是真实踩过的坑按“现象→原因→解决”写看到类似现象可以直接对号入座。5.1 时延公式套错算出来传输时延比传播时延大一个数量级现象算端到端时延时传输时延算出几百毫秒传播时延只有几毫秒和直觉相反。原因把 L/R 和 d/s 弄反了或者单位没统一——L 用了字节但 R 用 bps结果差 8 倍d 用了公里但 s 用了米/秒结果差 1000 倍。解决算之前先统一单位L 换成 bitd 换成米R 换成 bpss 用 2×10⁸ m/s。然后在草稿纸上标一行“传输L/R传播d/s”每一步只套一个公式。传输时延跟距离无关、传播时延跟分组大小无关这条判据能挡住大部分糊涂账。5.2 DNS 的传输层协议判断反了现象判断题“DNS 使用 TCP 作为传输层协议”打了对勾。原因只记住“DNS 是应用层协议”没记传输层。原文里明明写了“使用运输层的服务UDP”但复习时跳过了。解决记默认 UDP 53例外场景区域传送、响应超过 512 字节时的 TCP 回退单独列一行。判断时先想“默认是什么”再想“有没有例外”不要一上来就猜。5.3 套接字代码在原环境跑不通现象把笔记里的 UDPClient.py 抄进 Python 3 环境报 SyntaxError 或 TypeError。原因原示例是 Python 2 语法raw_input 在 Python 3 里改成 inputprint 从语句变成函数sendto 发字符串要显式 encode 成 bytes。解决按 Python 3 重写字符串发送前 encode(utf-8)接收后 decode(utf-8)print 加括号。下一章会给一份改好的可运行版本。5.4 P2P 分发公式漏了最慢对等方那一项现象算出 P2P 分发时间比 C/S 还长和“P2P 更快”的直觉矛盾。原因只算了 NF/(u_s Σu_i) 这一项漏了 F/d_min最慢对等方的下载瓶颈和 F/u_s服务器上载瓶颈。P2P 分发时间取三项最大值不是只取系统总上载那一项。解决三项都写出来再取 max。物理意义也要对上F/u_s 是服务器把文件推一遍的时间下界F/d_min 是最慢那个对等方收完的时间下界NF/(u_sΣu_i) 是整个系统总上载能力分摊到 NF 比特的时间下界三个下界里最大的那个才是真正的分发时间。5.5 协议栈分层记混把 HTTP 归到传输层现象选择题问“HTTP 属于哪一层”选了传输层。原因HTTP 跑在 TCP 之上复习时把“依赖”当成了“属于”。解决按“协议定义在哪一层”列表不按“跑在谁上面”列表。应用层HTTP、SMTP、FTP、DNS、P2P传输层TCP、UDP网络层IP链路层取决于具体链路物理层与传输媒体相关。分组在各层的叫法也要对上应用层叫报文message传输层叫报文段segment网络层叫数据报datagram链路层叫帧frame。这一组对应关系是白送分的题别丢。6. 套接字示例从纸面到可运行一份 20 分钟验证清单笔记里的套接字代码是整份资料里唯一“能动手”的部分但原版是 Python 2 写法直接抄会翻车。我按 Python 3 重写了一版 UDP 回显程序两个终端就能跑通用来验证“进程通过套接字收发报文”这件事到底怎么发生。服务端先绑定端口循环收报文、转大写、回发# UDPServer.py —— Python 3 版本 from socket import * serverPort 12000 # AF_INET 表示 IPv4SOCK_DGRAM 表示 UDP serverSocket socket(AF_INET, SOCK_DGRAM) # 绑定本机所有网卡的 12000 端口 serverSocket.bind((, serverPort)) print(The server is ready to receive) while True: # 2048 是接收缓冲区大小单位字节 message, clientAddress serverSocket.recvfrom(2048) # 收到的是 bytes先解码再转大写再编码 modifiedMessage message.decode(utf-8).upper() serverSocket.sendto(modifiedMessage.encode(utf-8), clientAddress)客户端不绑定端口由系统自动分配直接 sendto 到服务端地址# UDPClient.py —— Python 3 版本 from socket import * # 本机测试用 localhost跨机测试换成服务端实际 IP serverName localhost serverPort 12000 clientSocket socket(AF_INET, SOCK_DGRAM) message input(Input lowercase sentence:) # 发送前必须 encode否则 Python 3 会报 TypeError clientSocket.sendto(message.encode(utf-8), (serverName, serverPort)) modifiedMessage, serverAddress clientSocket.recvfrom(2048) print(modifiedMessage.decode(utf-8)) clientSocket.close()跑的顺序是终端 A 执行python3 UDPServer.py终端 B 执行python3 UDPClient.py在 B 里输入helloA 那边不打印B 收到HELLO。这里有个反直觉的点UDP 服务端不需要 accept因为 UDP 是无连接的bind 完就能收。TCP 版本则要先listen再accept每条连接一个 socket代码结构完全不同。验证清单我一般按这四步走第一步两个终端在同一台机器上跑通 localhost第二步把 serverName 换成局域网 IP确认跨机可达不通就查防火墙第三步故意在服务端 bind 前先跑一次确认端口被占用时报OSError: [Errno 98] Address already in use知道这个错长什么样第四步把服务端改成message.decode(utf-8).lower()确认客户端收到小写验证“服务端处理逻辑改了客户端不用动”这个套接字编程的基本事实。最后说个习惯。从那以后我每次复习协议栈都强制自己先默写五层模型和每层的分组叫法再往下看具体协议每次跑套接字示例都先确认 Python 版本和端口占用再动键盘。这两步花不了五分钟但能挡掉后面百分之八十的“明明看懂了却跑不通”和“明明背过却选错”。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →