# 华东师范大学数据科学与工程学院学生期末项目报告

课程名称:计算机网络与编程年级:22 级上机实践成绩
指导教师:张召姓名:邓博昊学号:10225501432
上机实践名称上机实践日期:2024/3/1
上机实践编号组号上机实践时间:10:02

# 一、 题目要求

  • Task1: 创建一个以自己学号 + 姓名拼音命名的 java 项目,编写 java 代码以实现将自己的学号和姓名打印

    出来的效果,请将操作过程中的关键步骤和实验结果截图附在实验报告中 (建议使用方框等形式突出截图

    中关键部分),并仔细书写实验报告。

  • Task2: 访问自己经常访问的网站,并利用 wireshark 将访问过程中的网络包抓取下来,同时根据不同的

    过滤规则删选特定的网络包,请将操作过程中的关键步骤和实验结果截图附在实验报告中 (建议使用方框

    等形式突出截图中关键部分),并仔细书写实验报告。

# 二、 功能实现情况

# Task 1

# 1. 创建项目

image-20240229125430475

# 2. 创建 Package

image-20240229125754848

# 3. 在新创建的 Package 中创建 Class

image-20240229125843275

# 4. 编写简单 Java 代码

image-20240229130152979

package cc.aquaoh.print;
public class Main {
    public static void main(String[] args) {
        System.out.println("姓名 = 邓博昊");
        System.out.println("学号 = 10225501432");
    }
}

# 5. 运行结果

image-20240229130212067

# Task 2

# 1. 选择网卡

f326bb309df1478a4d8f6142158983c2

# 2. 查看 IP 信息

  • 查看内网地址

    fb13300905d6b513635cb472d7eeb210

# 3. 访问网站 MC 百科并开始捕获分组

网站地址为: https://mcmod.cn

c43c000f3595634cd1ff2eaadbc5ebd0

image-20240301104502935

# 4. 通过 DNS 解析记录获取网站 IP

  • 查找网站的 IPV4 (即 A 类地址) DNS 请求报文

    19e9ab4602f81c9e717bba6fac8f4134

  • 查看网站的 IPV4 DNS 响应报文

    通过分析,www.mcmod.cn 的服务器地址为 114.80.30.41

    089ca87794d10c0f64d5f4ebd967da0d

  • 验证地址是否正确

    打开浏览器 F12 开发者工具,点击网络工具

    a6e21651da5a9309db0f39f698f0475c

# 5. 查看 IP 地址为 114.80.30.41 的所有记录

image-20240307110339831

# 6.TCP 三次握手

三次握手过程

  • 第一次握手:客户端发送 SYN 包至服务器,并进入 SYN_SENT 状态,等待服务器确认

  • 第二次握手:服务器收到客户端的 SYN 包,发送一个 ACK,同时发送自己的 SYN,此时服务器进入 SYN_RCVD 状态

  • 第三次握手:客户端接收到服务器发送的 SYN+ACK 后,进入 ESTABLISHED 状态,并发送服务器 SYN 包的确认 ACK,服务器接收到客户端 ACK 后,进入 ESTABLISHED 状态
    image-20240307110630167

    img

# 第一次握手,客户端发送 SYN 报文 到服务器
  • 客户端作为源主机通过向服务器(作为目的主机)发送 TCP 连接请求(SYN 段),其中 flags 处,SYN=1,ACK=0;并且 Seq = 0。

  • 客户端进入 SYN_SENT 状态。

image-20240307110936481

# 第二次握手,服务器接收到 客户端的 SYN 报文,回复 SYN + ACK 报文
  • 服务器在指定的端口等待连接,收到 TCP 连接请求后,将回应一个 TCP 连接应答(即 SYN/ACK 段),其中 Flags 显示是 SYN=1,ACK=1;序列号不变,但确认号(ACK)为客户端的初始序列号加一。

  • 服务器进入 SYN_RCVD 状态

    image-20240307112514400

image-20240307111126823

# 第三次握手,客户端接收到服务端的 SYN+ACK 报文后,回复 ACK 报文
  • 客户端再向服务器发送一个 TCP 连接确认报文,其中 Flags 处 SYN=0,ACK=1;序列号为客户端初始序列号加一,确认好为服务器的初始序列号加一。

  • 此时客户端和服务器都进入 ESTABLISHED 状态。

  • 经过上述的三次握手,TCP 连接正式建立,双方都置为 ACK flag,交换并确认了对方的初始序列号。

    image-20240307121621954

image-20240307111404458

# 7.TCP 四次挥手

  • 第一次挥手:主动关闭方发送一个 FIN 并进入 FIN_WAIT1 状态

  • 第二次挥手:被动关闭方接收到主动关闭方发送的 FIN 并发送 ACK,此时被动关闭方进入 CLOSE_WAIT 状态;主动关闭方收到被动关闭方的 ACK 后,进入 FIN_WAIT2 状态

  • 第三次挥手:被动关闭方发送一个 FIN 并进入 LAST_ACK 状态

  • 第四次挥手:主动关闭方收到被动关闭方发送的 FIN 并发送 ACK,此时主动关闭方进入 TIME_WAIT 状态,经过 2MSL 时间后关闭连接;被动关闭方收到主动关闭方的 ACK 后,关闭连接

image-20240307122956933

img

# 第一次挥手 FIN + ACK

服务器 IP 地址为:114.80.30.41

可见该次挥手由服务器发起

image-20240307125320998

# 第二次挥手 ACK

image-20240307125839484

# 第三次挥手 FIN + ACK

image-20240307130118895

# 第四次握手 ACK

image-20240307130316200

# 三、 性能测试情况

# Task 1

Java 的 System.out.println 方法性能开销在仅调用两次中可忽略不计

但在生产环境中使用 System.out.print 可能导致性能问题,原因如下:

  1. I/O 操作开销: System.out.print 将信息输出到控制台,这是一个 I/O 操作。I/O 操作通常比内存操作和 CPU 操作慢得多。大量的 System.out.print 调用可能会导致程序运行速度变慢,从而影响性能。
  2. 阻塞问题: System.out.print 在输出时可能会阻塞,特别是在多线程环境下。由于控制台输出是线程安全的,因此多个线程同时输出时,它们可能需要等待其他线程完成输出。这种阻塞会导致线程等待时间增加,从而影响整体性能。
  3. 日志级别和过滤:与专业的日志框架相比, System.out.print 不支持日志级别设置和过滤。在生产环境中,通常需要根据不同的日志级别(如 DEBUG、INFO、WARN、ERROR)来控制日志输出。使用 System.out.print 无法实现这一目的,可能会导致输出大量不必要的信息,从而影响性能。
  4. 日志管理不便: System.out.print 输出的日志无法进行方便的管理和归档。在生产环境中,日志记录通常需要存储在磁盘上以供分析和审计。专业的日志框架可以方便地将日志输出到文件、数据库或远程服务器,而 System.out.print 则无法提供这些功能。

# Task 2

Wireshark 在网站抓包过程中可以有效抓取数据包。

其在抓取网站数据过程中性能开销较小,所占用 CPU、内存、磁盘资源非常小

image-20240307131109493

但如果抓取下载文件时的数据包,其性能开销将会增大,且随着记录的数据包条目越来越多,其所占内存也会越来越多

可以推测当所抓取的数据包条目使得内存溢出时,wireshark 可能会崩溃

image-20240307131501956

# 四、总结

# Task 1: 创建 Java 项目并打印学号和姓名

在这个任务中,我学会了如何使用 IDE 创建 Java 项目,并在其中编写简单的 Java 代码。通过实现打印学号和姓名的功能,我加深了对 Java 基本语法和程序结构的理解。此外,对于项目管理和代码组织也有了更清晰的认识。

# Task 2: 使用 Wireshark 抓取网络包

在这个任务中,我了解了 Wireshark 这个强大的网络抓包工具的基本用法。通过设置过滤规则和观察捕获的数据包,我能够深入了解网络通信的细节,包括协议、数据传输过程等。详细分析了 TCP 协议的三次握手和四次挥手这对于网络调试和安全分析都非常有帮助。