精华内容
下载资源
问答
  • linux 构造udp 报文

    千次阅读 2018-07-23 23:36:45
    1. udp 结构: IP + UDP +data 2. checksum 校验和: IP 为自身的20个字节 UDP 为 伪头部+ UDPhead + data。 其中伪头部为:(伪头部在实际的数据中不进行发送。只是为了接收方进行校验是真的发送给我的。)  ...

    1. udp 结构:

    IP + UDP +data

    2. checksum 校验和:

    IP 为自身的20个字节

    UDP 为  伪头部+ UDPhead + data。 其中伪头部为:(伪头部在实际的数据中不进行发送。只是为了接收方进行校验是真的发送给我的。)

    1.  struct pseudo_hdr  
    2.     {  
    3.         struct in_addr  src;  
    4.         struct in_addr  dst;  
    5.         uint8_t         mbz;  
    6.         uint8_t         proto;  
    7.         uint16_t        len;  
    8.     } __attribute__((__packed__)); 

     len 为 UDP + 数据。 协议为 17 (UDP), MBZ 为填充字段 一定为0. 

    3. checksum 计算:

    将数据采用16位,2字节无符号进行相加。 最终的__u16 sum 再拆分为 2个1字节相加。所得结果 取反 即是 校验和

    展开全文
  • 这里是在 ubuntu 下通过原始套接字组一个 udp 数据包,给 PC 机的网络调试助手发送信息: #include #include #include #include <net/if.h> //struct ifreq #include <sys/ioctl.h> //ioctl、...

    校验和函数:

    /*******************************************************
    功能:
    	校验和函数
    参数:
    	buf: 需要校验数据的首地址
    	nword: 需要校验数据长度的一半
    返回值:
    	校验和
    *******************************************************/
    unsigned short checksum(unsigned short *buf, int nword)
    {
    	unsigned long sum;
    	for(sum = 0; nword > 0; nword--)
    	{
    		sum += htons(*buf);
    		buf++;
    	}
    	sum = (sum>>16) + (sum&0xffff);
    	sum += (sum>>16);
    	return ~sum;
    }
    

    这里是在 ubuntu 下通过原始套接字组一个 udp 数据包,给 PC 机的网络调试助手发送信息:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <net/if.h>				//struct ifreq
    #include <sys/ioctl.h>			//ioctl、SIOCGIFADDR
    #include <sys/socket.h>
    #include <netinet/ether.h>		//ETH_P_ALL
    #include <netpacket/packet.h&
    展开全文
  • DM9000发送UDP报文

    千次阅读 2010-05-30 16:43:00
    //直到整个报文发送完毕 writeb(0xf8, io_addr); //FRAME_BUF_SIZE一般为偶数 for( i=0 ; i; i += 2 ) { writew( *(unsigned short*)(frame+i), io_data); //printk(KERN_ALERT "%c %c ", frame[i], ...

    DM9000的驱动为:

     

     

     

     

     

    这个驱动最容易出错的地方就在ip头部的校验和的计算,一定要先把它设置为0再计算,否则ip校验和总是计算错误。 

     

     

    发送端程序

     

     

    需要先执行mknod /dev/dm9k c 244 0 

     

     

     

     

     

    监听程序我就不写了,也可以通过wireshark抓包查看结果。

    展开全文
  • 内核态填充sk_buff结构体发送udp报文

    千次阅读 2017-03-18 15:48:42
    Linux version 3.13.0-32-generic 填充sk_buff结构体,用skb_push函数压入每一层的报文头比较方便。而网上一些教程多是用skb_put追加数据,追加完了还得设置mac_header, network_header, transport_header等指针,...

    环境:ubuntu12.04

    Linux version 3.13.0-32-generic

    填充sk_buff结构体,用skb_push函数压入每一层的报文头比较方便。而网上一些教程多是用skb_put追加数据,追加完了还得设置mac_header, network_header, transport_header等指针,比较麻烦。


    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/types.h>
    #include <linux/netdevice.h>
    #include <linux/skbuff.h>
    #include <linux/inet.h>
    #include <linux/netfilter_ipv4.h>
    #include <linux/in.h>
    #include <linux/ip.h>
    #include <linux/tcp.h>
    #include <linux/udp.h>
    
    unsigned short xorSum(unsigned short* data, int len)//计算校验和
    {
    	int pad = 0;
    	unsigned short ret = 0;
    	unsigned int sum = 0;
    	if (len % 2 != 0) pad = 1;
    	len /= 2;
    	int i = 0;
    	for ( i = 0; i < len; i++)
    	{
    		sum += data[i];	
    	}
    	if (pad == 1) sum += ((unsigned char*)(data + len))[0] ;
    	sum = (sum & 0xffff) + (sum >> 16);
    	sum += (sum >> 16);
    	ret = ~sum;
    	//printk("sum:%x\n",ret);
    	return ret;	
    }
    
    void xxx(char *dev_name, unsigned char srcMAC[ETH_ALEN], unsigned char destMAC[ETH_ALEN], unsigned int srcIP, unsigned int destIP, unsigned short srcPort, unsigned short destPort)
    {
    	char str[] = "this is what we want to send from kernel :)\n";
    	int i = 0;
    	struct sk_buff *skb = 0;
    	unsigned char * p = 0;
    	struct udphdr *udph = 0;
    	struct iphdr *iph = 0;
    	struct ethhdr *ethh = 0;
    	struct net_device *dev = 0;
    
            dev = dev_get_by_name(&init_net, dev_name);//此处不能立马dev_put(dev)
    	skb = alloc_skb(sizeof(str) + sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct udphdr) + 16, GFP_ATOMIC);//16可以去掉
    	if(!skb) { printk("alloc failed\n"); return;}
    	skb->ip_summed = CHECKSUM_NONE;
    	skb->protocol = htons(ETH_P_IP);//此处用__constant_htons()宏更好,因为是常量,编译时就能算好。
    	skb->priority = 0;
    	skb->dev = dev;
    	skb->pkt_type = PACKET_OTHERHOST;
    
    	skb_reserve(skb, sizeof(str) + sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct udphdr) + 8);//8可以去掉
            //刚alloc_skb的时候,data等于tail;reserve之后,data还是等于tail,两人同步移动了。不过增加了headroom,为push做准备。
            p = skb_push(skb, sizeof(str));
    	memcpy(p, str, sizeof(str));
    
    	p = skb_push(skb, sizeof(struct udphdr));
    	skb_reset_transport_header(skb);
    	udph = (struct udphdr *)p;
    	udph->source = htons(srcPort);
    	udph->dest = htons(destPort);
    	udph->len = htons(sizeof(str) + sizeof(struct udphdr));
    	udph->check = 0x00;
    	//udp和tcp的校验和,要带伪头部一起计算
    	memcpy(p-12, &srcIP, sizeof(srcIP));
    	memcpy(p-8, &destIP, sizeof(destIP));
    	((unsigned short *)(p-4))[0] = 0x1100;
    	memcpy(p-2, &udph->len, sizeof(udph->len));
    	udph->check = xorSum((unsigned short*)(p-12), 12 + sizeof(str) + sizeof(struct udphdr));
    	printk("fakehead:\n");
    	for (i = 12; i > 0; i--)
    		printk("%02x ", (p-i)[0]);	
    	printk("endhead\n");
    
    
    	p = skb_push(skb, sizeof(struct iphdr));
    	skb_reset_network_header(skb);
    	iph = (struct iphdr *)p;
    	iph->version = 4;
    	iph->ihl = 5;
    	iph->tos = 0;
    	iph->tot_len = htons(sizeof(str) + sizeof(struct udphdr) + sizeof(struct iphdr));
    	iph->id = 0x08fc;//id应该是实时计算出来的,唯一的数。
    	iph->frag_off = 0;
    	iph->ttl = 0x40;
    	iph->protocol = 0x11;
    	iph->check = 0;
    	iph->saddr = srcIP;
    	iph->daddr = destIP;
    	iph->check = xorSum((unsigned short*)p, sizeof(struct iphdr));
    	
    	p = skb_push(skb, sizeof(struct ethhdr));
    	skb_reset_mac_header(skb);
    	ethh = (struct ethhdr *)p;
    	memcpy(ethh->h_dest, destMAC, ETH_ALEN);
    	memcpy(ethh->h_source, srcMAC, ETH_ALEN);
    	ethh->h_proto = htons(ETH_P_IP);
    
    	printk("content:\n");
    	for (i = 0; i < sizeof(str) + sizeof(struct udphdr) + 20; i++)
    		printk("%02x ", (p+i)[0]);	
    	printk("\n");
    
            i = dev_queue_xmit(skb);
    	printk("dev_queue_xmit:%d\n", i);
    	kfree_skb(skb);
    	dev_put(dev);
    }
    
    
    static int __init init(void)
    {
    	printk("module inserted!\n");
    	unsigned char srcMAC[ETH_ALEN] = {0x00,0x1c,0x42, 0xa7, 0xd6, 0x67};
    	unsigned char destMAC[ETH_ALEN]= {0x00,0x1c,0x42, 0x00, 0x00, 0x08};
    	unsigned char srcIp[4] = {10,211,55,5};
    	unsigned char destIp[4] = {10,211,55,2};
    	unsigned int srcIP = 0;
    	unsigned int destIP = 0;
    	memcpy(&srcIP, srcIp, sizeof(srcIP));
    	memcpy(&destIP, destIp, sizeof(destIP));
    	xxx("eth0", srcMAC, destMAC, srcIP, destIP, 61116, 1234);
    	return 0;
    }
    
    static void __exit fini(void)
    {
    	printk("module removed!\n");
    }
    
    module_init(init);
    module_exit(fini);
    




    参考:

    www.cnblogs.com/oracleloyal/p/6061161.html

    bbs.chinaunix.net/thread-1941060-1-1.html

    展开全文
  • 利用Linux内核模块Netfilter hook UDP报文,并对其中的部分数据进行修改 实验环境 Ubuntu18.04:用于挂载hook程序,抓取udp报文 Window10:udp报文的目的地,利用工具可检测到报文及其内容 实验工具 Wireshark...
  • 在调试UDP协议时,总是会遇到需要查看UDP报文的内容情况,或许是为了验证自己写的序列化组包是否正确,或者接受到的报文是否合法,亦或是为了查看自己发送或者接收的报文频率是否合格。无论出于什么目的,都要查看...
  • 项目采用的是3.10.108的kernel,在测试时使用发包功率高速发送DHCP Request报文,发现busybox中的udhcpd 进程状态为D,抓包看,没有offer包,而且样机ping不通。 分析发现是在kernel中的函数udp_queue_rcv_skb中: ...
  • UDP报文GSO分段的入口函数是udp4_ufo_fragment,由udpv4_offload常量中定义。 1、udp4_ufo_fragment函数 static struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, netdev_features_t features) { ...
  • Linux内核构造和发送vlan&udp数据报文

    千次阅读 2014-02-08 10:51:47
    Linux内核中构造ip数据包,通过网卡驱动直接发送是一种有效的发送数据包方式。本文通过构造数据包和发送数据包来实现该方式。 构造数据包:构造vlant头的ip和udp数据包 #define IP_HEAD_LENTH 
  • 内核udp报文截取、修改和发送

    千次阅读 2016-01-15 14:04:50
    近来做一个产品需要在网关上获取特定UDP端口(假设是1000端口)的报文,并将其转发给其它设备的1000端口。虽然此类文章网上已经有很多了,但我还是贴上来,这样自己也做下记录,大家也多一份参考。 下面只给出了...
  • linuxudp 发送数据包程序

    热门讨论 2010-06-25 20:46:02
    linux下的udp 发包函数源码,可以指定发送的IP与端口号,适合socket 编程初学者学习
  • udp_tunnel_xmit_skb函数是OVS2.5发送UDP报文的内核入口,在调用该函数之前,headroom空间需要准备完成,且vxlan头已经创建,skb结构体的data指向vxlan头的首地址。 1、udp_tunnel_xmit_skb函数 int udp_tunnel_...
  • Linux 直接发送UDP

    千次阅读 2017-05-17 11:42:00
    如果往本地UDP端口發送數據,那麼可以使用以下命令: echo “hello” > /dev/udp/192.168.1.81/5060 意思是往本地192.168.1.81的5060端口發送數據包hello。 如果往遠程UDP端口發送數據,那麼可以使用以下命令: ...
  • TCP,UDP报文详解

    万次阅读 2017-11-08 20:08:33
    如果在指定的时间内没有收到目标主机对所发数据段的确认,源主机将再次发送该数据段。TCP报文结构TCP头部他的标准长度是20字节。除非出现选项,头部字段以32位为单位给出头部大小(最小值是5)。  源端口
  • UDP报文的覆盖/重叠问题

    千次阅读 2010-06-23 01:04:00
    对一个UDP Server来说,如果同时有几个UDP Client向其发送数据,而UDP Server使用了单线程串行处理的方式来处理收到的UDP报文,那么,会不会在UPD Server还没有处理完一条报文的时候,其他几个Client同时发送了数据...
  • 一、滑动窗口协议 滑动窗口概念不仅存在于数据链路层,也存在于传输层,两者有不同的协议,但基本原理是相近的。... 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧
  • 以太网报文格式: 详细的说明,请看《MAC 头部报文分析》。...UDP 报文格式: 详细的说明,请看《UDP 数据报格式详解》。 校验和函数: /**************************
  • LinuxUDP广播发送接受

    千次阅读 2019-05-06 21:22:48
    网络通信基础 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口。因为同一主机上的程序使用...UDP Socket的使用过程: 1. 初始化网络库 2. 创建SOCK_DGRAM类型的Soc...
  • UDP 报文格式:详细的说明,请看《UDP 数据报格式详解》。校验和函数:/******************************************************* 功能: 校验和函数 参数: buf: 需要校验数据的首地址 nword: 需要校验数据长度...
  • Linux数据报文接收发送总结3

    万次阅读 2021-02-17 12:09:36
    当网卡上收到数据以后,Linux中第一个工作的模块是网络驱动。网络驱动会以DMA的方式把网卡上收到的帧写到内存里。再向CPU发起一个中断,以通知CPU有数据到达。 当CPU收到中断请求后,会去调用网络驱动注册的中断...
  • Linux 邻居子系统 抓包程序层次 设备驱动前、后? 参考文章 https://www.cnblogs.com/newjiang/p/7428125.html https://blog.csdn.net/one_clouder/article/details/52674706 https...
  • 2 UDP 报文发送 工作中有时候遇到需要进行UDP报文发送,一般我们可以通过NC命令进行。 echo "Hello World\!" | nc -4u 192.168.10.21 9100 命令很简单,但是可以快速达到目的,一般在数据对接中,需要进行报文测试...
  • Linux发送全网广播报文

    千次阅读 2011-05-09 21:28:00
    前面一段时间做个程序移植,需要在Linux发送和接收全网广播(255.255.255.255)报文。由于对Linux不是太熟悉,因此查了一些资料才解决这个问题,这里做个概要总结。 1)建立UDP socket,并调用setsockopt设置SOL_...
  • linux服务器开发相关视频解析: 大厂面试,udp不了解这些,何以过关 手写一个用户态网络协议栈,瞬间...首先网络报文通过物理网线发送到网卡 网络驱动程序会把网络中的报文读出来放到 ring buffer 中,这个过程使用 DMA
  • Linux数据报文接收发送总结6

    千次阅读 2021-05-05 21:08:59
    Linux内核中的fs_initcall和subsys_initcall类似,也是初始化模块的入口。fs_initcall调用inet_init后开始网络协议栈注册。通过inet_init,将这些函数注册到了inet_protos(传输层协议)和ptype_base
  • 6.2.2.2.4、报文发送: 如果客户端之前已经执行了connect系统调用,那么此时它直接使用send发送报文即可,当然也可以使用sendto显式的指定目的地址,事实上send和sendto在内核中使用同一个hook,只是send提供的显式...
  • linux 系统 UDP 丢包

    2018-10-20 17:28:02
    1、 linux 系统接收网络报文的过程介绍 ● 首先网络报文通过物理网线发送到网卡● 网络驱动程序会把网络中的报文读出来放到 ring buffer 中,这个过程使用 DMA(Direct Memory Access),不需要 CPU 参与● 内核从 ...
  • linux发送arp请求报文 代码

    千次阅读 2011-09-29 16:07:09
    1,本代码主要是参考 宋敬彬的linux 网络编程>写的,如果完全按照书上的代码编译不能通过,编译通过后运行出现提示:Transport endpoint is ...用tcpdump抓包发现没有arp请求报文发送出去。我用的操作系统 为ubuntu9.10

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,854
精华内容 11,141
关键字:

linux发送udp报文

linux 订阅