ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

传输层核心考点全解:TCP/UDP原理、三次握手与拥塞控制

传输层核心考点全解:TCP/UDP原理、三次握手与拥塞控制 这章是谢希仁《计算机网络》里的重头戏也是考研408和面试八股文的高频区。说实话传输层这章学得好不好直接决定了你对TCP三次握手、拥塞控制这些经典问题的理解深度。不少人把UDP和TCP的区别背得滚瓜烂熟但一问到“为什么快重传要快”、“为什么TIME_WAIT要等2MSL”就卡壳了这就是典型的只记结论、没吃透原理。我复习这章的时候最大的感受是传输层是整个网络体系里“承上启下”的枢纽上面要替应用层管好进程通信下面要应对网络层的不可靠服务。如果只停留在背端口号、背报文格式的层面那这章等于白学。这篇总结我不会按教材目录平铺直叙而是按“从问题出发”的逻辑重新组织把端口复用、UDP设计哲学、可靠传输原理、TCP流量控制与拥塞控制、连接管理这些核心考点串成一条线顺便附上我踩过的坑和做题时悟出来的记忆方法。1. 为什么传输层是考研和面试的分水岭先说个现象好多人在学完物理层、数据链路层和网络层之后脑子里还全是“怎么把包从一个节点送到另一个节点”的电路思维。到了传输层视角突然换了——不再关心下一跳怎么走而是关心“两个主机上的两个进程之间怎么像坐在同一台机器上一样对话”。这个视角转换就是这章的第一个坎。在学习传输层之前你需要先接受一个前提网络层提供的服务是不可靠的。IP协议只负责尽力转发包丢了、重复了、乱序了它一概不管。传输层的价值就是在这个“不靠谱”的网络之上给应用进程提供“靠谱”的通信服务。TCP选择把不靠谱变成靠谱UDP选择接受不靠谱并把它包装成“实时优先”的能力。所以无论你用的是谢希仁的教材还是跟王道、湖科大教书匠的课都不要跳过“传输层要解决什么问题”这个动机篇。直接刷报文格式和端口表的人后面做滑动窗口的题大概率要栽。传输层的核心考点可以分成四条主线端口与复用分用传输层靠端口号区分同一主机上的不同进程。UDP协议无连接、不可靠、面向报文但头部简单、延迟低。TCP协议面向连接、可靠传输、面向字节流核心机制包括确认、重传、窗口、拥塞控制。TCP连接管理三次握手、四次挥手、状态迁移、超时时间设计。把这四条线理清楚再去看具体的报文格式你会发现每个字段都不是白设的全是为了解决某个通信问题。我个人建议的学习顺序是先搞明白“端口”解决了什么问题再看UDP因为UDP简单适合建立直觉然后进入TCP——这时候你会遇到整个章节里最难的“可靠传输原理”它是后面所有窗口机制的地基。2. 端口与套接字传输层唯一的“寻址手段”很多人一上来就背端口号列表HTTP是80HTTPS是443DNS是53SSH是22。但真正重要的是理解端口号在TCP/IP协议栈里扮演的角色。网络层用IP地址定位主机但一台主机上同时跑着浏览器、微信、邮件客户端IP包到了主机后内核怎么知道这个包是给浏览器的还是给邮件的答案就是端口号。端口号是一个16位的整数范围0到65535。其中0到1023是周知端口由IANA统一分配给HTTP、FTP、DNS这些标准服务用1024到49151是注册端口49152到65535是动态或私有端口客户端临时使用。这里有一个关键考点端口号只在本地方才有意义。一个TCP连接的四元组是源IP、源端口、目的IP、目的端口它唯一确定了一条连接。同一个端口在不同主机上出现完全没问题因为IP地址已经区分了主机。2.1 复用与分用的本质复用与分用是传输层的基础功能这个知识点千万别只记定义要理解它的实际场景。复用发送方的多个应用进程可以把数据都交给同一个传输层协议UDP或TCP去封装发送传输层用端口号来区分这些数据属于哪个进程。分用接收方的传输层收到数据后根据报文头部的目的端口号把数据交给对应的应用进程。用大白话说复用就是“很多进程共用同一个传输层出口”分用就是“一个入口到达后按门牌号分发给不同的进程”。这个道理和快递柜差不多所有快递都送进同一个柜子主机但每个柜门上贴着取件码端口号不同的人凭码取走自己的包裹。做题的时候经常会有“如果一个应用层进程绑定了端口8080另一个进程还能用这个端口吗”这类题。答案是如果两个进程都在同一台主机的同一个传输层协议上绑定同一端口就会冲突。但TCP和UDP可以各自占用同一个端口号比如DNS同时使用UDP 53和TCP 53因为它们属于不同协议复用分用的维度不同。2.2 套接字从“主机到主机”到“进程到进程”套接字Socket这个概念是网络安全和编程面试里的高频词。在网络编程里Socket是应用进程和传输层协议之间的编程接口在网络体系结构里套接字通常指的是IP地址加端口号的组合用来唯一标识一个通信端点。一个TCP连接的四元组源IP、源端口、目的IP、目的端口之所以能唯一确定一条连接靠的就是两端套接字的组合。理解这一点后面看三次握手、四次挥手、连接表这些概念时就会通透很多。复习建议不要孤立地背端口号把端口号和Socket绑定在一起记。看到“客户进程发起连接”你要反应出来它需要一个源IP、源端口目标服务器那里有一个固定目的IP、目的端口这样才能构成连接。3. UDP越简单的东西越容易被低估UDPUser Datagram Protocol用户数据报协议在教材里篇幅不多经常被一笔带过。但如果你真以为UDP不重要那就错了——近年来面试官最爱问的问题里就有“既然TCP可靠为什么视频通话不用TCP”以及“QUIC基于UDP那UDP是不是不可靠”。这些问题的根子都在于你有没有看透UDP的设计哲学。3.1 UDP的特点和适用场景UDP的主要特点可以总结成“四个不”无连接发送数据之前不需要建立连接想发就发。不可靠不保证数据一定到达不保证顺序不保证不重复。面向报文应用层交给UDP多长的报文UDP就原样封装发送既不拆分也不合并。头部开销小UDP首部只有8个字节相比TCP首部的20字节起步少了很多。对比着看UDP的优势就出来了无连接意味着没有握手延迟发送第一个字节就能走人。首部小每包协议开销低适合频繁发送小消息的场景DNS查询就是典型。没有拥塞控制不会因为网络拥塞主动降低发送速度适合实时音视频——哪怕丢几帧也比卡顿好。适用场景里最容易考的是“为什么DNS用UDP”以及“为什么视频会议用UDP”。DNS用UDP是因为查询响应都很短一个包能装下用UDP省去握手开销即使丢包重发代价也低。但如果响应特别大超过512字节DNS会转用TCP做区域传送或大数据响应。视频会议、在线游戏选UDP则是因为实时性优先级高于可靠性。试想一下你在视频通话时如果网络丢了一个关键帧TCP会重传结果这一秒的画面卡顿但为了等重传后面的画面全堵住了。UDP的做法是丢了就丢了渲染端直接补一帧或者显示上一帧用户几乎感知不到。3.2 UDP首部格式与校验和UDP首部只有四个字段源端口16位、目的端口16位、长度16位、校验和16位共8字节。长度字段指UDP首部加上数据的总长度最小值为8。关于校验和有一个需要留意的冷门考点UDP校验和计算时除UDP报文本身外还要加上一个“伪首部”。伪首部不是真正发送的字段它包含源IP地址、目的IP地址、协议号17和UDP长度。为什么要把IP层的地址信息拿过来参与校验因为如果只校验端口和数据那么IP层转发时如果目的地址错了比如被路由器乱发接收方无法察觉数据可能被投递给错误的目的端。引入伪首部相当于把“投递地址”也纳入了校验范围加强了传输层与网络层的语义关联。这个知识点谢希仁教材有讲王道视频也会提但考408的同学经常忽略。做题时如果看到“伪首部的作用是什么”要能答出“为了保证传输层在复用分用时校验数据确实是被投递到正确的目的地址”。3.3 UDP的“无拥塞控制”是特性不是缺陷我见过很多初学者把UDP的不可靠和“差”画等号这个思维要改。UDP没有拥塞控制意味着发送速率只受应用层限制网络拥塞时它不会主动退让。这对音视频流特别重要宁可牺牲少量质量也不能因为拥塞控制算法把发送速率压到极低。不过这也带来一个衍生问题大量UDP流量可能把网络挤爆导致TCP流量饿死。这是个经典的“UDP与TCP公平性”问题。互联网上很多应用层协议跑在UDP上又没做拥塞控制架不住流量大就会挤压TCP的带宽。现在很多优化方案比如WebRTC里的带宽估计、QUIC里的拥塞控制本质上都是“给UDP加上TCP的秩序”但保留UDP的低延迟优势。这类扩展知识在408里不会直接考但面试时聊到“如何改善UDP的可靠性”时你有这个认知就会很加分。4. 可靠传输的基本原理TCP一切机制的地基TCP的可靠传输不是某一个机制单独起作用的它是“确认 重传 序号 窗口”四个机制的组合。复习的时候如果把TCP可靠传输拆成四个独立环节去理解做题时很难深入。我个人建议把下面的逻辑链背下来发送方给每个字节编上序号 → 接收方收到数据后发送确认ACK → 发送方通过定时器感知丢包 → 超时或收到重复ACK后重传 → 配合滑动窗口控制发送速率和流量。这一节是重中之重考研大题里“滑动窗口的发送窗口大小变化”、“累计确认下重传哪些数据”、“超时时间怎么算”全部从这里出。4.1 停止等待协议Stop-and-Wait停止等待协议是最简单的可靠传输方案也是理解所有窗口机制的第一步。它的流程是发送方发一个包 → 等待确认 → 收到ACK再发下一个包 → 没收到就超时重传。这个协议最大的缺点是信道利用率太低如果往返时延RTT是很大发送方大部分时间都在干等。所以TCP不可能使用停等它要引入“流水线”思想——允许连续发送多个包这就是滑动窗口的动机。408里有一道经典题“停等协议的信道利用率是多少”公式是利用率 发送时间 / (发送时间 RTT)。真实网络RTT往往远大于发送时间所以利用率特别低。这也是为什么TCP要设计窗口机制的底层原因——提高信道利用率。4.2 回退N帧Go-Back-N与选择重传Selective RepeatGBN和SR是传输层可靠传输的核心考点这两种协议属于“滑动窗口 重传策略”的两种极端回退N帧GBN发送窗口大于1接收窗口等于1。接收方只能按序接收如果中间丢了一个包之后到达的后续包全部丢弃发送方超时后要把从丢包开始往后的所有数据重传。这种策略简单但重传代价高。信道质量差、误码率高时GBN的效率很低。选择重传SR发送窗口和接收窗口都大于1。接收方可以缓存乱序到达的包只要求发送方重传真正丢失的那个包。效率更高但需要接收方有较大的缓存并且每个包的确认逻辑更复杂。TCP实际采用的是GBN和SR的混合思想——TCP的接收窗口通常是1要求字节严格按序已到达的乱序数据不会立刻丢弃而是存在接收缓冲区里等到缺失字节到达后再统一交付上层应用但同时TCP又支持选择确认SACK选项允许接收方告诉发送方“我已经收到哪些范围的数据”从而只重传真正缺失的部分。考试中经常有一道对比题“GBN和SR在窗口大小限制上的区别”。记住无论GBN还是SR发送窗口大小都不能超过序号空间的一半否则无法区分“新数据”和“旧重传数据”。这个限制在TCP里也适用——所以TCP最大可以同时发送的未确认字节数受窗口和序号空间的共同约束。4.3 确认与累计确认的陷阱TCP使用累计确认确认号表示“该序号之前的数据都已正确收到”而不是“这个序号的数据刚刚收到”。举例说发送方发了字节1、2、3、4接收方收到1、2、43丢了它会立刻确认“字节2之前都收到了”也就是ACK3期望收到3。但注意4已经被接收方收到了只是暂时存着不向上交付因为3还没到。此时发送方有两种选择超时后重传3或者收到三个重复ACK后推断3丢了并快速重传3。累计确认的便利是一个ACK可以确认前面所有数据减少确认包数量代价是丢包时发送方无法立刻知道具体丢了哪个字节除非启用SACK。408 的判断题很喜欢挖坑“接收方收到乱序数据后立即发送ACK确认已收到的乱序数据”。这句话是错的——TCP 的 ACK 永远表示“期望收到的下一个字节序号”即使接收方已经收到了 4 号字节它的 ACK 也不会变成 5而会持续回复 ACK3。5. 滑动窗口与TCP流量控制别把窗口机制学成一堆公式滑动窗口是传输层里最容易让人头晕的部分因为教材里一会儿讲发送窗口一会儿讲接收窗口还有rwnd、cwnd两个概念混在一起。我自己的经验是先分清楚“流量控制”和“拥塞控制”是两个不同的问题再去分别看窗口机制脑子就清晰了。5.1 流量控制解决的不是网络拥塞而是接收方缓存不足流量控制Flow Control的作用是让发送方的发送速率不要超过接收方的接收能力。听起来和拥塞控制很像但两者解决的问题不同流量控制接收方处理不过来防止接收方缓存溢出。这是端到端的问题。拥塞控制网络中间设备路由器处理不过来防止网络中的包过度堆积。这是全局网络的问题。TCP用接收窗口rwnd做流量控制。接收方在TCP首部的窗口字段里告诉发送方“我还有多少缓存空间可以收数据”。发送方的发送窗口大小 min(接收窗口rwnd, 拥塞窗口cwnd)。也就是说发送速度既不能超过对方接收能力也不能超过网络能承受的容量。5.2 滑动窗口的计算做一道题就懂了我们来手动推演一遍经典滑动窗口题目。假设发送窗口大小为4接收窗口大小为4实际TCP里发送窗口由rwnd和cwnd决定但概念题里常简化为固定值。发送方初始可以发送字节1~4依次发送后等待ACK。发送字节1、2、3、4收到ACK3表示1、2已确认期望收到3此时发送端窗口滑动到[3,6]可以发送字节5、6如果字节5、6也发出去了发送窗口在途数据是3、4、5、6如果接下来收到ACK5因为字节3、4都已收到窗口滑到[5,8]发送方就可以继续发7、8这里的核心要点是发送窗口上限并不是固定不变的它是“已经发送但未被确认”的数据量上限。窗口前沿随着ACK推进窗口后沿随着确认移动。所有题目本质都在考“发出去的字节数 - 已经确认的字节数 ≤ 窗口大小”。做题建议画时间线图。横轴是序号纵轴是时间或方向把每个ACK到达的时间点和窗口滑动后的区间画出来一目了然。5.3 窗口值为0与“糊涂窗口综合症”流量控制里有一个很有意思的边界情况接收方发给发送方的ACK里窗口字段为0表示“我没空间了别发了”。这时候发送方必须停止发送。但接收方什么时候会重新给出发送许可答案是——当接收方的应用进程读走了缓冲区数据腾出空间后接收方再发送一个窗口更新的ACK。如果这个更新ACK丢失双方就会死锁发送方等接收方更新接收方以为发送方已经收到。解决思路是TCP的“持续计时器”Persist Timer发送方在收到窗口0后启动持续计时器计时器超时后主动发送一个1字节的探测报文触发接收方重新回应窗口状态。这个机制408里常被作为“TCP计时器”小题考察别漏掉。另一个边界情况是糊涂窗口综合症双方都在很慢地产生数据比如一次只发1字节接收方窗口刚腾出1字节就通告发送方刚收到1字节空间就立刻发1字节结果网络里全是小包传输效率极低。解决办法是让接收方等待窗口积累到一定大小或者接收缓存可用空间达到一半时再通告窗口避免频繁的小窗口通告。这就是Nagle算法和延迟确认策略的动机。6. 拥塞控制慢开始、拥塞避免、快重传、快恢复拥塞控制是传输层考点里的大头408必考面试必问。这里最忌讳的是死背“阈值为12从1开始指数增长”这类数字然后不懂为什么要这么设计。6.1 慢开始与拥塞避免指数增长为什么不能停拥塞控制最朴素的想法是发得越慢网络越不容易堵。但问题在于如果发得太慢网络利用率就低如果发得太快可能直接把网络打瘫。TCP的解法是一边试探一边增长。慢开始Slow Start拥塞窗口cwnd从1开始每收到一个确认cwnd就翻倍。也就是说发送速率是指数增长的1、2、4、8、16……直到达到慢开始门限ssthresh。拥塞避免Congestion Avoidance达到ssthresh后cwnd不再翻倍而是每经过一个RTT只增加1。这个阶段是线性增长缓和得多。一旦发生超时判定网络拥塞ssthresh被设置为当前cwnd的一半cwnd从1重新开始慢开始。很多人会问指数增长岂不是很容易打爆网络注意慢开始不是真的“慢”它的“慢”是从cwnd1这个最小状态开始指数增长其实非常快。之所以要指数增长是为了快速探测网络可用带宽因为TCP在启动时并不知道网络的真实容量。这个“探测-增长-遇堵则减半”的思路就是TCP拥塞控制的学术脉络——它在“公平性”和“效率”之间做折中。6.2 快重传与快恢复把丢包检测从“超时”提前到“重复ACK”超时重传有个明显缺点要等一个RTO重传超时时间如果RTO很大丢包后的空闲等待会白白浪费吞吐。快重传和快恢复就是用来缩短这段等待的。快重传的前提是发送方连续收到3个重复ACK比如收到3次ACK4说明4号包之后的数据都到了但4本身丢了此时发送方不等RTO超时立刻重传丢失的报文。这个机制解决的是“快速感知丢包、快速补发”的问题。快恢复的意思是发送方从“3个重复ACK”判断出的拥塞比“超时”判断出的拥塞要轻微——因为既然还能连续收到ACK说明网络还在转发数据只是某个包丢了。所以不把cwnd完全降到1而是把ssthresh设置为当前cwnd的一半cwnd直接降到ssthresh进入拥塞避免阶段。相比之下超时重传说明网络状态已经很差所以要把cwnd打回1重新慢开始。记住这个判断原则做题时就不会混淆什么时候降一半、什么时候归1超时重传 → 网络严重拥塞 → ssthresh cwnd/2cwnd 1重新慢开始。收到3个重复ACK → 网络轻度拥塞 → ssthresh cwnd/2cwnd ssthresh进入拥塞避免。6.3 拥塞窗口与接收窗口的协同发送窗口的最终值发送方真正能发送的数据量是取两者较小值swnd min(rwnd, cwnd)。其中rwnd是接收方的缓存能力由对端通告cwnd是发送方自己的“网络容量估计”由拥塞控制算法维护。两者独立变化、互相约束。这就是为什么接收方窗口中没有任何数据但发送方仍然可能不发——因为cwnd可能降到了很小。408的题目中经常给出一段时间内cwnd的变化曲线表让你填某个时刻ssthresh或cwnd。解法就是先判断每个时间点发生了什么事件超时还是3个ACK然后按规则更新。注意ssthresh在拥塞发生后会被更新为“此时cwnd的一半”这个半值会保持到下一次拥塞事件发生之前别每次都从头算。7. TCP连接管理三次握手与四次挥手的所有考点TCP连接管理这块内容是面试八股的重灾区也是408大题的高频区。我在这个部分花了很多时间因为书上的状态迁移图初看特别复杂但只要你理解了“为什么需要三次”和“为什么需要四次”所有状态都能自己推出来。7.1 三次握手为什么必须是3次三次握手的流程大家都熟SYN客户端→服务器→ SYNACK服务器→客户端→ ACK客户端→服务器。核心目的是确定双方的发送和接收能力都正常并同步初始序列号ISN。三次握手里最值得深挖的是“为什么不能只握两次”。假设只有两次客户端发SYN服务器回SYNACK然后服务器就认为连接建立完成。但网络里存在一种经典故障——请求滞后。客户端第一次发的SYN因为网络拥堵滞留了很久客户端已经超时重传并建立了新连接。旧SYN迟到了服务器收到后以为是个新连接如果只握两次服务器就会创建一条僵尸连接浪费资源。而三次握手的第三次ACK可以解决这个问题服务器发出SYNACK后只有收到客户端的ACK才能确认客户端确实在“活跃”状态。迟到的旧SYN只会让服务器收到一个SYN但客户端并不会为它回复ACK所以连接建立不起来。更深一点三次握手还允许双方协商初始序列号。序列号是可靠传输的基础双方必须知道对方的起始序列号才能正确确认和排序。所以SYN包要带自己的ISNACK包要确认对方的ISN。7.2 四次挥手为什么是4次TCP是全双工的双方都可以发送和接收数据。断开连接时每一方都要独立地确认“我不再发送数据了”和“我接收完数据了”所以需要双方各发一次FIN、各确认一次ACK这就是四次挥手。具体流程主动方通常客户端发送FIN表示“我的数据发完了我准备关闭发送方向”。被动方回复ACK表示“我收到了你的FIN我同意你的发送方向关闭”。被动方仍然可以继续发送数据如果还有数据要发的话。被动方发完数据后发送FIN表示“我的数据也发完了准备关闭”。主动方回复ACK完成关闭。注意第二步和第三步之间可能隔一段时间因为被动方还需要时间处理剩余数据这就是为什么“挥手”通常是4次而不是3次。7.3 TIME_WAIT状态的2MSL问题四次挥手后主动关闭的那一方会进入TIME_WAIT状态持续时间为2MSLMSL为报文最大生存时间通常2分钟或30秒/1分钟。这个状态的存在有三层原因保证最后一个ACK能够到达被动方。如果最后一个ACK丢失被动方会超时重发FIN主动方需要还能接收并重新确认。让本连接内所有旧报文在网络中自然消亡。防止延迟到达的旧数据包被新连接同一四元组错误接收。帮助路由器交换路由信息。不过第三点是次要原因前两层是面试和考研的标准答案。408里常问“TIME_WAIT状态处于主动关闭方还是被动关闭方”答案是主动关闭方。因为主动方承担“确认关闭”的责任它必须等待一段时间确保被动方收到了自己的最终ACK。7.4 SYN Flood攻击与防护思路这是面试里常被问到的一个扩展考点攻击者伪造大量源IP地址向服务器发送SYN报文但不完成三次握手。服务器每收到一个SYN都会分配连接资源同时回复SYNACK并等待客户端的ACK。如果客户端不回复这些半开连接会堆积耗尽服务器的连接表和内存导致正常用户无法连接。防护思路通常包括SYN Cookie不分配连接资源只通过计算一个Cookie来回应SYN待收到ACK时再验证、限制半连接队列长度、使用SYN代理等。这部分408很少考但作为面试扩展很有价值。7.5 一个抓包实验帮我彻底理顺了状态切换我当初学状态迁移时光靠看状态图强记回头就忘。后来自己用Wireshark在本地起了个服务做了一次真实的三次握手和四次挥手抓包把每个包的序列号、ACK号和标志位一一对上看了一遍状态就通了。建议你也试试特别是观察FIN包和ACK包的交互以及TIME_WAIT状态的存在。抓包验证对理解TCP非常有效比自己死记状态图强十倍。8. 超时重传与RTO估算一个总被忽视的细节这一部分教材讲得不多但408偶尔会出一道关于“RTT和重传超时时间”的计算题面试里也有一道常见的题“TCP的超时时间是怎么确定的”8.1 动态RTO不能设死如果RTO设得太小正常的数据还没传输完就超时重传了网络里会塞满重复包如果设得太大真正丢包后要等很久才能重传白白浪费吞吐量。问题是网络的RTT一直在变化——跨局域网和跨公网的RTT天差地别所以TCP必须动态估算RTO。经典算法是先测量一个RTT样本用它对RTT进行平滑EstimatedRTT α × EstimatedRTT (1 - α) × SampleRTT其中α通常取0.875也就是新样本只占12.5%的权重。这个公式本质是一个低通滤波器保留历史RTT趋势平滑掉瞬时抖动。接着计算RTT偏差DevRTT用来度量RTT的波动程度然后RTO EstimatedRTT 4 × DevRTT系数4是经验值保证RTO既能覆盖大多数正常RTT波动又不会因为偶尔的尖峰而频繁误判。8.2 Karn算法与重传二义性这里有另一个坑如果发送方重传了一个包由于超时那么收到的ACK到底对应第一次发送的包还是重传的包这个ACK的RTT样本会失真——它可能是第一次发送、重传后才收到的确认。Karn算法的处理是发生重传时不要用这次ACK更新RTT估算避免污染样本当某次数据传输超时后RTO会按指数退避退避到下一次重传前乘2防止网络持续拥塞时反复用相近的RTO重传导致更严重的拥塞。这个知识点很细但如果目标分数在120分以上408考研或者想稳过“TCP超时重传”面试题一定要掌握。8.3 快重传与超时重传的触发条件做题时怎么判断该用快重传还是超时重传看我总结的触发条件超时重传计时器到期没有收到任何ACK。此时基本可以断定网络出现了严重问题或包真的丢了。快重传收到3个重复ACK。此时ACK还能到达说明后续数据已经在北京只是缺了一段判断为轻度拥塞。408计算题里如果同时有超时和多个重复ACK一定要先看时间轴。哪个事件先发生就按哪个事件更新状态。9. 一个完整案例把本章知识点串起来理论讲了这么多我们来做一个综合性的推演题把端口、UDP/TCP、滑动窗口、拥塞控制、连接管理全部串起来。这个案例不是我凭空编的而是综合了王道第八章课后题和408真题的思路自己重新组织了一遍。场景客户端IP192.168.1.10向服务器IP203.0.113.8发起HTTP请求URL是http://203.0.113.8/index.html。9.1 流程拆解DNS解析客户端向本地DNS服务器发起UDP查询源端口随机比如50000目的端口53。这就是UDP复用/分用和端口概念的体现。建立TCP连接客户端使用临时端口比如51000与服务器80端口建立TCP连接。这个连接的四元组是192.168.1.10, 51000, 203.0.113.8, 80。发送HTTP请求HTTP请求通过TCP连接发送TCP对数据进行编号、加首部、交给IP层。发送窗口由rwnd和cwnd共同决定。拥塞控制开始初始cwnd可能是10个MSS现代TCP发送方按慢开始指数增长直到ssthresh。正常关闭数据传完后客户端主动关闭连接经历四次挥手进入TIME_WAIT。9.2 这道题能牵出哪些考点端口号客户端端口是临时的服务器端口是周知端口。TCP与UDP对比DNS用UDPHTTP用TCP。四元组为什么TCP连接可以同时存在多个HTTP连接因为源端口不同。滑动窗口发送过程中窗口怎么变化。拥塞控制如果网络拥塞cwnd怎么变化。连接管理三次握手和四次挥手的状态迁移。这道题如果能不看教材从头推演一遍说明你已经把这一章的知识点按实际通信场景串成了一个整体。如果哪个环节卡壳了就回去翻对应小节。这种“把知识串起来”的复习方式比孤立地刷题效率高得多。10. 常见误区与备考建议最后说几个我自己踩过、也在考研群里看别人反复踩的坑。这章的细节陷阱特别多希望这段话能帮你省下不少弯路。10.1 易错点清单误把rwnd当发送窗口发送窗口是min(rwnd, cwnd)不是单独用rwnd。混淆“超时重传”与“快重传”后的cwnd恢复方式前者cwnd归1后者cwnd降到ssthresh。分不清UDP校验和伪首部的内容注意要包含IP地址和协议号。忽略TIME_WAIT只在主动关闭方出现被动方不会进入TIME_WAIT。背滑动窗口公式时搞不清“序号窗口”和“确认号”的关系确认号是期望下一个字节号不是已确认的最大字节号。把GBN的“丢弃乱序数据”和TCP的“缓存乱序数据”搞混TCP虽然也有累计确认但乱序数据会临时存入接收缓冲区SACK开启时还能选择性确认。10.2 408和面试复习侧重不同如果是408考研重点题型是滑动窗口计算、拥塞控制cwnd变化表、三次握手/四次挥手状态迁移、IP分片与端口结合的综合题、TCP报文段格式填空。这些题目考查的更多是记忆和精确计算需要熟练掌握公式和默认参数。如果是面试找工作重点会转到为什么三次握手不是两次、为什么四次挥手不能少一次、TCP如何实现可靠传输、UDP为什么快、QUIC为什么基于UDP、流量控制和拥塞控制的区别、SYN Flood原理与防护。这些问题不考背诵考的是你能不能把每个机制的原因讲清楚。10.3 我的复习节奏建议我当年复习这章用的“三层递进”方法供你参考第一层通读教材谢希仁版或自顶向下版把每一小节的标题串成一个逻辑链先保证“知道有哪些概念”。第二层看王道视频或湖科大教书匠的课跟着做笔记每看完一节立刻做课后题重点做滑动窗口和拥塞控制的计算题。第三层自己画图复盘把三次握手、滑动窗口、拥塞控制的整个过程用纸笔推演一遍再对着抓包软件验证一次。这个阶段不做题只做梳理但效果比刷三遍题还好。传输层这一章学完你会发现整个计算机网络课程的主干已经打通了。后面无论学应用层还是网络安全很多概念都能在这一章找到根。别急着往前赶把这里的基础打牢后面写网络编程、调接口超时、分析抓包结果的时候你会受益很多。如果复习过程中卡在某个状态迁移或窗口计算上欢迎评论区一起讨论我尽量用我踩过的坑给你解释清楚。
返回列表