计算机网络综合实验指南

计算机网络综合实验指南

本实验将结合《计算机网络自顶向下》前三章的核心概念,通过实际操作加深对应用层、运输层和网络层的理解。实验涵盖 HTTP/TCP抓包分析DNS解析观察网页性能评估简单Socket编程,帮助你将理论转化为实践。


实验准备

  • 工具

    • Wireshark(下载链接)

    • Chrome 浏览器

    • Python 环境(推荐安装 Python 3.x)

  • 网络环境:确保能访问互联网(如访问 http://example.com)。


实验任务 1:使用 Wireshark 捕获 HTTP/TCP 流量

目标:观察 TCP 三次握手、HTTP 请求/响应、TCP 四次挥手。
步骤
  1. 启动 Wireshark

    • 选择监听的网络接口(如 Wi-Fi)。

    • 设置过滤条件:tcp.port == 80(仅捕获 HTTP 流量)。

    • 点击 蓝色鲨鱼鳍按钮 开始抓包。

  2. 触发 HTTP 请求

    • 打开浏览器,访问 http://example.com

  3. 停止抓包

    • 返回 Wireshark,点击 红色方块按钮 停止捕获。

  4. 分析数据包

    • TCP 三次握手

      • 查找前三个 TCP 包(Flags: SYN → SYN-ACK → ACK)。

      • 点击 SYN 包,查看 Transmission Control Protocol 下的 Sequence Number 和 Acknowledgment Number

    • HTTP 请求/响应

      • 查找 GET / HTTP/1.1 请求包,展开 Hypertext Transfer Protocol 查看请求头。

      • 找到状态码为 200 OK 的响应包,查看响应内容。

    • TCP 四次挥手

      • 过滤 tcp.flags.fin == 1,观察 FIN 和 ACK 包的交互。

验证问题
  1. 三次握手中,Client 和 Server 的初始序列号(ISN)分别是多少?

  2. HTTP 响应包中的 Content-Type 是什么?

  3. 四次挥手中,哪一方先发送了 FIN 包?


实验任务 2:分析 DNS 查询

目标:理解域名解析过程,观察 DNS 协议交互。
步骤
  1. 清空 DNS 缓存(可选)

    • Windows:ipconfig /flushdns

    • macOS/Linux:sudo dscacheutil -flushcache

  2. 捕获 DNS 流量

    • 在 Wireshark 中设置过滤条件:dns

    • 在浏览器中访问一个新域名(如 http://neverssl.com)。

  3. 分析 DNS 数据包

    • 查找 DNS Query 和 DNS Response

    • 展开 Domain Name System,查看查询类型(如 A 记录)、响应 IP 地址。

    • 注意事务 ID(Transaction ID)如何匹配请求与响应。

验证问题
  1. DNS 查询的类型是 A 记录还是 AAAA 记录?

  2. 域名解析耗时多少毫秒?(查看 Time 列)

  3. DNS 响应中返回的 IP 地址是什么?


实验任务 3:使用 Chrome 开发者工具分析网页性能

目标:评估网页加载性能,识别关键耗时阶段。
步骤
  1. 打开 Network 面板

    • Chrome 中按 F12 → 切换到 Network 标签。

    • 勾选 Disable cache(避免缓存干扰)。

  2. 捕获网页加载过程

    • 访问一个复杂网页(如 http://www.nytimes.com)。

    • 观察所有请求的加载顺序和时间线。

  3. 分析性能瓶颈

    • 按 Time 列排序,找到耗时最长的请求。

    • 点击该请求 → 查看 Timing 标签,分析各阶段耗时:

      • Queuing:请求排队时间。

      • DNS Lookup:DNS 查询耗时。

      • Initial connection:TCP 握手 + SSL 握手(HTTPS)。

      • Content Download:下载内容耗时。

验证问题
  1. 页面加载共发起了多少个请求?

  2. 耗时最长的请求是哪种类型(JS、图片、XHR)?

  3. 该请求的 Content Download 阶段耗时多少?


实验任务 4:编写简单的 Socket 程序

目标:体验 TCP/UDP 通信,理解协议差异。
步骤
  1. TCP 客户端/服务端通信

    • 服务端代码(Python)

      python

      import socket
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.bind(('0.0.0.0', 8080))
      s.listen()
      conn, addr = s.accept()
      print(f"Connected by {addr}")
      data = conn.recv(1024)
      print(f"Received: {data.decode()}")
      conn.send(b"Hello from server!")
      conn.close()
    • 客户端代码(Python)

      python

      import socket
      s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
      s.connect(('localhost', 8080))
      s.send(b"Hello from client!")
      data = s.recv(1024)
      print(f"Received: {data.decode()}")
      s.close()
    • 运行观察

      • 先启动服务端,再运行客户端,查看控制台输出。

  2. UDP 客户端/服务端通信

    • 服务端代码

      python

      import socket
      s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      s.bind(('0.0.0.0', 8080))
      data, addr = s.recvfrom(1024)
      print(f"Received from {addr}: {data.decode()}")
      s.sendto(b"Hello from UDP server!", addr)
    • 客户端代码

      python

      import socket
      s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
      s.sendto(b"Hello from UDP client!", ('localhost', 8080))
      data, addr = s.recvfrom(1024)
      print(f"Received: {data.decode()}")
      s.close()
    • 运行观察

      • 注意无需建立连接,直接发送数据。

验证问题
  1. TCP 和 UDP 在代码中有何关键区别?

  2. 如果先启动客户端再启动服务端,TCP 和 UDP 的行为有何不同?

  3. UDP 服务端能否收到客户端消息?为什么?


实验总结与拓展

知识点回顾
  • 应用层:HTTP/DNS 协议格式、网页性能优化。

  • 运输层:TCP 可靠传输机制(握手、挥手)、UDP 无连接特性。

  • 工具使用:Wireshark 抓包、Chrome 开发者工具分析。

拓展挑战
  1. 使用 Wireshark 捕获 HTTPS 流量(需导入浏览器证书)。

  2. 修改 Socket 程序,实现多客户端并发通信(TCP 多线程)。

  3. 分析 HTTP/2 与 HTTP/1.1 的流量差异(如多路复用)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AI部署】腾讯云GPU-RUN—SadTalker的AI数字人视频—未来之窗超算中心

磁盘空间 创建未来之窗 查看磁盘命令 df -h 指定路径创建环境 conda create --prefix sadtalker python3.10 指令路径运行环境 conda activate ./sadtalker 安装环境 pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://…

爬虫利器SpiderTools谷歌插件教程v1.0.0!!!web端JavaScript环境检测!!!

SpiderTools谷歌插件教程v1.0.0 一、SpiderTools简介二、下载通道三、插件介绍四、插件使用五、工具函数使用 补环境工具推荐:爬虫补环境利器webEnv 一、SpiderTools简介 SpiderTools主要用于检测和监控网页的JavaScript运行环境。该插件可以帮助开发者更好地查看…

Android开发协调布局滑动悬停

Android开发协调布局滑动悬停 直接给个xml,防止下次忘了怎么写。 <?xml version="1.0" encoding="utf-8"?> <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"x…

Linux学习——TCP

一.TCP编程API 1.socket函数 1.socket函数 include include int socket(int domain,int type,int protocol); 参数 domain AF_INET AF_INET6 AF_UNIX,AF_LOCAL AF_NETLINK AF_PACKET type SOCK_STREAM: 流式…

Linux驱动开发--异步通知与异步I/O

3、异步通知与异步I/O 3.1 Linux信号 阻塞与非阻塞访问、poll()函数提供了较好的解决设备访问的机制&#xff0c;但是如果有了异步通知&#xff0c;整套机制则更加完整了。 异步通知的意思是&#xff1a;一旦设备就绪&#xff0c;则主动通知应用程序&#xff0c;这样应用程序…

大语言模型推理能力的强化学习现状理解GRPO与近期推理模型研究的新见解

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Linux系统】Linux基础指令(详解Linux命令行常用指令,每一个指令都有示例演示)

文章目录 一、与文件路径相关的指令0.补充知识&#xff1a;路径的认识1.pwd 指令2.cd 指令&#xff08;含家目录的介绍&#xff09; 二、创建和删除文件的指令0.补充知识&#xff1a;普通文件和目录文件1.touch 指令&#xff08;可以修改文件的时间戳&#xff09;2.mkdir 指令3…

LangChain 单智能体模式示例【纯代码】

# LangChain 单智能体模式示例import os from typing import Anyfrom langchain.agents import AgentType, initialize_agent, Tool from langchain_openai import ChatOpenAI from langchain.tools import BaseTool from langchain_experimental.tools.python.tool import Pyt…

解决:VSCode C++ conan 安装第三方库后 头文件报错

文章目录 1 头文件include路径查找报错参考 1 头文件include路径查找报错 找到conan_toolchain.cmake中 INCLUDE_PATH list(PREPEND CMAKE_INCLUDE_PATH "/Users/hanliqiang/.conan2/p/b/fmte8c4f7a755477/p/include")生成C编译配置 CtrlShiftP 中选择C Edit Confi…

松灵Cobot Magic双臂具身遥操机器人(基于ROS的定位建图与协同导航技术)

摘要 本文以CobotMagic可移动协作机器人为研究对象&#xff0c;从硬件架构设计、软件系统架构、多传感器融合定位建图系统、智能导航系统协同机制四个维度&#xff0c;深入解析机器人系统工作原理。重点研究多传感器融合定位建图系统实现原理&#xff0c;结合实测数据验证系统…

回归,git 分支开发操作命令

核心分支说明 主分支&#xff08;master/production&#xff09;存放随时可部署到生产环境的稳定代码&#xff0c;仅接受通过测试的合并请求。 开发分支&#xff08;develop&#xff09;集成所有功能开发的稳定版本&#xff0c;日常开发的基础分支&#xff0c;从该分支创建特性…

ASP.NET Core 最小 API:极简开发,高效构建(下)

在上篇文章 ASP.NET Core 最小 API&#xff1a;极简开发&#xff0c;高效构建&#xff08;上&#xff09; 中我们添加了 API 代码并且测试&#xff0c;本篇继续补充相关内容。 一、使用 MapGroup API 示例应用代码每次设置终结点时都会重复 todoitems URL 前缀。 API 通常具有…

Spring之我见 - Spring Boot Starter 自动装配原理

欢迎光临小站&#xff1a;致橡树 Spring Boot Starter 的核心设计理念是 约定优于配置&#xff0c;其核心实现基于 自动配置&#xff08;Auto-Configuration&#xff09; 和 条件化注册&#xff08;Conditional Registration&#xff09;。以下是其生效原理&#xff1a; 约定…

精益数据分析(7/126):打破创业幻想,拥抱数据驱动

精益数据分析&#xff08;7/126&#xff09;&#xff1a;打破创业幻想&#xff0c;拥抱数据驱动 在创业的道路上&#xff0c;我们都怀揣着梦想&#xff0c;但往往容易陷入自我编织的幻想中。我希望通过和大家一起学习《精益数据分析》&#xff0c;能帮助我们更清醒地认识创业过…

牛客java练习题

[toc] 1.依赖注入 依赖注入是一种设计模式和编程思想,不依赖 具体的框架实现,可以通过多种方式和框架来实现可以通过Spring , Google Guice , PicoContainer 等都可以实现依赖注入,也可以通过手动编写实现目的: 为了解耦合,将对象之间的依赖关系从代码中解耦出来, 使系统更加…

大模型应用开发自学笔记

理论学习地址&#xff1a; https://zh.d2l.ai/chapter_linear-networks/index.html autodl学术加速&#xff1a; source /etc/network_turboconda常见操作: 删除&#xff1a; conda remove --name myenv --all -y导出&#xff1a; conda env export > environment.yml…

鸿蒙ArkUI实战之TextArea组件、RichEditor组件、RichText组件、Search组件的使用

本文接上篇继续更新ArkUI中组件的使用&#xff0c;本文介绍的组件有TextArea组件、RichEditor组件、RichText组件、Search组件&#xff0c;这几个组件的使用对应特定场景&#xff0c;使用时更加需要注意根据需求去使用 TextArea组件 官方文档&#xff1a; TextArea-文本与输…

除了`String`、`StringBuffer` 和 `StringBuilder`之外,还有什么处理字符串的方法?

一、标准库中的字符串处理类 1. StringJoiner&#xff08;Java 8&#xff09; 用途&#xff1a;用于在拼接字符串时自动添加分隔符、前缀和后缀。示例&#xff1a;StringJoiner sj new StringJoiner(", ", "[", "]"); sj.add("A").…

Qt中读写结构体字节数据

在Qt中读写结构体字节数据通常涉及将结构体转换为字节数组(QByteArray)或直接从内存中读写。以下是几种常见方法&#xff1a; 方法1&#xff1a;使用QDataStream读写结构体 cpp #include <QFile> #include <QDataStream>// 定义结构体 #pragma pack(push, 1) //…

Windows 10 上安装 Spring Boot CLI详细步骤

在 Windows 10 上安装 Spring Boot CLI 可以通过以下几种方式完成。以下是详细的步骤说明&#xff1a; 1. 手动安装&#xff08;推荐&#xff09; 步骤 1&#xff1a;下载 Spring Boot CLI 访问 Spring Boot CLI 官方发布页面。下载最新版本的 .zip 文件&#xff08;例如 sp…