使用WireShark抓包分析TCP_IP协议

news/2024/3/29 10:28:19/文章来源:https://blog.csdn.net/qq_23091073/article/details/130382623

文章目录

  • 前言
  • 一、TCP/IP协议
    • 1.1 OSI分层
    • 1.2 TCP/IP 分层
  • 二、抓包
    • 2.1 Socket代码
    • 2.2 过滤包
  • 三、分析
    • 3.1 TCP首部
    • 3.2 实战分析
    • 3.3 三次握手
    • 3.4 四次挥手
  • 参考

前言

TCP/IP 协议 是一组用于互联网通信的协议。它由两个主要协议组成:传输控制协议(TCP)和互联网协议(IP)。TCP/IP协议是互联网上最常用的协议之一,它使得不同类型的计算机和网络设备能够相互通信。

  • TCP负责将数据分割成数据包,并确保它们在网络上的传输。
  • IP负责将数据包从源地址路由到目标地址。

计算机网络(谢希仁编著)这本书中,详细介绍了TCP/IP网络传输涉及的分层,及各个比特的含义。在这篇文章中,我们将使用Wireshark 抓包分析 TCP/IP 协议,用实践来验证理论。

  • Wireshark是一个网络协议分析器,可以帮助你抓取和分析网络数据包,它是一个开源软件,可以在多个操作系统上
    运行。
  • Wireshark 最新版下载地址:https://www.wireshark.org。

一、TCP/IP协议

1.1 OSI分层

OSI 是 OSI/RM(Open Systems Interconnecation Reference Model)开放互联基本参考模型的简称,由 ISO 于 1983 年制定,形成正式文件。

OSI 分层是一种网络架构模型,它将网络通信分为七个不同的层次。每个层次都有自己的功能和任务。下面是由上到下每个层次的简要介绍:

序号层级名称
1应用层负责提供各种应用程序,例如电子邮件、文件传输和远程登录等。
2表示层负责将数据转换为应用程序可以理解的格式,它定义了如何在不同的系统之间交换数据。
3会话层负责建立、管理和终止会话,它定义了如何在两个节点之间建立连接。
4传输层负责将数据分割成数据包,并确保它们在网络上的传输。它还提供了可靠的端到端传输服务。
5网络层负责将数据包从源地址路由到目标地址,它定义了如何在不同的网络之间传输数据包。
6数据链路层负责将数据包从一个节点传输到另一个节点,它定义了如何在物理介质上传输数据包。
7物理层负责将数据从一个节点传输到另一个节点,它定义了电气、光学和机械接口的规范。

虽然标准已经制定了,但是由于一些缺陷,现今规模最大的、覆盖全世界的因特网并未使用 OSI 标准,而是使用 TCP/IP 标准。

1.2 TCP/IP 分层

相比OSI 7层模型,TCP/IP协议只有4层,它将部分层进行了合并。

通常讲的TCP/IP协议是指TCP/IP协议簇,按照分层可以分为以下部分

层级协议名称
应用层HTTP、FTP、SMTP、POP3、IMAP、Telnet、SSH、DNS
传输层TCP、UDP
网络层IP、ICMP、ARP、RARP
网络接口层Ethernet、Token Ring、FDDI、PPP

下面抓包使用的 WireShark 用的就是TCP/IP标准。

二、抓包

2.1 Socket代码

使用 Java 编写服务端和客户端代码, 通过调用 Socket API 实现两者通讯。

Socket 即套接字,是应用层 与 TCP/IP 协议族通信的中间软件抽象层,表现为一个封装了 TCP / IP协议簇 的编程接口(API),ServerSocket 是使用 TCP 协议,如果想使用 UDP 协议,可以使用 DatagramSocket。

WireShark 需要管理员权限启动,默认不能查看不走网卡的 loopback,需要下个 npcap。

  1. Server.java

    public class Server {public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(10007);System.out.println("服务器已启动,等待客户端连接...");Socket socket = server.accept();System.out.println("客户端已连接!");BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));String str = br.readLine();System.out.println("客户端说:" + str);PrintWriter pw = new PrintWriter(socket.getOutputStream());pw.println("欢迎您!");pw.flush();socket.close();}
    }
    
  2. Client.java

    public class Client {public static void main(String[] args) throws IOException, InterruptedException {Socket socket = new Socket("localhost", 10007);BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str = br.readLine();PrintWriter pw = new PrintWriter(socket.getOutputStream());pw.println(str);pw.flush();BufferedReader br2 = new BufferedReader(new InputStreamReader(socket.getInputStream()));String str2 = br2.readLine();System.out.println("服务器说:" + str2);socket.close();}
    }
    

2.2 过滤包

  1. 使用管理员权限开启 Wireshark

  2. 选择对应的网卡接口
    loopback.png

  3. 开启过滤

    tcp_10007.png

  4. 启动Server,再启动Client,发送hello

  5. 已过滤的包

    tcp_10007_after.png

三、分析

3.1 TCP首部

TCP 首部如下所示:

3.2 实战分析

  1. 源端口和目的端口,各占2个字节

    tcp_ip_01.png

  2. 序号,占4个字节

    tcp_ip_02.png

  3. 确认号,占4个字节

    tcp_ip_03.png

  4. 数据偏移,占4位,半个字节

    tcp_ip_04_数据偏移.png

  5. 保留,占6位

    tcp_ip_05_保留.png

  6. flag 控制位: URG/ACK/PSH/RST/SYN/FIN,占6位

    tcp_ip_06_标志位.png

  7. 窗口,占2个字节

    tcp_ip_07_窗口.png

  8. 检验和,占2个字节

    tcp_ip_08_检验和.png

  9. 紧急指针,占2个字节

    tcp_ip_09_紧急指针.png

  10. 选项,字节数不固定,下面是12字节

    tcp_ip_10_选项.png

3.3 三次握手

tcp 建立连接的最先三个包就是握手的三个包,下面会从理论结合实际抓包分析三次握手具体流程

  1. 客户端发送给服务端

    客户端在建立TCP连接时,会启用一个随机的序列号,并将其值存入相互交换的第一个报文段的TCP头部的序列号字段,后续TCP报文段的序列号字段值将依次递増

    在以下抓包过程中,可以发现 0x4cf2bfaa 就是第一个包的随机序列号,而且 wireshark 已经标注相对序号Seq为0,就是第一个包.

    而且TCP 客户端在发送时需要将 SYN 设置为1,此时客户端进入SYN-SENT 状态

    tcp_ip_11_建立连接.png

  2. 服务端发送给客户端

    服务端接到报文后,同意建立连接后向客户端发送确认报文,此报文需要将 SYN 和 ACK 都设置为1,ack 设为发送过来的 seq+1,并且为自己启用一个随机序号,在报文中,可以发现随机序号为 0x890b1b78 ,此时服务器进入到 SYN-RCVD 状态

    tcp_ip_11_建立连接2.png

  3. 客户端发送给服务端

    客户端收到后还需要进行确认,再次发送报文,这次报文将 ACK 设为1,序号设为之前自身序号+1=0x4cf2bfab, 将 ack 设为服务器发送过来的序号+1=0x890b1b79,当发送过去后,进入ESTABLISHED状态,服务器接收到后也会进入ESTABLISHED状态

    tcp_ip_11_建立连接3.png

以上过程可以总结如下,在上述例子中 x 实际为 0x4cf2bfaa,y 实际为 0x890b1b78

客户端 服务器 CLOSED CLOSED LISTEN 发送SYN=1,seq=x SYN-SENT 返回SYN=1,ACK=1,seq=y,ack=x+1 SYN-RCVD 回复ACK=1,seq=x+1,ack=y+1 ESTABLISHED ESTABLISHED 客户端 服务器 TCP三次握手

3.4 四次挥手

从书上226页可以得到的图表如下:

建立连接的服务端和客户端都可以释放连接,双方需要进行四次挥手,上面 java 代码经抓包发现是服务端先释放连接

  1. 服务端发送FIN报文

    发送FIN=1, ACK=1, seq=u(此次抓包u实际为0x91dd5af1)。

    书上记载 u是前面已发送过的数据的最后一个字节的序号加1, 这个不太明白,还有实际ACK也被置为1,是否必须?后续再研究

    tcp_ip_12_释放连接1.png

  2. 客户端发送ACK=1,seq=v(此次抓包实际seq为0x6a067550),ack为u+1(此次抓包实际为0x91dd5af2)

    v是前面已发送过的数据的最后一个字节的序号加1。

    tcp_ip_12_释放连接2.png

  3. 客户端接着发送FIN=1,ACK=1,seq=w(此次抓包实际为0x6a067550),ack=u+1(此次抓包实际为0x91dd5af2)

    此处的w实际抓包发现w和v一样

    tcp_ip_12_释放连接3.png

  4. 服务端发送ACK=1,seq=u+1(此次抓包实际为0x91dd5af2),ack=w+1(此次抓包实际为0x6a067551 )

    tcp_ip_12_释放连接4.png

上述过程可以总结如下,由于客户端和服务器都可以发送FIN包释放连接,下面图表由客户端释放连接

客户端 服务器 ESTABLISHED ESTABLISHED 发送FIN=1,seq=u FIN-WAIT-1 返回 ACK=1,seq=v,ack=u+1 FIN-WAIT-2 CLOSE-WAIT 返回 FIN=1,ACK=1,seq=w,ack=u+1 LAST-ACK 回复ACK=1,seq=u+1,ack=w+1 CLOSED TIME-WAIT 等待2MSL后,CLOSED 客户端 服务器 TCP四次挥手

参考

  1. 计算机网络(第6版,谢希仁编著)
  2. OSI七层模型
  3. TCP 协议转让层规格
  4. TCP的三次握手和四次挥手

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

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

相关文章

RabbitMq-接收消息+redis消费者重复接收

在接触RammitMQ时,好多文章都说在配置中设置属性 # rabbitmq 配置 rabbitmq:host: xxx.xxx.xxx.xxxport: xxxxusername: xxxpassword: xxxxxx## 生产端配置# 开启发布确认,就是confirm模式. 消费端ack应答后,才将消息从队列中删除#确认消息已发送到队列(Queue)pub…

排查和解决CentOS系统上Nacos服务启动报错“java.net.UnknownHostException: jmenv.tbsite.net“问题

背景 环境是CentOS7操作系统,nacos服务宕掉了,启动服务的时候报错。 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.web.servlet.FilterRegistrationBean]: Factory method ‘di…

大数据管理中心规划设计方案(ppt可编辑)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 统一汇聚 推动业务数据协同5 价值提炼 支撑精准服务与科学管理6 实时感知 辅助城市治理高效运行7 大数据资源平台目标体系规划11 建设目标与思路12 使能高效协同&#xff0…

Qt+MySql开发笔记:Qt5.9.3的msvc2017x64版本编译MySql8.0.16版本驱动并Demo连接数据库测试

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130381428 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

【数据结构初阶】第七节.树和二叉树的基本操作

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:Java初阶数据结构 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目…

港科夜闻|香港科技大学(广州)与中国电信广东公司签署战略合作协议

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科技大学(广州)与中国电信广东公司签署战略合作协议。根据协议,双方将围绕各自科技创新及发展需要,整合双方的优质资源和优势能力,务实开展多方位的战略合作。本次合作&#xff0c…

6.微服务项目实战---Sleuth--链路追踪

6.1 链路追踪介绍 在大型系统的微服务化构建中,一个系统被拆分成了许多模块。这些模块负责不同的功能,组合成 系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上…

【算法与数据结构】6 学会对算法进行性能测试

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于算法与数据结构体系专栏,本专栏对于0基础者极为友好,欢迎与我一起完成算法与数据结构的从0到1的跨越 算法性能测试 一、前情回顾二、算法性能测试1.生成测试用例2.使用测…

多种内网穿透的实现方案

1. 内网穿透的应用场景 1.1. 开发调试 比如企业微信、钉钉等开发,需要一个回调地址,开发的时候,希望回调到开发的电脑上,打断点进行调试,这就需要穿透到内网的开发机器。 1.2. 演示测试 有需要演示或测试的系统&am…

SLAM论文速递:SLAM—— MID-Fusion:基于八叉树的对象级多实例动态SLAM—4.26(1)

论文信息 题目: MID-Fusion:Octree-based Object-Level Multi-Instance Dynamic SLAMMID-Fusion:基于八叉树的对象级多实例动态SLAM 论文地址: https://ieeexplore.ieee.org/abstract/document/8794371发表期刊: 2019 International Conf…

凌恩生物文献分享|一株细菌完成图也能发一区10分+!

期刊:Science of the Total Environment 影响因子:10.753 发表时间:2022 样本类型:Bosea sp. Ads-6菌株 客户单位:中国科学院微生物研究所 一、研究背景 环境中抗生素残留和耐药性的增加引发了许多…

亚马逊美国站纽扣电池标准

近日,亚马逊美国站公布要求卖家需遵守扭电池和硬币电池的新包装和警示标签规定公告。 在亚马逊销售单独的纽扣电池和硬币电池,则从2023年3月2日开始,您需要证明您的符合儿童安全包装和警告标签要求。 适用产品有;单独的纽扣电池或硬币电池&a…

Android SeekBar控制视频播放进度(二)——seekTo()不准确

Android SeekBar控制视频播放进度二——seekTo不准确 简介seekTo()视频帧 和 视频关键帧解决办法方法一方法二 简介 上一篇文章中,我们介绍了使用SeekBar控制视频播放,使用过程中发现,对于一些视频,我们拖动SeekBar进度条调节播放…

谈谈如何用开源网关进行 API 管理

需求痛点 1.企业不清楚到底有多少个API,无法形成API资产管理等问题。 2.API在不同集群的生命周期问题。 3.API运行状态监控和告警问题。 4.API请求限流、流量控制以及安全等问题。 功能介绍 Apinto的API管理提供API生命周期控制:可管理所有API&…

【DRF配置管理】如何在视图类使用get_objects()

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 DRF应用和管理 【DRF配置管理】Django使用DRF框架 【DRF配置管理】如何在视图类配置参数(一) 【DRF配置管理】如何在视图类配置参数(二) 【DRF配置管理…

跨数据中心下的 Kafka 高可用架构分析

导语 本文介绍了 Kafka 跨数据中心的两种部署方式,简要分析两种方式下的不同架构以及优缺点,对这些架构可能碰到的问题也提供了一些解决思路;同时也说明了 Kafka 跨数据中心部署的社区解决方案和商业化解决方案。 背景 Kafka 作为世界上最…

Excel技能之实用技巧,高手私藏

今天来讲一下Excel技巧,工作常用,高手私藏。能帮到你是我最大的荣幸。 与其加班熬夜赶进度,不如下班学习提效率。能力有成长,效率提上去,自然不用加班。 消化吸收,工作中立马使用,感觉真不错。…

宠物领养系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设!!! 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址:https://download.csdn.net/download/qq_50954361/87708775 更多系统资源库…

「OceanBase 4.1 体验」|大厂开始接入的国产分布式数据库,不来了解了解?

OceanBase 4.1 体验 前言OCP Express在线升级功能租户级物理备库TP(事务处理)和AP(分析处理)优化TP 性能优化AP 性能优化 结尾 前言 上次我们讲了本人自己亲自上手OceanBase 4.1的初体验,国产的分布式数据库也太太太太…

【STM32】基础知识 第八课 MDK 工程

【STM32】基础知识 第八课 MDK 工程 准备工作新建寄存器版本 MDK 工程步骤新建工程文件夹添加文件魔术棒设置绝对路径和相对路径对比测试程序 新建 HAL 库版本 MDK 工程CMSISHAL 库简介DriversMiddlewaresDevice 和 Include HAL 库文件介绍HAL 库 API 函数和比那辆命名规则HAL …