Wireshark网络协议分析 - UDP协议

我的博客阅读本文

1. 基础

UDP包的数据结构:

2. 实战

2.1. 用Go写一个简单的UDP服务器与客户端

我们这里使用Golang写了一个简单的9830端口的UDP服务器与客户端,源代码简单展示如下:

服务端:

go 复制代码
package server

import (
	"fmt"
	"net"
	"os"
	"test/util"
)

func StartUDPServer(c chan<- string) {
	addr := "localhost:9829"
	udpAddr, err := net.ResolveUDPAddr("udp", addr)
	if err != nil {
		util.HandleError(err)
		os.Exit(1)
	}

	conn, err := net.ListenUDP("udp", udpAddr)
	if err != nil {
		util.HandleError(err)
		os.Exit(1)
	}
	defer conn.Close()
	c <- "ready"
	fmt.Println("UDP server listening on", addr)

	buffer := make([]byte, 1024)

	for {
		n, clientAddr, _ := conn.ReadFromUDP(buffer)
		if n > 0 {
			fmt.Printf("Received '%s' from %s\n", string(buffer[:n]), clientAddr)
			return
		}
	}
}

客户端:

go 复制代码
package client

import (
	"fmt"
	"net"
	"os"
	"test/util"
)

func StartUDPClient() {
	serverAddr := "localhost:9829"
	udpAddr, err := net.ResolveUDPAddr("udp", serverAddr)
	if err != nil {
		util.HandleError(err)
		os.Exit(1)
	}

	conn, err := net.DialUDP("udp", nil, udpAddr)
	if err != nil {
		util.HandleError(err)
		os.Exit(1)
	}
	defer conn.Close()

	message := []byte("Hello UDP server!")
	_, err = conn.Write(message)
	if err != nil {
		fmt.Println("Error writing to UDP:", err)
		os.Exit(1)
	}

	fmt.Println("Message sent to server:", string(message))
}

执行入口:

go 复制代码
package main

import (
	"fmt"
	"sync"
	c "test/internal/client"
	s "test/internal/server"
)

// main wireshark filter express: udp.port==9829
func main() {
	var wg sync.WaitGroup
	wg.Add(2)
	serverReady := make(chan string, 1)

	go func() {
		s.StartUDPServer(serverReady)
		wg.Done()
	}()

	go func() {
		<-serverReady
		c.StartUDPClient()
		wg.Done()
	}()

	wg.Wait()
	fmt.Println("done!")
}

编译执行,控制台输出如下:

2.2. Wireshark抓包分析

由于我们这里UDP客户端和服务端都是面向localhost ,使用adapter for loopback traffic capture接口捕获回环流量,过滤器过滤tcp端口9829即可:

bash 复制代码
udp.port==9829

可以看到,UDP协议的过程是比较简单的,无需TCP一样的"三次握手"操作,仅需直接对着监听端口发送数据,接收方接受数据即可。

WiresharkTransport分析中,我们可以看到上述的UDP包头信息:

其中包括了源和目标端口地址,长度,校验和和数据payload信息。

3. UDP与TCP的区别

  • 本质的区别是TCP 是有状态的,面向连接的,UDP是面向无连接的。TCP会三次握手,维护客户端和服务端的连接,建立一定的数据结构来维护双方交互的状态,UDP则不会
  • 剩下的区别都是基于这个本质特性不一样衍生出的应用特性,比如:
    • TCP提供可靠交付。通过 TCP 连接传输的数据,无差错、不丢失、不重复、有序。
    • UDP不保证不丢失,不保证按顺序到达。

4. 参考资料

  • 林沛满 -《Wireshark网络分析就这么简单》
  • 刘超 ------《趣谈网络协议》
相关推荐
Dovis(誓平步青云)2 分钟前
《Linux CPU频率为何忽高忽低:cpufreq、idle状态与性能抖动教程》
linux·运维·服务器·spring boot·后端·生成对抗网络
To_OC7 小时前
手写 AI 编程 Agent 的命令执行工具:我被 child_process 坑出来的实战经验
后端·node.js·agent
逝水无殇10 小时前
C# 异常处理详解
开发语言·后端·c#
考虑考虑12 小时前
Sentinel安装
java·后端·微服务
IT_陈寒12 小时前
SpringBoot自动配置失灵?你可能忘了这个关键注解
前端·人工智能·后端
碎碎念_49212 小时前
SpringBoot + Vue 前后端分离从 0 到 1 完整环境配置流程
vue.js·spring boot·后端
逝水无殇13 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
YIAN13 小时前
从手写 Agent 工具到 MCP 协议:一文搞懂大模型跨进程跨语言工具调用
后端·agent·mcp
小兔崽子去哪了13 小时前
Docker 删除镜像后磁盘空间没有释放?
后端·docker·容器
高明珠14 小时前
麒麟 V10 SP1 排查实录:ttyS5 每 10 秒莫名收到一批报文,元凶是 eGTouchD
后端