udp协议范文

时间:2023-09-29 01:13:22

udp协议

udp协议篇1

关键词:UDP协议;Socket;网络通信

中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)34-1867-02

Socket Network Programs Based on UDP Protocol

ZHOU Li-juan

(College of Science, Hunan University of Technology, Zhuzhou 412008, China)

Abstract: Windows Socket is a network programming interface,and applications can correspond to eachother in different domains without worrying about the different protocols by using it.This paper introduces the mechanism and principle of Socket network programs based on UDP protocol,and proposes a method of network with Java socket.

key words: UDP protocol;socket; network communication

Socket适用于网络环境中的进程间通信,它已成为当前许多操作系统的网络API,也是网络操作系统中必不可少的基础功能。随着Linux操作系统和Internet的不断发展,Linux网络环境下尤其是基于UDP的socket通信技术仍广为注目。文章介绍了socket的编程原理,并通过一个Java编写的客户/服务器程序,描述了网络中基于UDP的不同主机上的两个进程之间的socket通信机制。

1 Socket通信机制

Socket(套接字)机制是一种API,是网络应用程序的编程接口。Socket是通过标准文件描述符和其它程序通讯的一个方法。每一个套接字都用一个半相关描述:{协议,本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述:{协议,本地地址、本地端口、远程地址、远程端口},每一个套接字都有一个本地的由操作系统分配的唯一的套接字号。

根据传输数据类型的不同,Socket主要分为三类:1) 流式Socket(SOCK_STREAM),在这种方式下,两个通讯的应用程序之间要先建立一种虚拟的连接,提供可靠的、面向连接的通信流,它使用TCP协议,从而保证了数据传输的正确性和顺序的。2) 数据报Socket(SOCK_DGRAM),它使用数据报协议UDP,定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠、无差错。3) 原始Socket,原始套接字允许对底层协议如IP或ICMP直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。

2 UDP协议的工作原理

UDP协议是一个面向无连接的协议,其连接的建立不必像TCP那样需要服务器端侦听,也不需要有客户机请求连接,属于一种“强制”性的网络连接。UDP提供一对一或一对多的、无连接的数据报服务。该服务对消息中传输的数据提供不可靠的、最大努力的传送,这意味着它不保证数据的到达,也不保证所传送的数据报的顺序是否正确,UDP不重新传输丢失的数据。其主要工作是:将应用程序传输过来的数据分块交给网络层,确认接受到分组信息。

尽管UDP无法像TCP一样提供可靠的数据传输,但UDP并不比TCP缺乏优越性。UDP在传输效率方面比TCP要高一些,而且许多应用程序并不需要保证严格的传输可靠性,比如视频会议系统等,需要实时的交互,但并不要求音频视频的绝对正确。

使用UDP协议传输数据时,首先设置客户计算机的Local Port(本地端口)属性,而作为服务器的计算机只需要设置Remoter Host(远程主机)属性为客户计算机的IP地址或域名即可,并将其Remote Port属性设置为客户计算机上的Local Port属性。使用UDP端口号时,端口提供了用于发送消息的位置,每个端口由一个唯一的编号来标识。当应用程序向另一台计算机发送数据时,UDP生成一个数据头,包括源端口,这些端口提供送达信息所需要的地址。UDP协议还为数据和数据头计算出求和检验的值,在目标计算机中,数据包被传递至UDP协议程序并送到目的地端口。

3 UDP套接字的通信过程

中提供了两个类DatagramSocket和DatagramPacket用来支持数据报通信。DatagramSoc ket用来在程序之间建立传送数据报的通信连接,是数据报通信中的Socket。在数据报实现C/S通信程序时,无论在客户端还是服务器端,都要首先建立一个DatagramSocket对象,用来表示数据报通信的端点,应用程序通过Socket接收或发送数据报。

DatagramPacket则用来表示一个数据报,它是传输数据的载体,封装了数据、数据长度、数据报地址等信息。

采用UDP套接字方式实现C/S的通信程序由客户端和服务器端两部分组成。服务器进程依次按以下步骤进行:1) 调用Socket()创建一个数据报套接字;2) 调用bind()把服务器地址绑定在该套接字上;3) 调用recvform()等待客户进程发来的请求,服务器此时处于无限循环状态;4) 服务进程接收到客户进程所发来的数据报后,进行处理,调用sendto()将处理结果返回给客户进程,返回状态3),继续监听;5)服务进程调用close()撤消套接字,终止服务。

客户进程则按以下步骤进行:1) 调用Socket()创建一个数据流套接字;2) 调用sendto()向服务器进程发送数据报;3) 调用recvfrom()等待服务器进程返回该处理结果;4) 客户进程调用close()撤消套接字。

4 数据报通信实例

程序由服务器端和客户端两部分组成,服务器端主机中有一个名为“udp_socket.txt”文件,文件中保存了一段英文。服务器端接收一个客户端的请求,就从文件中读取若干个英文字符发送给客户端。当文件中所有内容发送给完毕,服务器端程序将退出。客户端首先构造一个数据报发送给服务器端,然后等待接受服务器端响应,当接收到服务器端的数据报后,显示数据并结束通信。

1) 服务器端程序

public class Server_Th

{ boolean m_q=true;

public void serverWork() throea IOException

{DatagramSocket ds=new DatagramSocket(2000)

//创建端口号为2000的数据报套接字

BufferedReader in=new BufferedReader(new FileReader (“udp_socket.txt”));

while(m_q)

{ byte buf[ ]=new byte[256];//创建缓冲区

DatagramPacket packet=new DatagramPacket (buf, buflength); //创建接收数据报对象

ds.receive(packet);//接收数据报

String dString=null;

if((dString=in.reaLine())==null)

{in.close();

m_q=false;

dString=”Good Morning!”;}

buf=dString.getBytes();//将数据存储到buf中

inetAddress address=packet.getAddress();

//得到客户端IP地址

int prot=packet.getPort();//得到客户端的端口

packet=new DatagramPacket (buf,buf.length, address. port );

//构造要发送数据报

ds.send(packet);//发送数据报

}

ds.close();//关闭

}

public void main(String args[])

{ Server_Th server=new Server_Th();

try

{server.serverWork();}

Catch(IOException e){}

}}

2) 客户端程序

public class Client_Th

{public void main(String args[ ]) throws IOException

{ DatagramSocket socket=new DatagramSocket( );

//创建套接字对象

byte buf[ ]=new byte[256];

InetAdress address=InetAddress.getByName(“20.14.30.9”);

//服务器IP地址

DatagramPacket packet=new DatagramPacket(buf,buf. Length,address,2000);//创建要发送的数据报对象

socket.send(packet);//接收数据报

packet=new DatagramPacket(buf,buf.length);

//创建要接收的数据报对象

socket.receive(packet);//接收数据报

String received=new String(packet.getData());

System.out.println(“The string form the server: ”+recerived);

//取得数据报中的数据并显示

Socket.close();//关闭socket

}}

编写程序时客户端和服务器端的DatagramSocket必须用一个端口,因为客户端向服务器端请求时,服务器需要知道从哪个端口监听请求。当数据进行传输时,服务器从接收到的数据报中得到客户端的接收数据的端口,然后将数据报发送到这个端口,客户端则监听这个端口而得到服务器端发送过来的数据报并显示其内容。运行时要先运行服务器端程序,再运行客户端程序。

5 小结

Socket在网络编程方面发挥着很大的作用。UDP是可靠性无法得到保障的协议,但对于质量要求不是很高的网络应用程序,UDP是一个很好的选择。

参考文献:

[1] 张桂珠.Java面向对象程序设计[M].北京:邮电出版社,2006.

[2] 周坤,傅德胜.基于Windows Socket的网络数据传输及其安全[J].计算机工程与设计,2007,28(22):5381-5386.

[3] 赵文清.浅析用Socket的Java语言网络通讯机制和程序设计[J].信息技术,2002(7):66-67.

udp协议篇2

关键词:arm;linux;交叉编译环境;udp协议;重发机制;重发次数

中图分类号:tp393文献标识码:a文章编号:1009-3044(2011)13-3001-03

the application research of communicating based on arm-linux environment and udp-protocol

cui hao, shao ping-fan

(wuhan university of science and technology, wuhan 430000, china)

abstract: the sender and receiver are relatively independent when communicating under udp- protocol, the sender resending messages to receiver times instead of creating a connection. a resend-mechanism that the key-messages were send by upper computer in fixed times, was used in order to ensuring not to lost key-message. although the resend-mechanism can ensure that the key-message wouldn’t be lose anyway, but abundant of redundancy messages were send through the network device lead to inefficency, obviously more resend-times more inefficency. so, how to determine the resend-times become the crucial to improve the efficiency while ensuring the messages were send accurately. a method of determining the resend-times will be given as following.

key words: arm; linux; crossing compile evironment; udp-protocol; resend mechanism; resend times

udp协议以其高效性和应用的简单,被广泛运用于嵌入式网络开发中。由于udp协议的应用简单,在嵌入式设备开发过程中,网络资源的利用率并不高。以下将介绍一个udp具体项目实验过程,描述arm-linux环境的软硬件环境构建过程,并对udp协议下一种重发模式中上位机的重发次数的确定提出一种可行的方法。

1 研究背景

随着嵌入式技术的快速发展,嵌入式设备已经在许多领域取代了传统的微型机设备。本文的选题主要来自于实习期间承接的一项改造项目:某院校特长生评分系统的改造。项目改造目的有:1) 保留原上位机。2) 改用手持式客户端进行显示及评分操作。3)保留原有网络设备。针对要求,我们使用s3c2440作为硬件平台,移植linux操作系统,并在arm-linux环境下研究了udp协议的通信过程,进行了上位机与嵌入式系统的udp协议通信实验及分析,并给出一种重发机制中的发送次数求法。

2 硬件平台介绍

s3c2440处理速度达到了400mhz,具有较高的性价比。为了提高开发效率,我们采用公司自行研制开发的et-s3c2440开发板。

2.1 et-s3c2440开发板简介

et-s3c2440是公司自行开发的一款arm9架构的实验开发板,其结构框图如图1。

核心板的主要器件有:32mb×2片sdram,64mb norflash,512mb nandflash。设计了启动方式可选,通过开关选择从nandflash或norflash启动。

2.2 实验相关电路说明

底板电路主要功能是输入输出以及网络通讯功能。按键输入部分采用扫描方式获得输入,用一个单向地址锁存器和一个双向地址锁存器与地址总线相连,可以通过扫描地址来获得按键输入。lcd采用三星的3.5寸tft屏作为显示输出设备。网卡芯片选用的是与原设备匹配的10m 的cs8900a,关于cs8900a与s3c2440的硬件连接,有众多资源可供参考,本文不再赘述。

3 系统软件平台的构建

硬件平台搭建完毕后要将操作系统和应用程序在硬件平台上运行起来。以下是对嵌入式linux操作系统移植的过程。

3.1 交叉编译环境的构建

linux 2.6.29.1版本的内核可以登录到kernel.org下载。本文选择的是arm-linux-gcc-4.3.2工具链(ftp://ftp.arm.linux.org.uk/pub/armlinux/toolchain)

在宿主机上进入linux系统,切换当前目录到工具链所在目录,新建一个arm目录保存解压后的文件(mkdir /user/local/arm)并将arm-linux-gcc-4.3.2解压到这个目录中(tar jxvf arm-linux-gcc-4.3.2 –c /user/local/arm)。然后将环境变量$path修改一下,让$path中包含有arm-linux-gcc所在的目录(编辑/etc/profile 添加语句”export path=/user/local/arm/4.3.2/bin:$path”),然后reboot一下,这样交叉编译环境就构建好了。

3.2 bootloader的移植

vivi是一款相当成熟和相对简单的常用bootloader,我们以vivi为移植原型,将s3c2440所有io端口寄存器定义添加到头文件2440add.inc,删除部分硬件平台使用不到的代码,最后将修改过的vivi制作成镜像烧录到flash中。[1]

3.3 linux内核移植

获取linux-2.6.29.1源代码并解压后,首先修改内核源代码所在目录中的makefile,将系统架构修改为arm(arch ?=arm ),交叉编译工具修改为arm-linux-gcc (cross_compile ?=arm-linux-),修改输入时钟(arch/arm/mach-s3c2440/mach-smdk2440.c中的函数static void __init smdk2440_map_io中,修改s3c24xx_init_clocks(12000000)此处所用晶振为12m)。修改machine名称(在arch/arm/mach-s3c2440/mach-smdk2440.c文件中的函数machine_start( ),修改为machine_start(s3c2440, “自定义机器名”),修改nandflash分区信息(arch/arm/plat-s3c24xx/common-smdk.c结构体static struct mtd_partition smdk_default_nand_part[]中保存的是nandflah的分区信息,将其修改为当前使用的分区信息),然后修改nandflash的匹配时间(3c2410_platform_nand_smdk_nand_info smdk_nand_info ={})。

上述内核源代码修改完成后,还需要对一些设备的驱动进行修改。本文使用的nec 3.5寸 320×240液晶屏,硬件平台使用gpg4脚进行背光控制,需要修改lcd背光(/arch/arm/mach-s3c2440/mach-smdk2440.c中static void __init smdk2440_machine_init(void),将函数中的gpio口配置为gpg4)。关于cs8900a网卡的驱动移植,相关资源很丰富,本文也不再赘述。

本实验中nandflash采用的是yaffs2文件系统,所以打yaffs2文件系统补丁,压缩包为cvs-root.tar.gz。

至此,linux的内核源代码修改工作完成了,下面还需要利用makefile,进行内核配置。

在linux 2.6.29.1内核目录下首先make s3c2410_defconfig使用2410的配置模板来配置2440;然后make menuconfig,这时我们可以在图形化界面中,空格键可改变各个配置选项的被选中状态,根据需要进行配置即可。配置完成后保存好配置,最后进行内核的编译(make dep 建立文件间依赖 make clean 清除编译残留文件make zimage 生成内核压缩镜像文件)。

编译过程完成后会在内核目录arch/arm/boot/下生成zimage内核映像文件,将这个镜像文件烧录到flash中,调试检验,经上述修改后的内核工作运行正常。

3.4 根文件系统的制作

根文件系统是使用busybox-1.13.3来制作完成。下载busybox并解压完成后,修改makefile中的架构为arm架构,编译工具为arm-linux-gcc( arch ?=arm; cross_compile ?=arm-linux-),然后make menuconfig,通过图形界面对busybox进行配置,然后对busybox进行编译(make config_prefix=/opt/studyarm/rootfs install),在目标目录下会生成目录bin、sbin、usr和文件linuxrc的内容。

基本目录结构生成后,应该在目标目录下建立一些未生成的必要的系统目录如dev、etc、lib等,并通过chmod命令改变目录权限为可写。再将一些必要的动态链接库和静态库拷贝到lib下,然后在dev目录下创建设备节点,最后创建该嵌入式linux系统的初始化配置文件(包括设备列表文件、口令、网络分组组名、hostname主机名、etc/inittab初始化表单、etc/profile环境变量配置文件、用于系统初始化的.bash脚本文件等)。[2]由于本实验需对网络编程,要求自动初始化cs8900a网卡芯片的ip地址、网关、子网掩码等,所以在开机自启动脚本中加入ifconfig语句,使得开机时自动配置网卡参数。

根文件系统构建完成后,使用yaffs2文件系统制作工具mkyaffs2image.tgz,通过命令mkyaffs2image rootfs rootfs.img生成根文件系统镜像,然后将镜像烧写入flash中。

4 arm-linux环境下的udp协议通信实验

经过上述硬件设计和操作系统移植过程,本文所使用到的实验环境已经构建完毕,经反复调试修改,嵌入式linux操作系统在平台下运行正常,于是进行udp协议通信实验。

4.1 udp协议套接字编程基础

udp是一个面向数据报和无连接的简单传输层协议,它不像tcp那样通过握手过程建立服务器与客户端的连接才可以工作。在网络通信质量较好的情况下,udp体现出高效率,这适合于传送少量报文的应用。[3] linux系统是通过套接字结构来进行网络编程的,应用程序通过对套接字的几个函数调用,会返回一个用于通信的套接字描述符,而linux应用程序在进行任何形式的i/o操作时,程序实际上是在读写一个文件描述符。[4]因此linux下的套接字编程,可以看成是对普通文件描述符的操作,这些操作与被使用的硬件平台无关,这是linux设备无关性的优点。udp协议的通信模型如图3所示。

在上述流程中,客户端所收到的报文被存储在缓冲区中,recvfrom()函数返回了报文存储缓冲区的首地址,我们可以很方便地对这个首地址进行数组操作,从而实现对报文的解码。

4.2 上位机报文结构及重发机制分析

根据项目要求,上位机软件依然保留,我们使用协议嗅探工具对上位机发送的报文进行了嗅探,得到了上位机报文的结构如表1所示。

表1 上位机报文结构

上位机发出的每条报文由32个字节组成,第0位为版本信息。第1……12位为比赛信息和运动员教练信息,是报文的关键信息部分,13……22位为服务器端和客户端的ip地址及端口号信息,23位是上位机对客户端的操作指令代码,24位是相关重发机制的代码,30和31两位是checksum,用来保证数据传输的正确。上位机采用的重发机制是一种上位机按照固定重发次数多次发送同一关键内容报文的机制,其第24位重发机制位被分为高4位和低4位两部分,高四位的内容是当前发送的报文的索引号,每次发送一条新内容的报文时索引号自增1,索引号的取值范围在0x00—0xff范围内循环自增。低四位是重发编号,表示同一索引号的报文正在被第几次重发,固定的重发次数由上位机初始化时设定。

4.3 嵌入式客户端的实验程序设计

针对报文结构,我们对接收端编写实验程序代码,代码的主要功能是从上位机接收报文,将计算出的checksum校验和与收到的校验和对比判断报文是否正确,然后从正确报文中取出主要信息并按照报文中的上位机指令码进行输出。其结构流程图如图3所示。

实验程序经编码、调试后在交叉编译环境中交叉编译,生成arm-linux环境下可执行文件,在目标板上执行。经测试试验程序能够正确接收上位机发来的报文,对报文解码,并能根据上位机命令对关键信息做输出处理。

4.4 对上位机重发次数的研究

进行udp协议通信时,发送端和接收端的状态是相对独立的,发送端不与接收端建立连接,而是不停向接收端发送,为了确保不丢失报文,上位机采取了按固定次数重发相同内容报文的机制。然而这种机制虽然可以有效确保报文不丢失,但是大量冗余数据报被发送,网络资源利用率不高。重发次数越多,冗余数据报越多,效率越低。要想有效保证数据报准确发送的同时又不产生过多冗余数据报,那么重复发送的次数的确定就成为问题的关键。以下给出一种确定上位机重发次数的方法。

假设当前网络状况下,每次报文发送被丢失的概率为p,系统允许接收端报文关键内容丢失概率为q,那么如何确定以上重发机制中的重发次数k呢?

特殊情况下若报文重发次数为2,分别在每条报文重发机制位注明一个索引号和一个重发编号,发送端发送报文的次序应形如 1.1 ,1.2 ,2.1 ,2.2 ,3.1 ,3.2……其中索引号相同的报文关键内容相同,重发编号不同代表同一关键内容报文的不同次发送。因此只有出现连续两次丢失数据报的情况下,报文关键内容才可能丢失。出现连续两次丢失的情况有2种,当x.1 , x.2丢失,此时索引号为x的报文关键信息将全部丢失。当x.2,(x+1). 1丢失,丢失报文的索引号不同,此时不会发生报文关键信息丢失,因此报文关键内容丢失的概率q=p2/2。

当报文重发次数为3,依然在每条报文的重发机制位注明索引号和重发号,发送报文的次序应为1.1 ,1.2 ,1.3 ,2.1 ,2.2 ,2.3 ,3.1 ,3.2……。只有出现连续3次丢失数据报的情况报文关键信息才可能丢失,列出连续3次丢失报文的情况有3种,当x.1 , x.2 , x.3丢失,此时索引号为x的报文信息全部丢失。当x.2 , x.3 ,(x+1).1或x.3 ,(x+1).1 ,(x+1).2丢失时不影响报文的准确传递。因此此时报文关键内容丢失的概率q=p3/3。

推广至一般情况易得当报文重发次数为k时,报文关键内容丢失的概率q=pk/k,移项有kq=pk。于是我们得到求重发次数k的方法如下:

1) 根据网络状况获得报文丢失概率p;

2) 根据客户需求取得报文关键内容的允许丢失率范围q;

3) 分别作出y=px和y=qx的图像;

4) 求得两图像的交点的x坐标,并将x坐标值取整加一即为所求重发次数k。

本文实验中,需求方允许报文关键信息丢失概率q=0.0001,我们分别对上位机发送端和下位机接收端收发的报文进行了统计,在某一固定时间段内,上位机共发送报文19665条,接收端接收报文18636条,传输过程中丢失的报文19665-18636=1029条,当前网络环境下的报文丢失率为,即p=0.0523。据此数值分别作出y=0.0001x的曲线和y=0.0523 x的曲线,取得两曲线交点x坐标为x≈2.78,最后将x=2.78取整加1得到k=3,即上位机对同一数据报的重发次数应该定为3次就可保证系统丢失报文的概率低于0.0001。

5 结论与展望

本文从硬件平台搭建、linux移植以及udp协议编程几个方面介绍了arm-linux环境下udp协议通信的具体实现,并分析了一种在实际嵌入式项目中常用的上位机数据报重发机制,最后对这种机制中的重发次数的确定方法给出了求解过程,为后续的具体项目实施提供了实践依据,也希望为其他应用这种重发机制的嵌入式产品开发者们提供了借鉴。

参考文献:

[1] 李伟.基于arm9的嵌入式linux手持平台的设计与实现[d].武汉:武汉理工大学硕士学位论文,2009.

[2] 范艳开.基于arm的嵌入式linux操作系统移植[d].西安:西北工业大学,2005.

[3] 刘畅,彭楚武.linux下的udp协议编程[j].仪表技术,2006(1).

udp协议篇3

【关键词】UDP协议;ARM;X86;通讯;解决方案

随着人工智能的应用,ARM产品已经遍布到各个领域:工业控制、无线通讯领域、消费类电子产品、成像和安全产品,包括现在流行的数码相机和打印机中绝大部分采用ARM技术,手机中的32位SIM智能卡也采用了ARM技术。除此以外,ARM微处理器及技术还应用到许多不同的领域,并会在将来取得更加广泛的应用,因此,ARM与其它平台之间通讯就显得尤为重要。

1.UDP协议本质

UDP协议是英文User Datagram Protocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。

UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。

数据报的长度是指包括报头和数据部分在内的总的字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据工作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。

UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。

如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。其实在UDP协议中校验功能是可选的,如果将其关闭可以使系统的性能有所提升。这与TCP协议是不同的,后者要求必须具有校验值。

2.实现案例

实现案例如下:在触摸屏进行画图,使其在液晶屏上显示,同时通过网络传输数据,使其在计算机屏幕上显示,并由计算机控制清除液晶屏上的图形。

步骤如下:

(1)新建工程

void InitNetWork()//初始化网络

{

U32 ipaddr32,ipmaskaddr32,ipgateaddr32;

U8 *Mac;

ipaddr32=Get_ipaddr(); //获取IP地址

ipmaskaddr32=Get_maskaddr();//获取子网掩码

ipgateaddr32=Get_gwaddr(); //获取网关

Mac=Get_mac(); //获取网卡地址

NetPortChoose(0); //选择网口,必须在配置网络以前进行

initOSNet(ipaddr32, ipmaskaddr32, ipgateaddr32,Mac);//配置网络

OSTimeDly(1000);//任务挂起1秒

printk("init Ethernet and UDP is ok!\n");

}

(3)定义计算机端套接字,全局变量

(4)编写Main_Task任务及消息循环

主要负责响应触摸屏消息,在屏幕上画图,然后将数据传输到计算机上。

对触摸屏消息的处理和键盘消息类似,其消息类型pMsg->Message为OSM_TOUCH_SCREEN,消息参数pMsg->LParam中包含了触摸屏的动作信息,定义如下:

#define TCHSCR_ACTION_NULL 0

#define TCHSCR_ACTION_CLICK 1 //触摸屏单击

#define TCHSCR_ACTION_DBCLICK 2 //触摸屏双击

#define TCHSCR_ACTION_DOWN 3 //触摸屏按下

#define TCHSCR_ACTION_UP 4 //触摸屏抬起

#define TCHSCR_ACTION_MOVE 5 //触摸屏移动

消息参数pMsg->WParam中则包含了触摸点的坐标信息,低16位是X坐标值,高16位是Y坐标值。这里当触摸屏产生“按下”动作后采用MoveTo()函数设置绘图起始点坐标,当产生“移动”动作后采用LineTo()函数绘制线段。

3.解决方案

3.1 建立Socket

为了建立建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为:

int socket(int domain, int type,int protocol);

domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_STREAM或SOCK_DGRAM,Socket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值”0”。Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。

Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上”建立一个Socket”意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。

两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。

3.2 配置Socket

通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用bind函数来配置本地信息。

Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。Bind函数原型为:

int bind(int sockfd,struct sockaddr *my_addr,int addrlen);

Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为

3.3 建立连接

面向连接的客户程序使用Connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:

int connect(int sockfd,struct sockaddr *serv_addr,int addrlen);

Sockfd是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地址结构的长度。Connect函数在出现错误时返回-1,并且设置errno为相应的错误码。进行客户端程序设计无须调用bind(),因为这种情况下只需知道目的机器的IP地址,而客户通过哪个端口与服务器建立连接并不需要关心,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候到达端口。

Connect函数启动和远端主机的直接连接。只有面向连接的客户程序使用socket时才需要将此socket与远端主机相连。无连接协议从不建立直接连接。面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的请求。

Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。

int listen(int sockfd,int backlog);

首先,当accept函数监视的socket收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的初始socket仍可以继续在以前的socket上监听,同时可以在新的socket描述符上进行数据传输操作。

3.4 传输数据

Send()和recv()这两个函数用于面向连接的socket上进行数据传输。

Sockfd是你用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len是以字节为单位数据的长度;flags一般情况下设置为0(关于该参数的用法可参照man手册)。

Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。在程序中应该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。

3.5 传输结束

当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作。

udp协议篇4

关键词 网络通信;UDP二次封装;共享内存;进程间通信

中图分类号TN92 文献标识码A 文章编号 1674-6708(2011)55-0181-02

1研究背景

磁浮仿真系统大致可以为分3个层次,底层是仿真子系统的仿真管理计算机,中间层是仿真支撑服务器,上层是工作站仿真计算机。所有环境仿真设备通过以太网与底层子系统的仿真管理计算机相连,仿真管理计算机对其仿真子系统进行统一管理,它将子系统仿真设备的工况信息实时向上推送。仿真支撑服务器与所有底层子系统管理计算机和上层工作站均有通信需求,是报文收发的中转站,它将、工作站及其执行结果的信息记入数据库备查,或用于数据分析。上层工作站用于集成管理底层的子系统,它注入故障下达测试命令到底层子系统管理计算机并等待应答。此外,底层子系统管理计算机之间也互相传递信息。这些计算机中仿真系统在处理接收和发送数据上的工作大多是相同的,如果能够简化它们在数据通信上的工作,将对系统的设计和效率有很大的提高作用。网络通信方案的设计,即可将系统中各模块处理网络通信的部分抽取出来,封装成一个相对独立的模块。

2影响因素分析

磁浮仿真系统中底层管理计算机上运行的仿真软件是不同编程语言实现的,各自重新构建通信接口有困难,底层、中层、上层不同计算机之间的通信要求也各异。通过对磁浮仿真系统中多个模块的通信要求分析,可以得到模块间的数据通信具有以下特点:

1)多点对多点传输数据。如果采用面向连接的方式进行通信,则需要每个模块都各自维护到其它模块的多个连接,处理起来很不方便,并且不利于扩充模块。因此适合无连接的通信;

2)模块间的数据通信具有突发性,通信数据量不规则、不连续。比较适合采用报文转发方式传输;

3)通信目的计算机的IP地址可能改变,需要可配置;

4)模块的数量可能扩充,也就是说,在同一台计算机上运行的不同模块的通信节点可能有多个,需要可配置;

5)模块间传输数据必须保证通信的可靠性和数据的正确性;

6)某些通信要求实时性,通信异常导致陈旧数据必须清除。

3方案设计

根据第2节的影响因素分析,了解到通信方案需要解决四个问题,即通信接口问题、实时性可靠性均衡问题、IP端口可配置问题。首先,解决通信接口问题,需要将系统的数据通信工作独立出来,与原本系统的其他应用隔离开。因此,引入这样两个概念――通信层进程和应用层进程。通信层进程负责为应用层提供通信服务和其他辅助服务,如通信日志记录、通信状态监控等;应用层进程即原本系统各模块运行的应用进程,两者间数据通信靠本机进程间通信维系。基于确保实时性和大数据量的通信要求,本机进程间通信选取的方法是共享内存,然后分别为通信层和应用层提供读写共享内存的接口,即使用DLL(动态链接库)的方式分别加载到通信层程序和应用层程序中。其次,解决实时性可靠性均衡问题,从多点通信和实时性的考虑出发,决定了选取无连接且传输更高效的UDP协议。然而,UDP协议不能保证可靠性,于是想到了对UDP协议进行二次封装,形成一种兼顾通信的可靠性与实时性的新协议――RUDP协议。最后,采用通信层进程读取.ini配置文件的配置信息的方法来解决IP端口可配置问题。

3.1 本机进程间通信

本机应用层与通信层之间的进程间通信需要借助共享内存技术、动态链接库技术来实现。

共享内存技术是通过内存映射文件的方式来实现的。内存映射文件是文件内容到进程虚拟地址空间的复制。文件的内容的拷贝称为文件映像,而操作系统用来维持该拷贝的内部结构称为文件映射对象。另一个进程通过使用第一个进程的文件映射对象建立映像,可以在它自己的虚拟地址空间建立完全一样的文件映像,这样就达到了进程间共享数据的目的。

设计方案将共享内存分为两种。一种发送报文时使用,应用层进程向此共享内存内写入报文,通信层进程分配线程采用轮循或接收消息通知的方式读取共享内存中的待发送报文,并通过套接字将其发送到目的计算机的通信层进程。这种共享内存可称之为发送结点共享内存。另一种与此相反,接收报文时使用,通信层进程接收到报文后,根据报文首部判断与之对应的目的应用层,并将报文写入对应的共享内存,应用层进程再读出并解封装报文。根据报文发送目的地址与源地址,可为每个源地址与目的地址分配对应的共享内存。每一块共享内存,有一个或几个写入线程,一个读出线程与其相对应。

动态链接库(DLL)技术用来提供读、写、清空共享内存的接口。在DLL完成相应共享内存的初始化工作后,发送接收双方进程通过调用该DLL中相应的写入读取共享内存的函数访问共享内存,从而实现双方的通信。双方进程启动后,用内存映射文件的方式把一块命名共享内存映射到DLL附加的各个进程地址空间。

共享内存的实现方式设计如图1所示。

3.2 UDP协议二次封装

RUDP就是在原TCP/IP协议的传输层的UDP协议和应用层之间加入了一层为保证可靠数据传送而实现的RUDP软件模块而形成的一个五层体系结构,即在原有TCP/IP模型的应用层和传输层之间加入一个定制的通信层(RUDP层),这样就可以利用UDP协议实现一种基于消息的面向连接的可靠数据传递机制。

为了保证数据传输的可靠性,可以借鉴TCP的三次握手原理,对UDP进行二次封装,形成了RUDP传输机制。报文发送方对传输的可靠性和实时性要求通过应用层与通信层的接口DLL,以出口函数的参数形式传递,然后再将这些信息封装到原报文首部。通信层中解封装报文首部,并根据这些信息灵活地选择通信方式用以提高传输效率和保证可靠。

3.3配置文件

.ini配置文件用来灵活配置系统中某台计算机需要通信的节点个数、通信目的地址、对端接收端口和本机绑定端口。.ini的读写通过调用api函数GetPrivateProfileInt();GetPrivateProfileString()和WritePrivateProfileString()来实现。

4测试验证

根据通信方案的设计,我们已经编码实现了一套通信中间件,包含单独的通信层程序、配套动态链接库通信接口及.ini配置文件,并在100Mbps传输速率的局域网中进行了一对一、多对一、多对多的测试验证,得到测试结果如下表:

5结论

文中论述的通信方案确保了整个仿真系统可以高频度大数据量地进行通信,实现了上层工作站、中层服务器与下层管理计算机之间的数据交互要求。在保证数据传输可靠性的的前提下,尽可能的满足了数据传输的实时性。通信层完全独立于需要通信的应用层,通信接口良好,可以做到灵活配置,极大地方便了应用层的调用,为今后整个仿真系统的扩展,通信需求的增加提供了良好保证。完善后的通信方案不仅适用于本仿真系统,还可以应用于类似需求的局域网多点通信中。

参考文献

[1]施炜,李峥,秦颖编著.Windows Sockets 规范及应用-Windows网络编程接口.

[2]周伟明.多核计算与程序设计.华中科技大学出版社,2009.

[3]汪翔,袁辉编著.Visual C++实践与提高.网络编程篇.中国铁道出版社,2001.

[4]郎锐,孙方编著.Visual C++网络通信程序开发基础及实例解析.2版.北京:机械工业出版社,2006.

[5]电脑编程技巧与维护杂志社编著.Visual C++编程技巧典型案例解析网络与通信及计算机安全与维护篇.北京:中国电力出版社,2005.

[6]刘化君编著.网络编程与计算技术.北京:机械工业出版社,2009.

[7]梁庚,白焰.Windows下进程间通信方式探讨.微型电脑应用,2006,22(12).

[8]马魁涛,蔡颖,郭宝峰.Win32进程间信息共享的实现方法研究.

udp协议篇5

关键词:IPSec;NAT;IKE;VPN;UDP封装

中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)33-1360-03

Research on Coordination Between IPSec and NAT

ZHANG Ai-ke

(Departmet of Information Engineering, Liuzhou Vocational&Technical College,Liuzhou 545006,China)

Abstract: Network Address Translation (NAT) and IP security protocol (IPSec) are outstanding technologies that are widely used in network. At present, because IPSec and NAT are incompatible, the technologies can not co-exist in network at the same time. This paper engages in the research upon the coordination between IPSec and NAT. points out the application scope of NAT-T so as to guide the optimum IPSec VPN implementation.

Key words: IPSec;NAT;IKE;VPN;UDP encapsulation

1 引言

IPSec与NAT是用来解决IPv4中网络安全与IP地址短缺问题的两项技术。IPSec是Internet工程任务组(IETF)制定的一系列安全标准[1],已被确定为IPv6的必需组成部分,是下一代网络的安全标准,它可以较好地解决目前Internet上面临的安全威胁,有效地保证数据的安全传输。随着Internet的不断发展,采用IPSec技术实现利用互联网建立VPN网络,越来越被众多大中型企业所青睐,IPSec已逐渐成为构建VPN的主流技术。网络地址转换(NAT)技术[2] 在内部网络中使用内部私有IP地址,通过NAT将每个从内部网络发出的数据包的私有地址翻译成合法的公用IP地址在Internet上使用,支持多台主机共享全局IP地址,常见于接入设备和防火墙中,能很好地解决IPv4网络地址枯竭的问题,同时具有屏蔽内部网络的作用。

然而,在实际应用中,IPSec技术和NAT技术存在严重的不兼容性,当IPSec数据流穿越NAT设备时,两者无法协同工作,已被广泛使用的NAT设备制约着基于IPSec技术的VPN的发展。因此,IPSec和NAT兼容性方面的问题已成为当前网络安全领域的研究热点,寻求基于IPSec技术的VPN和现有的NAT设备和平共处,实现NAT透明穿越的解决方案已成为迫在眉睫的任务。

2 问题描述

由于IPSec对数据包进行保护,对数据包的改动会导致验证或解密过程的失败。IPSec与NAT的兼容性冲突是多方面的,其中主要是由于IPSec数据包在穿越NAT时无法进行正确转换造成的。IPSec与NAT的不兼容性问题主要有以下几个方面[3]:

1) IPSec AH和NAT:AH利用消息摘要算法对整个IP数据包产生一个散列值,该散列值的作用范围是整个IP包,包括源IP地址和目的IP地址,接收方利用该散列值认证收到的IP数据包。如果在发送过程中原始IP包的任何字段发生变化,都将会导致接收方的认证失败,接收方将丢弃该包。但NAT会对外出包的源地址和进入包的目的地址进行修改,AH认为IP包被非法修改,从而导致认证失效。ESP的完整性检查不包括IP头(传输模式),或者检查的是不为NAT所修改的内嵌IP协议头(隧道模式),因此在ESP中不存在这样的问题。

2) 校验和与NAT:TCP和UDP在计算校验和时使用了伪头部,因而校验和与IP源和目的地址有依赖关系。因此,当NAT设备改变IP地址后需要重新计算并修改TCP/UDP校验和。当应用了ESP传输模式的IP包经过NAT设备时,由于TCP/UDP校验和处于加密负载之中,该值在在修改了外层IP包头后无法被NAT进行更新,这样,虽然IPSec不会丢弃这个包,但是当它被送往上层协议处理,在进行校验和校验时会出错,这个包还是会被丢弃。ESP隧道模式可以和静态或动态NAT相兼容,因为TCP/UDP校验和只与内层“原始”IP包头有关,对于外层IP包头的的修改并不对其造成影响。然而,在NAPT存在的情况下,AH和ESP都无法通过NAPT,NAPT需要TCP/UDP端口来匹配出入信包,上层端口信息对于NAT网关是不可知的,所以NAT网关无法完成多个私网地址映射到一个公网地址的变换。

3) IKE地址标识符和NAT:在IKE协商中,通信双方使用IP地址作为身份标识符,而NAT设备对IP地址的修改会引起IP头中的地址和标识符不符,IKE会将这样的包丢掉。

4) IKE固定的目标端口和NAPT:IKE协商时的UDP通信端口号一般固定是500,而当NAPT后面的多方主机向同一响应者发起IKE SA时,NAPT需要通过不同的端口号区分不同的连接,因此,响应者必须能够接受非500UDP端口的IKE流量。

5) 重叠的SPD项和NAT:在IKE协商的第二阶段中,NAT后的多个主机和相同响应者协商SPD时会出现重叠,这样,响应者可能在错误的IPSec SA下发送数据包。

6) IPSec SPI选择符和NAT:IPSec ESP流量受加密保护,对NAT是透明的,NAT必须使用IP头和IPSec头来多路分解到来的IPSec信包,目的IP地址、安全协议(AH/ESP)、和SPI共同惟一标识一个安全联盟来达到这个目的。由于SA是单向的,外出和进入包的SPI选取是独立的,因此,仅通过监测外出的流量,NAT无法决定哪个进入的SPI和哪个目标主机相对应。

7) 内嵌IP地址和NAT:当内嵌IP地址时,由于载荷受到完整性保护,IPSec包中的任何IP地址不能被NAT转换。内嵌IP地址的协议包括FTP、IRC、SNMP、LPAP、H.232、SIP和许多游戏协议。

除上述外,有些NAT的具体实现也存在不利于IPSec穿越的特点,例如:某些NAT供应商的NAPT不能处理非UDP/TCP报文,拒绝通过ESP、AH报文;有些帮助解决兼容性问题的方法会引起新的不兼容性,如对端口500的特殊处理、对ISAKMP有效载荷进行解析及ISAKMP头部检查等。

3 协同工作的方法

IPSec和NAT的兼容性方案的目的是扩大IPSec的适用范围。根据前面分析的IPSec与NAT之间存在的兼容性问题,以及评估一个解决方案的可配置性、可扩展性、多模式支持能力、与防火墙的兼容性、远程通信能力、互操作性和安全性等原则[4],下面来探讨一些方法来解决IPSec和NAT协同工作的问题。

3.1 RSIP方法

RSIP是指在不同地址域通信的主机自己能处理跨越不同地址域的地址变换问题。它的工作机制[5]是:当RSIP客户机要联系互联网上主机的时候,它查询RSIP服务器以便获得一个端口号和公网IP地址。接着客户机通过隧道将包发往RSIP服务器,RSIP服务器将隧道头剥掉,然后将包发向互联网。对于到达的包,RSIP服务器基于端口号查找客户机IP地址,加入隧道头,然后将它们发往RSIP客户机。

RSIP网关是跨越在多个编址域的多宿主设备,允许主机直接参与到多个编址域中,并不对地址进行翻译,这样尽管主机需要知道RSIP网关,但是却没有破坏Internet端到端的通信,应用RSIP不需要修改源到目的地的IP载荷流,也就避免了对AH、ESP等协议的损伤。

RSIP技术的完全实现需要用新的RSIP网关代替现有的NAT路由设备,同时涉及对客户机的修改、服务器的重新部署等问题,因此实施费用相对较大,部署时间较长,降低了该方案的可行性。

3.2 “6to4”方法

这种方法的基本原理[6]是:各个局部网络运行在IPv6上,在IPv6网络边界安装NAT,NAT给主机提供IPv6地址前缀,这个地址前缀是NAT设备的IPv4 IP地址,当IPv6的数据报到达NAT时,NAT提取IPv6的地址前缀作为IPv6数据报的IPv4隧道地址,NAT把IPv6数据包封装在IPv4数据包中发送出去;在响应方,相应的NAT作IPv4隧道的解封,解封后的数据包在局部网络中用IPv6协议进行路由。在各个VPN保护的子网中是基于IPv6协议通信的。

这种方法很好地考虑了将来整个网络升级到IPv6的情况,同时它需要的支持也很少。

但这种方式要求对NAT进行修改,现在NAT的分布已非常广泛,而且很多NAT设备部署在公司、机构无法控制的地方,例如:ISP部署NAT在它的接入服务器上。因此,实施这种方式的费用较高,短期内难以实现。

3.3 专用NAT方法

其基本思想是:在VPN网关接收到数据包时作一次该网关专用的NAT,将通信链路中作了NAT的数据包根据策略配置恢复没有NAT时的IP地址或端口,当数据包通过网关到达目的地时,与通信链路中没有NAT时的数据包一样。通过这种方式来解决IPSec与NAT兼容性问题的关键是:在双方初始通信时确定NAT的存在,把经过NAT的数据包和系统策略配置中的连接相联系起来,为通信双方的后续通信建立地址、策略绑定,维持这个连接的状态,后续的通信根据连接状态作NAT。

这种处理方式将内部网络的拓扑结构暴露给了通信对方的网关,通信链路中的窃听者也能得到这部分信息,并且每个客户端都必须安装有这个解决方案的实现。专用NAT没有正式文档描述,在已有的几个产品中可以见到,如e-Border Solution provided by Permeo Technologies,Inc。目前没有提供也没有实现这种方案的系统之间的兼容性。

3.4 UDP封装方法

UDP封装法[7]是IETF提出的一种用于IPSec穿越NAT的解决方案,基本思想是:由发送主机在发送前将IPSec数据包封装在UDP中,到达接收方后再去掉外面的IP头以及UDP封装,从而使其中的IPSec数据包不受影响。ESP协议在传输模式和隧道模式下UDP封装格式分别如图1、图2所示。

图1 ESP传输模式UDP封装数据格式变化图

图2 ESP隧道模式UDP封装数据格式变化图

UDP封装法的实现需要对IKE协商进行改进来配合。

1) IKE协商第一阶段

在这一阶段中需要完成两种探测:探测对方是否支持NAT穿越(NAT-T);探测在通信路径中是否存在NAT设备。在IKE第一阶段的前两条交换消息中,发送“厂商ID载荷”,如果对方支持NAT,那么它就能识别此载荷,因为它详细描述了对NAT穿越的支持。然后在主模式的第三个和第四个交换消息或者野蛮模式的第二个和第三个交换消息中,增加载荷NAT-D(NAT-Discovery),载荷的值是源或者目的地址和端口号的HASH值,计算如下:

HASH=HASH(CK-I│CK-R│IP│Port)

其中CK-I,CK-R分别是发送方和接收方的Cookie值。当对方收到NAT-D载荷后,计算地址和端口的HASH值,如果与收到的相同,则表示它们之间没有NAT,否则表明链路中有NAT设备对它做了改变。如果发送者不能确定自己的IP地址,它可以在报文中包含多个本地IP地址的HASH值,仅当所有的HASH值均不匹配时,才表明有NA设备存在。

一些NAT设备不改变源端口500,即使NAT后面有多个客户机。这些NAT设备通过Cookie值而不是端口来完成与后面多个客户机的映射,这样,IKE很难发现NAT设备的兼容性能力。最好的方法是发现存在NAT设备后,把IKE传输从端口500上移走。一般在NAT设备被探测到后,发起者必须立刻将UDP的源端口和目的端口都设置为4500。这样会出现一个问题:IKE协商数据包(UDP数据包)和协商完成后的UDP封装ESP数据包使用相同的端口4500进行发送,为了区分出这两种数据包,在IKE数据包的UDP头和IKE头之间添加四字节的Non-ESP标志,与UDP封装的ESP包中的SPI域对齐,且值为全零。封装后的IKE包和ESP包的格式[8]如图3所示。

图3UDP封装后IKE包和ESP包的区别

2) IKE协商第二阶段

如果在第一阶段发现有NAT设备存在,IKE的第二阶段协商SA时就作相应的变化:添加两种新的模式:UDP封装隧道模式和UDP封装传输模式;增加NAT-OA以发送发起者的原始IP地址,以修正因NAT变换后的TCP/UDP校验和;位于NAT后面的IPSec发起方定期发送保持激活报文(keep alive),用以保持所建立的NAT映射不变。

该方案不需要对IKE或IPSec协议本身做任何的改动,只需要对IKE的实现做一些小的改进,该方法只依赖于NAT对UDP的支持,所以可以与绝大多数的NAT设备一起协同工作,具有简单且易于实现的优点,在总体上对NAT穿越问题有了较好的解决。但是,该方案的缺点也很明显:不支持AH协议,增加了载荷长度,延长了IKE协商SA的时间,无法实现NAT后多主机发起通信,泄漏了内网地址信息等。尽管如此,IETF提出的UDP封装法及在它基础上进行的各种改进,仍然是目前解决IPSec与NAT兼容性问题的主流技术。

3.5 TCP封装方法

使用UDP协议的好处在于传输数据比较快,UDP协议在传输小数据量时确实比TCP协议有更好的效率。但是,当需要传输的数据量比较大(如使用数字证书进行身份认证和密钥协商)时,UDP协议数据容易失序和丢失;在一个噪音比较大,数据失真比较多,容易受干扰的网络环境(如无线网络)中,往往造成数据的大量失真。出现这些情况时,需要上层协议对UDP数据包进行重新排序或重传等操作,由此造成的效率损失往往比较大,在此我们可以考虑使用TCP协议进行密钥协商。TCP协议能够很好地处理数据报的失序和丢失问题,在大数据量传输时也有很好的表现。TCP协议在建立过程和拆除过程中的数据交换所造成的效率损失并不比UDP协议处理时的损失大。

在实际的应用环境中,使用UDP封装会遇到以下的复杂情况:UDP数据属于上层数据,如果长度比较大,IP层会对此数据进行分片,先由IPSec协议对此分片数据进行封装,再由UDP协议进行二次封装以穿越NAT;到达目的地后拆除UDP的二次封装,需要再由IP层对分片数据进行重组。假如其中UDP二次封装的一个数据报丢失,那么整个UDP数据报都需要重新发送而不是只发送丢失的数据分片。这将造成整个通信效率明显下降。在此我们可以考虑使用TCP协议对IPSec数据包进行二次封装。TCP协议不会造成数据的失序和丢失,TCP协议会自动重新发送丢失的数据报而不是全部业务数据重新发送。此时使用TCP不会造成明显的效率降低,而是更好地提供了数据的传输服务。

以上分析的虽然是复杂的情形,但VPN通信是面向广域网的安全传输需求,它相比局域网环境中的通信要复杂得多,在实际应用中各种情况都可能出现,所以用TCP代替UDP对IPSec数据包进行封装以穿越NAT设备的考虑是具有现实意义的。

4 结束语

基于IPSec的VPN技术和NAT技术都是充满前途和广泛被使用的网络技术,解决IPSec和NAT的协同工作问题,对于部署VPN具有重要的意义。该文在详细分析了影响IPSec和NAT无法兼容的原因后,提出了实现NAT穿越几种方法,其中详细介绍了比较适用于目前网络环境的UDP封装法,并提出了用TCP封装IPSec数据包的设想,下一步的研究工作就是在此基础上进一步深入加以完善。

参考文献:

[1] Naganand Doraswamy.IPSec新一代因特网安全标准[M].北京:机械工业出版社,1998.

[2] RFC-1631-1994.The IP Network Address Translator (NAT) [S].

[3] 谭兴烈,张世雄.IPSec和NAT协同工作技术研究[J].计算机工程与应用,2003(12):I64-165.

[4] 李孝展,潘金贵.IPSec与NAT兼容性问题及其解决方案剖析[J].计算机应用与软件,2007,24(2):161-163.

[5] RFC-3103-2001.M.Borella, D.Grabelsky ,J Lo,K.Taniguchi. Ream Specific IP:Protocol Specification( RSIP)[S].

[6] RFC-3056-2001.B.Carpente and K.Moore.Connection of IPv6 Domains via IPv4 Clouds[S].

[7] RFC-3984-2005. A. Huttunen, W. Dixon, V. Volpe. UDPEncapsulation of IPsec Packets[S].

udp协议篇6

关键词: TCP/IP;TCP协议; UDP协议;Winsock;远程监测

中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2013)04-0731-06

Design of TCP and UDP Communication Test Software

TU Jin-long

(Nanjing Communications Institute of Technology, Nanjing 211188, China)

Abstract: TCP and UDP are two protocols of TCP/IP transmission layer protocol. They use IP routing function to send packets to destinations, thus provide network services for applications and application layer protocols. TCP and UDP both have their advantages and disadvantages, the mai n difference between them lies in the connection state. Applications choose accord to the actual usage. Winsock can be used to write client and server applications without the need of knowing details of the TCP/IP. By setting Winsock attributes and call its control methods, connection to remote computers and two-way data exchange can be easily achieved.

Key words: TCP/IP; TCP protocol; UDP protocol; Winsock; remote monitoring

根据国家有关标准,各地应加强对客运车辆燃料消耗量检测和监督管理,加快淘汰、更新高耗能的老旧营运车辆。但迄今为止,我国客运行业的能耗统计一直采用手工填写统计报表的方式,不仅投入的人力物力大、数据误差大,而且不能实时了解能耗情况。为此,需要研发一种客车能耗远程监测系统,以便实时快速地采集客车运营过程中的有关信息,实现全自动的客车能耗数据分析、处理、评估,从而改变现行的由人工按月或年度填写报表的统计方式,提高工作效率及数据的准确性,为管理部门对高能耗高污染车辆实施强制淘汰或报废提供数据支持。

随着计算机技术及网络技术的不断发展,人们的生活和工作越来越离不开网络,尤其是网络远程控制技术已经广泛地应用于网络自动化管理、实时监控等方面。针对移动运行的客车,要实时获取有关数据,就需要凭借无线网络将采集到的数据传到监控中心。在众多的网络通信中,以TCP/IP协议最为流行,为了测试远程无线通信在具有防火墙的系统中的有效性,针对应用的特殊性,以及为了顺利进行软硬件的配接,需要先编写一个测试通信链路的TCP和UDP通信测试软件。

TCP和UDP是TCP/IP体系结构中的两个传输层协议,它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层协议提供网络服务。TCP提供的是面向连接的可靠的端到端传送服务,它可以在低层不可靠的情况下(如出现分组传输的丢失、乱序等)提供可靠的传输机制。而UDP提供的是无连接的、不可靠的传输服务,在数据传输之前,不需要建立连接,而且收方收到UDP数据报文之后,也不需要给出任何应答信息。显然,UDP减少了很多的为保证可靠传输而附加的额外开销,因而它的效率高[1]。因此,TCP与UDP各有其优缺点,要根据实际应用进行选择。

1 TCP和UDP测试软件的设计

使用TCP和UDP通信的方法有多种,在VB开发平台上使用Winsock控件来设计软件可以说是最方便的。Winsock即Windows Sockets规范的简称,是目前最流行的网络通信应用程序接口之一。Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过“套接字”向网络发出请求或者应答网络请求。

Winsock控件对用户是不可见的,但它提供了访问TCP/IP网络的捷径,使用它可以通过UDP协议或TCP协议方便地连接到远程的机器并进行数据交换。用Winsock控件编写客户和服务器应用程序,不需要了解TCP/IP或调用底层Winsock API的具体细节。通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。

使用WinSock控件时,首先要确定的是使用TCP还是UDP协议,它们之间主要的区别在于连接状态。

1.1 TCP测试软件设计

TCP协议是面向连接的协议,在数据传输前就建立好了点到点的连接。TCP网络程序工作原理如图1所示[2]。

图1 TCP网络程序工作原理

基于 TCP/IP 协议网络通信主要模式就是客户机/服务器模式(Client/Server 模式,简称 C/S),即客户端提出请求,服务器在监听时接收到请求后就提供请求服务。远程控制是基于 C/S 模式来实现的,所以程序分为服务器和客户端程序。客户端和服务器端连接成功后,通过信息交换取得相应的服务。因此,在进行编程时,服务器端程序应设置Winsock控件的LocalPort属性和调用 Listen 方法来监听,客户机端程序则要设置 Winsock 控件的 RemoteHost 和 RemotePort 属性、调用 Connect 方法请求连接[3]。一旦建立了连接,两台计算机之间就可以发送和接受数据了。要发送数据,调用SendData方法。当接受数据时,产生DataArrival事件。在DataArrival事件中调用GetData方法来接收数据。

在VB6开发平台上可以方便地使用Winsock控件来设计网络通信软件,为了测试的方便,将客户端和服务器端的软件设计在同一软件中,通过标签来选择是客户端还是服务器端,或是UDP测试,也可以在同一台电脑中运行软件完成测试。在设计阶段,添加好必要的窗体和按钮、文本框并设置所需的名称、属性后,在窗体中放置Winsock控件,在属性窗口里的协议,选择sckTCPProtocol,也可以在代码里配置协议,例如:

Winsock1.Protocol=sckTCPProtocol

1.1.1服务器端程序

为了能接受多个连接请求,需要创建新的控件实例,调用新的实例中的接受方法。下面是创建一个服务器端程序的主要内容:

1)设置端口并侦听(监听)。双击“开始侦听”按钮,在代码中加入要设置的LocalPort,并开始监听,代码如下:

Private Sub cmdListen_Click()

If TCP_Server(0).State sckClosed Then TCP_Server(0).Close

TCP_Server(0).LocalPort = txtLocalPort(2).Text

TCP_Server(0).Listen

End Sub

2)监听连接请求。监听方法在控件中被调用,每个连接请求到来时,代码会测试看它的索引(Index)是否为0(监听控件的值),根据其值是否为0执行不同的操作。代码如下:

Private Sub TCP_Server_ConnectionRequest(Index As Integer, ByVal requestID As Long)

Dim i As Long

If Index = 0 Then '主Winsock——Winsock(0)发生消息

i = 1

If maxConnext > 0 Then

While i

i = i + 1

DoEvents

Wend

End If

If i

TCP_Server(i).LocalPort = txtLocalPort(2).Text

TCP_Server(i).Accept requestID

nowconnext(i) = True 'Winsock(i)被占用

Else

If maxConnext > 50 Then

MsgBox "已经达到最大用户数!", vbExclamation + vbOKOnly, "提示"

Exit Sub

End If

maxConnext = maxConnext + 1

Load TCP_Server(maxConnext)

TCP_Server(maxConnext).LocalPort = txtLocalPort(2).Text

TCP_Server(maxConnext).Accept requestID

ReDim Preserve nowconnext(maxConnext + 1)

nowconnext(maxConnext) = True

ReDim Preserve saveServerData(maxConnext + 1)

ReDim Preserve saveServerIndex(maxConnext + 1)

i = maxConnext

End If

End If

End Sub

3)服务器端发送数据。若选中发送回车符,则在代码中增加发送回车符,若选中发送换行符,则在代码中增加发送换行符。若是广播,则逐个发送,否则需要选择发送目标。主要代码如下:

Private Sub cmdSend3_Click()

Dim i As Integer

Dim sendresult As Long

Dim sendsrc() As Byte

Dim sendsrclen As Long

Dim sendmess(1 To 1024) As Byte

Dim outByte() As Byte

If Me.ckHex(2).Value = 1 Then '十六进制发送

sendsrclen = Len(txtSend(2).Text) / 2 - 1

ReDim sendsrc(0 To sendsrclen)

For i = 0 To sendsrclen

sendsrc(i) = Val("&H" & Mid(txtSend(0).Text, i * 2 + 1, 2))

Next

Else

outByte = StrConv(txtSend(2).Text, vbFromUnicode)

sendsrc = outByte

sendsrclen = UBound(outByte)

End If

If chkGB.Value = 1 Then

For i = 1 To maxConnext

If TCP_Server(i).State = sckConnected Then

TCP_Server(i).SendData sendsrc

End If

DoEvents

Next

Else

Dim findSerVer As Boolean

For i = 1 To maxConnext

If saveServerIndex(i) = Val(Combo1.Text) Then

findSerVer = True

Exit For

End If

Next

If i > 0 And findSerVer = True Then

If TCP_Server(i).State = sckConnected Then

TCP_Server(i).SendData sendsrc

End If

Else

MsgBox "请选择发送目标!", , "提示:"

End If

End If

End Sub

4)服务器端接收数据,数据到达后,先调用TCP_Server控件的getdata方法,将接收的数据以vbstring数据类型,存放在strdata变量之中,然后再加到txtReceive(2)控件之中。主要代码如下:

Private Sub TCP_Server_dataarrival(Index As Integer, ByVal bytestotal As Long)

Dim strdata As String

TCP_Server(Index).GetData strdata, vbString

txtReceive(2).Text = txtReceive(2).Text & Index & ":" & TCP_Server(Index).RemoteHostIP & ":" & TCP_Server(Index).RemotePort & ":" & strdata & vbCr

End Sub

以上是创建一个服务器端程序的主要内容,为了方便使用,还可适当增加一些辅助的功能,运行后的服务器端界面如图2所示。

图2 TCP协议服务器端测试软件运行界面

1.1.2 客户端程序

1)设置远程主机端口并连接。双击“建立连接”按钮,在代码中指定远程主机的ip地址,并调用TCP_Client控件的connect方法,来初始化与主机的连接请求,代码如下:

Private Sub cmdConnect_Click()

On Error GoTo connectErr

If Tcp_Client.State sckClosed Then Tcp_Client.Close

Tcp_Client.RemoteHost = txtRemoteHost(1).Text

Tcp_Client.RemotePort = txtRemotePort(1).Text

Tcp_Client.Connect

TimerConnect.Enabled = True

Exit Sub

connectErr:

StatusBar1.Panels.Item(2).Text = "未能成功连接。" & Err.Number

End Sub

2)客户端发送数据。若选中发送回车符,则在代码中增加发送回车符,若选中发送换行符,则在代码中增加发送换行符。主要代码如下:

Private Sub cmdSend2_Click()

Dim i As Integer

Dim sendresult As Long

Dim sendsrc() As Byte

Dim sendsrclen As Long

Dim sendmess(1 To 1024) As Byte

Dim outByte() As Byte

On Error Resume Next

If Me.ckHex(1).Value = 1 Then '十六进制发送

sendsrclen = Len(txtSend(1).Text) / 2 - 1

ReDim sendsrc(0 To sendsrclen)

For i = 0 To sendsrclen

sendsrc(i) = Val("&H" & Mid(txtSend(0).Text, i * 2 + 1, 2))

Next

Else

outByte = StrConv(txtSend(1).Text, vbFromUnicode)

sendsrc = outByte

sendsrclen = UBound(outByte)

End If

If chk13(1).Value = 1 Then

sendsrclen = sendsrclen + 1

ReDim Preserve sendsrc(0 To sendsrclen)

sendsrc(sendsrclen) = 13

End If

If chk10(1).Value = 1 Then

sendsrclen = sendsrclen + 1

ReDim Preserve sendsrc(0 To sendsrclen)

sendsrc(sendsrclen) = 10

End If

If Tcp_Client.State = sckConnected Then

Tcp_Client.SendData sendsrc

Else

MsgBox "请先建立连接!", , "提示:"

End If

End Sub

3)客户端接收数据,先调用TCP_Client控件的getdata方法,将接收的数据以vbstring数据类型存放strdata变量之中,然后将strdata变量的内容,加到txtReceive(1)控件之中。主要代码如下:

Private Sub TCP_Client_dataarrival(ByVal bytestotal As Long)

Dim strdata As String

Tcp_Client.GetData strdata, vbString

txtReceive(1).Text = txtReceive(1).Text & strdata

End Sub

本部分是创建一个客户端程序的主要内容,运行后的界面如图3所示。

1.2 UDP测试软件

UDP是无连接的协议。与TCP操作不同,计算机并不建立一个连接。并且,UDP应用程序可以是用在客户端,也可以用在服务器端。使用UDP协议,在两个Winsock控制间进行数据的发送,在连接的两端必须完成以下三步:

1)设置RemoteHost属性;

2)设置RemotePort属性;

3)申请Bind方法。

通过使用方法Bind,则可将该Winsock捆绑到一个本地端口,以便该Winsock使用该端口来进行类似TCP的“监听”功能,并防止其它应用使用该端口。

使用UDP协议传送数据,首先设置客户计算机的LocalPort属性。而作为服务器的计算机仅需要设置RemoteHost属性为客户计算机的IP地址或域名,并将其RemotePort属性设置成客户计算机上的LocalPort属性。主要代码如下:

WinsockUDP.RemoteHost = txtRemoteHost(0).Text

WinsockUDP.RemotePort = txtRemotePort(0).Text

WinsockUDP.LocalPort = txtLocalPort(0).Text

WinsockUDP.Bind txtLocalPort(0)

然后就可通过SendData方法来开始信息发送,客户计算机则可在其DataArrial事件中使用方法GetData来获取发送的信息,发送和接收数据的代码与TCP通信的代码类似。UDP测试程序运行后的界面如图4所示。

图4 UDP协议测试软件运行界面

2 结束语

TCP和UDP是TCP/IP体系结构中的两个传输层协议,它们使用IP路由功能把数据包发送到目的地,从而为应用程序及应用层

协议提供网络服务。TCP提供的是面向连接的可靠的端到端传送服务,而UDP提供的是无连接的传输服务,在数据传输之前,不需要建立连接,因而它的效率高。TCP与UDP各有其优缺点,它们之间主要的区别在于连接状态,应用时要根据实际应用进行选择。

使用TCP和UDP通信的方法有多种,在VB开发平台上使用Winsock控件来设计软件可以说是最方便的。用Winsock控件编写客户和服务器应用程序,不需要了解TCP/IP的具体细节。通过设置Winsock控件的属性和调用该控件的方法,可以很容易地连接到远程计算机并进行双向的数据交换。

参考文献:

[1] 天津电气传动设计研究所.电气传动自动化技术手册[M].北京:机械工业出版社,2011.

[2] 茹志鹃.基于TCP协议的Socket数据通信[J].科技信息,2012 (13):69,93

udp协议篇7

关键词:车辆监控系统; GPS; GPRS; UDP

中图分类号:TN919-34 文献标识码:A 文章编号:1004-373X(2011)24-0107-03

Vehicle Monitoring System Based on GPRS Technology

WU Xiao-bin1, DU Dong-gao2

(1. Computer College, Nanjing Institute of Technology, Nanjing 210000, China;

2. College of Information Engineering, Jiaozuo University, Jiaozuo 454003, China)

Abstract: In order to implement the positioning tracking for dangerous goods, passenger, cargo transport vehicles and other special project vehicles, the GPS positioning system and GPRS communication technology are adopted for the achievement of real-time vehicle monitoring system. The data communication between the vehicle terminal and the control center is achieved by taking GPRS communication technology as a carrier of information transmission to display real-time traffic information by GPS positioning and WEBGIS technologies. The system has the advantages of high-speed communication, strong communication format scalability, high communication reliability and strong client controlling capacity to vehicles. The vehicle front-end status and location are displayed by Web page. It is easy for the clients to use the system.

Keywords: vehicle monitoring system; GPS; GPRS; UDP

收稿日期:2011-07-23

基金项目:南京工程学院青年基金资助项目(QKJB2009023)

0 引 言

随着我国经济的发展,车辆日益增多,交通运输的经营管理,货运、客运的安全管理等,已成为公安、交通系统中的一个重要问题。车辆监控系统以全球定位系统(Global Position System,GPS)和GPRS(General Packet Radio Service)通信技术基础,它可以将车载单元上接受到的实时定位数据通过无线网络传送至监控中心服务器上,监控中心计算机再利用地理信息系统的地图显示功能,以及信号指令的发送功能,实现对动态车辆的跟踪与调度控制,从而建立起的一种大范围、全方位发挥作用的、实时、准确、高效的综合车辆调度和管理系统。系统基于Internet网络,将监控中心、远程监控终端、数据服务器、无线移动通信网、GPS 车载终端有机地结合在一起,以Internet服务器为核心实现分布式监控。

1 系统结构

基于GPRS的车辆监控信息系统由4个主要部分构成,即监控服务中心、车载终端、监控终端及无线通信网络构成;监控服务中心是系统的核心部分,它连接车载终端和客户端。监控服务中心由Web服务器,通信服务器,数据库服务器构成。通信服务器接受车载终端的数据,并将数据转发给Web服务器和数据库服务器。该系统结构图如图1所示。

2 系统关键技术

2.1 GPRS通信技术及UDP数据传输协议

在车辆和监控中心之间需要通信设备来发送或接收信息。通信手段的选择是监控系统的难点和技术关键。合理的通信方式的选择可以为监控系统的指挥调度、报警处理提供一个稳定、快速的平台。

车辆监控系统使用GPRS网络作为传输载体。GPRS是一种采用分组交换和传输技术的高效率数据传输方式。它克服了电路交换速率低、资源利用率差等缺点,最大限度地利用了现有的GSM网络资源,提高了传输速率。 相对于短消息方式来说,GPRS服务既提高了质量又降低了使用费用。移动车载终端与监控调度中心之间的通信突发性较强,而每次数据量较小,使用GPRS网络作为其传输载体是目前比较理想的解决方案,GPRS通信主要分为TCP和UDP协议。

TCP和UDP协议同在传输层,由于本系统每次传输的数据量小而且突发性强,所以采用UDP协议传输数据。UDP协议的主要作用是将网络数据流压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。UDP协议为不可靠的传输协议,不提供数据传送的保障机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,必须在应用层的协议中添加保障信息传输可靠性的确认机制。监控中心向终端下传数据时,要求终端返回接收正确或错误的确认信息,监控中心收到正确的确认信息后数据下传进程才完毕。否则,监控中心将在规定的时间内重发,直到收到正确的确认信息或发送次数标志溢出才终止。

GPRS网络UDP端口资源十分紧缺,变化很快;UDP由于自身特点,以及GPRS网络UDP端口资源的有限性,在一段时间没有数据流量后,端口容易改变,产生的影响就是从服务器中心端向GPRS终端发送数据,GPRS终端接收不到。原因是移动网关从中做了中转,需要隔一定时间给主机发UDP包来维持该IP和端口号,这样主机就能主动给GPRS发UDP包,笔者在测试中发现,这个间隔时间很短,约1 min发一次UDP包才能够维持,再长时间移动网关那边就要丢失这个端口了,逾期主机想主动发数据给终端,将无法送达。只有GPRS终端设备重新发一个UDP包过去,移动再分配一个中转IP和端口,才能够进行双向通信。为保证端口有效性和数据实时性,终端设备每5 s发送一条包含定位和状态的数据给服务器。

2.2 基于C#发送、接收UDP数据包使用的主要方法

(1) UDP数据类。用Visual C#实现UDP协议,最为常用,也是最为关键的类就是UdpClient,UdpClient位于命名空间.Sockets中,Visual C#发送、接收UDP数据包都是通过UdpClient类的。UdpClient类主要有以下几个方法,见表1。

(2) 接受终端UDP数据。接收UDP数据包使用的是UdpClient中的“Receive”方法。此方法的调用语法如下: public byte [] Receive ( ref IPEndPoint remoteEP ); 参数remoteEP 是一个IPEndPoint类的实例,它表示网络中发送此数据包的节点。下面就是通过侦听本地端口号“8080”来获取信息代码:

UdpClient server = new UdpClient (8080);

IPEndPoint receivePoint = new IPEndPoint (IPAddress.Any,0);

byte[] recData = server.Receive ( ref receivePoint );

recData就是接受到的UDP报文,其中UDP包头结构如下:源端口16位,目的端口16位,长度 16位,校验和 16位;上文中阐述了GPRS的UDP端口非常紧缺,随时会变化,在每次接受到UDP报文后,必须记录源端口、IP地址。receivePoint参数是引用类型,receive到新的UDP后,receivePoint对象的address和port属性值就是发送源的IP地址和端口。这个IP和端口未必是真的终端的IP和端口。因为终端上的应用程序绑定本地一个端口(比如是9002),通过这个端口发送请求给路由器,路由器由此记录下终端的内网IP和端口(9002),然后路由器分配自己的一个空闲端口(比如是7000),通过这个端口(7000)发送请求给监控中心。而对于监控中心,它没有任何关于终端的信息,它要做的只是回信息到路由器的外网IP的7000这个端口。路由器收到发送到其7000端口的数据后会再转发给终端。

(3) 发送UDP数据报。发送UDP数据报使用” Send”方法。“Send”方法的调用语法如下:public int Send ( byte[] dgram,int bytes,IPEndPoint endPoint ); 参数说明:dgram 要发送的 UDP 数据文报(以字节数组表示)。bytes 数据文报中的字节数。 endPoint 一个 IPEndPoint,它表示要将数据文报发送到的主机和端口。 返回值是已发送的字节数。下面使用UDPClient发送UDP数据包的具体的调用例子:

string IP =receivePoint.Address.ToString();

int Port = receivePoint.Port;

//receivePoint在上文中描述过,为Receive接受UDP时的引用;

IPEndPoint host = new IPEndPoint (IP,Port);

UdpClient.Send ( "发送的字节","发送的字节长度",host );

该代码实现了对某终端发送UDP报文后的回复。如果需要主动向终端发送报文则需要从数据库中提取该终端最近一次的IP和端口号,调用该方法发送内容。

2.3 数据封装和转存

监控中心与客户端的数据通信包含2种:一种是上行数据,一种是下行数据。上行数据包含终端汇报车辆的状态信息,车辆实时信息,车辆语音信息,视频信息等。下行信息包含对终端的回应,车辆的实时控制等信息。数据种类大约一百多种,可分为20多种格式。针对每种格式定义一个结构进行数据接受和转存到数据库,进行数据显示和分析。终端返回数据一般是结构类型,为保证数据转换准确和便捷,C#也使用同样的结构对数据进行接受。上文中UDP报文接受到的正文是byte类型,该byte内容有报文头和报文类型、校验部分和正文构成。根据报文类型找到对应的C#结构体structType。利用Marshal.SizeOf(structType);获取结构体大小,并进行分配空间:IntPtr structPtr = Marshal.AllocHGlobal(size); 然后将byte数组拷到分配好的内存空间: Marshal.Copy(recData,0,structPtr,size); 将内存空间转换为目标结构体object obj = Marshal.PtrToStructure(structPtr,structType)。为提高系统的实时响应速度,这些数据分为2种处理方式,如非紧急数据直接保存到数据库,而如果是紧急数据,比如车辆报警数据,车辆控制数据则直接通过Socket连接发送到Web服务器,由Web服务器推送到浏览器监控端。

3 结 语

本文主要分析了监控系统的GPRS通信技术,详细介绍了基于GPRS的UDP数据通信流程和方法,实现了C#环境下接受,发送UDP数据报文,协议的定制,数据转存等关键技术。本文解决的问题是监控系统的核心内容,但并不是全部,一个完整的系统还应包括终端硬件设计以及后台监控软件、GIS地图显示等许多方面。今后,应通过进一步的研究,解决系统其他相关技术。

参 考 文 献

[1] LAGRANGE X.GSM网络与GPRS [M].北京:电子工业出版社,2002.

[2] 钟章队.GPRS通用分组无线业务[M].北京:人民邮电出版社,2002.

[3] 李德仁.论空间信息与移动通信的集成应用[J].武汉大学学报,2002,27(1):15-17.

[4] 杨东凯.北京公交GPS车辆监控系统研究 [J ].电子技术应用,2000(11):59-61.

[5] ELLIOTT D K.GPS原理与应用 [M].北京:电子工业出版社,2002.

[6] 翟战强.基于GPRS/GPS/GIS 的车辆导航与监控系统 [J ].测绘通报,2004(5):9-11.

[7] 何小卫,王爱华,马跃.基于GPRS的GPS车载终端通信技术研究[J].计算机应用,2008,28 (11):2952-2954.

[8] 王缓缓,李虎,张友纯.基于GPS的车辆管理系统的难点及解决方案[J].计算机应用,2003,23(12):292-294.

[9] 明日科技有限公司.Visual C#开发技术大全[M].北京:人民邮电出版社,2007.

[10] 石超,孙保华,魏云飞,等.GPS接收机低噪声放大器设计[J].电子科技,2010(3):56-58.

udp协议篇8

【关键词】网络测量;时延;测量技术

0 引言

随着Internet的发展,其规模迅速扩大、网络业务不断出现、网络拓扑结构日益复杂。但具有开放、分布式、不协作、异构等特点的因特网有效管理和控制变得更难。人们致力于在各种情况下寻找和建立连接,主要关注分组向那里发送,而较少关注发送分组的时间。分组到达的时间时延大大影响了因特网的服务质量。要提高网络服务质量,就要找出存在问题。当前的网络性能测量评价指标包括:时延、流量、丢包率、吞吐量(带宽)等。其中网络时延是最重要、最常用的性能指标。

1 网络时延的基本概念和时延测量原理

时延是指一个报文或分组从一个网络的一段传送到另一端所需的时间。时延由发送时延、传播时延和处理时延组成。发送时延是节点在发送数据时使数据块从节点进入传媒所需要时间,也就是数据块的第一个比特开始发送算起,到最后一个比特发送完毕所需时间,也称为传输时延。处理时延是指数据在交换节点为存储转发而进行必要的处理所花费时间。

2 时延测量中的关键技术和影响因素

时延测量首先要消除测量中出现的随机性。网络分组的时延是一个随时间变化的随机变量,由固定时延和可变时延两部分构成。固定时延是基本上不变的,它由传输时延和传播时延构成。传输时延由分组大小和链路的容量决定,一个分组的大小一旦固定,通过的链路容量便是固定的,其传输时延也是固定的。传播时延由固定的物理传输介质确定并且是固定的。分组时延中的可变时延是由很多因素造成的。它可以分成中间路由器处理时延和排队等待时延两部分。对于任何一个分组,中间路由器总要对其进行路由查表以确定其转发端口,这个时间可以看成是处理时间。同时,中间路由器繁忙可能导致分组排队等待处理,也需要一段等待时间。处理和等待时间是不固定的,由路由器的具体性能以及链路的拥塞状况而定,是一个随机变量。所以如果链路不出现拥塞,一个分组的最小时延便与该分组的大小成线性关系。分组的时延具有突发性和偶然性,为了能够使测量结果尽可能地反映网络的真实情况,可以采用低通滤波的方法来消除随机性。

其次,对网络时延的测量,必须保证网络入口点和出口点时钟同步。如果时钟不同步,则时延测量会有很大误差。网络中路径往往是非对称的,或者即使路由是对称的但往返具有不同的性能特征。单向时延测量要求严格的时钟同步。GPS时间同步技术是当前比较成熟的并在国际上广泛使用的时间同步技术。单向时延测量一般要求、成本比较高。在实际的测量中,测量精度不是主要问题。网络时延通常在数十到数百毫秒范围内,测量存在几毫秒的误差完全可以接受。因此测量方案都采用往返时延,可以避开时钟同步问题。

网络时延总是随着网络的运行状况而不断变化。通过分析,可将影响网络时延测量的因素归为两类:1)网络本身的性能,即完全独立于网络测量方法、仅与网络本身特性相关的部分;2)测量报文的特定性能,与网络具体的测量方式密切相关.

目前,基于端到端的网络时延测量方法,能达到快速准确的目的。这种方法,不是单个设备的时延测量,而是某一段甚至某一跳之间链路的时延测量。端到端往返时延的计算时间都在同一台计算机上,不存在时间同步问题,无需在测量的两端都安装测量软件,只需要固定一个测量点,另一个测量点可以任意选择,使测量范围扩充到整个因特网。端到端传输优点是链路建立后,发送端知道接收设备一定能收到,而且经过中间交换设备时不需要进行存储转发,因此时延较小。端到端传输缺点是直到接收端收到数据为止,发送端设备一直要参与传输。如果网络时延很长,那么对发送端设备造成很大浪费。端到端传输的另一个缺点是如果接收设备关机或故障,那么端到端传输不可能实现。在端到端网络时延测量中,要降低这种缺点带来的影响,就要选择合理的测量时段、数据包字长和测量样本等。

3 网络时延测量方法

根据网络时延测量其承载数据包的协议不同,网络时延测量方法可分为:基于ICMP协议的网络时延测量。Ping是基于ICMP请求应答报文开发的应用软件,用来诊断网络故障,也是用来测量往返时延最常用的工具。Ping工具通过向网络定地址发送ICMP echo报文,并监听回应报文,根据回应报文的探测结果,来评估主机路径的可靠性、往返时延大小等。将报文封装在ICMP报文中是目前网络测量工具最常用的方式,但是ICMP报文也是用来进行DOS攻击的主要方式,因此在许多ICMP协议都被过滤了,可能会完全被阻塞。路由器可以限制ICMP回复的速率来避免被消耗过多的网络带宽和路由资源。这意味利用ICMP协议测量时延的结果是不可靠的。基于UDP协议的网络时延测量。当对方主机或者中间节点过滤掉ICMP报文后,可以使用UDP报文来实现网络的往返时延测量。UDP报文的实现和ICMP报文较相似,都是无连接的。不同的是UDP协议需要指定一个端口,在实际使用时,可以任选一个端口,当接收方该端口对应的服务不存在时,会立即返回一个“端口不可到达”的IC-MP报文。因此,在使用UDP报文进行测量时,要注意发送方发送一个UDP报文,接收方反馈的不一定是UDP报文,也有可能是ICMP报文,这两种返回的报文都可以用来计算网络的时延。此外,UDP协议在实现时要注意其最大报文长度与ICMP报文不同,通常应小于500 Byte。但是将报文封装在UDP报文中也有疑问。UDP没有TCP协议所固有的拥塞控制算法,在UDP报文使用达到高峰时,为了减少对TCP流的影响,UDP报文的速率可能会受到限制。

基于TCP协议的网络时延测量。针对防火墙设置,虽比较复杂,但可适用于测量某些前两种方法不能工作的特定环境。除了选取合适的承载报文,TCP协议测量网络时延的难点包括TCP协议发送机制本身。TCP协议为提高传输效率,往往不是即时发送报文,而要收集足够的数据后才发送,可能会产生发送方记录的发送时间远远早于时间发送时间,而使得测量的结果大于实际值的现象。为避免此现象的发生,要求在主动测量时,不但要求发送方在承载的TCP报文中加入PSH标志,此时将立即发送此数据报文而无需等待,同时也要求接收方在反馈该报文时,也必须带PSH标志。同理,在被动测量时,要注意承载的报文必须是带有PSH标志的报文,并且对应的反馈报文也必须同样带有PSH报文。也可以利用其它协议实现网络时延的测量。方法基本和UDP或TCP类似,关键根据所在网络设置的具体情况,灵活选择承载报文,即能在发送方立即发送,而接收方收到后又能立即反馈的报文。

4 结论

上一篇:安全协议范文 下一篇:协议离婚需要什么手续范文