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

计算机网络综合实验指南

计算机网络综合实验指南

本实验将结合《计算机网络自顶向下》前三章的核心概念,通过实际操作加深对应用层、运输层和网络层的理解。实验涵盖 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.xdnf.cn/news/750.html

相关文章:

  • 【Rust 精进之路之第14篇-结构体 Struct】定义、实例化与方法:封装数据与行为
  • 【操作系统原理06】虚拟存储器
  • CLion编译器中配置ARM嵌入式开发环境教程
  • 面试题:循环引用两个节点相互引用,如何判断哪个用 shared_ptr?哪个用 weak_ptr?
  • ThreadLocal - 原理与应用场景详解
  • 蓝桥杯 二进制问题 刷题笔记
  • 一个旅行攻略需要调用多少个MCP的服务?
  • 松灵Cobot Magic双臂具身遥操机器人(基于ROS的定位建图与协同导航技术)
  • 网工_DHCP协议
  • AI与思维模型【67】——元认知
  • 使用docker任意系统编译opengauss
  • Vue.js 入门教程
  • Spring 微服务解决了单体架构的哪些痛点?
  • 分布式入门
  • 七段码 路径压缩 并查集 dfs
  • 思维题专题
  • K8s-Pod详解
  • 第一讲 生成式ai是什么
  • 头歌java课程实验(函数式接口及lambda表达式)
  • 【AI论文】CLIMB:基于聚类的迭代数据混合自举语言模型预训练
  • 2026《数据结构》考研复习笔记四(第一章)
  • 单例模式与消费者生产者模型,以及线程池的基本认识与模拟实现
  • Java学习手册:Filter 和 Listener
  • synchronized 与分布式锁
  • 约束:常见约束(常见约束-例子,外键约束)
  • Laravel-vite+vue开发前端模板
  • 最新扣子空间实操指南
  • QML--全局对象Qt
  • 1.Vue自动化工具安装(Vue-cli)
  • 自定义请求头导致跨域的解决办法