Lab Exercise – TCP
实验要求:
查看TCP (Transmission Control Protocol)的详细信息。TCP是Internet上使用的主要传输层协议。
实验操作:
一、TCP报文捕获
-
找到一个中等大小的资源的URL,使用的是HTTP,而不是HTTPS下载该资源。确保它是一个单一的资源,而不是一个包含许多内联资源的web页面(例如a.html)。比如 http://sigcomm.org/paper.pdf(但是这个要cookie,不然连不上)
我用的是http://mapp.alicdn.com/1635733544972TiyMc7FEtdYZzhq.jpg。 -
在命令行输入 wget http://mapp.alicdn.com/1635733544972TiyMc7FEtdYZzhq.jpg,结果如下,表示能成功连接。
-
打开wireshark,用tcp and host xx.xx.xx进行过滤xx.xx.xx是获取资源的网址。如,我的是.
-
再次在命令重复第2步。然后wireshark里面可以看到捕获的TCP数据报如下。
二、TCP结构
在跟踪中间的任何地方选择一个协议列为TCP的长包。在中间面板中展开TCP协议部分(通过使用“+”扩展器或图标)。除HTTP响应的第一个HTTP GET包和最后一个HTTP响应包外,所有的报文都应该被列为TCP。选择一个长数据包可以确保我们看到的是从服务器到你的计算机的下载数据包。查看协议层,在TCP块之前看到一个IP块。这是因为TCP段是在IP中携带的。下表是TCP部分的各字段解释。
源端口和目的端口source port& destination port | 这是TCP在IP地址之外添加的地址。源端口很可能是80,因为数据包是由web服务器发送的,而标准web服务器端口是80 |
---|---|
序号sequence number | 它给出了第一个有效负载字节在字节流中的位置。 |
确认号acknowledgement | 它告诉反向字节流中最后接收到的位置。也是期望收到下一个报文段的第一个数据字节的序号。 |
首部长度header length | 给出了TCP报头的长度 |
标记flags | 有多个标志位,包括【紧急位、确认位、推送位、复位位、同步位、终止位】 |
校验和checksum | 校验范围是首部和数据两部分 |
(可能有)负载TCPplayload | 携带被传输的字节 |
使用Wireshark可以观察到的TCP报头字段的位置和字节大小。不要分解Flags字段,或任何Options字段,如果你发现某些TCP字段共享一个字节,那么将它们分组。画出TCP报头结构。
三、TCP连接的建立和释放
三次握手:
为了查看到TCP连接建立的时候的数据报,使用tcp.flags.syn==1进行过滤。结构如下:
要求:在你的跟踪中画一个三次握手的时间序列图。
在建立连接的过程中,TCP SYN报文通过Options在两端协商参数。每一端都通过在SYN中包含适当的选项向另一端描述其功能,通常两端都必须支持在此期间使用的行为。
问题:在SYN数据包上,TCP包含了哪些选项字段以供跟踪。
答:ACK字段和SYN字段。
连接释放:
最后,在下载完成后关闭TCP连接。这通常在FIN (Finalize)环节中完成。每一方向另一方发送FIN,并确认收到FIN;这类似于三次握手。或者,当一端发送RST (Reset)时,连接可能突然断开。此报文不需要被对方确认。
要求:和前面一样,画出连接释放的时序图。
![](https://img-blog.csdnimg.cn/39401c24f93a46d999fd776a11575471.png)
四、TCP数据传输
查看数据传输情况:
在wireshark里面点击统计-IO图标。弹出界面如下
接下来依次进行以下操作
- 间隔选择10毫秒
- Y轴单位改为Bits
- Display Filter:填入tcp.srcport==80
- 点击“+”,在新的条目的Display Filter里面填入tcp.dstport==80
最终得到两条线,红色的表示下载速率,蓝色的表示上传速率,如下所示:
回答问题:
-
当TCP连接正常的时候,下载方向的粗略数据速率(以包/秒或位/秒为单位)是多少?
答:大约是2.5Mbps -
内容占下载率的百分比是多少?展示你的计算。
答:使用tcp.srcport==80 进行过滤,找到任意一个中间位置的大型包。可以看到,总的数据量为1514B=12112bits。而TCP携带的内容占1460B。所以内容占下载率的96.43%。
-
由于ACK报文,上传方向的粗略速率(比特/秒)是多少?
答:缩放坐标轴后可以看到,速率大约为81.7Kbps。 -
如果最近从服务器接收到的TCP段的序列号是X,那么下一个传输的TCP段携带的ACK号是什么?
答:下一个报文ACK号是X加上这个报文的长度的。