实验六:TCP协议流量控制
【实验目的】
1、掌握TCP的流量控制机制;
2、理解TCP的零窗口通知及处理方法。
【实验步骤与结果记录】
要求:根据实验指导书中的实验内容和步骤,认真完成实验。采取截图、拍照等形式记录自己的实验步骤和结果。(可根据需要加页)
步骤1:修改Linux系统参数
在Linux中,执行如下命令,修改TCP连接的接收缓存参数,限制Linux分配的接收缓存为9232字节。
sysctl -w net.ipv4.tcp_rmem='4096 8192 8192'
步骤2:创建虚拟网络拓扑。
1.使用script3.1.sh 脚本,创建如图所示的网络拓扑
在Linux中,该虚拟网络拓扑的实现如图所示。
运行脚本,创建虚拟网络拓扑。
步骤3:为虚拟网络拓扑中的各路由器配置静态路由。
1. 使用script3.2.sh 脚本,为各路由器配置静态路由。
步骤4:关闭网卡offload功能,将运输层封装时需要的计算还给CPU
1. 使用script3.3.sh 脚本,关闭网卡offload功能。
步骤5:打开两个终端窗口,分别模拟主机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,并修改终端名。
步骤6:在主机ns56A上创建一个10K字节长度的文件备用。
1.在主机ns56A的模拟终端中,执行如下命令,创建一个10K字节长度的文件,命名为10K.0。
truncate -s 10K 10K.0
步骤7:在主机ns57C上启动Wireshark,在接口tap57C上启动抓包。
1.新开一个终端窗口,执行如下命令,在主机ns57C上后台启动Wireshark。
ip netns exec ns57C wireshark &
2.在Wireshark窗口中选择接口tap57C,启动抓包。
步骤8:在主机ns57C上打开TCP服务程序。在主机ns56A上打开TCP客户程序,然后通过网络将主机ns56A上的10K.0文件发送到主机ns57C,并限制ns57C上的TCP服务程序延迟5秒再读取数据。
1.在主机ns57C的模拟终端中,执行如下命令,在4499端口打开TCP服务,nc进程延迟操作5秒,并将输出重定向到文件10K.1。
nc -d 5 -lv 4499 > 10K.1
执行上述命令后,通过TCP连接收到的字符在延迟5秒后,将被保存到文件10K.1中。
2.在主机ns56A的模拟终端中,执行如下命令,打开TCP客户程序,指定TCP服务程序的IP地址和端口,并将输入重定向到文件10K.0。
nc 192.168.57.254 4499 < 10K.0
执行上述命令后,TCP连接建立后,会自动读取文件10K.0,并从TCP连接发送出去。
3.文件10K.0发送完成后,ns56A上的nc命令会主动释放TCP连接。
步骤9:在Wireshark中停止抓包,保存抓包结果文件并分析本次TCP通信,理解TCP流量控制机制,分析零窗口通知及其处理方法。
【问题与分析】
1、在步骤8中,操作系统为主机ns56A上的TCP客户程序分配的端口号是多少?截图说明你的分析过程。
端口号为48456。
2、在你的实验结果中,主机ns56A发送了多少字节数据后,收到了来自主机ns57C的零窗口通知报文?主机ns57C发送第一个零窗口通知报文之前,最后发送的那个ACK报文段中,窗口字段值是多少?收到第一个零窗口通知报文前,主机ns56A发送的最后一个数据报文段的序号字段值是多少?它包含多少字节数据?截图说明你的分析过程。
发送了9032个字节数据。
窗口字段值是344
序号字段是16,包含344字节的数据。
3、在你的实验结果中,主机ns56A一共发送了几个窗口探测报文。第一个窗口探测报文与第一个零窗口通知报文的时间间隔多少?随后的多个窗口探测报文之间的时间间隔分别是多少?在窗口探测报文中包含多少字节的数据?窗口探测报文中的序号字段值是多少?零窗口通知报文中的确认号字段值是多少?这两个值有什么关系?截图说明你的分析过程。
4个Keep-alive标识的就是窗口探测报文。
第一个窗口探测报文与第一个零窗口通知报文的时间间隔大概是0.2s。
多个窗口探测报文之间的时间间隔依次大概是0.4s 0.8s 1.6s。
在窗口探测报文中包含的数据为0。
窗口探测报文中的序号字段值为9032
零窗口通知报文中的确认号字段值是9033
零窗口通知报文中的确认号字段值=窗口探测报文中的序号字段值+1
表明期待收到的数据号为9033