---
title: 【计网实验】lab6-传输层实验
date: 2025-12-14 00:03:50
tags: 学习经验
categories:
- [学习经验, 计网实验]
---
1. TCP基础实验
2. TCP滑动窗口机制和窗口探查机制分析
3. TCP慢启动、拥塞避免算法及拥塞处理实验
4. UDP实验
tips:TCP 实验约 **Linux** 系统,UDP 实验约 **winxp** 系统
## 0 Linux 相关 & mooc & 实验报告
### 0.1 Linux 相关
##### 1 Linux 用户名&密码
用户名:root
密码:network
##### 2 Linux 配 IP
以PCB为例,配置接收端IP地址:
1. 右键点击如图的网络连接图标,选择 `Edit Connection`;


2. 先查看是否有可用的配置好的ip地址,
如果没有,则点击add,如下图配置(选择 `IPv4 Settings`, `Method` 为 `Manual`, 点击 `Add`,输入 IP 地址、掩码、网管),点击apply,关闭编辑网络连接。
注意:配网关和子网掩码的之前或之后,要在旁边空白的地方点一下,看看是否配置成功了。或者配完敲一下回车。不要急于点确定。否则,容易出现配的网关等总是变成0.0.0.0

3. 鼠标左键点击网络连接图标,先点击 `disconnect` 断开网络连接,再用鼠标选择receiver eth0(你刚刚给那个 IP 的命名),出现下面界面即可。还可以 `ipconfig` 验证 ip 是否生效

##### 3 Linux配路由器或交换机
打开命令行窗口,输入minicom,敲回车,等待几秒钟即可

### 0.2 mooc


### 0.3 实验报告
本次实验报告共 11 题
1. TCP 基础实验:T1-T5
2. TCP 滑动窗口机制和窗口探查机制分析:T6-T7
3. TCP 慢启动、拥塞避免算法及拥塞处理实验:T8-T10
4. UDP 实验:T11
##### T1
根据2.6中步骤3回答:TCP的连接和建立采用的是:**三次握手**方式,PCA是**主动打开**,PCB是**被动打开**。先点击发送再点击接收,会出现什么问题?为什么?
**如果先点击发送再点击连接,则会失败,提示 IO错误。因为这类似于C/S模式,如果被动连接server没有启动,不接受连接,则主动连接的client不能连接上。必须先打开被动连接一方。**
##### T2 参考

发送方初始序号:209418378



##### T3
TCP连接建立时,其报文首部与其它TCP报文不同,有一个“Option”字段,它的作用是什么,值为多少?结合IEEE802.3协议规定的以太网最大帧长度分析此数据是怎样得出的。
**它的作用是给出最大报文段长度MSS,大小是发送方和接收方的MSS的较小值。这个值将在数据传输时被使用到,在本实验中,该值为1460字节。**
**IEEE802.3协议规定的以太网最大帧长度为1500字节,减去20字节的IP首部和20字节的TCP首部,结果即为1460字节。**
包含Option字段的报文见下:

##### T4 参考


##### T5 参考







##### T6
##### T7
##### T8 参考
###### (1)
ssthresh = 2147483647,cwnd = 3。ssthresh的初始值很大,而cwnd的初始值很小,这样,TCP可以在开始时快速增加发送窗口,直到达到ssthresh,然后进入拥塞避免阶段,逐渐增加发送窗口。
**RFC5681慢启动初始值的规定如下:**
If SMSS > 2190 bytes:
IW = 2 * SMSS bytes and MUST NOT be more than 2 segments
If (SMSS > 1095 bytes) and (SMSS <= 2190 bytes) :
IW = 3 * SMSS bytes and MUST NOT be more than 3 segments
If (SMSS <= 1095 bytes)
IW = 4 * SMSS bytes and MUST NOT be more than 4 segments
计算过程如下表:
| | rcv_wnd | snd_wnd_left | snd_wnd_pointer | snd_wnd_left+cwnd和<br>snd_wnd_left+rcv_wnd | snd_wnd_point- left |
| ------- | -------------------------------------------------------- | ------------ | --------------- | ------------------------------------------ | ------------------- |
| 发送方发出报文 | 5840 | 978938082 | 978939482 | 978942462 978943922 | 1400 |
| 发送窗口右边沿 | Min(snd_wnd_left+cwnd, snd_wnd_left+rcv_wnd) = 978942462 | | | | |

###### (2)
ssthresh保持不变,cwnd每收到一个确认报文就加1.
因为snd_cwnd\*1460< ssthresh,处于慢启动阶段,每收到一个ACK,snd_cwnd至多增加1个MSS的数值。
发送的报文相关信息截图如下,可以发现符合这一规律。

###### (3)
第60号报文时ssthresh变化为10和cwnd变化为1,因为路由器上的端口被关闭。
之后ssthresh不变,而cwnd依次加1.依次处于慢启动、拥塞避免阶段直到发送完毕。根据截图可见符合这一规律。
在发送文件为100k大小的实验中,截获的报文信息如下:


##### T9 参考
###### (1)
**参考 1**:
| | 第一个重传时间差 | 第二个重传时间差 | 第三个重传时间差 |
| ------ | -------- | -------- | -------- |
| 10Mbps | 0.275358 | 0.537274 | 0.123423 |
| 80Kbps | 4.235234 | 9.257412 | 21.26568 |
计算超时重传时间时,采用了修正的Karn算法,同种速率下,重传时间满足:新的重传时间=2×旧的重传时间,表现为重传时间差成倍增长;转发速率越大,重传时间越短。
示例截图如下:


**参考 2**
| | 第一个重传时间差 | 第二个重传时间差 | 第三个重传时间差 |
| ------ | -------- | -------- | -------- |
| 10Mbps | 0.2053s | 0.4128s | 0.8243s |
| 80Kbps | 3.2225s | 6.4449s | 12.8898s |



##### T10
```
[R1]interface g0/0
[R1-GigabitEthernet0/0]undo qos lr outbound
[R1-GigabitEthernet0/0]interface g0/1
[R1-GigabitEthernet0/1]undo qos lr outbound
```
## 1 TCP 基础实验
##### 步骤 1 组网,配置 IP、路由器、交换机
1. 组网

2. 配置 IP
1. PCA:点击“网络连接图标” -> 点击 TCP_send -> 检查`ifconfig` 192.168.1.2
2. PCB:点击“网络连接图标” -> 点击 TCP_Receiver -> 检查 `ipconfig` 192.168.2.2 -> `ping 192.168.1.2`
3. 配置路由器:PCC上
```
minicom
sys
sysn R1
interface e 0/0
ip add 192.168.1.1 24
quit
interface e 0/1
ip add 192.168.2.1 24
quit
```
4. 配置交换机:PCA 上
```
minicom
sys
sysn S1
vlan 2
port e 1/0/1 e 1/0/2
quit
vlan 3
port e 1/0/23 e 1/0/24
quit
```
##### 步骤 2、步骤 3
1. PCB 打开 Wireshark,选择 `eth0` 进行抓包,过滤 tcp 报文
2. PCB 上双击运行桌面的 `tcptest` 程序, `Run`, 选择“作为接收端”, ` 休眠时间 ` 为 0, ` 计数器阈值 ` 为 0,点击 ` 接收 `
3. PCA 打开 Wireshark,选择 `eth0` 进行抓包,过滤 tcp 报文
4. PCA 上双击运行桌面的 `tcplog_init` 程序进行初始化, `Run`
5. PCA 上双击运行桌面的 `tcptest` 程序, `Run`,选择“作为发送端”, `要发送的文件` 为 `???300k.txt`,点击 `发送`
6. 保存 PCA、PCB报文为 `send1-学号` 和 `receive1-学号` ,**截图**
> [!note]+
> 看到 TCP seq number 是 0 或者 1 的,这些都是 wireshark 软件处理过的 relative sequence number。而不是初始的 32 位随机产生的 sequence number。可以通过设置 wireshark 来解决:如图,设置一下 wireshark,edit—>preference 选 tcp,将 relative sequence number 勾选掉。
> 
7. PCA 上双击运行桌面的 `tcplog_read` 程序, `Run`。双击桌面 `network` 文件夹, `root`, `TCPLog`,根据文件属性的日期找到我们的数据,右键,点击最上面的那一个选项来打开文件,**截图**
##### 步骤 4 5 6
分析报文,填写报告(参考本博客第 0.3 节)
## 2 TCP 滑动窗口机制和窗口探查机制分析
前置知识
如何配置主机IP?
进入主机,点击任务栏中的网络状态图标,如果没有TCP Send或者TCP Receive的设置项,则需要自行添加。
鼠标右击相同图标,选择编辑网络,输入相应的项目名称,选择IPv4协议,然后输入熟悉的IP地址、掩码、网关等信息,之后点击`Apply`即可添加项目,后面需要启动项目则重新左击相同图标,选择对应项即可。
如何配置路由器/交换机?
进入对应主机,打开命令行,输入`minicom`后Enter,多按几次回车进入配置界面。
如何发送TCP信息?
在接收端,打开TcpTest程序,点击作为接收端,然后输入相应的配置信息。
在发送端,发送文件,需要先进行init初始化,即运行桌面上一个初始化脚本,然后再与接收端同样操作。
如何连接组网?
与winxp一样,在PCA上有对应程序。
---
实验内容:通过TcpTest程序参数的选择和路由器端口速率的设置,制造TCP传输的不同环境,截取TCP报文,分析滑动窗口机制,以及坚持定时器的作用。
具体内容如下:
1. 滑动窗口机制和窗口侦查机制分析。
### 实验步骤(Linux)
步骤1 按照课本图4-10进行组网,确保组网正确和路由器、PC接口IP地址配置正确。
步骤2 所有PC进入Linux系统,用户名为`root`,密码为`network`,打开所有计算机上的Wireshark脚本。(注意对报文进行TCP过滤)
步骤3 PCA即发送端在Linux下命令行中运行脚本初始化TCPConnection实时监控模块。
```
root@qjl-desktop:~# cd /root/TCPLog
root@qjl-desktop:~# ./init.sh
```
步骤4 所有PC在Linux下打开一个新的“终端命令行”,使用命令行方式启动TcpTest程序:
```
root@qjl-desktop:~# cd /root/TCPTest/
root@qjl-desktop:~# /root/jre/bin/java TcpTest
```
然后PCA作为发送端,选择一个300KB的文件准备发送
参数如下
- 要发送的文件:/root/snd300k.txt
- 目的IP地址:192.168.2.2
- 目的端口:1234
- 发送缓存:60000
- 滞留时间:500
- 每次写入套接字的字节数:1400
- Nagle算法:enable
- 信息反馈:空
PCB作为接收端,配置如下
- 要写入的文件:/root/rcv.txt
- 指定端口:1234
- 休眠时间:0
- 计数器阈值:0
- 接收缓存:100000
- 滞留时间:500
- 每次读出套接字的字节数:1400
- Nagle算法:enable
- 信息反馈:空
先点接收,再点发送,文件传输完成后,将截获的报文命名为"sed2-学号"和"receive2-学号",保存到本地磁盘/root/DATA/目录下。
步骤5 在PCA的终端命令行中运行脚本来读取"TCPConnection实时监控模块":
```
root@qjl-desktop:~# cd /root/TCPLog
root@qjl-desktop:~# ./read.sh
```
将本地磁盘/root/TCPLog/目录下的"tcpsnd-wnddata.txt"和"tcprtodata.txt"文件分别复制到/root/DATA/目录下并改名为"send2-学号-tcpsndwnddata.txt"和"send2-学号-tcprtodata.txt"。
步骤6 分析之前保存的报文和文件信息(截图)(实验报告)
步骤7 分析报文文件,找到窗口侦查开始的报文(截图)
## 3 TCP 慢启动、拥塞避免算法及拥塞处理实验
##### 步骤 1
路由器 R1 上配置端口转发速率为 10Mbps
```
interface e0/0
qos lr outbound cir 10000 #存疑,参见下面note
interface e0/1
qos lr outbound cir 10000
```
> [!note]
> 如图所示,设置接口转发速率10Mbps 需使用?在线帮助。
> 注意按照设备上的提示做,**注意一下转发速率的单位**,不同设备单位可能不同。
> > 
##### 步骤 2
1. PCB 打开 Wireshark,选择 `eth0` 进行抓包,过滤 tcp 报文
2. PCA 打开 Wireshark,选择 `eth0` 进行抓包,过滤 tcp 报文
##### 步骤 3
1. PCB 上双击运行桌面的 `tcptest` 程序, `Run`, 选择“作为接收端”, ` 休眠时间 ` 为 0, ` 计数器阈值 ` 为 0,点击 ` 接收 `
2. (不清楚用不用做)PCA 上双击运行桌面的 `tcplog_init` 程序进行初始化, `Run`
3. PCA 上双击运行桌面的 `tcptest` 程序, `Run`,选择“作为发送端”, `要发送的文件` 为 `/root/snd6m.txt`,点击 `发送`
4. PCA 点击 `发送` 后**立即**在 minicom 内 `shutdown` 路由器的一个端口。
`[R1-GigabitEthernet0/0]shutdown`
**由于文件发送时间较快,务必与现在 minicom 上输入命令 shutdown,PCA 发送后立即回车,一定要保证 shutdown 一个路由器端口后,程序还在传输数据(或许可以在 TCP 协议测试软件内看到“系统 IO 错误”)。如果 shutdown 一个路由器端口前程序已经传输完数据,重做此步骤!!!**
5. 10s 后,将此端口 undo shutdown
`[R1-GigabitEthernet0/0]undo shutdown`
6. **存报文** `send3-学号`, `receive3-学号`
##### 步骤 4
1. 下面两个方法二选一,看哪个能行得通走哪个
1. PCA 上双击运行桌面的 `tcplog_read` 程序, `Run`。双击桌面 `network` 文件夹, `root`, `TCPLog`,根据文件属性的日期找到我们的数据,右键,点击最上面的那一个选项来打开文件,**截图**
2. 终端命令行中运行脚本来读取“TCPConnection 实时监控模块”已记录的此 TCP 连接期间的相关参数数据
```
root@qjl-desktop:~# cd /root/TCPLog
root@qjl-desktop:~/TCPLog# ./read.sh
```
此脚本将读取的 TCP 连接相关参数数据保存在本地磁盘/root/TCPLog/目录下的“tcpsnd-wnddata.txt"和“tcprtodata.txt”文件中,将其复制到/root/DATA/目录下并改名为“send3-学号-tcpsndwnddata.txt"和“send3-学号-tcprtodata.txt”。
##### 步骤 5
更改路由器上的端口转发速率为 80Kbps
```
interface e0/0
qos lr outbound cir 80
interface e0/1
qos lr outbound cir 80
```
> [!note]
> 如图所示,设置接口转发速率 10Mbps 需使用?在线帮助。
> 注意按照设备上的提示做,**注意一下转发速率的单位**,不同设备单位可能不同。
> 
##### 步骤 6
1. PCB 打开 Wireshark,选择 `eth0` 进行抓包,过滤 tcp 报文
2. PCA 打开 Wireshark,选择 `eth0` 进行抓包,过滤 tcp 报文
##### 步骤 7
1. PCB 上双击运行桌面的 `tcptest` 程序, `Run`, 选择“作为接收端”, ` 休眠时间 ` 为 0, ` 计数器阈值 ` 为 0,点击 ` 接收 `
2. (不清楚用不用做)PCA 上双击运行桌面的 `tcplog_init` 程序进行初始化, `Run`
3. PCA 上双击运行桌面的 `tcptest` 程序, `Run`,选择“作为发送端”, `要发送的文件` 为 `/root/snd100k.txt`,点击 `发送`
4. PCA 点击 `发送` 后**立即**在 minicom 内 `shutdown` 路由器的一个端口。
`[R1-GigabitEthernet0/0]shutdown`
此文件发送较慢,可从容配置,但依旧要 shutdown 后仍在传输局
5. 40s 后,将此端口 undo shutdown
`[R1-GigabitEthernet0/0]undo shutdown`
6. **存报文** `send4-学号`, `receive4-学号`
##### 步骤 8
1. 下面两个方法二选一,看哪个能行得通走哪个
1. PCA 上双击运行桌面的 `tcplog_read` 程序, `Run`。双击桌面 `network` 文件夹, `root`, `TCPLog`,根据文件属性的日期找到我们的数据,右键,点击最上面的那一个选项来打开文件,**截图**
2. 终端命令行中运行脚本来读取“TCPConnection 实时监控模块”已记录的此 TCP 连接期间的相关参数数据
```
root@qjl-desktop:~# cd /root/TCPLog
root@qjl-desktop:~/TCPLog# ./read.sh
```
此脚本将读取的 TCP 连接相关参数数据保存在本地磁盘/root/TCPLog/目录下的“tcpsnd-wnddata.txt"和“tcprtodata.txt”文件中,将其复制到/root/DATA/目录下并改名为“send4-学号-tcpsndwnddata.txt"和“send4-学号-tcprtodata.txt”。
##### 步骤 9
分析文件“send3-学号”(或“receive3-学号”)和“send3-学号-tepsndwnddata.txt”(或send4-学号"和“send4-学号-tcpsndwnddata.txt”),体会慢启动、拥塞避免及拥塞处理机制,**填报告**
##### 步骤 10
分析文件“send3-学号”“send3-学号-teprtodata.txt”和“send4-学号”号-teprtodata.txt”,体会超时与重传机制。
## 4 UDP 实验
实验内容:使用模拟通信程序UDPTest发送消息数据,并使用Wireshark软件截获报文,分析UDP的报文格式。并进而了解和理解UDP运行机理。
### 实验步骤
步骤1 按照课本图4-20进行连线组网,注意清空交换机的所有配置
配置好各主机IP
PCA
192.168.1.22
255.255.255.0
PCB
192.168.1.21
255.255.255.0
步骤2 在PCA和PCB上都启动UDPTest程序,首先设置好监听的UDP端口并启动监听。
步骤3 打开PCA PCB上的Wireshark软件,开始截获报文。
步骤4 在PCA和PCB上的UDPTest程序的发送设置部分,互设对方的IP地址和UDP监听端口(1030)。互发消息进行通信。
步骤5 互发消息一段时间后,将交换机S1和S2之间的网线拔掉,此时PCA再继续往PCB发消息。
步骤6 PCA继续往PCB发消息一段时间后,将交换机S1和S2之间的网线重新插上。PCA和PCB继续互发消息一段时间。
步骤7 操作PCA和PCB上的Wireshark软件,分析截获报文,将报文保存为"UDP-学号"
选中第一个UDP报文,展开字段后(截图)
---
其余均为实验报告内容
## 5 讨论区
1. 1.0版本完工