# NetLab_FLTP **Repository Path**: ltstriker/NetLab_FLTP ## Basic Information - **Project Name**: NetLab_FLTP - **Description**: 使用udp实现一个快速可靠的传输应用 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-10-30 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # NetLab_FLTP 项目介绍 [NetLab_FLTP 项目介绍](#netlab_fltp-项目介绍) - [需求](#需求) - [目录结构](#目录结构) - [编译运行](#编译运行) - [开发计划](#开发计划) - [难点:](#难点) - [阶段一](#阶段一) - [阶段二](#阶段二) - [阶段三](#阶段三) - [阶段四](#阶段四) - [解决方案](#解决方案) - [开发日志](#开发日志) [设计报告](doc/design_doc.md) [测试报告](doc/test_doc.md) ## 需求 - LFTP must include a client side program and a server side program; Client side program can not only send a large file to the server but also download a file from the server. > Sending file should use the following format: **LFTP lsend myserver mylargefile** Getting file should use the following format **LFTP lget myserver mylargefile** The parameter myserver can be a url address or an IP address. - LFTP should use UDP as the transport layer protocol. - LFTP must realize 100% reliability as TCP; - LFTP must implement flow control function similar as TCP; - LFTP must implement congestion control function similar as TCP; - LFTP server side must be able to support multiple clients at the same time; - LFTP should provide meaningful debug information when programs are executed. ## 目录结构 - Client|客户端 - Configure|公用资源 - Server|服务器端 --- ## 编译运行 目前都是在linux环境下运行。 使用各个端的bin目录下workbench.sh编译生成可执行文件在bin目录下。 先开启服务端,然后打开客户端即可即可 ***注*** 校园网下有失败的可能,有一些包莫名其妙的发不出去,未解之谜。换个网络就好,比如说换手机热点,或者别的。 --- ## 开发计划 开发语言: c/c++ --- ### 难点: 1. UDP接口使用 2. 服务端编写(多线程等) 3. 可靠:TCP的状态机实现 4. 流水线发送信息,窗口 5. 流控制, 速度调节,RcvWindow 6. 阻塞控制, 慢启动&阻塞避免,递增增加||系数减少 7. 握手, 交流信息,准备开始传输 8. 重传策略,选择重传,3次重复ack 9. 校验位,checksum(not need) 10. 定时器 11. 文件流,切分,拼装。 --- 暂定开发顺序: ### 阶段一 > 目标为完成1、7、9、11 1. 测试相关UDP接口。 × 2. 抽象出消息类型,握手&&数据,封装消息类,UDP接口类 × 3. 测试1、2内容,完成基本项目结构。 x 4. 找个时间完成文件IO类 × ### 阶段二 > 目标为完成3、8、10 4. 实现定时器,基本的重传 x 5. 状态机, 快速重传 x ### 阶段三 > 目标为完成4、5、6 6. 流水线发送消息,窗口 x 7. 流控制 x 8. 阻塞控制 x ### 阶段四 > 目标为完成服务端的多线程,可同时面对多个用户 9. 客户端面多多个用户,多线程 x ## 解决方案 1. UDP接口使用 - [极简风格](https://dotblogs.com.tw/changyinshung/2012/12/12/85600) - [一个看起来很详细的UDP接口介绍文档](https://www.cs.rutgers.edu/~pxk/417/notes/sockets/udp.html) - [UDP博客](https://blog.csdn.net/yaopeng_2005/article/details/6696105) - [不同平台的示例](https://www.cnblogs.com/lyggqm/p/9111010.html) 2. 服务端编写(多线程等) - [多进程soket服务端(目测可行)](https://blog.csdn.net/u011599639/article/details/71191889) 3. 可靠:TCP的状态机实现 - 无 4. 流水线发送信息,窗口 - 无,感觉看书可以搞 - 看起来搞个多线程就很好。(用个openmp感觉就足够了) 5. 流控制, 速度调节,RcvWindow - 无 6. 阻塞控制, 慢启动&阻塞避免,递增增加||系数减少 - 无 7. 握手, 交流信息,准备开始传输 > 1. 第一次是客户端到服务器,表示客户端请求同步连接(SYNbit=1, Seq=x) (服务器获取客户端的地址以及具体的请求并分出进程处理这次的请求) > 2. 第二次是服务器发到客户端请求确认同步(SYNbit=1, Seq=y ACKbit=1; ACKnum=x+1) (客户端得到回应,发送确认,并同时开始传输确认包,并附带第一份的数据。) > 3. 第三次是客户端发到服务端表明已同步(这次可以附带数据)(ACKbit=1, ACKnum=y+1) (服务端进入处理数据状态) 8. 重传策略,选择重传,3次重复ack - 无 9. 校验位,checksum **(not need)** (udp本身就有) - 无 10. 定时器 - [时间函数](http://www.runoob.com/cplusplus/cpp-date-time.html) **(not need)** - 使用网络层的相关接口即可以完成[socket C编程设置接收超时(Windows & Linux)](http://blog.sina.com.cn/s/blog_631e3f260101b3od.html) 11. 文件流,切分,拼装。(√) - 当前考虑是直接二进制读入,写出。 - [文件流操作](http://www.runoob.com/cplusplus/cpp-files-streams.html) - [一个解析博客](https://blog.csdn.net/kingstar158/article/details/6859379) - [c++ Reference](http://www.cplusplus.com/reference/fstream/fstream/) ---