华东师范大学软件工程学院实践报告
实验课程:计算机网络实践 | 姓名:刘佳奇 | 学号:10225101455 |
---|---|---|
实验名称:Lab6 TCP | 实验日期:2023/12/29 | 指导老师:刘献忠 |
实验目的
- 学会通过Wireshark获取TCP消息
- 掌握TCP数据包结构
- 掌握TCP数据包各字段的含义
- 掌握TCP连接建立和释放的步骤
- 掌握TCP数据传输阶段的过程
实验内容与实验步骤
- 捕获tcp报文
- 以https://v1.ax1x.com/2023/12/29/7BJvVb.jpg为例,用wget确认该链接有效
- 启动wireshark,利用tcp and host pluseven-sechs.site过滤捕获
- 主要观察客户端与服务器之间的tcp流
- 捕获开始后,重复第一步,重新发送请求
- wget结束后,停止wireshark捕获
- 分析tcp报文
- tcp连接的建立与释放
- tcp数据传输
- 问题与探索
实验环境
- windows
- wireshark
- wget
实验过程与分析
- 捕获数据
win + x 以管理员身份运行命令行,以 https://v1.ax1x.com/2023/12/29/7BJvVb.jpg 为例,用wget确认该链接有效
启动wireshark,利用tcp and host v1.ax1x.com过滤捕获,主要观察客户端与服务器之间的tcp流,捕获开始后,重复第一步,重新发送请求,wget结束后,停止wireshark捕获
- 分析TCP报文
选择一个数据帧,分析其TCP包头字段
- Source
Port:源端口号,2个字节。客户端通常使用系统自动选择的临时端口号
- Destination Port:目的端口号,2个字节。服务器的端口号
- Sequence
Numbebr:序号,4个字节。A与B连接后发送第一个报文段,序号值被系统分配随机一个值S,后续报文段的序号值为S
+ 偏移值
- Acknowledgement
Number:确认号,4个字节。用作对另一方发送来的TCP报文段的响应。其值是收到的TCP报文段的序号值加1
- Header Length:头部长度,表示有多少个32位字(4字节),4位最大值是15,所以头部最长60字节。
- ACK: 表示确认号是否有效
PSH: 提示接收端应用程序应该立即从TCP接收缓冲区中读走数据
RST: 表示要求对方重新建立连接
SYN: 表示请求建立一个连接
FIN:表示通知对方本端要关闭连接了
URG(紧急位):设置为1时,首部中的紧急指针有效;为0时,紧急指针没有意义
- windows:
16位窗口大小,2个字节。告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以控制发送数据的速度。最大位65535字节。窗口大小为0时候,说明数据被截断
- checksum:
校验和,2个字节。由发送端填充,接收端对TCP报文段执行CRC算法以检验TCP报文段在传输过程中是否损坏。注意,这个校验不仅包括TCP头部,也包括数据部分
- Urgent Pointer: 紧急指针,2个字节
- TCP连接的建立和释放
- TCP的三次握手协议主要分为以下三个步骤:
A. 客户端发送一个SYN包给服务器,然后等待应答
B. 服务器端回应给客户端一个ACK=1、SYN=1的TCP数据段
C. 客户必须再次回应服务器端一个ACK确认数据段
画出三次握手协议的步骤图
观察并分析TCP数据段中的option字段
最大段大小(Maximum Segment Size): 该选项告知对方TCP连接端点在一个TCP段中能够接受的最大数据量(1460字节)
窗口缩放(Window Scale): 该选项指示TCP连接端点要对窗口字段进行缩放,乘以256,以便在高延迟网络中更好地利用带宽。在这里,Shift count为8,表示要将窗口值左移8位,相当于乘以256
SACK允许(SACK Permitted): 该选项表示TCP连接端点支持选择性确认(SACK)。 SACK允许在TCP连接中使用选择性确认机制,以提高数据传输的效率
这些TCP选项提供了有关TCP连接配置和支持特性的信息
- TCP的四次挥手主要分为以下四个步骤: A.
客户端进程发出断开连接指令,这将导致客户端的TCP程序创建一个特殊的TCP报文段,发送到服务器。这个报文段的FIN字段被置为1,表示这是一条断开连接的报文;
B. 服务器接收到客户端发来的断开连接报文,向客户端回送这个报文的确认报文(ACK字段为1),告诉服务器已经接收到FIN报文,并允许断开连接;
C. 服务器发送完确认报文后,服务器的TCP程序创建一条自己的断开连接报文,此报文的FIN字段被置为1,然后发往客户端;
D. 客户端接收到服务器发来的FIN报文段,则产生一条确认报文(ACK为1),发送给服务器,告知服务器已经接收到了它的断开报文。服务器接收到这条ACK报文段后,释放TCP连接相关的资源(缓存和变量),而客户端等待一段时间后(半分钟、一分钟或两分钟),也释放处于客户端的缓存和变量
TCP的三次握手完成了双方准备发送数据的工作,并协商了初始序列号。这确保了建立连接的可靠性和双方对连接参数的同意。而四次握手则涉及到TCP连接的半关闭,因为TCP连接是全双工的,每个方向都需要单独进行关闭。半关闭是指在连接关闭过程中,每个方向上的数据传输是独立的,一方完成数据传输后可以发送FIN通告另一方关闭该方向的连接。这样的设计允许在双方各自完成数据传输后独立关闭连接
另外,服务端在LISTEN状态下收到建立请求时,可以将ACK和SYN放在同一个报文里发送,以提高效率。然而,在关闭连接时,接收到对方的FIN通知并不意味着对方已经完全发送了所有数据,所以可能需要一段时间继续传输数据,然后再发送FIN通告对方同意关闭连接。因此,ACK和FIN通常在关闭连接时是分开发送的,以确保数据传输的完整性
- TCP数据传输
观察wireshark生成的IO图表
实验中的下载速率是多少? Bits/s & packets/s
750 packets/s
实验中的上传速率,即ACK消息的发送速率是多少?
观察数据传输过程中Acknowledgment number,sequence number以及Segment Len之间的变化
如果最近从服务器收到的TCP数据段的序列号是X,那么下一个发送的ACK是X+1
实验结果总结
本次实验首先探讨了TCP包的结构,然后回顾了TCP三次握手和四次挥手的过程,最后通过wireshark获得了传输过程的IO图