DDL:December 15th
- 可靠传输、按序传输、流量控制、拥塞控制、公平(共享链路上获得大致相同的带宽)
- 这个PJ的主要任务是实现TCP滑窗处理
- 不同的TCP拥塞控制算法:Reno、New Reno、Cubic,,,
- 建立连接:握手、从连接中读和写数据(socket中有buffer,多次的读和写可能会组合在一个单一的包中,或者一次读和写可能会封装到多个包中)
- 一个例子:
- 有两个socket,A和B,A发送数据给B
- A会将数据存在buffer中,并且用buffer中的数据产生发送的packet,根据拥塞控制和流量控制产生尽可能多的packet
- 当socketB接收到packet,他将数据存放在buffer中(buffer用来帮助维护按序到达)
- B会向A发送一个ACK用来通知A我已经收到了
- B还追踪下一个应用程序需要的字节,一旦到达,转发尽可能多的字节到应用缓冲区(按序到达)
- 一旦包已经被B确认了,A会释放用来存储这些数据的内存
- 最后两方可以释放链接(4次握手)
- 实现之前理清思路,AB知道那些数据和信息;尽可能使用接口使代码模块化、高可用性
- 基本的TCP实现。,可靠传输,按序传递,流量控制
- 实现Reno拥塞控制算法
- 设计我们的CCA:一个数据中心或者地月通信
- cmu_tcp.h接口,其中可以加一些帮助函数,也可以更改四个核心函数(socket,close,read和write)的实现,client.c和server.c使用套接字发送信息,grade.h测试(包的长度和初始的窗口大小可能会变化)
- 对于每一个任务都需要提供违背确认的包的数量和时间的关系,gen_graph.h帮助画图,为了提供一个高质量的图,这个可能需要更改
- 目标:实现滑窗,基础是停等协议
- 分包、重组、window、重传
- 开始代码:
- cmu_packet.h:规定了头的基本格式,不可更改,脚本依赖于该头文件
- grading.h:测试变量,不要修改,测试时会修改
- server.c:服务器端
- client.c:客户端
- cmu_tcp.c:包括了socket相关的函数
- backend.c:模拟数据缓冲和发送
- gen_graph.py:接受一个pcap文件并且绘制出序列号随时间变化
- cmu_packet.h:所有底层的通信都是UDP的
- Course Number [4 bytes]
- Source Port [2 bytes]
- Destination Port [2 bytes]
- Sequence Number [4 bytes]
- Acknowledgement Number [4 bytes]
- Header Length [2 bytes]
- Packet Length [2 bytes]
- Flags [1 byte]
- Advertised Window [2 bytes]
- Extension length [2 bytes]
- Extension Data [You Decide]
- 所有的整数都要按照网络字节顺序传输(ntoh,hton)
- 所有的整数都必须是无符号的
- course number设置为15441
- 头文件中的域不可更改,除非第三步要扩展数据
- plen≤1400
- 可以用wireshark或者tcpdump检测头的正确性
- TCP握手:写在cmu中socket的构造函数和析构函数中
- 流量控制:
- RTT估计:用Jacobson/Karels算法或者Karns/Partridge算法实现RTO的估计
- 重复的ACK重传:快速重传机制
- 实现TCP Reno:正常情况下“加性增加”,丢包情况下“乘性减少”
- 快速恢复,TCP状态机如何进行拥塞控制
- 准备:理解TCP拥塞控制的状态机
- 加入cwnd保持应用的缓冲数据总数
- 慢启动和拥塞控制,类似TCP Tahoe
- 快速恢复:TCP Tahoe-->TCP Reno
- 设置带宽小于文件大小,增加丢包率,以查看
- grade.h测试:
- WINDOW INITIAL WINDOW SIZE: 初始化窗口大小,slow start,cwnd = WINDOW INITIAL WINDOW SIZE.
- WINDOW INITIAL SSTHRESH: 拥塞控制中ssthresh值,slow start,ssthresh = WINDOW INITIAL SSTHRESH.
- MAX LEN: 包括头在内的包的最大大小,固定值,不可更改
- MAX NETWORK BUFFER:buffer的最大大小,发送方:MAX NETWORK BUFFER 接收方:MAX NETWORK BUFFER
- 实现两个场景之一:
- 地月通信:丢包率30%,延时2.5s,最大带宽10megabit per second
- 数据中心:丢包率0.05%,延时0.1s,最大带宽5 gigabits per second
- 利用上面的Reno实现,传输一个20M的文件,多久完成?为什么没有在预期内完成?
- 提交:designdiscussion.pdf中提交在选定场景中的结果,至少两段描述什么原因使其没有那么好
- 设计一个CCA:比之前的实现至少快10%,使用TCP Cubic或者TCP BBR实现
- 提交:designdiscussion.pdf提供我们实现的代码的运行情况,回答以下问题:
- 描述我们的算法,可以复现,怎么工作的,状态机是什么?
- 我们的算法传输一个20M的文件需要多久?Reno呢?
- 什么导致速度不同?
- 我们的算法传输一个3M的文件需要多久?Reno呢?
- 解释什么优于原来的算法?
- 安装VirutalBox 和 Vagrant,Vagrantfile:在我的电脑上更改代码,或者VM上,Vagrant会自动同步
- server和client和私密的IP地址10.0.0.1和10.0.0.2相连,要保证即便是IP地址改变了,代码仍然能正常运行,这些地址的接口名是eth1
- 其他工具:文档中说明
- tcconfig安装在VM上允许控制网络特征,初始值是20ms的延时(RTT=40ms),100Mbps的双向带宽
$tcshow eth1显示参数- 模拟丢包、重新排序、错包
- pytest安装在VM上,test_cp1.py测试样例
- 我们用自己的测试
- 标准C的debug工具,gdb 和 Valgrind也要安装在VM上
- 传输一个100M的文件,抓包,画图,PDF提交图和pcap文件
- 使用utils中的工具:
- 启动TCP dump和server:
vagrant@server:/vagrant/project-1$ makevagrant@server:/vagrant/project-1$ utils/capture_packets.sh start submit.pcapvagrant@server:/vagrant/project-1$ ./server
- 启动client:
vagrant@client:/vagrant/project-1$ ./client - 传输完成,停止抓包:
vagrant@server:/vagrant/project-1$ utils/capture_packets.sh stop submit.pcap
- 启动TCP dump和server:
- Makefile: Make sure all the variables and paths are set correctly such that your program compiles in the hand-in directory. Running make test should run your testing code.
- All of your source code files and test files. (files ending in .c, .h, etc. only, no .o files and no executables)
- readme.txt: File containing a thorough description of your design and implementation. If you use any additional packet headers, please document them here.
- tests.txt: File containing documentation of your test cases and any known issues you have.
- submit.pcap: Your PCAP submission file from running the functionality code in server.c and client.c from the starter code (for a larger file transfer).
- graph.pdf: Your graph of the currently unacked packets in flight vs time computed from submit.pcap.
- design.pdf: Reflect the overall design of your project and show the function of each code module and interface.
- 代码
- 风格&文档
- balabala
- 梳理文档
- 分配任务