☰
北邮研究生高级计算机网络课件:TCP拥塞控制、BGP与SDN实践指南
2026/9/29 4:28:29 网站建设 项目流程

简介:北邮研究生课程《高级计算机网络技术》的配套PPT课件,定位为计算机网络概论部分的精讲讲义,适合研究生、网络方向初学者以及备考高校网络课程的人群使用。资源共1个文件,格式为pptx,共72页,压缩包仅762KB,单文件便于携带和课堂展示。目前已有231人学习浏览,是较为实用的课程辅助材料。课件系统梳理了计算机网络从实验性网络、局域网兴起到ISO开放系统互连、Internet时代的四个发展阶段,并围绕因特网从ARPANET到三级结构再到多层次ISP的演进过程展开,还介绍了Internet2与NGI计划、ISOC/IANA/IETF等管理组织以及因特网标准的四个制定阶段。后续内容延伸到网络定义、分类、性能指标和体系结构等核心概念,配有网络互联示意图与阶段划分图示,可帮助读者快速建立计算机网络知识框架,也为进一步学习网络层、传输层和网络安全打下基础。

1. 北邮研究生课程高级计算机网络技术PPT课件:先搞清楚这份课件值不值得啃

拿到一份《北邮研究生课程高级计算机网络技术PPT课件.pptx》,如果只按本科期末复习的习惯从头翻到尾,这份材料对你几乎没有任何额外价值。这门课从TCP拥塞控制开始就推翻本科教材的简化结论,讲BGP时把路由选路当成AS之间的经济博弈,到SDN章节再谈控制面与数据面分离,每一页PPT都在追问同一个问题:这个协议为什么被设计成现在这样。它适合三类人:准备考研复试的研究生、工作几年想回炉补网络底子的从业者,以及期末前把课件当索引用的在读学生。后面我把这套课件的使用方式拆成三个深水区、一套最小实验和四个避坑点,你对照着再过一遍PPT,价值会比刷两遍历年题高得多。

2. 课件里最容易拉开差距的三个深水区:TCP拥塞控制、BGP路由策略、SDN数据面

本科《计算机网络》和研究生《高级计算机网络》的区别,不在多讲了几个协议,而在把协议背后的权衡讲透。课件如果按章节流水账看,很容易被带过去,但真正拉开差距的是下面三块:拥塞控制从记忆状态机变成推导控制律,BGP从背诵选路顺序变成理解AS间博弈,SDN从听说过OpenFlow变成能说清南向接口发生了什么。这三块也是复试和期末主观题最爱出题的地方。

2.1 TCP拥塞控制:从Reno到BBR,为什么研究生课上要重新推导

本科阶段看谢希仁的教材,拥塞控制收敛成一句话:慢启动、拥塞避免、快重传、快恢复,四个状态背下来就能应付考试。但研究生课件不会满足于状态机,它会给出一张图:一条TCP流在丢包率0.1%、RTT 50ms的链路上,吞吐量到底是多少。这时候你会发现本科背的结论完全不够用,教材可以为了教学把系统简化成“发生拥塞就减半”,但真实网络里,窗口减半的时机、减半的幅度、恢复的节奏都直接影响链路利用率和公平性。

课件里通常会推导经典TCP吞吐量公式,这个公式虽然不再精确描述现代算法,但作为数量级估算依然实用:

import math def tcp_throughput(mss_bytes, rtt_sec, loss_rate): # 经典公式 T = 1.2 * MSS / (RTT * sqrt(loss_rate)) # 输入MSS按字节,RTT按秒,loss_rate是丢包概率 return 1.2 * mss_bytes / (rtt_sec * math.sqrt(loss_rate)) # 以太网典型MSS为1460字节,RTT取50ms,丢包率0.1% throughput_bps = tcp_throughput(1460, 0.05, 0.001) print(f"理论吞吐量约 {throughput_bps * 8 / 1e6:.2f} Mbps")

这段代码里,MSS是最大报文段长度,链路MTU为1500时减去IP头20字节和TCP头20字节就是1460;RTT是往返时延,丢包率要按小数传,0.1%写成0.001而不是1。课件用它说明一个反直觉结论:哪怕只有0.1%的丢包,一条50ms延迟的TCP流也跑不满百兆链路。正是这个缺陷催生了CUBIC和BBR。复习时别满足于记住“收到三个重复ACK就快重传”,要能答出阈值为什么设成3、AIMD为什么是加性增乘性减、BBR为什么在深队列下延迟表现更好。

算法对比是课件图表重灾区,建议自己列一张表加深理解:

算法核心思想关键参数典型场景
RenoAIMD线性探测cwnd减半低带宽时延积,丢包即拥塞
CUBIC三次函数凹增长最后窗口Wmax高带宽长链路,Linux默认
BBR基于瓶颈带宽和RTT建模pacing rate高丢包、深队列链路

2.2 BGP选路:不是背路由表,而是理解AS间博弈

本科网络课对BGP的要求通常是能说出EBGP和IBGP的区别,知道AS Path是选路依据。课件里BGP这部分会往前走一大步,直接问:互联网上两个AS都不愿意绕路给别家免费转发流量,这种“自私”行为如何体现在BGP属性里?答案就是LocalPref、AS Path、MED这几个属性。选路顺序在课件里被反复强调:先比本地优先级,再比AS Path长度,然后Origin、MED,最后才是内部IGP代价到下一跳的距离。

这个顺序背下来不难,但很多人栽在细节上。我做复试模拟时发现,考生普遍说不清LocalPref默认值是100、范围是0到232−1,也不知道MED只在本AS向邻居宣告时才有意义。用思科配置举例,调优BGP路径选择就这几行:

router bgp 65001 bgp default local-preference 200 neighbor 192.168.1.1 route-map SET_MED in route-map SET_MED permit 10 set metric 100

这段配置里,bgp default local-preference把本AS所有BGP路由的本地优先级改为200,接收来自192.168.1.1的路由时通过route-map把MED设为100。选路时LocalPref越大越优先,MED越小越优先。这里的坑是:LocalPref只在同一个AS内传播,不会出现在BGP对外宣告的路径属性里;MED则会随路由通告给邻居AS,但邻居是否采纳取决于它的策略。考试题经常把这两个属性混在一起问“对外通告哪些属性”,答不上来就翻车。

课件想让学生建立的核心认知是:BGP不是最短路径协议,而是策略协议。AS可以为了商业关系故意把某条路径的LocalPref调低,实现主备切换或流量分流。能说出这一点,复试里关于“为什么BGP不采用类似OSPF的SPF算法”这类问题的答案就通了:AS之间没有统一的度量标准,谁都不愿把选路权交给一个全网公用的公式。

2.3 SDN南向接口与数据面:OpenFlow与可编程交换机

SDN章节在课件里占了不小篇幅,但很多读者看到“控制面与数据面分离”就以为听懂了。真正的分水岭在OpenFlow协议的消息细节上。课件会展示一条流表从控制器下发到交换机的全过程:交换机收到未匹配的报文,通过PacketIn消息上报控制器;控制器计算转发路径,回复FlowMod消息;交换机把规则装进流表,后续同流报文直接按规则转发。这一个闭环,就是南向接口的核心。

如果只看原理不看实现,很容易忘记流表下发还需要指定匹配域和优先级。用OVS实际下发一条流表规则会更直观:

# 创建OVS网桥并添加一条流表:目的网段10.10.0.0/16的报文从2号口转发 ovs-vsctl add-br br0 ovs-ofctl add-flow br0 "priority=100,ip,nw_dst=10.10.0.0/16,actions=output:2"

priority参数决定多条规则同时命中时谁生效,数值越大越优先;nw_dst是IP目的匹配域;actions除了output还支持drop、set_field、push_vlan等动作。课件里关于SDN的图表,最关键的其实是理解“控制器挂了,流表还在不在”这个问题——OpenFlow流表默认带idle_timeout,但不主动清除规则,所以数据面仍然能继续转发已有流,只是新流无法建立。这个细节能区分一个本科式理解和一个研究生式理解。

数据中心网络部分,SDN常和VXLAN一起出现。VXLAN把二层以太网帧封装在UDP里,外层端口4789,解决数据中心里租户隔离和跨物理机二层互通的问题。协议本身不复杂,但配合SDN控制器做自动化网络隔离,这套组合才真正体现研究生课件的深度。复习时能画出让“控制器统一下发VXLAN隧道”的流程图,比背十个概念都管用。

3. 把课件用起来:用最小实验复现TCP拥塞控制与SDN转发逻辑

课件里最难啃的是实验曲线图,与其把图背下来,不如亲手跑一遍。我一般会用一台普通笔记本完成下面三个实验,不需要服务器,也不需要买设备。实验环境建议Ubuntu 22.04以上,内核5.15或更新版本;如果用Windows,WSL2对网络命名空间支持不完整,建议直接装虚拟机。三个实验分别对应课件里难懂的三类内容:多节点网络环境、拥塞控制动态过程、SDN转发逻辑。

3.1 用Linux网络命名空间搭建多节点实验环境

课程实验最麻烦的就是搭环境。建两台虚拟机太笨重,用Docker又多了层NAT,干扰网络观测。最常见也最干净的做法是用Linux网络命名空间加veth对,在主机里模拟两台主机和一台交换机的三层结构。网络命名空间有独立网卡、路由表和协议栈,却只占几MB内存,是复现课件场景最轻量的工具。

#!/bin/bash # 实验拓扑:h1 -- veth -- 网桥br0 -- veth -- h2 # 模拟课件里的两主机经交换机通信的场景 ip netns add h1 ip netns add h2 ip link add br0 type bridge ip link add veth-h1 type veth peer name veth-h1-br ip link add veth-h2 type veth peer name veth-h2-br ip link set veth-h1 netns h1 ip link set veth-h2 netns h2 ip link set veth-h1-br master br0 ip link set veth-h2-br master br0 ip link set br0 up ip link set veth-h1-br up ip link set veth-h2-br up ip netns exec h1 ip link set lo up ip netns exec h2 ip link set lo up ip netns exec h1 ip link set veth-h1 up ip netns exec h2 ip link set veth-h2 up ip netns exec h1 ip addr add 192.168.10.1/24 dev veth-h1 ip netns exec h2 ip addr add 192.168.10.2/24 dev veth-h2 ip netns exec h2 ping -c 3 192.168.10.1

这段脚本里,ip netns add创建两个独立网络栈;veth是一对虚拟网线,一端放进命名空间,另一端挂到Linux网桥上,网桥充当二层交换机。关键的细节是:网桥本身不需要配IP,veth对两端的名字长度不能超过15个字符,否则内核会拒绝创建。脚本最后一步用ping验证h2到h1的连通性。这里不需要开启ip_forward,因为网桥走的是二层转发;如果以后扩展为路由器模式,才需要sysctl -w net.ipv4.ip_forward=1。

这套环境比mininet更透明,每个命令都能看清创建了什么对象。做完实验后清理也很重要,ip netns del h1和ip link del br0能回收所有资源,避免残留影响下一次实验。如果发现创建命名空间报Operation not permitted,说明内核没开CONFIG_NET_NS,或者当前用户在容器里没有权限。

3.2 用iperf3打流与netem注入丢包,观察snd_cwnd变化

课件里TCP拥塞控制那章最经典的一条曲线,是丢包发生后拥塞窗口从某个值乘性减半、然后线性爬坡的过程。Reno的这条曲线用人手画很容易画错,但用真实内核跑出来只需要三个工具:iperf3打流、tc命令注入损伤、ss命令读取内核TCP状态。

# 在h1里启动iperf3服务器,h2作为客户端压测20秒 ip netns exec h1 iperf3 -s -p 5201 & # 在另一个终端,进入h2命名空间查看TCP窗口信息 ip netns exec h2 watch -n 1 'ss -tni state established "( dport = :5201 )"'

iperf3的-s是服务端模式,-p指定端口,客户端用-c指定对端地址。watch每隔1秒刷新ss命令的输出。ss的-t显示TCP套接字,-n不做域名解析,-i显示内核TCP信息,其中snd_cwnd就是发送端拥塞窗口,单位是MSS段数而不是字节。要注意看客户端那一侧,因为数据发送方向是从h2到h1,只有h2的socket才有snd_cwnd值。如果窗口一直不变化,多半是链路质量太好,需要先注入网络损伤。

# 在h2的接收侧挂netem,模拟50ms延迟加5%丢包 tc qdisc add dev veth-h2-br root netem delay 50ms loss 5%

tc qdisc是Linux流量控制的核心命令,netem是内核自带的网络损伤模块。这里把qdisc挂在veth-h2-br的出口,影响的是发往h2方向的流量;如果希望双向都受损,要在两条veth的br侧都加。netem的delay指定固定时延,loss指定丢包概率,还可以用distribution normal让延迟呈正态分布,更接近真实网络。执行后再看ss输出,会发现snd_cwnd周期性下跌然后爬升,这就是把课件里的Reno曲线复现出来了。

如果还想看不同拥塞控制算法的差异,Linux内核自带CUBIC和BBR模块,直接切换即可:

ip netns exec h2 sysctl -w net.ipv4.tcp_congestion_control=bbr

sysctl的-w参数表示临时修改内核参数,重启后失效。切到BBR后,同样加netem丢包,拥塞窗口不再像Reno那样剧烈锯齿,而是维持一个相对平稳的水平。这个对比实验写进课程报告,比抄教材上的图有说服力得多。注意一点:系统默认算法是CUBIC,切换回CUBIC用cubic参数。

3.3 用Ryu控制器复现学习交换机行为

SDN实验最常遇到的场面是:代码写完跑不起来,跑起来又不通,通了又不知道是控制器在转发还是OVS自带的传统转发。要彻底看穿这个黑匣子,最省事的方式是用Ryu控制器加Mininet,让OVS交换机退化成一个纯数据面设备,所有转发决策全部由控制器下发。

# 先启动Ryu应用,再启动Mininet,让控制器接管OVS交换机 ryu-manager learning_switch.py --observe-links & sleep 2 mn --topo single,3 --controller remote --mac --switch ovsk --protocols OpenFlow13

mn参数里,--topo single,3表示一个交换机连三台主机,--controller remote让Mininet去连外部控制器,--mac把主机MAC设成有规律的00:00:00:00:00:01这种格式方便排查,--protocols OpenFlow13强制使用OpenFlow 1.3版本。Ryu应用放在当前目录的learning_switch.py文件里:

from ryu.base import app_manager from ryu.controller import ofp_event from ryu.controller.handler import MAIN_DISPATCHER, set_ev_cls from ryu.ofproto import ofproto_v1_3 from ryu.lib.packet import packet, ethernet class LearningSwitch(app_manager.RyuApp): OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION] def __init__(self, *_args, **_kwargs): super().__init__(*_args, **_kwargs) self.mac_table = {} @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER) def packet_in_handler(self, ev): msg = ev.msg dp = msg.datapath ofp = dp.ofproto parser = dp.ofproto_parser pkt = packet.Packet(msg.data) eth = pkt.get_protocol(ethernet.ethernet) in_port = msg.match['in_port'] # 学习源MAC对应的入端口 self.mac_table.setdefault(dp.id, {}) self.mac_table[dp.id][eth.src] = in_port # 查表决定转发端口,未知则泛洪 out_port = self.mac_table[dp.id].get(eth.dst, ofp.OFPP_FLOOD) actions = [parser.OFPActionOutput(out_port)] out = parser.OFPPacketOut( datapath=dp, buffer_id=msg.buffer_id, in_port=in_port, actions=actions) dp.send_msg(out) # 已知目的端口时下发流表,避免后续重复上报控制器 if out_port != ofp.OFPP_FLOOD: match = parser.OFPMatch(in_port=in_port, eth_dst=eth.dst) mod = parser.OFPFlowMod( datapath=dp, priority=10, match=match, instructions=[parser.OFPInstructionActions( ofp.OFPIT_APPLY_ACTIONS, actions)]) dp.send_msg(mod)

这段代码只有几十行,逻辑就是课件里描述的学习交换机。OFP_VERSIONS声明这个应用只支持OpenFlow 1.3;MAIN_DISPATCHER表示只在交换机连接完成后的正常状态下处理PacketIn事件。控制器收到未知报文后,先学习源MAC和入端口的映射,目的MAC没学到就泛洪,学到就下发一条FlowMod规则。参数里priority=10要高于默认的0优先级,否则流表不会生效。

在Mininet里执行h1 ping h2,第一次ping会看到Ryu日志刷出PacketIn事件,之后的数据包全部走OVS流表,不再经过控制器。用ovs-ofctl dump-flows s1查看,能看到控制器下发的规则。这个验证过程把课件里“控制面与数据面分离”的图还原成了实际可见的流表项,比单纯看PPT牢靠得多。

4. 高级计算机网络避坑指南:课程报告、实验代码与考试复习的四个坑

课件本身讲得再细,落地时该翻的车一个都不会少。以下四个坑是我反复踩过、也在帮别人排错时见过最多的,按“现象到原因再到解决”写清楚,能帮你省下至少一个通宵。

4.1 带宽与吞吐量的单位陷阱:Mbps和MB/s总是对不上

现象:实验报告里,链路带宽标的是10Gbps,iperf3结果里显示9.24Gbits/sec,同学却算出来链路利用率只有0.9%,后面怎么调参数都对不上。

原因:把Gbits/sec和GBytes/sec混用了,或者把Mbps当成MB/s直接除。iperf3默认用Mbits/sec输出,也就是兆比特每秒,而课件图表出于可读性经常用MB/s,也就是兆字节每秒。两者差8倍,再加上TCP头、IP头开销,算出来的利用率必然离谱。

解决:写报告前统一单位,全部换算成bps。带宽计算式:1Byte等于8bit,1MB/s等于8Mbps。链路利用率用实际吞吐量除以链路容量,都要用同一单位。一个更隐蔽的坑是,iperf3的吞吐量包含TCP载荷,不包含报文头,所以和物理链路速率相比必然偏低,这不是bug。建议执行时加-J参数输出JSON格式,里边的bits_per_second字段已经是规范单位,避免手写换算出错。

4.2 netem丢包后,Wireshark时间戳对不上

现象:用netem加了delay 50ms loss 5%,在主机上用Wireshark抓包,看到的RTT要么比50ms小很多,要么忽大忽小到几百毫秒,怀疑是控制变量没设对。

原因:tc qdisc只能挂在网络设备的出口方向,netem加入的延迟作用在报文发出之后;如果抓包点放在网桥入口或虚拟网卡入口,抓到的是延迟生效之前的报文。另外,现代网卡默认开启GRO和GSO,多个小包会被合并成大包交给抓包工具,时间戳记录的其实是合并后的时间,曲线自然对不上。

解决:抓包时用tcpdump加-tttt选项,记录精确时间戳;同时关闭设备的offload特性,执行ethtool -K veth-h1-br gro off gso off。如果只是观察拥塞窗口变化,更推荐直接读内核TCP_INFO,也就是ss -ti的输出,而不是用抓包算RTT,因为ss取到的是内核协议栈内真实的平滑RTT。课程报告里最好注明观测点,观测点不统一是数据对不上最常见的原因。

4.3 SDN控制器“黑匣子”:OpenFlow版本与fail-mode导致流量不通

现象:Ryu代码看着没问题,Mininet里三台主机也启动了,h1 ping h2第一个包能通,后面的包全部丢掉,ovs-ofctl dump-flows里看不到任何流表。

原因:两个细节叠加。一是OVS默认可能协商到OpenFlow 1.0,而Ryu应用只声明支持1.3,版本协商失败后规则下发不了;二是OVS交换机在连接不上控制器时,如果fail-mode是standalone,会退化成普通二层交换机自行转发,一旦控制器连上又切回secure模式,行为切换导致第一个包通、后续包丢。

解决:启动Mininet时固定协议版本,显式加上--protocols OpenFlow13;同时对交换机设置secure模式,让控制器断连时不再自转:

ovs-vsctl set bridge s1 protocols=OpenFlow13 ovs-vsctl set bridge s1 fail_mode=secure

ovs-vsctl的set命令直接修改数据库配置,protocols指定网桥支持的OpenFlow版本,fail_mode决定控制器失联时的行为。secure模式下没有流表直接丢弃报文,反而更容易排查。做完这两步再ping,Ryu日志里能看到PacketIn和FlowMod消息,这才是SDN在正常工作,而不是OpenFlow协议在碰运气。

4.4 PPT课件打开乱码、公式变形、字体缺失

现象:下载的《北邮研究生课程高级计算机网络技术PPT课件.pptx》用WPS打开,公式变成小方框,图片位置错乱,转成PDF后字体全部变成宋体,数学符号走样。

原因:课件基本用PowerPoint编写,公式采用OMML格式,WPS的公式渲染支持不完整;部分专业字体比如Cambria Math在非Office环境不预装,系统自动替换时版面就乱了。

解决:在装有Microsoft Office的Windows机器上打开,再用“另存为PDF”导出最安全。如果只是拿来做考前速览,可以用python-pptx把每页的文字提纲抽出来:

python3 -m pip install python-pptx
from pptx import Presentation prs = Presentation('北邮研究生课程高级计算机网络技术PPT课件.pptx') for i, slide in enumerate(prs.slides, 1): texts = [] for shape in slide.shapes: if hasattr(shape, "text") and shape.text: texts.append(shape.text.replace("\n", " ")) print(f"[{i:03d}] " + " | ".join(texts[:5]))

python-pptx读取每页幻灯片中所有文本框和图形里的文字,按页打印,前5段文本足以作为速查目录。它不解析公式对象与内嵌图片,所以适合建立复习框架,不适合替代精读。还有一个文件层面的坑:有的文件扩展名是.pptx,实际却是旧版二进制格式,用file命令确认一下,输出如果是“Composite Document File V2”说明文件本身不是真pptx,要先用Office转换器转格式,而不是纠结打开软件。期末复习怕课件乱码,提前导出PDF再批注,是最省心的方案。

5. 进阶:把计算机网络八股变成自己的研究方向

5.1 从课件提取研究方向:找“设计权衡”和“未解决的点”

很多人读完这套课件只会说“我学过SDN和拥塞控制”,这等于没学。我一般会做一件事:把课件里所有对比图、曲线图单独挑出来,在每张图旁边标注三个问题——它证明了什么,用了什么参数,还有哪个场景没覆盖。比如CUBIC为什么在高带宽高延迟链路上用凹函数增长,而不是像Reno那样线性爬升;BGP的AS Path选路会不会被上游AS恶意宣告短路径影响;FlowMod下发时延在流表项上百万之后怎么优化。这些“为什么”和“还差什么”就是现成的技术方向。

拿这些方向去面试或写小论文,比说“我熟悉网络协议”具体得多。下面的表是我从课件里抽出来的入门方向,每个方向都能在一台笔记本上复现:

研究方向课件对应章节最小复现实验
TCP多流公平性拥塞控制iperf3开两条流,统计吞吐分配比
BBR收敛行为拥塞控制动态改tbf限速,观察snd_cwnd
BGP策略博弈域间路由用FRRouting搭两个AS,调LocalPref
SDN控制面瓶颈南向接口用Ryu批量下发流表,测首包时延
VXLAN多租户隔离数据中心网络Mininet加OVS,封装VXLAN隧道

5.2 验证课件结论的习惯:复现图表而非背书

我建议至少复现课件里一条曲线,而不只是看。常见做法是在h1和h2之间的网桥侧加一个tbf限速命令:

tc qdisc add dev veth-h1-br root tbf rate 10mbit burst 32kbit limit 3000

tbf是令牌桶过滤,rate限制平均速率,burst控制瞬间突发大小,limit限制队列长度。加完限速后,用iperf3打流,同时把ss -ti的输出追加到文件:

ip netns exec h2 ss -tin > cwnd.txt

得到数据后用awk提取snd_cwnd列,交给matplotlib或gnuplot画图。用一到两个晚上把Reno和BBR在同样限速条件下的窗口曲线并排画出来,课件里那些结论就不再是图形,而是你亲手跑出来的证据。我自己拿到任何一门新课件,都习惯先翻图再翻文字,先把图讲出理由再看答案,后来做网络实验也一直用这个习惯。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询