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网络分析就这么简单》
  • 刘超 ------《趣谈网络协议》
相关推荐
九圣残炎30 分钟前
【springboot】简易模块化开发项目整合Redis
spring boot·redis·后端
.生产的驴1 小时前
Electron Vue框架环境搭建 Vue3环境搭建
java·前端·vue.js·spring boot·后端·electron·ecmascript
爱学的小涛1 小时前
【NIO基础】基于 NIO 中的组件实现对文件的操作(文件编程),FileChannel 详解
java·开发语言·笔记·后端·nio
爱学的小涛1 小时前
【NIO基础】NIO(非阻塞 I/O)和 IO(传统 I/O)的区别,以及 NIO 的三大组件详解
java·开发语言·笔记·后端·nio
北极无雪1 小时前
Spring源码学习:SpringMVC(4)DispatcherServlet请求入口分析
java·开发语言·后端·学习·spring
爱码少年1 小时前
springboot工程中使用tcp协议
spring boot·后端·tcp/ip
2401_857622669 小时前
SpringBoot框架下校园资料库的构建与优化
spring boot·后端·php
2402_857589369 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
哎呦没10 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch11 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j