`
newleague
  • 浏览: 1493142 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

UDP

 
阅读更多

百科名片

UDP 是User Datagram Protocol的简称, 中文名是用户数据包协议,是 OSI 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。它是IETF RFC 768是UDP的正式规范。

目录

用户数据包协议
简介
使用UDP
UDP报头
UDP协议的几个特性
化学中的UDP
UDP vs TCP
UDP协议的应用
UDP 程序设计
  1. 1、编写UDP Server程序的步骤
  2. 2、udpserv.c程序内容
  3. 运行例子程序
  4. 运行UDP Client程序
用户数据包协议
简介
使用UDP
UDP报头
UDP协议的几个特性
化学中的UDP
UDP vs TCP
UDP协议的应用
展开

<script type="text/javascript"></script>

编辑本段用户数据包协议

  UDP是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 UDP 协议基本上是IP协议与上层协议的接口。UDP协议适用端口分别运行在同一台设备上的多个应用程序

编辑本段简介

  UDP协议的全称是用户数据报协议,在网络中它与TCP协议一样用于处理   
  

UDP

数据包。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。   与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。   UDP协议的主要作用是将网络数据流量压缩成数据包的形式。一个典型的数据包就是一个二进制数据的传输单位。每一个数据包的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。

编辑本段使用UDP

  在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人不十分满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。

编辑本段UDP报头

  UDP报头由4个域组成,其中每个域各占用2个字节,具体如下:
  

UDP

端口号   目标端口号   数据报长度   校验值   UDP协议使用端口号为不同的应用保留其各自的数据传输通道。UDP和TCP协议正是采用这一机制实现对同一时刻内多项应用同时发送和接收数据的支持。数据发送一方(可以是客户端或服务器端)将UDP数据报通过源端口发送出去,而数据接收一方则通过目标端口接收数据。有的网络应用只能使用预先为其预留或注册的静态端口;而另外一些网络应用则可以使用未被注册的动态端口。因为UDP报头使用两个字节存放端口号,所以端口号的有效范围是从0到65535。一般来说,大于49151的端口号都代表动态端口。   数据报的长度是指包括报头和数据部分在内的总字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分(又称为数据负载)。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。   UDP协议使用报头中的校验值来保证数据的安全。校验值首先在数据发送方通过特殊的算法计算得出,在传递到接收方之后,还需要再重新计算。如果某个数据报在传输过程中被第三方篡改或者由于线路噪音等原因受到损坏,发送和接收方的校验计算值将不会相符,由此UDP协议可以检测是否出错。这与TCP协议是不同的,后者要求必须具有校验值。   许多链路层协议都提供错误检查,包括流行的以太网协议,也许想知道为什么UDP也要提供检查和。其原因是链路层以下的协议在源端和终端之间的某些通道可能不提供错误检测。虽然UDP提供有错误检测,但检测到错误时,UDP不做错误校正,只是简单地把损坏的消息段扔掉,或者给应用程序提供警告信息。

编辑本段UDP协议的几个特性

  (1) UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当
  

UDP

它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。   (2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。   (3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。   (4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。   (5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。   (6)UDP是面向报文的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。    虽然UDP是一个不可靠的协议,但它是分发信息的一个理想协议。例如,在屏幕上报告股票市场、在屏幕上显示航空信息等等。UDP也用在路由信息协议RIP(Routing Information Protocol)中修改路由表。在这些应用场合下,如果有一个消息丢失,在几秒之后另一个新的消息就会替换它。UDP广泛用在多媒体应用中,例如,Progressive Networks公司开发的RealAudio软件,它是在因特网上把预先录制的或者现场音乐实时传送给客户机的一种软件,该软件使用的RealAudio audio-on-demand protocol协议就是运行在UDP之上的协议,大多数因特网电话软件产品也都运行在UDP之上。

编辑本段化学中的UDP

  UDP = uridine diphosphate,尿苷二磷酸,一种嘧啶核苷酸,由碱基尿嘧啶核糖组成,主要用途是RNA合成(转录)时的原料。 另外UDP也是DTP能量消耗后产物,功能类似ADP,但较ADP少见。参与微生物肽聚糖等的合成。

编辑本段UDP vs TCP

  UDP和TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。
  

UDP

TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。 与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。   相对于TCP协议,UDP协议的另外一个不同之处在于如何接收突发性的多个数据报。不同于TCP,UDP并不能确保数据的发送和接收顺序。例如,一个位于客户端的应用程序向服务器发出了以下4个数据报   D1   D22   D333   D4444   但是UDP有可能按照以下顺序将所接收的数据提交到服务端的应用:   D333   D1   D4444   D22   事实上,UDP协议的这种乱序性基本上很少出现,通常只会在网络非常拥挤的情况下才有可能发生。

编辑本段UDP协议的应用

  既然UDP是一种不可靠的网络协议,那么还有什么使用价值或必要呢?其实不然,在有些情况下UDP协议可能会变得非常有用。因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。   关于UDP协议的最早规范是RFC768,1980年发布。尽管时间已经很长,但是UDP协议仍然继续在主流应用中发挥着作用。包括视频电话会议系统在内的许多应用都证明了UDP协议的存在价值。因为相对于可靠性来说,这些应用更加注重实际性能,所以为了获得更好的使用效果(例如,更高的画面帧刷新速率)往往可以牺牲一定的可靠性(例如,画面质量)。这就是UDP和TCP两种协议的权衡之处。根据不同的环境和特点,两种传输协议都将在今后的网络世界中发挥更加重要的作用。

编辑本段UDP 程序设计

  UDP Server程序

1、编写UDP Server程序的步骤

  (1)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。   (2)初始化sockaddr_in结构的变量,并赋值。sockaddr_in结构定义:   struct sockaddr_in {   uint8_t sin_len;   sa_family_t sin_family;   in_port_t sin_port;   struct in_addr sin_addr;   char sin_zero[8];   };   这里使用“08”作为服务程序的端口,使用“INADDR_ANY”作为绑定的IP地址即任何主机上的地址。   (3)使用bind()把上面的socket和定义的IP地址和端口绑定。这里检查bind()是否执行成功,如果有错误就退出。这样可以防止服务程序重复运行的问题。   (4)进入无限循环程序,使用recvfrom()进入等待状态,直到接收到客户程序发送的数据,就处理收到的数据,并向客户程序发送反馈。这里是直接把收到的数据发回给客户程序。

2、udpserv.c程序内容

  #include   #include   #include   #include   #include   #include #define MAXLINE 80   #define SERV_PORT 8888   void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)   {   int n;   socklen_t len;   char mesg[MAXLINE];   for(;;)   {   len = clilen;   /* waiting for receive data */   n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);   /* sent data back to client */   sendto(sockfd, mesg, n, 0, pcliaddr, len);   }   }   int main(void)   {   int sockfd;   struct sockaddr_in servaddr, cliaddr;   sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */   /* init servaddr */   bzero(&servaddr, sizeof(servaddr));   servaddr.sin_family = AF_INET;   servaddr.sin_addr.s_addr = htonl(INADDR_ANY);   servaddr.sin_port = htons(SERV_PORT);   /* bind address and port to socket */   if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)   {   perror("bind error");   exit(1);   }   do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));   return 0;   }   UDP Client程序   1、编写UDP Client程序的步骤   (1)初始化sockaddr_in结构的变量,并赋值。这里使用“8888”作为连接的服务程序的端口,从命令行参数读取IP地址,并且判断IP地址是否符合要求。   (2)使用socket()来建立一个UDP socket,第二个参数为SOCK_DGRAM。   (3)使用connect()来建立与服务程序的连接。与TCP协议不同,UDP的connect()并没有与服务程序三次握手。上面说了UDP是非连接的,实际上也可以是连接的。使用连接的UDP,kernel可以直接返回错误信息给用户程序,从而避免由于没有接收到数据而导致调用recvfrom()一直等待下去,看上去好像客户程序没有反应一样。   (4)向服务程序发送数据,因为使用连接的UDP,所以使用write()来替代sendto()。这里的数据直接从标准输入读取用户输入。   (5)接收服务程序发回的数据,同样使用read()来替代recvfrom()。   (6)处理接收到的数据,这里是直接输出到标准输出上。   udpclient.c程序内容:   #include   #include   #include   #include   #include   #include   #include   #include   #define MAXLINE 80   #define SERV_PORT 8888   void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen)   {   int n;   char sendline[MAXLINE], recvline[MAXLINE + 1];   /* connect to server */   if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1)   {   perror("connect error");   exit(1);   }   while(fgets(sendline, MAXLINE, fp) != NULL)   {   /* read a line and send to server */   write(sockfd, sendline, strlen(sendline));   /* receive data from server */   n = read(sockfd, recvline, MAXLINE);   if(n == -1)   {   perror("read error");   exit(1);   }   recvline[n] = 0; /* terminate string */   fputs(recvline, stdout);   }   }   int main(int argc, char **argv)   {   int sockfd;   struct sockaddr_in srvaddr;   /* check args */   if(argc != 2)   {   printf("usage: udpclient \n");   exit(1);   }   /* init servaddr */   bzero(&servaddr, sizeof(servaddr));   servaddr.sin_family = AF_INET;   servaddr.sin_port = htons(SERV_PORT);   if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)   {   printf("[%s] is not a valid IPaddress\n", argv[1]);   exit(1);   }   sockfd = socket(AF_INET, SOCK_DGRAM, 0);   do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));   return 0;   }

运行例子程序

  1、编译例子程序   使用如下命令来编译例子程序:   gcc -Wall -o udpserv udpserv.c   gcc -Wall -o udpclient udpclient.c   编译完成生成了udpserv和udpclient两个可执行程序。   2、运行UDP Server程序   执行./udpserv &命令来启动服务程序。我们可以使用netstat -ln命令来观察服务程序绑定的IP地址和端口,部分输出信息如下:   Active Internet connections (only servers)   Proto Recv-Q Send-Q Local Address Foreign Address State   tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN   tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN   tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN   tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN   udp 0 0 0.0.0.0:32768 0.0.0.0:*   udp 0 0 0.0.0.0:8888 0.0.0.0:*   udp 0 0 0.0.0.0:111 0.0.0.0:*   udp 0 0 0.0.0.0:882 0.0.0.0:*   可以看到udp处有“0.0.0.0:8888”的内容,说明服务程序已经正常运行,可以接收主机上任何IP地址且端口为8888的数据。   如果这时再执行./udpserv &命令,就会看到如下信息:   bind error: Address already in use   说明已经有一个服务程序在运行了。

运行UDP Client程序

  执行./udpclient 127.0.0.1命令来启动客户程序,使用127.0.0.1来连接服务程序,执行效果如下:   Hello, World!   Hello, World!   this is a test   this is a test   ^d   输入的数据都正确从服务程序返回了,按ctrl+d可以结束输入,退出程序。   如果服务程序没有启动,而执行客户程序,就会看到如下信息:   $ ./udpclient 127.0.0.1   test   read error: Connection refused   说明指定的IP地址和端口没有服务程序绑定,客户程序就退出了。这就是使用connect()的好处,注意,这里错误信息是在向服务程序发送数据后收到的,而不是在调用connect()时。如果使用tcpdump程序来抓包,会发现收到的是ICMP的错误信息。
分享到:
评论

相关推荐

    摄像头udp传输 摄像头udp传输

    摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输摄像头udp传输...

    网络UDP调试工具 UDP客户端 UDP服务端 Socket通讯

    网络UDP调试工具是一款专为IT专业人士设计的实用软件,它主要功能是协助用户进行UDP(User Datagram Protocol)网络通信的调试和测试。UDP是一种无连接的传输层协议,相较于TCP,它提供了更低延迟和更高效率的数据...

    欧姆龙通讯.zip_FINS_UDP fins_UDP FINS_欧姆龙UDP_欧姆龙udp通讯

    《欧姆龙通讯.zip——FINS UDP协议与PLC链接详解》 在工业自动化领域,欧姆龙(Omron)PLC(可编程逻辑控制器)因其稳定性和灵活性被广泛使用。其中,FINS(Factory Integrated Network System)协议是欧姆龙网络...

    串口转UDP 工具 udp服务器

    串口通信和UDP(用户数据报协议)是两种在计算机网络中常见的通信方式,它们各自具有独特的特性和应用场景。在本文中,我们将深入探讨这两种通信方式,并了解如何将串口数据转换为UDP数据,以便在没有物理DTU(数据...

    UDP协议中的 UDP Flood 攻击详细讲解

    UDP Flood攻击详解与华为专业Anti-DDoS解决方案 UDP(User Datagram Protocol)协议是传输层的一种无连接协议,它不建立连接也不保证数据的可靠传输。由于这种特性,UDP具有低延迟、资源消耗小的优点,因此常用于...

    matlab udp 广播通信_广播_UDP_matlab_matlabudp广播_通信_

    在MATLAB中实现UDP广播通信是一项实用的技能,特别是在进行分布式系统开发或者网络测试时。UDP(User Datagram Protocol)是一种无连接的传输层协议,它提供了简单高效的数据传输方式,适用于实时数据传输或对丢包不...

    UDP-UE5.3 UDP-UE5.3

    UDP(User Datagram Protocol)是互联网协议族中的一种无连接、不可靠的传输协议,与TCP(Transmission Control Protocol)相比,它的设计更为简单,主要适用于对实时性要求高的应用,如在线游戏、视频会议等。...

    Qt_UDP通信,qt实现udp通信,C,C++

    在IT领域,网络通信是软件开发中的重要组成部分,而UDP(User Datagram Protocol)是一种无连接的、不可靠的传输协议,常用于实时性要求较高的应用,如在线视频、语音通话等。Qt是一个跨平台的C++图形用户界面应用...

    udp是不可靠的会丢包,如何查看udp丢包数、丢包率

    UDP(User Datagram Protocol)是一种无连接的传输层协议,它不提供像TCP那样确认数据包发送、重传丢失包或确保顺序传输的功能。因此,在使用UDP进行通信时,丢包现象是可能出现的。为了监控和分析UDP通信的丢包情况...

    0061+TCP+UDP网络调试助手含源码.zip_UDP c++源码_UDP 调试助手_tcp 网络 c#_udp 网络调试_

    《TCP与UDP网络调试助手:深入理解C++与C#实现》 在计算机网络通信领域,TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种广泛应用的传输层协议。TCP以其可靠性和有序性,广泛用于需要...

    tcpudp 2.1.1 TCP/UDP 调试软件

    TCP/IP协议是互联网通信的基础,其中TCP(传输控制协议)和UDP(用户数据报协议)是两种主要的传输层协议。TCP提供了一种可靠的数据传输服务,它通过序列化、确认、重传等机制确保了数据的准确无误地到达目的地。而...

    UDP校验和算法

    UDP校验和算法是网络通信中确保数据包完整性和正确性的一种重要机制,尤其是在无连接的UDP(User Datagram Protocol)协议中,由于其不提供可靠传输的保障,校验和的作用就显得尤为关键。本文将深入解析UDP校验和...

    UDPSender发包器工具

    UDPSender是一款强大的UDP(User Datagram Protocol)测试和压力测试工具,主要针对网络通信性能进行评估。UDP是一种无连接的、不可靠的传输层协议,常用于需要高速传输但对数据完整性要求不高的应用,如在线游戏、...

    udp server client demo

    UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,相比TCP,它具有更低的延迟和更高的效率,适合于对实时性要求较高的应用,例如在线视频、语音通话等。在这个“udp server client demo”中,我们...

    c# wpf 界面UDP通讯

    在C#和WPF(Windows Presentation Foundation)的环境中构建UDP通信是常见的任务,尤其是在开发实时性和性能要求较高的应用时。本教程将详细讲解如何在WPF界面中实现一个高效的UDP通信系统,确保程序运行时界面无假...

    TCP/UDP socket 调试工具

    TCP/UDP socket 调试工具 TCP/UDP socket 调试工具 SocketTool调试软件是一款网络TCP/UDP通信调试工具,本工具集功能强大与简单易用为一体,是无需安装的免费绿色软件。她可以帮助网络编程人员、网络维护人员检查所...

    C#的Socket实现UDP协议通信

    标题和描述中的知识点聚焦于如何使用C#的Socket类实现UDP协议通信,这涉及到了UDP协议的基本特性以及在C#中的具体实现方法。以下是对这一主题的深入解析: ### UDP协议简介 用户数据报协议(UDP)是互联网协议族中...

    vb UDP广播示例

    在VB6中,我们可以使用内置的Socket控件来实现UDP(User Datagram Protocol)广播功能。UDP是一种无连接的、不可靠的传输协议,适用于需要高效传输、实时性要求较高的场景,如网络发现和多播通信。 以下是一个关于...

    stm32f407-UDP服务器数据收发实验_STM32F407UDP_stm32f407_stm32f407UDP服务器

    UDP(User Datagram Protocol)是一种无连接的传输层协议,常用于需要快速传输数据且对数据完整性要求不高的网络应用。在这个实验中,我们将探讨如何在STM32F407上实现UDP服务器的数据收发功能。 首先,理解STM32F...

    lwip+udp项目实例

    lwip和UDP是嵌入式系统中网络通信的重要组成部分,特别是在资源有限的微控制器环境里。LWIP(Lightweight TCP/IP stack)是一个轻量级的TCP/IP协议栈,设计目的是为小型嵌入式系统提供互联网连接能力。UDP(User ...

Global site tag (gtag.js) - Google Analytics