首页 > 其他分享 >0226-UDP 请求报文

0226-UDP 请求报文

时间:2024-08-14 14:05:47浏览次数:15  
标签:UDP get 报文 tun0 packet length 0226 jiangbo12490

环境

  • Time 2022-11-20
  • WSL-Ubuntu 22.04
  • Rust 1.65.0
  • pnet 0.31.0
  • tun-tap 0.1.3

前言

说明

参考:https://docs.rs/pnet/latest/pnet/index.html
RFC 792

目标

了解 UDP 协议的的字段。
从这里开始,将进入第四层,传输层协议。UDP 协议基于 IP 协议。

配置 TUN

IP 地址不要和主机的网卡地址在一个段,以便选择这个网卡进行路由。

root@jiangbo12490:~# ip link delete tun0
root@jiangbo12490:~# ip tuntap add tun0 mode tun
root@jiangbo12490:~# ip addr add 192.168.144.1/24 dev tun0
root@jiangbo12490:~# ip link set up dev tun0
root@jiangbo12490:~# ip addr show dev tun0
8: tun0: <NO-CARRIER,POINTOPOINT,MULTICAST,NOARP,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 500
    link/none
    inet 192.168.144.1/24 scope global tun0
       valid_lft forever preferred_lft forever

main.rs

use pnet::packet::{ip::IpNextHeaderProtocols, ipv4::Ipv4Packet};
use pnet::packet::{udp::UdpPacket, Packet};
use tun_tap::{Iface, Mode};

fn main() -> std::io::Result<()> {
    let iface = Iface::without_packet_info("tun0", Mode::Tun)?;

    let mut buffer = vec![0; 1500];

    loop {
        let size = iface.recv(&mut buffer)?;
        let packet = Ipv4Packet::new(&buffer).unwrap();

        if packet.get_version() == 6 {
            println!("IPv6 packet, continue");
            continue;
        }

        if packet.get_next_level_protocol() != IpNextHeaderProtocols::Udp {
            println!("not udp packet, continue");
            continue;
        }

        // 因为头部长度的单位是 4 字节
        let length = packet.get_header_length() as usize * 4;
        let packet = UdpPacket::new(&buffer[length..]).unwrap();

        // 源端口
        println!("source {:?}", packet.get_source());
        // 目的端口
        println!("get_destination {:?}", packet.get_destination());
        // 长度,包含 UDP 头和数据
        println!("length {:?}", packet.get_length());
        // 校验和
        println!("checksum {:?}", packet.get_checksum());
        // 数据
        let payload = String::from_utf8_lossy(packet.payload());
        print!("udp say: {}", payload);

        println!("length: {}, {:?}", size, &buffer[..size]);
    }
}

发送 UDP 请求

root@jiangbo12490:~# nc 192.168.144.2 4444 -u
jiangbo

程序输出

source 33092
get_destination 4444
length 16
checksum 10644
udp say: jiangbo
length: 36, [69, 0, 0, 36, 164, 101, 64, 0, 64, 17, 245, 14, 192, 168, 144, 1, 192, 168, 144, 2, 129, 68, 17, 92, 0, 16, 41, 148, 106, 105, 97, 110, 103, 98, 111, 10]

源端口是 33092,目的端口 4444,长度 8 字节的 UDP 头加上 8 字节的数据(含换行),共 16 个字节。

查看源端口

root@jiangbo12490:~# ss -un
Recv-Q    Send-Q    Local Address:Port    Peer Address:Port     Process
0         0         192.168.144.1:33092   192.168.144.2:4444

tcpdump 抓包

root@jiangbo12490:~# tcpdump -An -i tun0
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes

23:42:22.881236 IP 192.168.144.1.33092 > 192.168.144.2.4444: UDP, length 8
E..$.f@[email protected].\..).jiangbo

Wireshark

UDP协议

总结

了解了 UDP 协议的字段,该协议基于 IP 协议,是一个比较简单的协议。

附录

标签:UDP,get,报文,tun0,packet,length,0226,jiangbo12490
From: https://www.cnblogs.com/jiangbo4444/p/18358857

相关文章

  • 0227-TCP 请求报文
    环境Time2022-11-24WSL-Ubuntu22.04Rust1.65.0pnet0.31.0tun-tap0.1.3前言说明参考:https://docs.rs/pnet/latest/pnet/index.htmlRFC793目标了解TCP协议头中的字段,其也是基于IP协议的。配置TUNIP地址不要和主机的网卡地址在一个段,以便选择这个网卡进行......
  • DHCP服务(服务名dhcpd,端口UDP /67和UDP/68)
    目录前言配置文件DHCP服务器的配置下载安装DHCP服务编辑配置文件重启服务客户端测试配置客户端网卡重启网卡前言DHCP动态主机配置协议是一种网络协议,提供了动态配置IP地址的功能,允许服务器自动为网络上的设备分配IP地址和其他网络配置参数。当设备连接到网络时,它......
  • 在K8S中,你用的flannel是哪个工作模式及fannel的底层原理如何实现数据报文转发的?
    在Kubernetes(K8S)中,Flannel是一个广泛使用的容器网络接口(CNI)插件,它提供了一种简单而有效的方法来为集群中的每个容器分配网络,并确保它们可以互相通信。Flannel支持多种工作模式来实现数据报文的转发,其中最常见的是VXLAN、UDP和HOST-GW三种模式。1.Flannel的工作模式VXLAN模式:......
  • 0225-ping 请求报文
    环境Time2022-11-20WSL-Ubuntu22.04Rust1.65.0pnet0.31.0tun-tap0.1.3前言说明参考:https://docs.rs/pnet/latest/pnet/index.htmlRFC792目标查看ping请求报文的格式,ping基于IP报文。ping命令ping-Itun0172.24.49.106root@jiangbo12490:~#ping-I......
  • 三报文握手经典例题详解
    如图,有如下TCP连接。主机V通过三次握手与主机U建立一个TCP连接1.有三个TCP段(标号为A、B、C) 被传送,请在下面括号中填入各段的SYN标志位、序号(seq)、确认号(ack)段A:  SYN=(  1 ),seq=500段B:  SYN=(  1 ),seq=600,ack=(  501    )段C:  ......
  • UDP网络套接字
    一、Socket编程预备1.1理解通行的本质    在网络通信中将数据传输到主机是目的吗?其实并不是,在现实生活中,我们通过网络聊天是人与人在聊天,下载软件是人在下载,浏览网页是人在浏览,而我们聊天用的微信、下载用的应用商店、浏览用的浏览器在主机中是不同的进程,所以人在主......
  • UDP/TCP网络调试助手 NetAssist【调试工具】下载
    链接:https://pan.baidu.com/s/1QgL4XZdKNW39nFe18feBbw?pwd=1122提取码:1122–来自百度网盘超级会员V3的分享接收设置ASCII:以ASCII格式显示接收到的数据。ASCII是一种字符编码标准,用于表示文本数据。HEX:以十六进制格式显示接收到的数据。十六进制显示更适合查看和调试......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-08 仿真验证
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 4仿真验证仿真代码的顶层如下......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-09 ICMP层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 5上板调试5.1硬件连接本次......
  • [米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-04 IP层程序设计
    软件版本:Anlogic-TD5.9.1-DR1_ES1.1操作系统:WIN1064bit硬件平台:适用安路(Anlogic)FPGA实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板板卡获取平台:https://milianke.tmall.com/登录"米联客"FPGA社区http://www.uisrc.com视频课程、答疑解惑! 3.3IP层ICMP层数据和UDP层数......