容器里启动 Mininet,两台主机经 bridge 互联:h1 跑 TCP 服务器,h2 发起连接,h1 用 tcpdump 抓包。每个场景独立脚本,配合 Makefile 直接运行:
- 正常三次握手,pcap:
captures/handshake.pcap - SYN 丢弃,pcap:
captures/handshake_syn_drop.pcap - 第三次 ACK 丢弃,pcap:
captures/handshake_ack_drop.pcap - 数据阶段定向丢包(握手正常后,丢服务器方向的已建立流量以观察重传),pcap:
captures/data_loss.pcap
- 能运行特权容器的 Docker(Mininet/OVS 需要)。
# 构建镜像
make build
# 运行各场景(pcap 落在 captures/)
make normal
make syn-drop
make ack-drop
make data-loss # 握手后在客户端侧丢掉来自 server:5000 的数据,触发重传容器内流程:
run_demo.sh启动 OVS(若选择 OVS),清理旧的 Mininet 状态,然后根据SCENARIO选择脚本。- 各脚本创建两台主机(
10.0.0.1、10.0.0.2),在h1启动 TCP 服务器,从h2发起连接,并在h1上抓包。
- 直接进 shell:
docker run --rm -it --privileged -v "$(pwd)"/captures:/captures tcp-mininet-demo bash - 先启动 OVS、清理 Mininet 再进 shell:
docker run --rm -it --privileged -v "$(pwd)"/captures:/captures -e SHELL_MODE=1 tcp-mininet-demo- 在 shell 内可手动跑:
python3 /opt/demo/normal_demo.py等四个脚本,或使用mn做其他拓扑试验。
- 在 shell 内可手动跑:
- 宿主机内核需有
openvswitch模块,并在运行容器时挂载/lib/modules。 - 示例:
无法加载 openvswitch 时请保留默认
docker run --rm -it --privileged \ -v /lib/modules:/lib/modules:ro \ -v "$(pwd)"/captures:/captures \ -e SWITCH_MODE=ovs \ tcp-mininet-demoSWITCH_MODE=linuxbridge。
- 正常场景:
tcpdump -r captures/handshake.pcap可见 SYN/SYN-ACK/ACK 以及简短 payload。 - SYN 丢弃场景:
tcpdump -r captures/handshake_syn_drop.pcap可见多次 SYN 重传,无 SYN-ACK。 - ACK 丢弃场景:
tcpdump -r captures/handshake_ack_drop.pcap可见 SYN、SYN-ACK 及其重传,缺少最终 ACK;客户端侧虽认为已 connect,发送/接收会超时失败。 - 数据丢包场景:
tcpdump -r captures/data_loss.pcap可见握手正常,随后 server->client 方向的包被丢弃,服务器会持续重传直至超时。
Dockerfile:基于 Ubuntu 22.04 安装 Mininet、OVS、iptables、ethtool 等工具。run_demo.sh:启动 OVS(可选)并根据SCENARIO运行对应脚本。common.py:Mininet 拓扑、抓包等公共辅助。normal_demo.py/syn_drop_demo.py/ack_drop_demo.py/data_loss_demo.py:各场景逻辑。Makefile:构建与运行命令。