LFTP,支持两台电脑之间通过互联网传输文件
- 基于UDP实现
- 100%可靠传输
- 流量控制
- 拥塞控制
- 支持多客户端同时传输
本程序的数据包基于UDP数据包,在UDP数据包传输数据部分封装了自己的数据包
| 源端口号 | 目的端口号 |
|---|---|
| 首部长度 | 校验和 |
| 数据 | |
| seq - 序列号 | ack - 确认号 | |
|---|---|---|
| rwnd - 接收方的接收窗口空闲大小 | FIN - 标志位 | timer - 发包时间 |
| infoLength - info的长度 | dataLength - data的长度 | totalByte - 发送方发送字节数目 |
| info -信息 | ||
| data - 数据 | ||
数据发送使用流水线协议,并且使用GBN协议,同时设定超时重传,当数据包在预设时间内没有收到回复,则重传数据包,保证可靠的数据传输
- GBN
| Sender | ![]() |
|---|---|
| Receiver | ![]() |
- 超时重传
- 创建一个额外的线程用于计时,记录第一个未被确认的数据包的发送时间
- 设定时间没有接收到回复,重新发送数据包
- 设定时间内接收到回复,重新计时
- 创建一个额外的线程用于计时,记录第一个未被确认的数据包的发送时间
对于每个连接,接收方设定一个固定大小的缓存,在返回确认信息的时候设置设置数据包的rwnd,通过此限制发送方的发送数据包的数量和速率,达到流量控制的效果
对于每个连接,发送方维护一个拥塞窗口,初始拥塞窗口cwnd的大小为1 * MSS,发送窗口小于cwnd和rwnd
在接收到ack的时候
- 正确的ack,增大拥塞窗口
cwnd小于等于ssthresh的时候,cwnd变为增加一倍cwnd大于ssthresh,cwnd加1
- 错误的ack,并且三个冗余,减小拥塞窗口
ssthresh变成之前的cwnd的一半cwnd调成sshresh + 3 * MSS
- 超时,减小拥塞窗口
ssthresh变成之前的cwnd的一半cwnd调成1 * MSS
服务器需要支持多个客户端同时连接,将客户端的 ip 信息作为该连接的唯一标识,存储数据包的时候按照数据包的信息划分存入到数据池中,当第一次连接的时候开启一个线程专门用来处理这个 ip 相关的数据包,不过这也有不好的地方,就是一个客户端不能够同时进行多个操作,只能等待当前操作完成后才能实现后续操作。每个线程依据创建时候所绑定的信息,处理相关的数据包,实现与客户端数据传输,当然共享数据需要使用锁进行保护,每一次只允许一个线程操作








