udp发包流程

本文探讨了一个简单的UDP程序如何向服务器发送时间信息请求,并通过内核的网络协议栈来理解UDP发包流程。内容涉及tcpdump观察、包结构、net_device选择、路由缓存以及路由查找。通过分析`udp_sendmsg`函数和`ip_route_output_slow`,展示了从用户态到内核态的数据传输细节。
摘要由CSDN通过智能技术生成

用户态的程序:

#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#define length 40  
int main()
{
    struct sockaddr_in serv;
    char buff[length];
    int sockfd,n,i;

    for(i=0;i<length;i++)
        buff[i]=i+'0'+5;

    if((sockfd=socket(PF_INET,SOCK_DGRAM,0)) < 0){ 
        printf("socket create error\n");
        return -1; 
    }   

    bzero(&serv, sizeof(serv));
    serv.sin_family = AF_INET;
    serv.sin_addr.s_addr=inet_addr("115.239.210.27");
    serv.sin_port = htons(13); /* daytime server */

    sendto(sockfd,buff,length,0,(struct sockaddr *)&serv,16);
    n=recvfrom(sockfd,buff,150,0,NULL,NULL);
    buff[n-2]=0;

    printf("buff=%s\n",buff);
    return 0;

}

该程序是一个简单的udp程序,向服务器发送时间信息请求,如果服务器开启了相应的服务,
就会返回类似的输出:buff=07 DEC 2013 11:40:40 CST
本文主要分析sendto函数具体做了什么。
本机的信息:ip:192.168.1.109 mac:1c:65:9d:2c:fe:f7
通过路由器连入网络,路由器信息:ip:192.168.1.1 mac:00:23:cd:5b:ea:d6
发送的包有40个字节的信息,内容为0x35到0x5c
首先通过tcpdump查看这种组合下发出去的包的内容,先有个直观的感觉:

11:31:39.553588 IP 192.168.1.109.55527 > 115.239.210.27.13: UDP, length 40
	0x0000:  0023 cd5b ead6 1c65 9d2c fef7 0800 4500  .#.[...e.,....E.
	0x0010:  0044 0000 4000 4011 3289 c0a8 016d 73ef  .D..@.@.2....ms.
	0x0020:  d21b d8e7 000d 0030 78bf 3536 3738 393a  .......0x.56789:
	0x0030:  3b3c 3d3e 3f40 4142 4344 4546 4748 494a  ;<=>?@ABCDEFGHIJ
	0x0040:  4b4c 4d4e 4f50 5152 5354 5556 5758 595a  KLMNOPQRSTUVWXYZ
	0x0050:  5b5c                                     [\
要读懂这串信息,需要知道L2 L3 L4的头结构 

ethernet header长度为14字节


ip header长度为20字节(不考虑option)


udp header 长度为8个字节


tcpdump抓到的总共为82个字节(L2:14 + L3:20 + L4:8 + LOAD:40)

用户态的代码中只指定了服务器的ip地址和端口号以及负载的内容,通过内核相应的处理后,填充了L2,L3以及L4的头结构,

其中包含本地的ip地址,MAC地址,本地端口号,路由器的MAC地址,以及类型相关的内容。

后面这些分量的赋值涉及linux内核的整个网络协议。

首先略过整个内核协议栈,手动构造发送的包,看需要做什么操作才能把包发出去。

内核调用dev_queue_xmit(skb)函数实现发包流程,因此手动构造skb包,然后调用该函数,看能否正常发出

static int create_init(void)
{
    struct net_device *dev,*dev_tmp;
    int hh_len;
    int alloc_len;
    char *data_addr;
    struct iphdr *iph;
    struct ethhdr *eth;
    struct udphdr *uh;
    struct sk_buff *skb;
    for_each_netdev(&init_net, dev)
        if(strncmp(dev->name,"wlan0",5)==0)
            dev=dev_tmp;
    hh_len= LL_RESERVED_SPACE(dev);
    init_dest_mac(dest_mac);

    /* based on __ip_append_data */
    alloc_len=LOAD_SIZE+L4_SIZE+L3_SIZE+hh_len+15;
    skb=alloc_skb(alloc_len, GFP_ATOMIC);
    if(!skb)
        return -1;
    skb->dev=dev;
    skb_reserve(skb, hh_len);//date+=hh_len;tail+=hh_len
    skb_put(skb,LOAD_SIZE+L4_SIZE+L3_SIZE);//tal+= ; skb->len+=
    skb_set_network_header(skb, 0);
    skb->transport_header = (skb->network_header + L3_SIZE);
    data_addr=skb->data+L3_SIZE+L4_SIZE;
    skb_fill_load(data_addr,LOAD_SIZE);

    /* based on __ip_make_skb  */
    iph = (struct iphdr *)skb->data;
    iph->version = 4;
    iph->ihl = 5;
    iph->tos = 0;
    iph->frag_off = htons(IP_DF);
    iph->ttl = 0x40;
    iph->protocol
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Windows操作系统上,我们有很多UDP发包工具可供选择。以下是一些常见的UDP发包工具和它们的简要介绍: 1. Packet Sender:Packet Sender是一款简单易用的UDP/TCP网络发包工具,可以在Windows平台上发送UDP包。它提供了用户友好的界面,可以轻松设置源和目标IP地址、端口号、数据包内容等参数,并实时查看发送和接收的数据包。 2. Netcat:Netcat(也称为NC)是一个多功能的网络工具,也可以用作UDP发包工具。它是一个命令行工具,在Windows平台上提供了类Unix的shell环境,可以通过命令行参数指定要发送的UDP数据包的内容和目的地。 3. Hping:Hping是一个非常强大的网络工具,也可以用来发送UDP数据包。它具有灵活的命令行接口,可以通过指定不同的选项和参数来定制要发送的UDP包的各个方面,如IP地址、端口、标记等。Hping还可以用于网络安全测试和调试等方面。 4. Nping:Nping是一个网络工具,专门设计用于进行网络探测和安全测试。它支持发送各种类型的网络流量,包括UDP包。通过指定参数、设置负载和其他选项,用户可以使用Nping对目标主机进行UDP网络探测、性能测试和安全审计。 总之,在Windows系统上有许多可选择的UDP发包工具,每个工具都有其自身的特点和用途。选择适合自己需求的工具,并根据自己的需求来设置参数,以便在网络测试、调试或安全评估等场景中使用UDP发包工具。 ### 回答2: UDP发包工具是一种用于测试网络传输性能的工具,在Windows系统上有许多可用的UDP发包工具。以下是几种常见的UDP发包工具: 1. Iperf:Iperf是一个开源的网络性能测试工具,可以通过UDP或TCP发送数据包来测试网络带宽、延迟和抖动等性能指标。它可以通过命令行界面或图形界面使用,非常方便实用。 2. PackETH:PackETH是一个简单而强大的网络分组发包工具,可以用于发送自定义的UDP数据包。它具有图形用户界面,可以轻松设置数据包的源地址、目标地址、端口号以及数据负载,非常适用于网络测试和研究。 3. UDP Tester:UDP Tester是一个简单但实用的UDP数据包发包工具。它可以发送UDP数据包,并显示接收到的回应时间和丢包率。UDP Tester具有直观的用户界面,可以轻松设置发送数据包的目标地址、端口号以及发送的数据负载。 4. Nping:Nping是一个流行的网络发包工具,可以用于发送各种类型的网络数据包。它支持灵活的数据包生成和定制,可以发送UDP、TCP、ICMP等协议的数据包。Nping可以通过命令行界面来使用,非常适合用于网络测试和诊断。 这些UDP发包工具在Windows系统上都有很好的兼容性,并提供了丰富的功能和选项,可以帮助用户进行各种网络性能测试和调试。无论是简单的带宽测试还是复杂的网络协议研究,这些工具都可以满足用户的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值