Golang案例开发之gopacket抓包三次握手四次分手(3)

文章目录

  • 前言
  • 一、理论知识
    • 三次握手
    • 四次分手
  • 二、代码实践
    • 1.模拟客户端和服务器端
    • 2.三次握手代码
    • 3.四次分手代码
    • 验证代码
    • 完整代码
  • 总结


前言

TCP通讯的三次握手和四次分手,有很多文章都在介绍了,当我们了解了gopacket这个工具的时候,我们当然是用代码实践一下,我们的理论。本节内容就是好的实践。
先看下我们本次实践的效果:
在这里插入图片描述


一、理论知识

三次握手

三从握手状态变迁
在这里插入图片描述

  1. 第一次握手:客户端向服务器发送一个SYN报文段,报文段的首部中的标志位SYN置为1,另外还会指明自己的初始化序号seq=x,此时客户端处于SYN_SENT状态。
  2. 第二次握手:服务器收到SYN的报文段后,会以自己的SYN-ACK报文进行应答。该应答报文的首部有三个重要信息:首先SYN被置为1;其次,确认号字段ack=x+1;最后服务器选择自己的初始序号seq=y。该报文段表明:“我收到了你发起建立连接的请求,该请求报文的初始序号是x(确认号ack=x+1就表明了我收到了初始序号seq=x的报文),我同意建立该连接,我的初始序号是y。”此时服务器处于SYN_RCVD状态。
  3. 第三次握手:客户端收到SYN-ACK报文后,会发送一个ACK报文段,该报文段中序号seq=x+1,确认号ack=y+1,表明我已经收到了你的确认。此时客户端处于ESTABLISHED状态。
    需要注意的是:第一次握手和第二次握手都只是消耗掉一个序号,但不能携带数据;第三次握手可以携带数据。

四次分手

在这里插入图片描述
初始时,客户端与服务器都处于ESTABLISHED状态,假如客户端发起断开连接的请求(服务器也可以发起)

  1. 第一次挥手:客户端发送一个FIN报文段,报文段中指定序号seq=u。此时客户端处于FIN_WAIT_1状态。
  2. 第二次挥手:服务器收到FIN报文后,立即发送一个ACK报文段,确认号为ack=u+1,序号设为seq=v。表明已经收到了客户端的报文。此时服务器处于CLOSE_WAIT状态。
    在第二次挥手和第三次挥手之间的时间段内,由于只是半关闭的状态,数据还是可以从服务器传送到客户端的。
  3. 第三次挥手:如果数据传送完毕,服务器也想断开连接,那么就发送一个FIN报文,并重新指定一个序号seq=w,确认号还是ack=u+1,表明可以断开连接。
  4. 第四次挥手:客户端收到报文后,一样发出一个ACK报文段做出应答,上一次客户端发送的报文段序号为u,那么这次序号就是seq=u+1,确认号为ack=w+1。此时客户端处于TIME_WAIT状态,需要经过一段时间确保服务器收到自己的应答报文后,才会进入CLOSED状态。

二、代码实践

1.模拟客户端和服务器端

我们准备了两台Linux虚拟机,分别是:
192.168.37.90 Client
192.168.37.100 Server
服务器端,我们可以启动一个Python的http服务来模拟。一般的Linux服务只要有Python2都可以运行:

python -m SimpleHTTPServer 8000

输入命令后,启动了一个监听8000端口的HttpServer服务。

客户端,我们直接用curl命令或者telnet

curl http://192.168.37.100:8000
或者
telnet 192.168.37.100 8000

下图,可以看到刚才的curl命令已经成功请求了。
在这里插入图片描述
客户端和服务器端都准备好了,现在开始开发我们的监听代码,我们的目标是获取到三次握手和四次分手的网络包。

2.三次握手代码

上一节,我们已经完成了网络包分层的代码,既然是要抓TCP的包,我们这次就关注tcpLayer := packet.Layer(layers.LayerTypeTCP) 这部分。
在这里插入图片描述
经过断言后,tcp 变量里面就可以获取到TCP层的所有信息。
我们先看三次握手:
第一次握手,SYN标志位为True,ACK标志位为False
第二次握手,SYN标志位和ACK标志位都为True
第三次握手,SYN标志位为False,ACK标志位为True,同时AckNum确认值是第二次握手SeqNum+1
结合情况,我们可以这样获取:
声明变量SecondSeqNum ,记录第二次握手的序列号。
var SecondSeqNum uint32

	tcpLayer := packet.Layer(layers.LayerTypeTCP)if tcpLayer != nil {tcp, _ := tcpLayer.(*layers.TCP)// TCP layer variables:// S

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

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

相关文章

图论基础|695. 岛屿的最大面积、1020. 飞地的数量、130. 被围绕的区域

695. 岛屿的最大面积 力扣题目链接(opens new window) 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff0…

何为布控球?布控球的分类对比

主要的分类有: 根据内部的主控板卡的系统分类,典型的是基于海思芯片的嵌入式LINUX系统的,一般出国标GB28181,另外一种是剑走偏锋的安卓系统的,需要把球机的输出YUV转换为UVC接入安卓主板,作为外接USB摄像头…

FreeRTOS从代码层面进行原理分析(1 任务的建立)

FreeRTOS_分析 FreeRTOS 是一个开源的实时操作系统。可以在很的低内存使用的情况下运行在单片机上,使得单片机可以并发(虽然某一时刻还是只有一个任务运行) 的运行程序。关于一些 FreeRTOS 优缺点的介绍文章很多,这里就不再赘述直接深入代码探究原理。 …

vscode用SSH远程开发c语言

vscode配置远程 这里我使用虚拟机进行展示,首先需要你的虚拟机安装好ssh 没安装好就执行下面的命令安装并开启服务 sudo apt-get install ssh sudo service ssh start ps -e | grep sshvscode安装 remote-ssh扩展 点击左下角的远程连接,我这里已经连接…

mysql 存储引擎 基本介绍

目录 一 存储引擎概念介绍 (一)存储引擎概念 (二)MySQL常用的存储引擎 (三)存储引擎运作方式 二 MyISAM 存储引擎介绍 (一) MyISAM 存储引擎特点 1,不支持…

8.测试教程-自动化测试selenium-3

文章目录 1.unittest框架解析2.批量执行脚本2.1构建测试套件2.2用例的执行顺序2.3忽略用例执行 3.unittest断言4.HTML报告生成5.异常捕捉与错误截图6.数据驱动 大家好,我是晓星航。今天为大家带来的是 自动化测试selenium第三节 相关的讲解!&#x1f600…

四、Elasticsearch 进阶

自定义目录 4.1 核心概念4.1.1 索引(Index)4.1.2 类型(Type)4.1.3 文档(Document)4.1.3 字段(Field)4.1.5 映射(Mapping)4.1.6 分片(Shards&#…

可视化技术干货:坐标系扫盲—图表呈现的核心,有点难懂,慢慢看

hello,我是贝格前端工场,本篇文章开始分享可视化干货技术,力争用深入浅出的语言讲明白坐标系,并附大量图表案例。欢迎老铁们关注转发,如有项目定制需求可以私信我们。 一、什么是坐标系 在可视化设计中,坐…

【Linux】进程地址空间详解

前言 在我们学习C语言或者C时肯定都听过老师讲过地址的概念而且老师肯定还会讲栈区、堆区等区域的概念,那么这个地址是指的物理内存地址吗?这里这些区域又是如何划分的呢? 我们在使用C语言的malloc或者C的new函数开辟空间时,开辟…

Spring Cloud三:API网关深入探索与实战应用

Spring Cloud一:Spring Cloud 简介 Spring Cloud二:核心组件解析 一、服务发现与动态路由 在微服务架构中,服务的动态注册与发现是一个核心功能。API网关可以与服务注册中心(如Eureka、Consul等)集成,动态…

C# 将 Word 转文本存储到数据库并进行管理

目录 功能需求 范例运行环境 设计数据表 关键代码 组件库引入 Word文件内容转文本 上传及保存举例 得到文件Byte[]数据方法 查询并下载Word文件 总结 功能需求 将 WORD 文件的二进制信息存储到数据库里,即方便了统一管理文件,又可以实行权限控…

安装IK分词器 + 扩展词典配置 + 停用词典配置

安装IK分词器 1.在线安装ik插件(较慢) # 进入容器内部 docker exec -it elasticsearch /bin/bash ​ # 在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elastics…

算法---动态规划

动态规划 1.前言2. 示例 - 第N个泰波那契数2.1 算法原理(重点)2.2 代码 3. 总结解题思路 1.前言 哪些情况下会用到动态规划: 1.最优化问题:当需要求解最大值或最小值的问题时,可以考虑使用动态规划。例如&#xff0c…

[C语言]——内存函数

目录 一.memcpy使用和模拟实现(内存拷贝) 二.memmove 使用和模拟实现 三.memset 函数的使用(内存设置) 四.memcmp 函数的使用 C语言中规定: memcpy拷贝的就是不重叠的内存memmove拷贝的就是重叠的内存但是在VS202…

SecureCRT:高效安全的远程连接工具

SecureCRT是一款功能强大的终端仿真工具,主要用于连接和运行包括Windows、UNIX和VMS在内的远程系统。它支持多种协议,如SSH1、SSH2、Telnet、SFTP、Rlogin、Serial、SCP等,确保用户与目标设备之间的通信安全,并防止网络攻击和窥探…

Android Preference简单介绍

Android Preference简单介绍 文章目录 Android Preference简单介绍一、前言二、Preference 简单介绍二、PreferenceScreen和SwitchPreference 简单示例2、相关demo代码示例(1)SettingsActivity.Java(2)layout\settings_activity.x…

局域网内的手机、平板、电脑的文件共享

在日常工作生活中,经常需要将文件在手机、平板、电脑间传输,以下介绍三种较为便捷的方法: 1.LocalSend 该软件是免费开源的,可以在局域网内的任意手机、平板、电脑间传递文件,并且任意一方都可以作为“发送方”和“接…

taro框架之taro-ui中AtSwipeAction的使用

题记&#xff1a;所需效果&#xff1a;滑动删除 工作进程 官网文档代码 <AtSwipeAction options{[{text: 取消,style: {backgroundColor: #6190E8}},{text: 确认,style: {backgroundColor: #FF4949}} ]}><View classNamenormal>AtSwipeAction 一般使用场景</…

DataEase大屏iframe嵌入自建网站(React)

1、修改dataease 所在的服务器nginx配置 server {listen 80;server_name dataease.ibaiqiu.cn;return 307 https://$host$request_uri; } server {listen 443 ssl;server_name dataease.ibaiqiu.cn;client_max_body_size 30M;ssl_certificate /usr/local/nginx/co…

计算机三级——网络技术(综合题第二题)

路由器工作模式 用户模式 当通过Console或Telnet方式登录到路由器时&#xff0c;只要输入的密码正确&#xff0c;路由器就直接进入了用户模式。在该模式下&#xff0c;系统提示符为一个尖括号(>)。如果用户以前为路由器输入过名称&#xff0c;则该名称将会显示在尖指号的前…