华东师范大学软件工程学院实验报告六
一、实验目的
- 学会通过Wireshark获取TCP消息
- 掌握TCP数据包结构
- 掌握TCP数据包各字段的含义
- 掌握TCP连接建立和释放的步骤
- 掌握TCP数据传输阶段的过程
二、实验内容与实验步骤
- 以 http://old.ecnu.edu.cn/site/xiaoli/2018.jpg为例,用wget确认该链接有效
- 启动Wireshark,在菜单栏的捕获->选项中进行设置,选择已连接的以太网,设置捕获过滤器为tcp and host old.ecnu.edu.cn,我们主要观察客户端与服务器之间的tcp流
- 捕获开始后,重复第一步,重新发送请求
- 当wget命令结束后,停止wireshark捕获
- 选择一个tcp帧,观察其协议层
问题:
1)画出TCP数据段的结构
6.TCP的三次握手协议主要分为以下三个步骤:
1)客户端发送一个SYN包给服务器,然后等待应答。
2)服务器端回应给客户端一个ACK=1、SYN=1的TCP数据段。
3)客户必须再次回应服务器端一个ACK确认数据段。
问题:
1)观察客户端与服务器的连接建立过程,画出三次握手协议的步骤图
2)观察TCP数据段中的option字段(MSS:最大报文长度/timestamp/WS/SACK)
7.问题:
1)观察客户端与服务器连接的释放过程,画出释放连接的步骤图
8.思考:
为什么连接的时候是三次握手,关闭的时候却是四次握手?
9.观察wireshark生成的IO图表
问题:(以各自实验为准)
1)实验中的下载速率是多少? Bits/s & packets/s
2)实验中包下载内容为图片占所有下载内容的比例是多少?
3)实验中的上传速率,即ACK消息的发送速率是多少?
10.观察数据传输过程中Acknowledgment number,sequence number以及 Segment Len之间的变化
问题:
1)如果最近从服务器收到的TCP数据段的序列号是X,那么下一个发送的ACK是多少?
三、实验环境
- Wireshark v3.0.6
- Windows 10
- wget
四、实验过程与分析
1. 以http://old.ecnu.edu.cn/site/xiaoli/2018.jpg为例,用wget确认该链接有效
发现链接有效
4. 启动Wireshark,在菜单栏的捕获->选项中进行设置,选择已连接的以太网,设置捕获过滤器为tcp and host old.ecnu.edu.cn,我们主要观察客户端与服务器之间的tcp流
3. 捕获开始后,重复第一步,重新发送请求
(由于 http://old.ecnu.edu.cn/site/xiaoli/2018.jpg 无法显示4次挥手,此处重新实验、以www.baidu.com 为例)
4. 当wget命令结束后,停止wireshark捕获
打开第一个TCP包分析
问题:
1)画出TCP数据段的结构
(TCP首部最少20字节,最多60字节)
实际上:
1、源端口2字节,目的端口2字节。
2、序号:占4B。因为TCP面向字节流,所以TCP数据报传输是编了号之后、按照一个个字节传输的。这样才能保证按序交付。
3、确认号:占4B。TCP含有确认机制,接收端要向发送端发送确认号。如果发送的确认号是N,那么表明到N-1为止所有的数据都被接受到了。
4、数据偏移:占4位。这是首部的偏移,就是说的是首部的形态。四位就是0001,
0010,0011、….总共15个形态。默认的是20B,最长的就是60B。
5、保留字段
6、紧急比特URG,当等于1的时候表示紧急,这个要与后面的紧急指针配合使用。紧急指针指向的是最后一个编号。
7、确认比特ACK,确认序号有效。1有效、2无效。
8、推送比特PSH,接收方尽快把这一段给应用层。(还是要走缓冲区,URG不需要走缓冲区)
9、复位比特RST,断线重连。
10、同步比特SYN:当SYN置为1的时候,表示这是一个连接请求或者连接接受报文。
11、终止比特FIN:当FIN=1的时候表明此报文段的发送端数据已经全部发送,并且要求释放传输连接。
12、窗口字段2B。这个窗口用于控制对方最大发送数据。单位是B。
13、校验和:2B。与UDP一样的。
14、紧急指针:占2B。刚说过是指的紧急数据(TCP数据段中)的最后一个编号。
15、选项字段:可变长度,经常为空。每个选项开始是一个字节的kind字段,说明选项类型。每个类型描述的内容也不同。
16、填充字段:为了使整个首部长度是4B的整数倍。6.TCP的三次握手协议主要分为以下三个步骤:
1)客户端发送一个SYN包给服务器,然后等待应答。
2)服务器端回应给客户端一个ACK=1、SYN=1的TCP数据段。
3)客户必须再次回应服务器端一个ACK确认数据段。
问题:
1)观察客户端与服务器的连接建立过程,画出三次握手协议的步骤图
三次握手:
第一次:客户机向服务器发送链接请求。(服务器是死循环监听状态)。那么首部中的SYN=1,seq是序号。TCP规定了SYN报文段不能携带数据,但是要消耗一个序号。表明我们连接发送的第一个编号是x。
第二次:服务器收到了客户机的请求(SYN是一个标示)。于是自己也发送一个同意连接SYN和一个确认收到ACK,seq是y 说明我这边第一次发送的编号是y。Ack是收到了x+1之前的所有帧。
第三次:客户端收到确认之后也发送一个确认过去
2)观察TCP数据段中的option字段(MSS:最大报文长度/timestamp/WS/SACK)
7.TCP连接的释放
问题:
1)观察客户端与服务器连接的释放过程,画出释放连接的步骤图
四次挥手:
第一挥:由客户机主动发送释放报文,并且单方面停止发送数据。(因为TCP
是双工的)。
第二挥:服务器收到发送确认。其实这个时候客户机→服务器已经关闭了。
第三挥:因为服务器数据还没传完。这个时候服务器发送,客户端还是要收。传完了就发送关闭请求。
第四挥:客户端发送确认请求,等2MSL关闭。
8.思考:
为什么连接的时候是三次握手,关闭的时候却是四次握手?
3次握手完成了两个重要的功能,即双方做好发送数据的准备工作,同时也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
TCP建立连接要进行3次握手,而断开连接要进行4次,这是由于TCP的半关闭造成的,因为TCP连接是全双工的,所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭.
关闭的方法是一方完成它的数据传输后,就发送一个FIN来向另一方通告将要终止这个方向的连接.当一端收到一个FIN,它必须通知应用层TCP连接已终止了这个方向的数据传送,发送FIN通常是应用层进行关闭的结果.
此外,服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACK和SYN(ACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。
9.观察wireshark生成的IO图表
问题:(以各自实验为准)
1)实验中的下载速率是多少? Bits/s & packets/s
大约在0-70Packets/s,大约0-175000Bit/s
2)实验中包下载内容为图片占所有下载内容的比例是多少?
3)实验中的上传速率,即ACK消息的发送速率是多少?
10.观察数据传输过程中Acknowledgment number,sequence number以及 Segment Len之间的变化
问题:
1)如果最近从服务器收到的TCP数据段的序列号是X,那么下一个发送的ACK是多少?
是X+1
五、实验结果总结
本次实验首先探讨了TCP包的结构,
然后回顾了TCP三次握手和四次挥手的过程,
最后通过wireshark获得了传输过程的IO图。
六、附录
TCP特点:
TCP报文结构: