实验五:TCP可靠传输和重传分析
【实验目的】
1、掌握TCP可靠传输原理;
2、掌握TCP的超时重传和快重传机制;
3、了解Linux下iptables命令的使用方法。
【实验步骤与结果记录】
要求:根据实验指导书中的实验内容和步骤,认真完成实验。采取截图、拍照等形式记录自己的实验步骤和结果。(可根据需要加页)
步骤1:修改Linux系统参数
1.在Linux中,执行如下命令,修改TCP连接的接收缓存参数,减少Linux 分配的接收缓存,降低接收窗口值。
sysctl -w net.ipv4.tcp_rmem='4096 65536 65536'
2.在Linux中,执行如下命令,关闭SACK选项,避免执行基于SACK的重传算法。
sysctl -w net.ipv4.tcp_sack=0
步骤2:创建虚拟网络拓扑。
1.使用script3.1.sh 脚本,创建如图所示的网络拓扑结构。
在Linux中,该虚拟网络拓扑的实现如图所示。
运行脚本,创建虚拟网络拓扑。
2.执行Linux命令,ip netns list 查询已经建立的NS列表,在所有NS内执行 ifconfig -a 命令查看NS内的网络接口配置,执行Linux命令 brctl show 查看交换机桥接状态,验证网络拓扑。
步骤3:为虚拟网络拓扑中的各路由器配置静态路由。
1. 使用script3.2.sh 脚本,为各路由器配置静态路由。
步骤4:关闭网卡offload功能,将运输层封装时需要的计算还给CPU
1. 使用script3.3.sh 脚本,关闭网卡offload功能。
步骤5:在路由器RA上,用iptables设置规则,模拟丢包
1.执行如下Linux命令,在路由器RA中,用iptables 设置规则,以10%的概率丢弃目标地址为192.168.57.254(ns57C)的IP数据报。
ip netns exec RA iptables -I FORWARD -d 192.168.57.254 -m statistic --mode random --probability 0.1 -j DROP
步骤6:打开两个终端窗口,分别模拟主机ns56A和主机ns57C。
1.打开一个终端窗口,利用Linux命令bash将本窗口模拟成主机ns56A的终端 执行以下命令 。
ip netns exec ns56A bash
执行上述命令后,Linux将在网络命名空间ns56A中开启bash交互,之后输入的Linux命令均在ns56A中执行,相当于模拟了主机ns56A的终端。
2.然后输入 ifconfig -a ,确认是否成功模拟成主机ns56A。
为了避免混淆,可以改变终端窗口名字。
3. 再打开一个终端窗口,利用Linux命令bash将本窗口模拟成主机ns57C的终端 执行以下命令
ip netns exec ns57C bash
模拟主机ns57C的终端。
4.然后输入ifconfig -a ,确认是否成功模拟成主机ns57C,并修改终端名。
步骤7:在主机ns56A上创建一个100K字节长度的文件备用
1.在主机ns56A的模拟终端中,执行如下命令,创建一个100K字节长度的文件,命名为100K.0。
truncate -s 100K 100K.0
步骤8:在主机ns56A上启动Wireshark,在接口tap56A上启动抓包
1.新开一个终端窗口,执行如下命令,在主机ns56A上后台启动Wireshark。
ip netns exec ns56A wireshark &
2.在Wireshark窗口中选择接口tap56A,启动抓包。
步骤9:在主机ns57C上打开TCP服务程序。在主机ns56A上打开TCP客户程序,然后通过网络将主机ns56A上的100K.0文件发送到主机ns57C。
1.在主机ns57C的模拟终端中,执行如下命令,在4499端口打开TCP服务,并将输出重定向到文件100K.1
nc -lv 4499 > 100K.1
执行上述命令后,通过TCP连接收到的字符被保存到文件100K.1中。
2.在主机ns56A的模拟终端中,执行如下命令,打开TCP客户程序,指定TCP服务程序的IP地址和端口,并将输入重定向到文件100K.0。
nc 192.168.57.254 4499 < 100K.0
执行上述命令后,TCP连接建立后,会自动读取文件100K.0,并从TCP连接发送出去。
3.文件100K.0发送完成后,ns56A上的nc命令会主动释放TCP连接。
步骤10:在Wireshark中停止抓包,保存抓包结果文件并分析本次TCP通信,理解TCP超时重传机制和快重传机制。
停止抓包,保存抓包结果。
1.如果抓包结果中没有出现快重传,可以重复执行实验步骤8-10,直至抓到理想的结果。
2.如果抓包结果中没有出现超时重传,可以重复执行实验步骤8-10,直至抓到理想的结果。
3.如果抓包结果中没有出现部分ACK,可以重复执行实验步骤8-10,直至抓到理想的结果。
【问题与分析】
1.本实验要求捕获到TCP超时重传事件,快重传事件和部分ACK事件,你在实验中捕获这几种事件时,操作系统为主机ns56A上的TCP客户程序分配的端口号是多少,如果这些事件是分多次捕获的,请分别给出客户进程的端口号。截图说明。
由图可知,在实验中捕获这几种事件时,操作系统为主机ns56A上的TCP客户程序分配的端口号是40674。
2.在你的实验结果中,任意选择一个超时重传的报文段,分析并回答以下问题:
(1) wireshark给这个超时重传报文段的编号是多少?分析超时重传报文段的首部,截图并填写表5.1。
这个超时重传报文段的编号是67。
打开相对序号选项,获取相对序号。
表5.1 超时重传报文段分析 | |
Wireshark分配给重传报文段的编号 | 67 |
源端口 | 40674 |
目的端口 | 4499 |
序号(相对序号) | 32769 |
数据偏移 | 32bytes |
窗口 | 7300 |
(2) 这个超时重传报文段重传的原TCP报文段的编号是多少,分析原TCP报文段的首部,截图并填写表5.2。
将序号字段排列到列,便于寻找序号。
由图可知,上一个号码为32769的报文为51号报文。
表5.2原TCP报文段分析 | |
Wireshark分配给原报文段的编号 | 51 |
源端口 | 40674 |
目的端口 | 4499 |
序号(相对序号) | 32769 |
数据偏移 | 32bytes |
窗口 | 7300 |
(3) 超时重传报文段发送之前,共收到几次对该报文段的前一个报文段的ACK确认?该超时重传报文段触发过快重传么?该报文段与原报文段的时间间隔是多长?截图说明你的分析过程。
如图所示,共有5次错误确认,应还有1个正确确认,故共收到6次确认。
该超时重传报文段没有触发过快重传。
该报文段时间约为0.2。
原报文段时间约为0.0。
故该报文段与原报文段的时间间隔是0.2-0.0=0.2s。
3.在你的实验结果中,任意选择一个快重传的报文段,分析并回答以下问题:
(1) wireshark给这个快重传报文段的编号是多少?分析超时重传报文段的首部,截图并填写表5.3。
这个快重传的编号是29。
按照内容填写数值即可。
表5.3 快重传报文段分析 | |
Wireshark分配给快重传报文段的编号 | 29 |
源端口 | 40674 |
目的端口 | 4499 |
序号(相对序号) | 11089 |
数据偏移 | 32bytes |
窗口 | 7300 |
(2) 这个快重传报文段重传的原TCP报文段的编号是多少,分析原TCP报文段的首部,截图并填写表5.4。
由相对序号可知原TCP报文段的编号是22。
按照报文段内容填写即可。
表5.4原TCP报文段分析 | |
Wireshark分配给原报文段的编号 | 22 |
源端口 | 40674 |
目的端口 | 4499 |
序号(相对序号) | 11089 |
数据偏移 | 32bytes |
窗口 | 7300 |
(3) 快重传报文段发送之前,共收到几次对该报文段的前一个报文段的ACK确认?截图说明你的分析过程。
共有3次错误确认,还有1次正确确认,故共有4次对前一个报文段的ACK确认。
4、在你的实验结果中,找到一次主机ns57C发给主机ns56A的部分ACK报文段。分析这次快重传过程中,引起快重传的丢失报文段、快重传报文段、快重传之前ns56A发送的最后一个报文段、部分ACK报文段,截图并填写表5.5。
含有该字段说明发生了部分确认。
丢失报文段是40,快重传报文段是50。
快重传前ns56A发送的最后一个报文段的编号是48。
Wireshark分配给部分ACK报文段的编号是52号。
丢失报文段的序号是24577。
丢失报文段的数据部分长度为1448。
快重传报文段的序号为24577。
快重传之前ns56A发送的最后一个报文段的序号是31817。
快重传之前ns56A发送的最后一个报文段的数据部分长度是952。
最后一字节编号=31817+952-1=32768。
部分ACK报文段的确认号是31817。
表5.5部分ACK分析 | |
Wireshark分配给丢失报文段的编号 | 40 |
Wireshark分配给快重传报文段的编号 | 50 |
Wireshark分配给快重传前ns56A发送的最后一个报文段的编号 | 48 |
Wireshark分配给部分ACK报文段的编号 | 52 |
丢失报文段的序号(相对序号) | 24577 |
丢失报文段的数据部分长度 | 1448(字节) |
快重传报文段的序号(相对序号) | 24577 |
快重传之前ns56A发送的最后一个报文段的序号(相对序号) | 31817 |
快重传之前ns56A发送的最后一个报文段的数据部分长度 | 952(字节) |
快重传发生时,ns56A发送的最后一字节的编号 | 32768 |
部分ACK报文段的确认号(相对确认号) | 31817 |
ns56A收到部分ACK报文段后,是如何处理的?截图说明你的分析过程。
收到部分ACK立刻重传缺失数据,避免触发超时重传。
标签:ns56A,重传,05,主机,报文,TCP,序号 From: https://blog.csdn.net/unbug1/article/details/139235133