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一样的"三次握手"操作,仅需直接对着监听端口发送数据,接收方接受数据即可。

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

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

3. UDP与TCP的区别

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

4. 参考资料

  • 林沛满 -《Wireshark网络分析就这么简单》
  • 刘超 ------《趣谈网络协议》
相关推荐
大鸡腿同学8 小时前
手心向上,手心向下
后端
CCblandy8 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
凤山老林10 小时前
Spring Boot 集成 Sa-Token 实现高可用权限认证:登录鉴权、动态路由权限与接口防重放实战
spring boot·后端·sa-token·bootstrap
Bazingga11 小时前
一次推理的完整旅程:ReAct推理深度解析
后端
姜鱼问生11 小时前
Nginx gzip 压缩:一个配置让页面加载快 3 倍
后端·算法·架构
颜酱11 小时前
一栋商业大厦,讲清 InnoDB 的表空间、段、区和页
后端·mysql
码事漫谈12 小时前
1956 亿行数据该怎么存:金仓时序数据库的三个实测
后端
Wx-bishekaifayuan12 小时前
springboot桂味美食分享系统40540-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
彭亚川Allen12 小时前
从零手搓 RAG 之检索全流程,给大模型接上自己的知识库
前端·后端·ai编程
IT_陈寒12 小时前
别让Java字符串拼接偷偷吃掉你的内存
前端·人工智能·后端