亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用gopacket解析協(xié)議層中的相關(guān)數(shù)據(jù)方式

 更新時(shí)間:2025年07月08日 09:20:10   作者:jj吉吉國(guó)王  
文章介紹使用Wireshark抓取ping數(shù)據(jù)包并保存為pcap格式,通過(guò)Go語(yǔ)言gopacket解析,提取IP版本號(hào)、指定標(biāo)識(shí)的數(shù)據(jù)包長(zhǎng)度及應(yīng)用層ICMP字符串內(nèi)容,展示TCP/IP協(xié)議族解析的簡(jiǎn)便方法

通過(guò)wirshark可視化相關(guān)應(yīng)用層

使用gopacket來(lái)進(jìn)行解析,或獲取指定結(jié)構(gòu)內(nèi)容。

首先使用wirshark抓取ping x.x.x.x 命令數(shù)據(jù)包

保存數(shù)據(jù)包為pcap格式。

在使用wirshark打開(kāi)pcap數(shù)據(jù)包。

嘗試使用go語(yǔ)言的gopacket來(lái)讀取指定數(shù)據(jù)包的字段數(shù)據(jù)。

可看到,數(shù)據(jù)包一共為103個(gè)。先用go讀取文件,統(tǒng)計(jì)有多少個(gè)數(shù)據(jù)包。

package main
import (
	"fmt"
	"github.com/google/gopacket"
	"github.com/google/gopacket/pcap"
)
func main() {
	handle, _ := pcap.OpenOffline("ping.pcap")
	defer handle.Close()
	packetSource := gopacket.NewPacketSource(
		handle,
		handle.LinkType(),
	)
	num := 0
	for packet := range packetSource.Packets() {
		num += 1
		fmt.Println(num)
		fmt.Println(packet)
	}
}

運(yùn)行代碼

打印所有數(shù)據(jù)包中協(xié)議版本號(hào)(4、6)

目前的協(xié)議版本號(hào)是4,因此IP有時(shí)也稱作IPv4。該值存放在IP層中,所以利用程序解析IP層中的數(shù)據(jù)。

package main
import (
	"fmt"
	"github.com/google/gopacket/layers"
	"github.com/google/gopacket"
	"github.com/google/gopacket/pcap"
)
func main() {
	handle, _ := pcap.OpenOffline("ping.pcap")
	defer handle.Close()
	packetSource := gopacket.NewPacketSource(
		handle,
		handle.LinkType(),
	)
	for packet := range packetSource.Packets() {
		ipLayer := packet.Layer(layers.LayerTypeIPv4) //解析IP層
		if ipLayer != nil {
			ip, _ := ipLayer.(*layers.IPv4)
			fmt.Println("Version:", ip.Version)
		}
	}
}

獲取指定數(shù)據(jù)包的長(zhǎng)度

要獲取指定數(shù)據(jù)包就需要找到數(shù)據(jù)包的唯一標(biāo)識(shí):

標(biāo)識(shí)字段唯一地標(biāo)識(shí)主機(jī)發(fā)送的每一份數(shù)據(jù)報(bào)。通常每發(fā)送一份報(bào)文它的值就會(huì)加1。

獲取唯一標(biāo)識(shí)1917的總長(zhǎng)度:

package main
import (
	"fmt"
	"github.com/google/gopacket/layers"
	"github.com/google/gopacket"
	"github.com/google/gopacket/pcap"
)
func main() {
	handle, _ := pcap.OpenOffline("ping.pcap")
	defer handle.Close()
	packetSource := gopacket.NewPacketSource(
		handle,
		handle.LinkType(),
	)
	for packet := range packetSource.Packets() {
		ipLayer := packet.Layer(layers.LayerTypeIPv4) //解析IP層
		if ipLayer != nil {
			ip, _ := ipLayer.(*layers.IPv4)
			//fmt.Println("Version:", ip.Version)
			if ip.Id == 1917 {
				fmt.Println("ID:", ip.Id)
				fmt.Println("Length:", ip.Length)
			}
		}
	}
}

查看源代碼,IP層可使用以下相關(guān)字段

fmt.Println("ID:", ip.Id)
fmt.Println("Length:", ip.Length)
fmt.Println("源IP:", ip.SrcIP)
fmt.Println("目的IP:", ip.DstIP)

1917數(shù)據(jù)包向目的地址發(fā)送了一段字符串a(chǎn)bcdef…嘗試使用程序獲取這段字符串

從wirshark中可看到,想要獲取的這段字符串在應(yīng)用層上,可看到該協(xié)議為ICMP協(xié)議。

gopacket內(nèi)置的有ICMP包的解析方式,不需要我們?cè)谧远x。

package main
import (
	"fmt"
	"github.com/google/gopacket/layers"
	"github.com/google/gopacket"
	"github.com/google/gopacket/pcap"
)
func main() {
	handle, _ := pcap.OpenOffline("ping.pcap")
	defer handle.Close()
	packetSource := gopacket.NewPacketSource(
		handle,
		handle.LinkType(),
	)
	for packet := range packetSource.Packets() {
		ipLayer := packet.Layer(layers.LayerTypeIPv4)
		if ipLayer != nil {
			ip, _ := ipLayer.(*layers.IPv4)
			if ip.Id == 1917 {
				icmpLayer := packet.Layer(layers.LayerTypeICMPv4) //解析應(yīng)用層ICMP數(shù)據(jù)包
				if icmpLayer != nil {
					fmt.Println(string(icmpLayer.LayerPayload()))
				}
			}
		}
	}
}

成功獲取數(shù)據(jù)內(nèi)容。

熟悉TCP/IP協(xié)議族使用gopacket會(huì)非常的簡(jiǎn)單,首先要知道需要解析的數(shù)據(jù)在哪一層上,如果在應(yīng)用層上就使用相關(guān)應(yīng)用協(xié)議進(jìn)行解析,或者自定義解析其他協(xié)議。

查看源代碼可看到內(nèi)置了很多支持的協(xié)議格式

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Golang語(yǔ)言如何避免空指針引發(fā)的panic詳解

    Golang語(yǔ)言如何避免空指針引發(fā)的panic詳解

    簡(jiǎn)單地說(shuō)go語(yǔ)言的指針類型和C/C++的指針類型用法是一樣的,除了出去安全性的考慮,go語(yǔ)言增加了一些限制,這篇文章主要給大家介紹了關(guān)于Golang語(yǔ)言如何避免空指針引發(fā)panic的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • go RWMutex的實(shí)現(xiàn)示例

    go RWMutex的實(shí)現(xiàn)示例

    本文主要來(lái)介紹讀寫(xiě)鎖的一種Go語(yǔ)言的實(shí)現(xiàn)方式RWMutex,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Go1.21新增內(nèi)置函數(shù)(built-in?functions)詳解

    Go1.21新增內(nèi)置函數(shù)(built-in?functions)詳解

    Go?1.21新增的內(nèi)置函數(shù)分別是?min、max?和?clear,這篇文章主要帶大家一起了解一下這幾個(gè)函數(shù)的用途和使用示例,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-08-08
  • Go讀取yaml文件到struct類的實(shí)現(xiàn)方法

    Go讀取yaml文件到struct類的實(shí)現(xiàn)方法

    本文主要介紹了Go讀取yaml文件到struct類,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 使用Go語(yǔ)言實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求并給GET添加參數(shù)

    使用Go語(yǔ)言實(shí)現(xiàn)發(fā)送HTTP請(qǐng)求并給GET添加參數(shù)

    在開(kāi)發(fā)Web應(yīng)用程序時(shí),我們經(jīng)常需要向服務(wù)器發(fā)送HTTP請(qǐng)求,本文將介紹一下使用Go語(yǔ)言發(fā)送HTTP請(qǐng)求,并給GET請(qǐng)求添加參數(shù)的方法,感興趣的小伙伴可以了解一下
    2023-07-07
  • Golang WebView跨平臺(tái)的桌面應(yīng)用庫(kù)的使用

    Golang WebView跨平臺(tái)的桌面應(yīng)用庫(kù)的使用

    Golang WebView是一個(gè)強(qiáng)大的桌面應(yīng)用庫(kù),本文介紹了Golang WebView的特點(diǎn)和使用方法,并列舉示例詳細(xì)的介紹了其在實(shí)際項(xiàng)目中的應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Windows下Goland的環(huán)境搭建過(guò)程詳解

    Windows下Goland的環(huán)境搭建過(guò)程詳解

    這篇文章主要介紹了Windows下Goland的環(huán)境搭建過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)必會(huì)知識(shí)點(diǎn)總結(jié)

    Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉樹(shù)必會(huì)知識(shí)點(diǎn)總結(jié)

    如果你是一個(gè)開(kāi)發(fā)人員,或多或少對(duì)樹(shù)型結(jié)構(gòu)都有一定的認(rèn)識(shí)。二叉樹(shù)作為樹(shù)的一種,是一種重要的數(shù)據(jù)結(jié)構(gòu),也是面試官經(jīng)??嫉臇|西。本文為大家總結(jié)了一些二叉樹(shù)必會(huì)知識(shí)點(diǎn),需要的可以參考一下
    2022-08-08
  • 最新評(píng)論