《计算机网络习题(难)》由会员分享,可在线阅读,更多相关《计算机网络习题(难)(21页珍藏版)》请在金锄头文库上搜索。
1、夺命作业题及解答分析*冯温迪 白金校2017 年 11 月 11 日摘要计算机网络是个体力活,登堂入室之道无他,唯将双手弄脏耳,因 而我们的课程作业和考试题目也完全以实战为目的,一共 10 题,面 向大学刚刚毕业,即将入学的硕士研究生,题目总分超过 100 分,可 以自由选做。老网工们不妨尝试一下,看看能否活到 60 分。 本文将各夺命利器拆分并条分理析,去其要害,取其精华。1预备知识工欲善其事,必先利其器。如若作为网工,两手空空,那也只能泪眼憧 憧。制服夺命题目之利器有二三,本节下文简述何以司诸类。1.1WiresharkShark 者,鲛也,俗称鲨鱼。生于海,肚白体大,有利齿善咬杀,乃洋
2、中之霸。此利器谓之 Wireshark1,实乃网路中之霸王。可探测本机及同局域 网路中主机的网络数据包之收发情况。上至应用层,下到链路层,皆可悉 数获取,不在话下。*Text is available under the Creative Commons Attribution-Share Alike License; additional termsmay apply. 快网架构部总监1https:/www.wireshark.org/1(a) Wireshark 主界面,选择网卡。(b) 选择网卡后,Wireshark 抓取到的包。图 1: Wireshark 操作Wireshark 乃现
3、代软件,有易用之图形界面。自软件运行之后,即可从 主界面(如图 1a)选择所监测之网卡,因一台主机可使用多个网卡,且每个 网卡都可链接一个网络,故检测不同之网卡之结果是为不同。然后,软件进 入包显示界面(如图 1b) 。此乃吾辈之分析所常用之界面。此界面之工具栏 处有开始捕获包(Start capturing packet) 、停止捕获包(Stop capturing packet) 之操作按钮, 用于按需检测或停止检测所选网卡上的包。 以防包之显示如江 水涛涛不绝,失之重点。此外,Wireshark 提供有如会话追踪(Follow Stream) 之功能(如图 2) 。可将某次完整之 TCP
4、 连接或 UDP 之请求找出一起展示, 隐藏其他,以便分析。另有主界面显示表格栏目可调,可按需增删不同栏 目。图 2: 追踪流功能21.2VMware Workstation虚者, 假也。 曹公在石头记中所述: 假作真时真亦假。 虚机亦然。 VMware Workstation 可在桌面操作系统创建虚机若干,平行运行,互不叨扰。亦可 通过虚拟网络互相连接通信。VMware Workstation 乃商业软件,易用性强, 稳定性高,对于虚机的操作如真机一般。另有虚机产品 VirtualBox 亦可满足 要求,然其为社区开源之作,易用性次之,稳定性更次。 虚机之操作虽甚为简单,然其网络配置应需注意
5、。默认设置为 NAT, 而下文建议桥接,虽 NAT 亦可,未免有损性能,影响结果。1.3LinuxLinux 乃天下之最受欢迎之开源操作系统也。因其自由、开放,内核参 数可控可调,故,下文实验需在其上。 古语有之,人机交互,谓为接口。信夫。人机接口主要有二,图形接 口为其一,命令行接口为其二。Linux 为程序员之所爱,程序员善司计算机, 而命令行接口善充分发掘计算机之能力,故程序员与命令行接口可谓金玉 良缘,天生一对。本文中所需的命令行命令主要涉及 Linux 基本操作,易于 理解,不在赘述。如若读者不甚明白,可 Google 之。2首包分析试在Windows系统上利用Wireshark抓包
6、工具分析以下3个URL 所对应的IP地址的首发包数量, 并阐述RTT时间, 截图为证。(原 链接已失效) URL1: http:/ URL2: http:/ URL3: http:/ TCP 之原理。RTT 乃 Round-Trip Time 之缩略语,意为往返 通信时延,在双方通讯中,发讯方的信号传播到收讯方的时间,加上收讯方 回传讯息到发讯方的时间。所谓首包,即自服务器端传输数据开始第一次 传输数据之包数,计算方法可使用服务器端开始传输数据之时间加上 RTT 时间一个,所到达的包都为首包。故要求得首包数应需先求得 RTT。 题目中所述三个 URL 访问所需之应用层协议为 HTTP,HTTP
7、 基于之 下传输层中 TCP 协议。TCP 为连接型协议,需先建连维持连接发送数据最 后闭连。建连之时,通信双方须有三包相传,谓之曰:三次握手;闭连时为 确保双方闭连,有四包相传,谓之曰:四次挥手。三次握手之时,通信一方 (如客户端)发送建连请求,请求中带有 SYN 标识位,此时,如若通信另一 方(如服务器端)允许连接,则发送带有 SYN,ACK 标识的包。自客户端发 送 SYN 包起到接收到此包之时所经总时日便是 RTT 之时间。此外,因网络3环境易变,RTT 大小亦易之,为判断某数据包是否属于某次发送,则需分 析此包与上包之时间间隔,若两次发包的时间间隔较大,则两包分属两次 传输,即不应归
8、为首包。下以 URL1 为例,详述求解过程。 另外, 白金老师 补充,正确之 initial congestion window 计算方法应 为计算 TCP 的 SEQ 序号差值,除以 TCP 的 MSS,并上取整得到报文 数量。其中,SEQ 序号差值为 第二批发送包的第一个包 的起始序号的差与 第一批发送包的首个包 的起始序号。前面提到的数包数的方法,对于在 抓包过程中有丢包(或抓包没有丢包但链路传输有丢包)的情况下是不适 用的。另外就是抓包机器所使用网卡启用了 LRO/GRO 的硬件功能 1,这 样硬件驱动层会把收上来的 frame 拼接成大包,提交给 TCP Stack,这样的 话,Wi
9、reshark 看到的包数量就有可能很少了,但每个 packet 的 size 都很大, 因此数包就不准了。要注意,此处初始窗口大小是协议传输是满包持续传 输( Payload 达到 TCP 的 MSS 的情况 ,例如 HTTP 持续下载)的情况,但 如若使用 Telnet,FTP,SSH,HTTPS 这些协议则无法分析初始窗口大小, 即使数包也不可。2 本实验需 Wireshark 软件一套与 wget 软件一套。Wireshark 之用途,自 不必说,wget 用于进行 HTTP 请求,也可使用 curl。至于为何不用浏览 器代而为之,实因浏览器多有缓存功能,扰乱结果,不便分析。话说 wg
10、et 乃类 UNIX 之软件,Windows 并未自带,幸 GNU 提供 MinGW 项目,可于 Windows 上运行模拟 Linux Shell 环境,甚是方便。至此,准备工作毕。下面 介绍操作步骤:图 3: 使用 wget 对 URL1 进行 HTTP 请求41. 将 Wireshark 打开,选择联网网卡(一般为“以太网”云云)进入;2. 打开 MinGW Shell2,使用 cd 切换到合适工作目录,运行 $ wget url1 发送 HTTP 请求(如图 3) ;3. 在 Wireshark 中观察可能是这次请求的数据包,然后右击该包选择 Follow-TCP Stream,可以添
11、加过滤条件如 tcp.dstport=80 方便观 察;4. 此时,Wireshark 中显示该此 TCP 流所有的包(如图 4所示) 。图 4: 使用设置了过滤条件的 Wireshark 对 URL1 的 HTTP 请求抓包为方便分析,应将包过滤条件全部设置为显示服务器端发送的包。如 此,可非常方便通过计算服务器端第一次发送 SYN,ACK 包到服务器端第一 次发送数据包之间所用时间,即 RTT。RTT = 4.962610 4.946645 = 0.015965s = 15.96ms(1)求得 RTT,首包数即易求得。initcwnd3= 20(2)2可依据用户所用之系统具体选择,如若,用
12、户之系统为类 UNIX 系统,则 wget 命令将自带,如若使用 Windows,亦可使用 unxutil3(http:/ 3Initial Congestion Window,初始拥塞窗口,下同。5对于 URL2,采用的方法与 URL1 类似,然我邮之校园网络边缘设置了 缓存,会对结果产生些许差别。在准备好 Wireshark 之前提下,先用 wget 进行 HTTP 请求,发现输出信息中有 302 信息码(如图 5a) 。对于 HTTP 而言,302 意为重定向,即请求重新定向至另外一个链接,且 IP 地址对应 一个内网地址(10.3.200.200) 。在 Wireshark 中追踪了流
13、之后也验证了此结 果(如图 5b) 。进而可重新选择目标地址为 10.3.200.200 之包 Follow 其 TCP Stream。并过滤只显示服务器发送给客户端的包,分析到 10.3.200.200 之连 接请求即可(如图 6) 。6(a) 使用 wget 对 URL2 进行 HTTP 请求(b) Wireshark 追踪流图 5: URL 分析7图 6: Wireshark 追踪重定向后之流使用同样之方法,计算 RTT 与首包。RTT=100.289035 100.287293 =0.001742s(3) =1.742ms initcwnd=14(4)然观之整个原请求 TCP 流,可见
14、返回自原服务器的 ACK 包若干(如图 7) 。 起初,思前想后,感服务器已经断连,为何无故再次发送,不知其然。幸 而 白金先生 ,授之于堂,谓之曰劫持。故中间设备在 HTTP 建连之时,发 现本地已有缓存,向客户端发送自己伪造原服务器之 ACK 包,欺骗客户端 认为此包为原服务器发送之确认包,并继续发送携带 302 之 HTTP 包,令 客户端重新访问新的地址,断开此 TCP 连接。然真正原服务器发送之确认 包到达客户端之后,为时已晚,客户端仍认为此乃服务器端抽风,无故重 传,舍弃之,不予理睬。此乃劫持之原理。8图 7: Wireshark 劫持与重传图 7中,可以看到有 302 重定向,若
15、是请求的网站的服务器自己发送的 302 重定向信息后面服务器端是不可能再继续发数据的。上图红框中的 4 个 包乃服务器端发送的 4 次握手断开连接。302 所在的包中有 FIN 标志,那 既然断开了连接为什服务器端还会继续发送数据呢。原因是,这个 302 是 劫持设备发送的,而真正的服务器并不知道这个连接已经断,仍然在继续 发送我们之前请求的数据的首包,由于一直没有收到客户端的确认,服务 器端会一直重传,直到达到重传次数为止。所以 白金先生 所讲之剥离劫持 实则为不使 Wireshark 这个工具错误的追踪 TCP 流。故我们将劫持设备发 送的这 4 次握手的 4 个包删除就可以剥离劫持。剥离后重新追踪就会得到 剥离劫持后的连接。如图 8所示。9(a) 剥离劫持后 Wireshark 重新追踪流(b) Wireshark 剥离劫持图 8: 剥离劫持10故原本 RTT 及首包应为:RTT=13.764538 13.761518 =0.003020s(5) =3.02ms initcwnd=30(6)使用同样的方法,对 URL3 先请求,再剥离劫持,在分析。求得(过程 不再赘述) :RTT=2.516403 2.485957 =0.030466s(7) =30.466ms initwnd=40(8)3传输时间计算试计算在 50ms 时延,无丢包