当前位置:首页 > 单片机 > 单片机
[导读] 1. UDP介绍UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送

1. UDP介绍

UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个 UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。

UDP数据报封装成一份 IP数据报的格式如图11 - 1所示。


RFC 768 [Postel 1980] 是UDP的正式规范。


UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。由于缺乏可靠性,我们似乎觉得要避免使用UDP而使用一种可靠协议如TCP。在讨论完TCP后将再回到这个话题,看看什么样的应用程序可以使用UDP。

2. UDP首部

UDP首部的各字段如图11 - 2所示。


端口号表示发送进程和接收进程。在图 1 - 8中,我们画出了TCP和UDP用目的端口号来分用来自IP层的数据的过程。


由于IP层已经把IP数据报分配给TCP或UDP(根据I P首部中协议字段值) ,因此TCP端口号由TCP来查看,而UDP端口号由UDP来查看。TCP端口号与UDP端口号是相互独立的。


尽管相互独立,如果TCP和UDP同时提供某种知名服务,两个协议通常选择相同的端口号。这纯粹是为了使用方便,而不是协议本身的要求。


UDP长度字段指的是UDP首部和UDP数据的字节长度。该字段的最小值为 8字节(发送一份0字节的UDP数据报是OK) 。这个UDP长度是有冗余的。 IP数据报长度指的是数据报全长(图3 - 1) ,因此UDP数据报长度是全长减去IP首部的长度(该值在首部长度字段中指定,如图3 - 1所示)


UDP检验和覆盖UDP首部和UDP数据。回想IP首部的检验和,它只覆盖IP的首部—并不覆盖IP数据报中的任何数据。


UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的,而TCP的检验和是必需的。


尽管UDP检验和的基本计算方法与我们在描述的IP首部检验和计算方法相类似(16 bit字的二进制反码和,但是稍微有所不同,在根据字段类型判定为UDP或者TCP时加入了一些处理,看代码就晓得了) ,但是它们之间存在不同的地方。首先, UDP数据报的长度可以为奇数字节,但是检验和算法是把若干个 16 bit字相加。解决方法是必要时在最后增加填充字节0,这只是为了检验和的计算(也就是说,可能增加的填充字节不被传送) 。


其次,UDP数据报和TCP段都包含一个1 2字节长的伪首部(本TCP/IP协议栈有所不同,只加入了4字节源IP地址和4字节目的IP地址,即利用IP首部的尾巴,实现了空间上的复用,看代码就晓得了),它是为了计算检验和而设置的。伪首部包含IP首部一些字段。其目的是让 UDP两次检查数据是否已经正确到达目的地(例如,IP没有接受地址不是本主机的数据报,以及IP没有把应传给另一高层的数据报传给UDP) 。UDP数据报中的伪首部格式如图11 - 3所示。


在该图中,我们特地举了一个奇数长度的数据报例子,因而在计算检验和时需要加上填充字节(0)。注意,UDP数据报的长度在检验和计算过程中出现两次。


如果检验和的计算结果为 0,则存入的值为全1(65535) ,这在二进制反码计算中是等效的。如果传送的检验和为0,说明发送端没有计算检验和。(因为协议要求如此,故代码需要实现之。)如果发送端没有计算检验和而接收端检测到检验和有差错,那么 UDP数据报就要被悄悄地丢弃。不产生任何差错报文(当IP层检测到IP首部检验和有差错时也这样做) 。


UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证。其目的是为了发现UDP首部和数据在发送端到接收端之间发生的任何改动。

/*下面阐述UDP校验和的一些历史和必要性*/

尽管UDP检验和是可选的,但是它们应该总是在用。在 80年代,一些计算机产商在默认条件下关闭UDP检验和的功能,以提高使用UDP协议的NFS(Network File System)的速度。


在单个局域网中这可能是可以接受的,但是在数据报通过路由器时,通过对链路层数据帧进行循环冗余检验(如以太网或令牌环数据帧)可以检测到大多数的差错,导致传输失败。不管相信与否,路由器中也存在软件和硬件差错,以致于修改数据报中的数据。如果关闭端到端的UDP检验和功能,那么这些差错在UDP数据报中就不能被检测出来。另外,一些数据链路层协议(如SLIP)没有任何形式的数据链路检验和。


Host Requirements RFC声明,UDP检验和选项在默认条件下是打开的。它还声明,如果发送端已经计算了检验和,那么接收端必须检验接收到的检验和(如接收到检验和不为0) 。但是,许多系统没有遵守这一点,只是在出口检验和选项被打开时才验证接收到的检验和。


另外需要解释几个术语:IP数据报是指IP层端到端的传输单元(在分片之前和重新组装之后) ,分组是指在IP层和链路层之间传送的数据单元。一个分组可以是一个完整的 IP数据报,也可以是IP数据报的一个分片。(这里有如何分片的说明,书里介绍的详细,简而言之,超过MTU就需要分,但是第一片和接下来的片是有区别的:第一个有UDP首部,其他没有,但是可以通过IP的flags来组合起来。下面的图很形象的说明了。)


------------------------------------------以上内容整理于《TCP/IP协议详解:卷1》--------------------------------------

------------------------------------------以下内容产生于代码及分析--------------------------------------

3. UDP宏定义实现

C++ Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


//*******UDP*******
#defineUDP_HEADER_LEN8
//源端口位置
#defineUDP_SRC_PORT_H_P0x22
#defineUDP_SRC_PORT_L_P0x23
//目标端口位置
#defineUDP_DST_PORT_H_P0x24
#defineUDP_DST_PORT_L_P0x25
//UDP数据长度位置
#defineUDP_LEN_H_P0x26
#defineUDP_LEN_L_P0x27
//UDP校验和位置
#defineUDP_CHECKSUM_H_P0x28
#defineUDP_CHECKSUM_L_P0x29
//UDP数据起始地址
#defineUDP_DATA_P0x2a

4. UDP函数实现


本TCP/IP协议栈中的UDP实现只一个make_udp_reply_from_request函数——udp服务器,可以响应其他udp的请求。在连接的顺序看来,在stm32板子上面的为服务器,等待pc机客户端的请求,当请求到来的时候,返回由程序员自行设定的响应,如本文中将做出3个响应的例子(当然udp一旦建立之后,就部分客户端和服务器端,地位是对等的,但是认为发起者为clien比较符合认知而已)。

这里说以下输入吧:buf为缓冲区,data为要传输的数据,datalen即为sizeof(data),port即为pc端的udp端口号

5. UDP实验

在有了以上的UDP实现之后,你还需要有UDP的请求进来,如下代码所示:

下面的代码放在一个while(1)或者RTOS进程里面,作为服务器来等待客户端的响应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


/*---------------------udpserverstart,welistenonudpport1200=0x4B0-----------------------------*/
if(buf[IP_PROTO_P]==IP_PROTO_UDP_V&&buf[UDP_DST_PORT_H_P]==4&&buf[UDP_DST_PORT_L_P]==0xb0)
{
//UDP数据长度
udpdatalen=buf[UDP_LEN_H_P];
udpdatalen=udpdatalen<<8;
udpdatalen=(udpdatalen+buf[UDP_LEN_L_P])-UDP_HEADER_LEN;
//udpdatalen=buf[UDP_LEN_L_P]-UDP_HEADER_LEN;
//获取pc端的udp port

pcudpport=buf[UDP_SRC_PORT_H_P]<<8| buf[UDP_SRC_PORT_L_P];

//将udp客户端得到的数据buf写入buf1,因为下面的实验需要输入的信息来做出相应的动作
for(i1=0;i1buf1[i1]=buf[UDP_DATA_P+i1];

make_udp_reply_from_request(buf,buf1,udpdatalen,pcudpport);
}
/*----------------------------------------udpend-----------------------------------------------*/

ps:本实验中板子udp的port为1200,pc机的port为4001

实验部分实现了三个简单的实验:

  1. 通过串口输出UDP客户端的IP地址及端口号

  2. 通过串口和UDP输出UDP的输入数据,即USART ECHO和UDP ECHO

  3. 实现UDP命令控制STM32板子上面的LED

C++ Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90


void make_udp_reply_from_request(unsigned char

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭