运输层考点地图:TCP/UDP可靠传输、拥塞控制与三次握手一次理清 计算机网络期末考试复习到第五章运输层很多同学就开始头大了。这一章的考点密度特别高端口、UDP/TCP、可靠传输、流量控制、拥塞控制、三次握手、四次挥手哪一个拎出来都能出题。不少学校把这章当成整门课的分水岭前面几章靠记忆还能撑住到这章概念一多、流程一长光靠死记硬背就顶不住了。我当年复习这章的时候前前后后看了三遍才把逻辑理顺。后来发现只要抓住一条主线——网络层只负责把数据送到主机运输层负责把数据送到进程并保证可靠整章内容都能串起来。这篇就把运输层的考点地图、记忆方法、计算套路全部整理出来不绕弯子直接给能用的东西。正在冲刺期末的本科生可以照着这份思路过一遍想系统搞懂TCP和UDP的自学者也能找到一条清晰的学习路径。1. 先看清第五章在整门课里的定位1.1 运输层是承上启下的中间层很多同学复习计算机网络习惯一章一章孤立地背背完第三章忘了第二章到第五章直接原地崩溃。我的建议是先看清楚这门课的叙事主线。物理层解决怎么传比特数据链路层解决怎么在一段链路上可靠传帧网络层解决怎么把分组从源主机送到目的主机也就是IP地址和路由选择那一套。但问题来了IP协议提供的是尽力而为的服务分组随时可能丢失、重复、乱序。可我们平时用浏览器、聊微信、收邮件需要的是一条看起来可靠的通信连接。这个可靠性的缺口谁来补就是运输层。运输层运行在主机上干两件核心的事一是通过端口号把数据交付给正确的应用进程这就是分用二是通过TCP协议实现端到端的可靠传输。记住一句话网络层负责主机到主机运输层负责进程到进程。这句话几乎是年年考的选择题也是理解整章的钥匙。1.2 第五章考试重点分布地图按高校期末的出题规律第五章的考点可以分成五块。我把它们整理成一张复习地图建议先按这张图自查哪一块心里没底就重点补哪块。考点板块核心内容常见题型基础概念端口号分类、复用与分用、UDP/TCP特点选择、判断报文格式UDP首部8字节、TCP首部20~60字节、六个标志位选择、填空可靠传输停止等待协议、连续ARQ、滑动窗口、流量控制简答、计算连接管理三次握手、四次挥手、状态变迁、TIME_WAIT简答、判断拥塞控制慢开始、拥塞避免、快重传、快恢复计算、画图从这五块可以看出第五章是全书少有的全题型覆盖章节。选择题考概念辨析简答题考流程叙述计算题考窗口和序号画图题考拥塞窗口变化曲线。后面每个部分我都会给出记忆方法和考场实操套路。2. 端口与复用分用别小看这几分2.1 端口号的分段规则端口号是运输层最基础的概念。它是16位的整数范围0到65535分为三段0到1023是熟知端口号也叫周知端口分配给最常用的应用层协议比如HTTP的80、HTTPS的4431024到49151是登记端口号给需要登记的应用使用避免冲突49152到65535是短暂端口号客户端进程临时使用通信一结束就回收。这里的易混淆点在于端口号是逻辑端口不是物理接口。平时我们说的网卡端口或者交换机上的插口那是物理层的东西。逻辑端口的作用是标识主机上的应用进程一个IP地址配上不同的端口号就能同时支撑多个应用同时通信。2.2 复用与分用用快递柜来理解复用与分用是运输层的两个基本动作。发送方这边多个应用进程的数据通过同一个运输层协议传送出去这叫复用接收方那边运输层根据端口号把收到的数据分别交付给对应的应用进程这叫分用。打个比方一栋楼里的快递柜。所有快递员把包裹投进同一个快递柜复用取件人凭取件码端口号到对应柜子里取出自己的包裹分用。取件码不对柜子就打不开对应到网络里就是端口不匹配数据无法交付。这个类比在简答题里特别管用能把抽象概念讲得清清楚楚。2.3 必背的常用端口号表考试爱考的端口号其实不多我整理成一张表基本就是全部的出题范围应用协议端口号传输层协议FTP 数据/控制20/21TCPTELNET23TCPSMTP25TCPDNS53UDP也支持TCPHTTP80TCPHTTPS443TCPDHCP67/68UDPTFTP69UDPSNMP161UDPRIP520UDP记忆技巧FTP是20/21一对儿DNS是53域名解析讲究快默认走UDPHTTP和HTTPS天天用浏览器都熟。考试如果出下列哪个协议使用了UDPDNS、TFTP、SNMP、DHCP、RIP都是常见答案而HTTP、FTP、SMTP一定是TCP这几个必须分清楚。3. UDP和TCP对比着记才不会被绕晕3.1 UDP的特点与报文格式UDP用户数据报协议的特点教材上写了四条我翻译成人话无连接。想发就发不需要先建立连接。就像发短信编辑好内容就发出去不用先打通电话再说话。尽最大努力交付。不保证不丢、不保证顺序。短信可能延迟也可能被运营商丢了一条但大部分情况下能到。面向报文。UDP一次交付一个完整的报文应用层给多少字节UDP就原封不动地封装成用户数据报发出去不拆分也不合并。所以报文太大IP层可能分片报文太小网络利用率低。没有拥塞控制。网络拥堵时UDP不会主动降速。这就是实时语音、视频通话这类应用喜欢UDP的原因——它们宁可丢一点也不愿等。UDP首部只有8个字节源端口占2字节目的端口占2字节长度占2字节检验和占2字节。长度字段是UDP用户数据报的总长度含8字节首部所以最小长度是8最大可以到65535。检验和字段可以填0表示不计算检验和这是IPv4下允许的。3.2 TCP的特点与报文格式TCP传输控制协议的特点同样可以拆成五条面向连接通信前必须建立连接通信后要释放点对点TCP连接只有两个端点不支持一对多广播可靠交付通过序号、确认、重传保证数据无差错、不丢失、不重复、按序到达全双工通信双方随时可以发数据需要各自的发送和接收缓存面向字节流TCP不关心应用层报文边界它把数据看成一串无结构的字节流按字节编号分块发送。这里要重点提醒面向字节流是高频判断题陷阱。UDP是面向报文TCP是面向字节流这两个一定不要搞混我见过太多人在这里丢分了。TCP首部最小20字节选项最多40字节所以最大60字节。核心字段必须记住源端口和目的端口各16位。序号seq32位本报文段数据第一个字节的序号。确认号ack32位期望收到对方下一个报文段第一个数据字节的序号。注意确认号只有在ACK标志位置1时才有效连接建立之后ACK通常总是1。数据偏移4位表示TCP首部长度单位是4字节。数据偏移为15说明首部是60字节。六个标志位URG紧急指针有效、ACK确认号有效、PSH尽快交付、RST重置连接、SYN同步建立连接、FIN终止释放连接。窗口16位接收方通告给发送方的我能收多少单位是字节这是流量控制的载体。检验和16位校验首部和数据。紧急指针16位配合URG使用。3.3 UDP与TCP终极对比表这张对比表建议抄下来贴在电脑前考前扫一眼比翻书快得多对比项UDPTCP连接状态无连接面向连接可靠性尽力而为不保证可靠交付传输单位用户数据报报文段数据视角面向报文面向字节流流量控制无有滑动窗口拥塞控制无有首部开销8字节20~60字节典型应用DNS、TFTP、实时音视频HTTP、FTP、SMTP考场速记UDP是四无产品——无连接、无可靠、无流量控制、无拥塞控制。TCP恰好全部相反该有的都有。4. 可靠传输原理从停等协议到滑动窗口4.1 停止等待协议最朴素的可靠传输停等协议的思想很朴素发送方发一个分组必须等接收方确认后才发下一个。如果超时没收到确认就重传。它解决了丢包和重复的问题但效率太低——一个往返时间只能发一个分组信道利用率极低。考试可能会问为什么不能只靠确认还要超时重传答案很简单确认本身也可能丢失。如果发送方发出数据后傻等而ACK在半路丢了接收方其实已经收到了数据发送方却不知道两边就会僵住。所以发送方必须设置一个超时计时器超时没等到确认就重传。这里还有一个经典问题重传的数据到了接收方手里接收方怎么知道它是新的还是重复的靠序号。这就是编号的意义所在。停等协议虽然效率低但它把可靠传输的三个基本要素讲清楚了检验和检测差错、序号解决重复、确认加超时重传解决丢失。4.2 连续ARQ与滑动窗口停等协议太慢所以有了连续ARQ协议也叫流水线传输发送方可以连续发送多个分组不必等每一个确认。接收方采用累计确认只确认最后一个按序到达的分组表示它和之前的所有分组都已正确收到。连续ARQ配合滑动窗口使用发送窗口的意义是发送方在不收到确认的情况下最多能发多少数据。窗口内的数据可以连续发送收到确认后窗口向前滑动。考试常考的坑是累计确认的缺点如果某个分组丢了即使后续分组都正确到达接收方也只能重复确认最后一个按序到达的分组发送方要等超时重传那个丢失的分组导致后续已到达的分组被缓存甚至丢弃。这就是回退N协议的思想。如果简答题考到这一块按连续ARQ 累计确认 超时重传 回退N的思路作答逻辑就完整了。4.3 流量控制与发送窗口的构成TCP的流量控制本质是让发送方的发送速率服从接收方的接收能力。具体实现是滑动窗口加窗口通告。接收方在TCP首部的窗口字段里写上自己当前能接收的字节数叫接收窗口rwnd发送方的发送窗口不能超过对方的rwnd。接收方还可以把窗口设为0强制发送方停下来。这里有个容易被忽略的点发送方的实际发送窗口由两个值共同决定一个是接收方通告的接收窗口rwnd另一个是发送方自己维护的拥塞窗口cwnd。发送窗口取两者的较小值。所以流量控制管的是对方能不能收拥塞控制管的是网络能不能扛两个概念各管各的但最终一起决定发送速率。再补充一个经典场景接收方通告窗口为0时发送方进入坚持状态。如果接收方后来想通告窗口变大了但这个通告报文丢了发送方不知道就会一直等两边形成死锁。解决办法是坚持定时器发送方周期性发送探测报文段逼接收方重新通告窗口。这个知识点在选择题里出现的频率不低。还有一个相关概念叫糊涂窗口综合症。接收方缓存几乎满了只腾出很少的空间却把这个小窗口通告给发送方发送方就发一个很小的报文段网络利用率极低。解决思路有两个层面接收方采用窗口通告策略等到窗口足够大再通告发送方采用Nagle算法积攒数据到一定量再发避免发送大量小报文。期末一般不深挖算法细节但知道小窗口导致低效率这个结论是必要的。注意流量控制是端到端的、基于接收能力的控制拥塞控制是全局性的、基于网络负载的控制。这两个概念期末必考一定要区分开简答题里经常要求对比它们。5. TCP连接管理三次握手与四次挥手5.1 三次握手全过程拆解三次握手是第五章的网红考点必须做到能默写。整个过程用序号表示客户端发送SYN1、seqx的报文段进入SYN_SENT状态。服务端回复SYN1、ACK1、seqy、ackx1的报文段进入SYN_RCVD状态。客户端发送ACK1、seqx1、acky1的报文段进入ESTABLISHED状态。服务端收到后也进入ESTABLISHED。三次握手的核心作用是双方确认自己的发送能力和接收能力都正常。第一次握手是客户端告诉服务端我要连你第二次是服务端告诉客户端我收到了你的请求我也可以发数据给你第三次是客户端告诉服务端我收到了你的确认。为什么不是两次假如只有两次握手服务端在第二次握手后就认为连接建立了但如果客户端第一个SYN在网络中滞留了很久客户端超时后重发SYN服务端收到重发的SYN再次回应客户端却认为这个回复是迟到的无效回复直接丢弃。此时服务端已经为一个假连接分配了资源只能傻等。三次握手可以防止这种历史连接请求突然到达造成的资源浪费。为什么不是四次因为三次已经足够第二次和第三次其实可以合并SYN和ACK标志位可以同时置1没必要多一次往返。还有一个高频考点前两次握手的报文段不能携带数据第三次握手的ACK报文段可以携带数据。因为SYN报文段要消耗一个序号而纯ACK报文段不消耗序号。FIN报文段即使不携带数据也要消耗一个序号这个细节后面四次挥手也会用到。5.2 四次挥手全过程拆解四次挥手是另一个必考流程主动关闭方发送FIN1、sequ的报文段进入FIN_WAIT_1状态。被动关闭方回复ACK1、seqv、acku1进入CLOSE_WAIT状态。主动方收到后进入FIN_WAIT_2状态。被动关闭方发送FIN1、ACK1、seqw、acku1进入LAST_ACK状态。主动关闭方回复ACK1、sequ1、ackw1进入TIME_WAIT状态。被动方收到后关闭连接主动方等待2MSL后关闭。为什么是四次而不是三次因为TCP是全双工的每个方向的关闭都需要单独的FIN和ACK。主动方发FIN只是表示我的数据发完了但被动方可能还有数据要发给主动方所以被动方的ACK和FIN必须分开发。这就是为什么挥手时第二次和第三次不能像握手那样合并。5.3 TIME_WAIT状态的深意主动关闭方在发送最后一个ACK后要等待2MSL才关闭。MSL是最长报文段寿命教材里写的是2分钟所以TIME_WAIT最长4分钟。为什么非要等这么久第一个原因保证最后一个ACK能到达对方。如果这个ACK丢了被动方会重发FIN主动方要是已经关闭就没法回应了。等待2MSL能确保即使ACK丢失也有足够时间收到重发的FIN并重新确认。第二个原因保证本次连接的所有报文段从网络中完全消散防止旧连接的数据残留在网络里被误认为是新连接的数据。判断题喜欢出TCP主动关闭方发送最后一个ACK后立即关闭连接这句话是错的要等2MSL。这个2不要记成1或0.5。5.4 状态变迁与速记口诀TCP连接共有11种状态CLOSED、LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、CLOSE_WAIT、LAST_ACK、TIME_WAIT、CLOSING。我自己的记忆方法是按角色分两条线客户端方向CLOSED到SYN_SENT到ESTABLISHED然后FIN_WAIT_1到FIN_WAIT_2到TIME_WAIT最后回到CLOSED。服务端方向CLOSED到LISTEN到SYN_RCVD到ESTABLISHED然后CLOSE_WAIT到LAST_ACK最后回到CLOSED。平时刷题时把每个报文段对应到状态变化反复推演几遍这两条线自然就记住了比死背状态名高效得多。这里列几个高频判断题考前务必过一遍TCP连接建立过程中服务端第二次握手可以携带数据错SYN报文段不携带数据。序号和确认号是同一个字段错序号是seq确认号是ack。四次挥手后主动方立即关闭连接错还要等待2MSL。6. 拥塞控制四个算法一条线串起来6.1 慢开始和拥塞避免拥塞控制解决的是发送数据太多太快路由器缓存溢出造成丢包进而触发大量重传让网络更堵甚至瘫痪。TCP的拥塞控制通过维护拥塞窗口cwnd来实现。慢开始算法的第一印象很有迷惑性它名字里带慢实际增长却快得惊人。cwnd初始为1个最大报文段MSS每收到一个对新报文段的确认cwnd就增加1个MSS。由于一个往返时间内收到的确认数量会翻倍实际效果是每个RTTcwnd翻倍也就是指数增长。慢开始的慢指的是起点低从小窗口试探网络而不是增长慢。慢开始门限ssthresh用来切换算法。当cwnd达到或超过ssthresh时改用拥塞避免算法。拥塞避免很简单每个RTTcwnd只增加1个MSS线性增长让窗口缓慢逼近网络容量。当发生超时说明网络确实堵了这时执行ssthresh cwnd/2cwnd 1重新进入慢开始。6.2 快重传和快恢复快重传解决的是丢了一个报文段但要等超时才能重传效率太低的问题。改进思路是接收方每收到一个失序报文段就立即发送重复的ACK发送方只要收到3个重复的ACK就立刻重传丢失的报文段不必等超时计时器到期。收到3个重复的ACK后执行快恢复而不是慢开始先把ssthresh设为cwnd的一半再把cwnd设为新的ssthresh然后执行拥塞避免线性增长。这里要和超时的情况严格区分超时代表网络严重拥塞直接回到慢开始从cwnd1重新来收到3个重复ACK大概率只是单个报文段丢失网络还能扛所以只减半再线性恢复。这两种情况的处理差异几乎年年出计算题。注意不同教材对快恢复后cwnd的初始值表述略有差异。有的写法是cwnd ssthresh 3×MSS理由是管道里还有3个重复确认对应的报文段已经送达。期末复习时务必以你教材的表述为准如果拿不准考前直接问任课老师确认。6.3 拥塞窗口计算题标准解法教材里经典的例题初始cwnd1ssthresh16写出cwnd随RTT的变化过程。标准步骤如下第1个RTTcwnd1发送1个MSS。第2个RTTcwnd2。第3个RTTcwnd4。第4个RTTcwnd8。第5个RTTcwnd16达到ssthresh。从第6个RTT起cwnd17、18、19线性增长。如果题目改成第5个RTT后发生超时那么ssthresh 16/2 8cwnd重置为1重新慢开始一直增长到8后才转线性增长。如果题目改成第5个RTT后收到3个重复ACK那么ssthresh 16/2 8cwnd直接设为8或按教材写成83然后线性增长。我强烈建议考场上画一张坐标图横轴是RTT次数纵轴是cwnd单位MSS指数段是不断上升的曲线线性段是平缓的斜线超时点是垂直回落到1的跳变快恢复是从减半位置开始线性上升。画图题在期末试卷里出现的概率很高而画图的过程本身就是梳理逻辑的过程比空想清楚得多。7. 超时重传与TCP四个定时器7.1 超时重传时间RTO的计算TCP发送方发出报文段后必须设置一个超时重传时间RTO。RTO太短会导致大量不必要的重传浪费带宽太长会导致丢包后长时间空等。教材给出的RTT平滑值计算方法是RTTs (1 - α) × 旧RTTs α × 新RTT样本其中α取1/8。再算偏差RTTd最后RTO RTTs 4 × RTTd。考试一般只要求会用公式。给你几个RTT样本先取第一个样本作为RTTs初值再按公式迭代算新的RTTs最后用RTO RTTs 4 × RTTd求结果。需要注意每次代入计算时α的取值、平滑公式的次序都不要写反。Karn算法是高频判断题如果报文段重传了那么收到的确认既不能用来更新RTTs也不能用来更新RTO必须把重传报文段的往返时间样本丢弃。原因很好理解重传后收到的ACK可能是对应第一次发送的报文段也可能是对应重传的报文段发送方无法区分用这样的样本计算反而会把RTO带偏。7.2 TCP的四个定时器TCP的定时器在选择题里出现的频率很高整理成表格直接背定时器作用高频考点重传定时器超时未收到ACK就重传超时后进入慢开始坚持定时器解决接收窗口为0时的死锁周期发送探测报文段保活定时器检测长时间空闲连接的对端是否存活默认2小时时间等待定时器主动关闭方TIME_WAIT计时等待2MSL坚持定时器的场景前面提过接收方通告窗口为0发送方等待。如果接收方的窗口已变大通告丢了发送方不知道就会一直等双方死锁。坚持定时器让发送方每隔一段时间发一个探测报文段逼接收方重新通告窗口。这四个定时器各管一摊考试喜欢把其中两个混在一起出题背清楚就好。8. 期末冲刺题型解法与易错点整理8.1 选择题高频陷阱清单按我刷题的经验下面这些说法几乎年年出现全部过一遍心里就有底了UDP可以提供可靠交付——错。TCP是面向报文的——错面向字节流。TCP首部最小长度为8字节——错最小20字节。UDP首部最小长度为20字节——错8字节。DNS使用的是TCP端口53——半对。DNS既用UDP也用TCP普通查询用UDP区域传送用TCP。选择题问默认传输层协议选UDP。HTTP使用UDP作为传输层协议——错TCP端口80。三次握手第二次握手中服务端可以携带数据——错SYN报文段不携带数据。TCP连接释放需要四次握手——对。拥塞控制在网络层实现——错运输层实现。端口号是用来标识主机地址的——错标识应用进程。这些选择题陷阱的核心就一条把UDP和TCP的特点、报文格式、流程细节记准确每个特例都想想为什么会这样而不是硬背结论。8.2 计算题套路总结第五章计算题基本逃不出四类每一类都有固定的解法第一类序号和确认号计算。给定握手或挥手过程的seq和ack推出下一个报文的序号。记规律SYN消耗1个序号FIN消耗1个序号纯ACK不消耗序号。第二类拥塞窗口变化。按6.3的流程画图填表关键区分超时和快重传两个分支的处理差异。第三类UDP长度与数据长度计算。UDP报文段的总长度含8字节首部减去8就是数据部分长度。题目给的长度字段是多少就用多少减8不会有坑。第四类滑动窗口与流量控制。给了接收窗口值和已发送未确认的字节数问还能发多少。基本公式是还能发送的字节数 接收窗口 - 已发送未确认的字节数。若题目同时给出拥塞窗口则取两者的较小值再减。做计算题一定要写单位。cwnd的单位是MSS还是字节窗口的单位是字节序号单位是字节这些在题目里都有约定看清再下笔能避免大量低级失误。8.3 简答题背诵清单高频简答题整理成背了就得分的口径考场直接按这个结构写条理清晰得分还高。Q1TCP和UDP的区别。 答按3.3的对比表展开。重点是无连接vs面向连接、可靠vs尽力而为、面向报文vs面向字节流再补一句UDP首部8字节、TCP首部20到60字节各举一个典型应用。Q2为什么TCP要三次握手 答防止失效的连接请求报文段突然到达服务端造成资源浪费。展开说若只有两次握手服务端在第二次握手后就认为连接建立但迟到的SYN可能让服务端为一个假连接分配资源三次握手能确认双方收发能力都正常。Q3流量控制和拥塞控制的区别。 答流量控制是端到端的控制发送速率不超过接收方的接收能力拥塞控制是全局的控制发送速率不超过网络能承载的负载。流量控制由接收方通过窗口字段通告实现拥塞控制由发送方维护cwnd实现两者共同决定发送窗口发送窗口取rwnd和cwnd的较小值。Q4叙述快重传和快恢复。 答接收方收到失序报文段立即发送重复ACK发送方收到3个重复ACK立即重传而不等超时随后执行快恢复ssthresh减半、cwnd设为新ssthresh、执行拥塞避免。Q5TIME_WAIT为什么等待2MSL 答两个理由保证最后一个ACK到达对端让本连接的所有报文段从网络中消散避免旧连接数据混入新连接。复习第五章我个人最有用的经验是先画图再背概念。三次握手、四次挥手、拥塞窗口演进全部在草稿纸上画一遍时序图和坐标图胜过死记硬背十遍。把图画熟了考场遇到状态变迁题、窗口计算题基本是下笔就有。另一个小技巧是把所有为什么是三次为什么是四次这类问题讲给自己听能不看笔记讲明白就说明真的理解了。最后再提醒一句运输层这章的题目坑点非常集中刷题时把每道错题的陷阱点记在小本子上考前翻一遍比再做十套卷子都管用。