您的位置:首页 > 其它

UDP数据包可靠传输实现方案

2015-09-21 20:58 239 查看
本文的主要工作是解决网关B下主机和网关C下主机之间的udp数据包可靠传输问题,采用基于udp的可靠传输协议UDT来实现udp数据包的可靠传输。网关B下的客户端A是发送udp数据包的请求端,网关C下的服务器D是udp数据包的接收端,我们要做的工作就是实现主机A与D通信的udp数据包在网关B和C之间的卫星网络(项目实验环境)传输过程中可靠。

一、网络环境测试说明



1.客户端A运行的是一个发送udp数据报请求的程序。

2.小站B和主站C运行的是同一个程序,根据命令行参数server/client选择程序的运行模式。

小站B运行的是UDT client模式:它是UDT程序运行的client端,小站通过iptables命令将特定的数据链路层udp数据包拿到网络层,通过libnetfilter_queue库的socket通信函数将udp数据包拿到应用层,将udp packet作为UDT通信传输的数据内容发送到主站C的服务器。

主站C运行的是UDT server模式:它是UDT程序运行的server端,主站接收多个小站发送的udp数据包,然后通过Raw Sockets通信将数据包发送到外侧网卡,路由到服务器D主机。

3.服务器D运行的是一个接收udp数据包请求的程序,并向客户端回复特定信息,服务器D回复的udp数据包,经过主站C也需要通过iptables规则将数据包拿到应用层,通过UDT协议传输数据到小站B,然后小站B通过Raw Sockets 将数据包回复给客户端A。

二、UDT可靠传输程序代码分析

1.main函数程序架构分析:

小站client运行模式:程序首先建立与主站的UDT连接,然后划分为三个线程执行。

client_queuer线程:执行msgqueuer_loop函数:调用libnetfilter-queue库函数,和内核队列进行socket通信,获取 iptables路由的udp数据包。

clientsnd线程:执行client_udtsocket_snd函数:小站向主站发送udt数据包请求。

clientrecv线程:执行udtsocket_recv函数:udt通信的消息接收端,小站接收中心站的回应,接收端会将接收到的udp数据包通过SOCK_RAW发送到外侧网卡,路由到目的ip主机。

主站server运行模式:程序接收多个小站的UDT连接,然后划分为三个线程执行。

server_queuer线程:执行msgqueuer_loop函数:调用libnetfilter-queue库函数,和内核队列进行socket通信,获取 iptables路由的udp数据包。

serversnd线程:执行server_udtsocket_snd函数:主站通过识别小站下的目的主机来给对应的小站回复消息请求的内容。

serverecv线程:执行udtsocket_recv函数:udt通信的消息接收端,中心站接收小站发送的请求。接收端会将接收到的udp数据包通过SOCK_RAW发送到外侧网卡,路由到目的ip主机。

2.nfq获取udp数据包到应用层:

使用libnetfilter_queue库接口来获取网络层的udp数据包:

nfq_open()打开内核udp包队列,nfq_bind_pf()绑定nfnetlink_queue,nfq_create_queue绑定socket通信的内核9号队列,执行cb函数。cb函数调用sendpkttoqueue从内核queue中取出udp的数据包,并将数据包发送到消息队列中。

3.UDT数据发送和接收:

UDT消息的客户端:小站主动与主站建立UDT连接,发送消息请求,执行模式与建立tcp套接字一致,先通过udt_socket建立套接字,然后执行udt_connect建立与主站的连接,udt_send函数向主站发送UDT请求,小站也另开辟了一个线程处理主站的回复。

UDT消息的服务器端:主站等待多个小站的UDT连接,接收并回复消息请求,执行模式与tcp一致,udt_socket创建UDT套接字,然后udt_bind绑定端口,udt_accept接收小站的连接,udt_recv接收小站发送给主站的数据,也另开辟了一个线程给小站回复消息请求。

三、测试步骤说明

环境配置:

1.小站和主站源码安装libnetfilter_queue库。

2.小站和主站源码安装udt.sdk.4.11.tar.gz。

3.小站拷贝一份client端运行的目录源码,主站拷贝一份server端运行的目录源码,

4.主站下的服务器D主机执行UdpServerSocket.java源码,启动udp服务器。

5.小站下的客户端A主机执行UdpClientSocket.java源码。发送udp请求。

测试步骤:

1.主站执行iptables和ebtables命令,将数据包从链路层拿到网络层(参考config.sh文件),配置多个小站所对应的名称、ip和网段(参考server.conf文件)。

iptables -A PREROUTING -t mangle -p udp -s 192.168.1.150 -d 10.10.188.56 -j NFQUEUE –queue-num 9

/sbin/ebtables -t broute -A BROUTING -p ipv4 –ip-protocol udp -j redirect –redirect-target ACCEPT

2.小站执行iptables命令,将数据包从链路层拿到网络层(参考主站配置)。

3.主站下的服务器主机D编译执行UdpServerSocket.java源码,启动UDP服务器。

4.小站下的服务器主机A编译执行UdpClientSocket.java源码,每间隔10秒发送udp数据请求并等待服务器的消息回复。

测试说明:

“我的”文件夹下包含子目录:client、server、tyy、work20150817;文件:UdpClientSocket.java、UdpServerSocket.java、udt.sdk.4.11.tar.gz、draft-gg-udt-01.txt。

udt.sdk.4.11.tar.gz是用于小站和主站安装udt的C++接口库。

client目录下的文件是小站端运行的UDT程序源码,make即可生成执行程序myapp,./myapp client以client模式运行。

server目录下的文件是主站端运行的UDT程序源码,make即可生成执行程序myapp,./myapp server以client模式运行。

tyy目录的源码是可以在小站和主站下运行的同一套代码,与client和server源码类似。

UdpServerSocket.java是主站下的服务器主机D运行的代码,用于启动UDP服务器。

UdpClientSocket.java是小站下的客户端主机A运行的代码,用于发送udp测试的数据包。

draft-gg-udt-01.txt是对UDT协议数据包格式和通信协议规范的标准文档说明。

测试说明中包含的文件内容放在百度网盘:udt测试代码以及安装包链接地址
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息