> # ♻️ 资源
> **大小:** 7.44MB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010206**](https://www.yuque.com/sxbn/ks/100010206)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87347704**](https://download.csdn.net/download/s1t16/87347704)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 实现可靠传输
## 1. 结合代码和 LOG 文件分析针对每个项目举例说明解决效果。
### RDT1.0
**对应 Log 日志:Log 1.0.txt,接收文件 recvData 1.0.txt**
RDT1.0 版本是在可靠信道上进行可靠的数据传输,因此没有过多的内容需要说明,发送方 Log 日志如下:
![c7326e62079c13e1de6e6670a98cfc15.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1705543401475-ce2200a0-2cff-459e-845e-259d11a16e19.png#averageHue=%23f2efed&clientId=u4a0f1024-8d6b-4&from=paste&height=53&id=ud0379a5a&originHeight=66&originWidth=823&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=6372&status=done&style=none&taskId=ud6987dfa-0b93-4fa3-a0e0-74c1a72cbae&title=&width=658.4)
接收方 Log 日志如下:
![eca96579ddc539f790c423189b0c1f75.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1705543415661-117391a2-4819-4b23-9e19-0b46a20e5399.png#averageHue=%23f7f5f3&clientId=u4a0f1024-8d6b-4&from=paste&height=34&id=uc46bc5bb&originHeight=42&originWidth=755&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=2111&status=done&style=none&taskId=ua3c4f7e1-39c6-47c0-84a0-b7d66f5a303&title=&width=604)
从发送方和接收方的发送数据报的数量我们就可以看出信道是没有出任何错的,双方也正常完成了全部内容传输
### RDT2.0
**对应 Log 日志:Log 2.0.txt,接收文件 recvData 2.0.txt**
RDT2.0 版本是在可能出现位错的信道上进行传输,只需要在 1.0 的基础上做出如下几点更改即可:
① 添加校验和 Checksum 的计算,代码如下:
```java
package com.ouc.tcp.test;
import com.ouc.tcp.message.TCP_HEADER;
import com.ouc.tcp.message.TCP_PACKET;
public class CheckSum {
/*计算TCP报文段校验和:只需校验TCP首部中的seq、ack和sum,以及TCP数据字段*/
public static short computeChkSum(TCP_PACKET tcpPack) {
//计算校验和
int checkSum = 0;
TCP_HEADER header = tcpPack.getTcpH();
int[] data = tcpPack.getTcpS().getData();
int length = data.length;
int[] header_info = new int[3];
header_info[0] = header.getTh_ack(); //seq
header_info[1] = header.getTh_seq(); //ack
//header_info[2] = header.getTh_sum(); //sum
//这里不代入sum进行计算是为了少更改Receiver的已有代码
int maxValue = 0xffff;
int modulus = 65536;
for(int i = 0; i < 2; i++) {
if(checkSum > maxValue) {
checkSum = checkSum % modulus + checkSum / modulus;
}
checkSum = checkSum + header_info[i];
}
for(int i = 0; i < length; i++) {
if(checkSum > maxValue) {
checkSum = checkSum % modulus + checkSum / modulus;
}
checkSum = checkSum + data[i];
}
if(checkSum > maxValue) {
checkSum = checkSum % modulus + checkSum / modulus;
}
checkSum = ~checkSum;
//System.out.println("checksum=" + checkSum);
return (short) checkSum;
}
}
```
这里我的校验和的计算方式是仿照了 UDP 的校验和计算方式,但是老师提供的代码中的 Receiver 类中的校验和的判断是这么写的:
```java
if(CheckSum.computeChkSum(recvPack) == recvPack.getTcpH().getTh_sum())
```
如果严格按照 UDP 计算校验和的方法,上述 if 语句的左边就会计算出来 0,而 if 语句的右边给出的值应该不是 0,那么这个 if 语句就不成立了,而应该改为:
```java
if(CheckSum.computeChkSum(recvPack) == 0)
```
为了少更改 Receiver 类中的已有代码,这里我在计算校验和的时候没有把 sum 代入进来,只计算了 seq,ack,以及 TCP 数据字段
② 在 Sender 的 recv 函数中加入对于 ACK 包的 ack 字段的检测:如果检测到 NACK,重发,代码如下:
```java
if(recvPack.getTcpH().getTh_ack() == -1) { //2.0版本检测NACK
udt_send(tcpPack);
return;
}
```
③ 调整 Receiver 的代码,在检测到 corrupt 之后返回 NACK,代码如下:
```java
if(CheckSum.computeChkSum(recvPack) == recvPack.getTcpH().getTh_sum()) {
//校验通过,这里代码省略了
} else {
//校验未通过
System.out.println("Recieve Computed: "+CheckSum.computeChkSum(recvPack));
System.out.println("Recieved Packet"+recvPack.getTcpH().getTh_sum());
System.out.println("Problem: Packet Number: "+recvPack.getTcpH().getTh_seq()+" + InnerSeq: "+sequence);
tcpH.setTh_ack(-1);
ackPack = new TCP_PACKET(tcpH, tcpS, recvPack.getSourceAddr());
tcpH.setTh_sum(CheckSum.computeChkSum(ackPack));
}
```
运行程序,得到发送方 Log 日志如下:
![c146b37625ba0720d3afedcafb43a11f.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1705543448394-7d28a118-46dd-4fbb-bb82-b67922b27d3f.png#averageHue=%23eeebe8&clientId=u4a0f1024-8d6b-4&from=paste&height=42&id=u970f26c9&originHeight=53&originWidth=775&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=4897&status=done&style=none&taskId=u90e3a281-4b90-40d3-bfa9-5f96157d323&title=&width=620)
由于 2.0 版本的假设,我们可以知道只有发送方会出现错误,接收方不会出现错误,因此发送方的 eFlag 设置成 1,接受方的 eFlag 设置成 0
在上图中,我们可以看到,发送方共犯了 13 个错误,因此有 13 个包需要重发,共计 1013 个包,数字是对的
在发送方的日志中我们也可以实际地看到这种犯错误并重发来修正的过程,下面以 Log 日志中的两处作为例子:
![45cd06ebb7062ede3c78d4f8bd999af2.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1705543480474-1093c68e-1bcb-4096-9e20-76b083645cb7.png#averageHue=%23f1efed&clientId=u4a0f1024-8d6b-4&from=paste&height=49&id=ubdfaf11b&originHeight=61&originWidth=885&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=6236&status=done&style=none&taskId=u459e989d-e888-4326-97d3-a8720fba763&title=&width=708)![7e99367660d733db90c2818b260bc5f7.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1705543480496-47a7ddc4-ae6c-4a03-a928-1fea1e55ac2e.png#averageHue=%23efecea&clientId=u4a0f1024-8d6b-4&from=paste&height=49&id=u6d74988a&originHeight=61&originWidth=881&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=6634&status=done&style=none&taskId=ua2328d89-a58d-4bdf-887d-5537b952044&title=&width=704.8)
同时,我们可以去接收方查看一下接收方对应处的日志,来检查接收方的 ACK/NACK 机制是否正常运行了:
![e36d6249c29f4b2ffab5b508be680bd0.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1705543501167-45f91bde-9892-443d-b3f5-d04c16b354b6.png#averageHue=%23efece9&clientId=u4a0f1024-8d6b-4&from=paste&height=77&id=ua7191b84&originHeight=96&originWidth=623&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8662&status=done&style=none&taskId=u9324c288-6aeb-45d7-b178-36979a9006e&title=&width=498.4)![ae10eb9bdacf9e98d186a1c2788cd186.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1705543501174-ea2301e1-b938-4a09-8a28-8f370496fd94.png#averageHue=%23f0ecea&clientId=u4a0f1024-8d6b-4&from=paste&height=62&id=u7406a559&originHeight=77&originWidth=629&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=6663&status=done&style=none&taskId=u83d49ed4-78e8-4fb4-8ba9-d3d4dc5ec50&title=&width=503.2)
可以看到,我们的接�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
详情介绍:https://www.yuque.com/sxbn/ks/100010206 计算机网络大作业报告,实现可靠传输。结合代码和LOG文件分析针对每个项目举例说明解决效果,总结完成大作业过程中已经解决的主要问题和自己采取的相应解决方法。
资源推荐
资源详情
资源评论
收起资源包目录
基于Java实现可靠传输【100010206】 (227个子文件)
Reno_SendWindow.class 5KB
TCP_Receiver.class 4KB
Taho_SendWindow.class 4KB
TCP_Sender.class 4KB
CycleQueue.class 3KB
SR_SendWindow.class 3KB
Reno_SendWindow$Taho_RetransmitTask.class 3KB
SR_ReceiveWindow.class 2KB
Taho_SendWindow$Taho_RetransmitTask.class 2KB
CheckSum.class 1KB
SR_SendWindow$RetransmitTask.class 863B
Window.class 859B
IQueue.class 533B
TestRun.class 508B
Taho_ReceiveWindow.class 411B
.classpath 356B
stylesheet.css 1KB
inherit.gif 57B
TCP_HEADER.html 32KB
WriteLogFile.html 22KB
ListenPacket.html 22KB
ListenACK.html 22KB
ForwardDelay.html 21KB
RunServer.html 21KB
TCP_PACKET.html 21KB
TCP_Sender_ADT.html 19KB
TCP_PACKET.html 16KB
TCP_SEGMENT.html 16KB
TCP_Receiver_ADT.html 14KB
TransLog.html 14KB
Client.html 14KB
index-11.html 13KB
UDT_RetransTask.html 13KB
index-5.html 13KB
Constant.html 13KB
Server.html 12KB
SYS_INI.html 12KB
UDT_Timer.html 12KB
SystemStart.html 11KB
MSG_STREAM.html 11KB
App_Sender.html 11KB
index-12.html 10KB
overview-tree.html 10KB
TCP_SEGMENT.html 10KB
TCP_HEADER.html 10KB
serialized-form.html 9KB
index-10.html 9KB
Client.html 9KB
index-2.html 9KB
package-use.html 8KB
help-doc.html 8KB
TransLog.html 8KB
package-tree.html 8KB
index-7.html 8KB
package-tree.html 7KB
package-summary.html 7KB
index-13.html 7KB
index-8.html 7KB
index-1.html 7KB
index-14.html 7KB
index-4.html 7KB
index-6.html 7KB
package-tree.html 7KB
package-summary.html 7KB
package-summary.html 6KB
package-use.html 6KB
package-tree.html 6KB
package-use.html 6KB
index-9.html 6KB
package-summary.html 6KB
package-summary.html 6KB
index-3.html 6KB
package-tree.html 6KB
overview-summary.html 6KB
TCP_Receiver_ADT.html 6KB
UDT_RetransTask.html 6KB
TCP_Sender_ADT.html 6KB
ListenPacket.html 6KB
ForwardDelay.html 6KB
WriteLogFile.html 6KB
MSG_STREAM.html 6KB
UDT_Timer.html 6KB
ListenACK.html 6KB
SystemStart.html 6KB
Constant.html 6KB
App_Sender.html 6KB
SYS_INI.html 6KB
RunServer.html 6KB
Server.html 6KB
package-use.html 5KB
package-use.html 5KB
constant-values.html 5KB
deprecated-list.html 5KB
allclasses-frame.html 3KB
allclasses-noframe.html 3KB
package-frame.html 1KB
overview-frame.html 1KB
index.html 1KB
package-frame.html 1KB
package-frame.html 1KB
共 227 条
- 1
- 2
- 3
资源评论
神仙别闹
- 粉丝: 2687
- 资源: 7642
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功