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网络分析就这么简单》
  • 刘超 ------《趣谈网络协议》
相关推荐
胡桃姓胡,蝴蝶也姓胡4 小时前
Rag优化 - 如何提升首字响应速度
后端·大模型·rag
紫荆鱼8 小时前
设计模式-命令模式(Command)
c++·后端·设计模式·命令模式
编码追梦人8 小时前
深耕 Rust:核心技术解析、生态实践与高性能开发指南
开发语言·后端·rust
朝新_9 小时前
【SpringBoot】详解Maven的操作与配置
java·spring boot·笔记·后端·spring·maven·javaee
绝无仅有9 小时前
某教育大厂面试题解析:MySQL索引、Redis缓存、Dubbo负载均衡等
vue.js·后端·面试
sean9 小时前
开发一个自己的 claude code
前端·后端·ai编程
追逐时光者10 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 59 期(2025年10.20-10.26)
后端·.net
盖世英雄酱5813611 小时前
java深度调试【第三章内存分析和堆内存设置】
java·后端
007php00711 小时前
京东面试题解析:同步方法、线程池、Spring、Dubbo、消息队列、Redis等
开发语言·后端·百度·面试·职场和发展·架构·1024程序员节
程序定小飞11 小时前
基于springboot的电影评论网站系统设计与实现
java·spring boot·后端