当前位置: 首页 > news >正文

【计算机网络】lab7 TCP协议

🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客

💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光

目录

1. 实验目的

2. 实验环境

3. 实验过程

3.1 Capture a Trace 捕获

3.2 Inspect the Trace 检查捕获

3.3 TCP Segment Structure

3.4 TCP三次握手

3.5 TCP四次挥手

 3.6 TCP数据传输 

4. 问题回答

5. 自我探索

6. 总结 


本系列重点针对山东大学-软件学院-计算机网络实验的任务。

希望通过实验,一方面加强大家对理论知识的认识,另一方面提升大家的动手能力。

也希望我的博客能够给学弟学妹们的学习提供一些帮助。

1. 实验目的

  1. 熟悉使用wireshark软件进行抓取TCP数据包 ;
  2. 分析抓取到的TCP数据包,掌握TCP数据包结构、TCP数据包各字段的含义;
  3. 掌握TCP连接建立和释放的步骤;
  4. 掌握TCP数据传输过程;

2. 实验环境

· wireshark;· wget :获取web资源。
· Browser:本次实验用web浏览器获得页面作为工作负载,查找、获取页面。

3. 实验过程

3.1 Capture a Trace 捕获

1.使用一个中等大小的资源URL,且是HTTP(非HTTPS):提供的资源URL(http://p4.qhimg.com/bdm/0_0_100/t010fae11f356641191.jpg)

2.命令行下载资源
使用 wget 命令来下载该资源。输入以下命令:

wget http://p4.qhimg.com/bdm/0_0_100/t010fae11f356641191.jpg

这条命令会使用 HTTP 协议从指定的 URL 下载该 JPEG 图片。

3. 打开 Wireshark 并设置过滤器:

在 Wireshark 中,设置一个过滤器以捕获与该 URL 相关的 TCP 流量。您可以使用以下过滤器:

tcp and host p4.qhimg.com

该过滤器会显示所有与 p4.qhimg.com 主机进行 TCP 通信的网络包。

4. 开始捕获数据包

  • 打开 Wireshark。
  • 选择合适的网络接口进行数据包捕获。
  • 在 Wireshark 的过滤框中输入 tcp and host p4.qhimg.com,然后按回车键应用过滤器。
  • 点击“开始捕获”按钮,Wireshark 将捕获和显示所有与 p4.qhimg.com 的 TCP 连接相关的数据包。

  

3.2 Inspect the Trace 检查捕获

选取一个TCP报文,检查结果如下:

  

可以知道:

  • source port 源端口 2B:很有可能是80,因为web服务器的端口号是80;
  • destination port 目的端口 2B:source port 和 destination port是TCP在IP地址以外添加的地址。
  • sequence number 序号4B:保证TCP可靠性传输的关键,记录第一个有效负载字节在字节流中的位置;
  • acknowledge number 确认号 4B:每一个ACK对应一个确认号,指明下一个期待收到的字节序号,同时表明该序号之前的所有数据都已经正确接收。只有当ACK位=1时有效。建连时SYN报文的ACK位=0;
  • TCP header length TCP首部长度 4b:TCP header 有多少个4B,例如这个TCP数据包的TCP header length显示为0101,说明这个TCP header长度为5(0101)*4 = 20B。TCP报文默认大小为20B。
  • flags 标志位 6b:CWR、ECE用于IP header的ECN字段;
  •         URG:标志紧急指针是否有效;
  •         ACK标志确认号是否有效;
  •         PSH提示接收端应用程序立即将接收缓冲区数据取走;
  •         RST处理异常连接,告知连接不一致的一方连接还没有建立好要求重新建连,RST=1复位报文段
  •         SYN用于同步,SYN=1 称为同步报文段;(1、2握手)
  •         FIN通知对方要关闭连接,FIN=1称为结束报文段。(1、3挥手)
  • window size 窗口大小 2B:流量控制,发送方发送大量数据时,接收方利用滑动窗口进行缓冲。
  • checksum 校验和 2B:和UDP检验相同;
  • options选项:建连时用于协调双方支持的内容;

3.3 TCP Segment Structure

在跟踪中间的任何地方选择一个协议列为TCP的长包。在中间面板中展开TCP协议部分(通过使用“+”扩展器或图标)。除HTTP响应的第一个HTTP GET包和最后一个HTTP响应包外,所有的报文都应该被列为TCP。选择一个长数据包可以确保我们看到的是从服务器到你的计算机的下载数据包。查看协议层,在TCP块之前看到一个IP块。这是因为TCP段是在IP中携带的。下表是TCP部分的各字段解释。  

  

3.4 TCP三次握手

记sequence number为Seq;acknowledge number为Ack;

  • 第一次握手:客户端发送一个SYN同步报文段(SYN=1的TCP数据包,包含初始序列号Seq=J),请求与服务器建立连接;
  • 第二次握手:服务器发送SYN+ACK段(SYN=ACK=1的TCP数据包,序列号Seq=K,确认号Ack=J+1),确认号=J+1表明前J+1之前的0~J都已经正确接收,已经接收了客户端发来的SYN段;
  • 第三次握手:客户端发送一个ACK段给服务器(ACK=1,Ack=K+1),表示已经正确接收服务器发来的SYN+ACK段;

具体图如下:

 在WireShark中如下:

3.5 TCP四次挥手

四次挥手的过程:

  • 第一次挥手:客户端发送结束报文段(FIN=1,Seq=U)给服务器。
  • 第二次挥手:服务器收到第一次挥手的数据包之后,向客户端发送确认报文(ACK=1,Seq=V,Ack=U+1),允许断开连接;
  • 第三次挥手:服务器发送确认报文之后,继续发送结束报文段(FIN=1,ACK=1,Seq=V,Ack=U+1)给客户端;
  • 第四次挥手:客户端接收到FIN结束报文段之后,发送确认报文(ACK=1,Seq=U+1,Ack=W+1)给服务器,告知服务器已经接收到结束报文。

服务器接收到这条ACK确认报文之后,释放TCP连接的相关资源(缓存和变量),客户端等待一段时间之后,释放处于客户端的缓存和变量。
等待一段时间TIME-WAIT:① 保证第四次挥手。客户端不确认第四次挥手时发送给服务器的ACK确认报文是否顺利到达服务器。如果没有顺利到达,服务器会重新进行第三次挥手,直到正确接收客户端第四次挥手的ACK确认报文段。所以不可以立即释放客户端资源,这会导致服务器重新进行的第三次挥手失败。② 防止新连接中出现旧连接的报文段。四次挥手完成之后,不代表之前通过这个连接发送的所有数据都已经处理完了,有些可能在网络中传输。如果立即释放资源,然后再在用一对源端口、目的端口建立TCP连接,可能导致上一次连接中遗留在网络中的报文在新连接中到达,会被当成是新连接的数据进行处理,这就产生了错误。所以需要等待2MSL时长,确保旧连接的报文都从网络中消失。
四次挥手:TCP是全双工的,当客户端要关闭连接时,服务器要发送的数据不一定发完了,所以第二、三次挥手都是服务器完成的,第二次确认知道要关闭连接,第三次告知客户端服务器数据也发送完毕可以断开;CLOSE-WAIT等待服务器发送完数据;第四次挥手返回ACK报文段完才进入TIME-WAIT。因为结束时涉及数据有没有传送完这个问题,所以不同于建立连接时只用三次握手。

 3.6 TCP数据传输 

在wireshark里面点击统计-IO图标。弹出界面如下:  

接下来依次进行以下操作

  1.  间隔选择1分钟
  2. Y轴单位改为Bits
  3. Display Filter:填入tcp.srcport==80
  4. 点击“+”,在新的条目的Display Filter里面填入tcp.dstport==80。最终得到两条线,青色的表示下载速率,红色的表示上传速率,如下所示: 

4. 问题回答

问题1:在SYN数据包上,TCP包含了哪些选项字段以供跟踪。
答:ACK字段和SYN字段。

问题2:当TCP连接正常的时候,下载方向的粗略数据速率(以包/秒或位/秒为单位)是多少?

答:大约是50000bps

问题3:内容占下载率的百分比是多少?展示你的计算。

答:使用tcp.srcport==80 进行过滤,找到任意一个中间位置的大型包。可以看到,总的数据量为1514B=12112bits。而TCP携带的内容占1460B。所以内容占下载率的96.43%。

问题4:由于ACK报文,上传方向的粗略速率(比特/秒)是多少?
答:缩放坐标轴后可以看到,速率大约为21.7Kbps。

问题5:如果最近从服务器接收到的TCP段的序列号是X,那么下一个传输的TCP段携带的ACK号是什么?

答:下一个报文ACK号是X加上这个报文的长度segment length。

5. 自我探索

TCP拥塞控制:拥塞窗口cwnd(congestion window):发送方维护一个状态变量(即拥塞窗口),大小取决于网络的拥塞程度且动态变化。发送方自己的发送窗口=拥塞窗口;如果要考虑接收方的接受能力,发送窗口可能<拥塞窗口。
原则:只要网络没有出现拥塞(发送方没有按时收到ACK确认报文),就增大窗口;若出现拥塞减少拥塞窗口。

探索TCP可靠性机制:
1. 超时重传机制:超过时间还未收到ACK则重新发送。
2. 校验和:校验和错误时重传。
3. 序列号:序列号能够确认缺少了哪个位置的数据,保证按序到达,同时筛除重复数据。
4. 确认应答机制:ACK标志位=1时,检查Ack=U+1,说明前U个数据包都正确接收。

SACK: TCP的一个选项,允许TCP单独确认非连续片段,用于告知真正丢失的包,只重传丢失的片段。options字段中:SACKpermitted 当发送序列中某个数据包丢失,可通过SACK报文通知发送方这个丢了,发送方于是重新传丢失的包,而不是全部重发。

6. 总结 

本文到这里就结束啦~~
如果觉得对你有帮助,辛苦友友点个赞哦~

相关文章:

【计算机网络】lab7 TCP协议

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;计算机网络_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 实验目的…...

计算机视觉:解锁未来智能世界的钥匙

计算机视觉&#xff1a;解锁未来智能世界的钥匙 在信息技术飞速发展的今天&#xff0c;计算机视觉作为人工智能领域的一个重要分支&#xff0c;正以前所未有的速度改变着我们的生活与工作方式。它使机器能够“看”并理解图像和视频中的信息&#xff0c;为自动驾驶、医疗影像分…...

Java的Stream流和Option类

1. Stream 流 背景 Stream是Java 8引入的一个用于处理集合&#xff08;或其他数据源&#xff09;中的元素的API。它提供了一种声明式的方式来处理数据&#xff0c;并可以链式调用。Stream支持惰性求值&#xff0c;也支持并行流处理。 1.1 创建 Stream 创建一个Stream可以通…...

深入理解ASP.NET Core 管道的工作原理

在 .NET Core 中&#xff0c;管道&#xff08;Pipeline&#xff09;是处理 HTTP 请求和响应的中间件组件的有序集合。每个中间件组件都可以对请求进行处理&#xff0c;并将其传递给下一个中间件组件&#xff0c;直到请求到达最终的处理程序。管道的概念类似于流水线&#xff0c…...

多模态论文笔记——CLIP

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍这几年AIGC火爆的隐藏功臣&#xff0c;多模态模型&#xff1a;CLIP。 文章目录 CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09…...

brpc之baidu_protocol

简介 是brpc默认使用的协议 初始化 Protocol baidu_protocol { ParseRpcMessage,SerializeRequestDefault, PackRpcRequest,ProcessRpcRequest, ProcessRpcResponse,VerifyRpcRequest, NULL, NULL,CONNECTION_TYPE_ALL, "baidu_std" };协议定义 定义在baidu_rpc…...

LeetCode:39. 组合总和

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;39. 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 cand…...

SOLID原则学习,开闭原则(Open Closed Principle, OCP)

文章目录 1. 定义2. 开闭原则的详细解释3. 实现开闭原则的方法4. 总结 1. 定义 开闭原则&#xff08;Open-Closed Principle&#xff0c;OCP&#xff09;是面向对象设计中的五大原则&#xff08;SOLID&#xff09;之一&#xff0c;由Bertrand Meyer提出。开闭原则的核心思想是…...

Unreal Engine 5 C++ Advanced Action RPG 七章笔记

第七章 Ranged Enemy 2-Ranged Enemy Starting Weapon 制作新敌人的流程准备 新敌人的武器起始的状态数据自己的战斗能力投射能力自己的行为树 创建角色,添加武器,添加数据,就是继承之前的基类敌人的 运行结果 3-Glacer Starting Stats 看看就行,就是复制曲线表格更改数…...

自动连接校园网wifi脚本实践(自动网页认证)

目录 起因执行步骤分析校园网登录逻辑如何判断当前是否处于未登录状态&#xff1f; 书写代码打包设置开机自动启动 起因 我们一般通过远程控制的方式访问实验室电脑&#xff0c;但是最近实验室老是断电&#xff0c;但重启后也不会自动连接校园网账户认证&#xff0c;远程工具&…...

HTTP/HTTPS ⑤-CA证书 || 中间人攻击 || SSL/TLS

这里是Themberfue ✨上节课我们聊到了对称加密和非对称加密&#xff0c;实际上&#xff0c;单纯地非对称加密并不能保证数据不被窃取&#xff0c;我们还需要一个更加重要的东西——证书 中间人攻击 通过非对称加密生成私钥priKey和公钥pubKey用来加密对称加密生成的密钥&…...

traceroute原理探究

文章中有截图&#xff0c;看不清的话&#xff0c;可以把浏览器显示比例放大到200%后观看。 linux下traceroute的原理 本文通过抓包观察一下linux下traceroute的原理 环境&#xff1a;一台嵌入式linux设备&#xff0c;内网ip是192.168.186.195&#xff0c;其上有192.168.202.…...

50_Lua垃圾回收

1.Lua垃圾回收机制概述 Lua采用了一种自动内存管理机制,称为垃圾回收(Garbage Collection, GC)。垃圾回收的主要目的是回收程序中不再被使用的内存,从而避免内存泄漏。Lua的垃圾回收器负责回收动态分配的对象,如函数、用户数据、表、字符串、线程、内部结构等。Lua的垃圾…...

Git-2-:Cherry-Pick 的使用场景及使用流程

前面我们说了 Git合并、解决冲突、强行回退等解决方案 >> 点击查看 这里再说一下 Cherry-Pick功能&#xff0c;Cherry-Pick不是merge&#xff0c;只是把部分功能代码Cherry-Pick到远程的目标分支 git cherry-pick功能简介&#xff1a; git cherry-pick 是用来从一个分…...

【C++】21.map和set的使用

文章目录 1. 序列式容器和关联式容器2. set系列的使用2.1 set和multiset参考文档2.2 set类的介绍2.3 set的构造和迭代器构造函数&#xff1a;双向迭代器迭代器&#xff1a; 2.4 set的增删查2.5 insert和迭代器遍历使用样例&#xff1a;2.6 find和erase使用样例&#xff1a;2.7 …...

burpsiute的基础使用(2)

爆破模块&#xff08;intruder&#xff09;&#xff1a; csrf请求伪造访问&#xff08;模拟攻击&#xff09;: 方法一&#xff1a; 通过burp将修改&#xff0c;删除等行为的数据包压缩成一个可访问链接&#xff0c;通过本地浏览器访问&#xff08;该浏览器用户处于登陆状态&a…...

ElasticSearch 同义词匹配

synonym.txt 电脑, 计算机, 主机 复印纸, 打印纸, A4纸, 纸, A3 平板电脑, Pad DELETE /es_sku_index_20_20250109 PUT /es_sku_index_20_20250109 {"settings": {"index": {"number_of_shards": "5","number_of_replicas&quo…...

linux RT-Preempt spin lock实现

一、spin_lock概述 Spinlock是linux内核中常用的一种互斥锁机制&#xff0c;和mutex不同&#xff0c;当无法持锁进入临界区的时候&#xff0c;当前执行线索不会阻塞&#xff0c;而是不断的自旋等待该锁释放。正因为如此&#xff0c;自旋锁也是可以用在中断上下文的。也正是因为…...

PySpark广播表连接解决数据倾斜的完整案例

使用PySpark解决数据倾斜问题的完整案例&#xff0c;通过广播表连接的方式来优化性能。 准备数据 假设我们有两张表&#xff0c;一张大表 big_table 和一张小表 small_table &#xff0c;小表将作为广播表。 from pyspark.sql import SparkSession# 初始化SparkSession spar…...

Chromium CDP 开发(十二):为自己的Domain建立custom_config.json

引言 本章详细介绍了如何为自定义的 CDP Domain 创建 custom_config.json 文件&#xff0c;并通过修改 BUILD.gn 文件来确保自定义的配置文件参与编译。我们通过 inspector_protocol_generate 配置段自动生成自定义 Domain 的头文件和实现文件&#xff0c;并成功将其集成到构建…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...