---
# System prepended metadata

title: 【计网实验】lab6-传输层实验
tags: [学习经验]

---

---
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`；
    ![02](https://hackmd.io/_uploads/Bypxjbif-g.png)
	![03](https://hackmd.io/_uploads/SypWiZszZg.png)
    
2. 先查看是否有可用的配置好的ip地址，
	如果没有，则点击add，如下图配置（选择 `IPv4 Settings`, `Method` 为 `Manual`, 点击 `Add`，输入 IP 地址、掩码、网管），点击apply，关闭编辑网络连接。
	注意：配网关和子网掩码的之前或之后，要在旁边空白的地方点一下，看看是否配置成功了。或者配完敲一下回车。不要急于点确定。否则，容易出现配的网关等总是变成0.0.0.0
	![04](https://hackmd.io/_uploads/BkNQo-ifWg.png)
3. 鼠标左键点击网络连接图标，先点击 `disconnect` 断开网络连接，再用鼠标选择receiver eth0（你刚刚给那个 IP 的命名），出现下面界面即可。还可以 `ipconfig` 验证 ip 是否生效
	![05](https://hackmd.io/_uploads/Hkf8oZoGbl.png)


##### 3 Linux配路由器或交换机

打开命令行窗口，输入minicom，敲回车，等待几秒钟即可
![01](https://hackmd.io/_uploads/Skq8iZozZe.png)

### 0.2 mooc
![06](https://hackmd.io/_uploads/rkrdoZjMbe.png)
![07](https://hackmd.io/_uploads/S1iOsZsfbl.png)

### 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 参考
![08](https://hackmd.io/_uploads/HkcKo-ofZl.png)

发送方初始序号：209418378
![09(1)](https://hackmd.io/_uploads/BkHc3-sz-x.png)
![10](https://hackmd.io/_uploads/Byv5hWizbl.png)
![11](https://hackmd.io/_uploads/HkFchbsz-g.png)

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


##### T4 参考
![13](https://hackmd.io/_uploads/SJk2hZsGWl.png)
![14](https://hackmd.io/_uploads/H1zn3-oGZx.png)


##### T5 参考
![15](https://hackmd.io/_uploads/B1462-jf-g.png)
![16](https://hackmd.io/_uploads/rJwpnZifWg.png)
![17](https://hackmd.io/_uploads/SyF6nZoGZx.png)
![18](https://hackmd.io/_uploads/HJm-pZozZg.png)
![19](https://hackmd.io/_uploads/S18Z6WjMbl.png)
![20](https://hackmd.io/_uploads/H1dbTbsz-g.png)
![21](https://hackmd.io/_uploads/S19b6-oMbl.png)



##### 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 |              |                 |                                            |                     |

![22](https://hackmd.io/_uploads/HJhRh-jMbx.png)


###### （2）
ssthresh保持不变，cwnd每收到一个确认报文就加1.
因为snd_cwnd\*1460< ssthresh，处于慢启动阶段，每收到一个ACK，snd_cwnd至多增加1个MSS的数值。
发送的报文相关信息截图如下，可以发现符合这一规律。
![23](https://hackmd.io/_uploads/H17kT-jMbx.png)


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


##### T9 参考

###### （1）
**参考 1**：

|        | 第一个重传时间差 | 第二个重传时间差 | 第三个重传时间差 |
| ------ | -------- | -------- | -------- |
| 10Mbps | 0.275358 | 0.537274 | 0.123423 |
| 80Kbps | 4.235234 | 9.257412 | 21.26568 |

计算超时重传时间时，采用了修正的Karn算法，同种速率下，重传时间满足：新的重传时间=2×旧的重传时间，表现为重传时间差成倍增长；转发速率越大，重传时间越短。
示例截图如下：
![26](https://hackmd.io/_uploads/HkBBabiG-e.png)
![27](https://hackmd.io/_uploads/SJDSaZjMbe.png)


**参考 2**

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

![28](https://hackmd.io/_uploads/B1gPabsMWl.png)
![29](https://hackmd.io/_uploads/SJlgD6-oGbx.png)
![30](https://hackmd.io/_uploads/BkZD6WiGWl.png)


##### 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. 组网
	![32](https://hackmd.io/_uploads/HJJd6Wifbl.png)

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 勾选掉。
> ![33](https://hackmd.io/_uploads/H1kK6-ifZe.png)

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 需使用？在线帮助。
> 注意按照设备上的提示做，**注意一下转发速率的单位**，不同设备单位可能不同。
> > ![31](https://hackmd.io/_uploads/HJtFT-sfWl.png)



##### 步骤 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 需使用？在线帮助。
> 注意按照设备上的提示做，**注意一下转发速率的单位**，不同设备单位可能不同。
> ![31](https://hackmd.io/_uploads/HJtFT-sfWl.png)

##### 步骤 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版本完工