UDP用户数据报协议.docx
- 文档编号:10969229
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:13
- 大小:738.14KB
UDP用户数据报协议.docx
《UDP用户数据报协议.docx》由会员分享,可在线阅读,更多相关《UDP用户数据报协议.docx(13页珍藏版)》请在冰豆网上搜索。
UDP用户数据报协议
UDP用户数据报协议
UDP是一个简单的面向数据报的运输层协议:
进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。
这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系。
RFC768是UDP的正式规范
1、UDP报文封装
UDP首部报文格式如下
端口号表示发送进程和接收进程,UDP长度字段指的是UDP首部和UDP数据的字节长度。
该字段的最小值为8字节(发送一份0字节的UDP数据报是OK的)。
这个UDP长度是有冗余的。
IP数据报长度指的是数据报全长,因此UDP数据报长度是全长减去IP首部的长度。
特点:
不可靠、易分片
UDP不提供可靠性:
它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地。
分片:
应用程序必须关心IP数据报的长度。
如果它超过网络的MTU,那么就要对IP数据报进行分片。
如果需要,源端到目的端之间的每个网络都要进行分片,并不只是发送端主机连接第一个网络才这样做。
2、IP分片
物理网络层一般要限制每次发送数据帧的最大长度。
任何时候IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。
IP把MTU与数据报长度进行比较,如果需要则进行分片。
分片可以发生在原始发送端主机上,也可以发生在中间路由器上。
把一份IP数据报分片以后,只有到达目的地才进行重新组装。
IP首部中部分字段用于报文分片组装,具体参见tcp/ip协议学习笔记(3)InternetProtocol(IP)
对于发送端发送的每份IP数据报来说,其标识字段都包含一个唯一值。
该值在数据报分片时被复制到每个片中。
标志字段用其中一个比特来表示“更多的片”。
除了最后一片外,其他每个组成数据报的片都要把该比特置1,下面简单抓一个分片ping包看一下
第一片
第二片
在分片时,除最后一片外,其他每一片中的数据部分(除IP首部外的其余部分)必须是8字节的整数倍。
标志字段中有一个比特称作“不分片”位。
如果将这一比特置1,IP将不对数据报进行分片。
相反把数据报丢弃并发送一个ICMP差错报文给起始端
尽管IP分片过程看起来是透明的,但有一点让人不想使用它:
即使只丢失一片数据也要重传整个数据报。
为什么会发生这种情况呢?
因为IP层本身没有超时重传的机制——由更高层来负责超时和重传(TCP有超时和重传机制,但UDP没有)
IP数据报:
是指IP层端到端的传输单元(在分片之前和重新组装之后)
分组是指在IP层和链路层之间传送的数据单元。
一个分组可以是一个完整的IP数据报,也可以是IP数据报的一个分片。
3、UDP数据报最大长度
理论上,IP数据报的最大长度是65535字节,这是由IP首部16比特总长度字段所限制的。
去除20字节的IP首部和8个字节的UDP首部,UDP数据报中用户数据的最长长度为65507字节。
但是,大多数实现所提供的长度比这个最大值小。
其中两个限制因素:
第一,应用程序可能会受到其程序接口的限制。
socketAPI提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。
对于UDPsocket,这个长度与应用程序可以读写的最大UDP数据报的长度直接相关。
现在的大部分系统都默认提供了可读写大于8192字节的UDP数据报
第二个限制来自于TCP/IP的内核实现。
可能存在一些实现特性(或差错),使IP数据报长度小于65535字节
4、UDP服务器的设计与实现
1./*********************************************************************************
2. *Author :
wph
3. *Version :
1.0
4. *Date :
2014/03/01
5. *Description:
udp server
6. *Others :
7. *History :
8.**********************************************************************************/
9.#include
10.#include
11.#include
12.#include
13.#include
14.#include
15.#include
16.#include
17.#include
18.
19.#include "errocode.h"
20.#include "basetype.h"
21.
22.#define INVALID_FD -1
23.#define PORT 1234
24.#define MAXDATASIZE 512
25.
26.STATIC INT g_iudpFd = INVALID_FD;
27.
28.VOID udp_callback(evutil_socket_t fd, short what, void *arg)
29.{
30. struct sockaddr_in client;
31. socklen_t addrlen;
32. int num;
33. char buf[MAXDATASIZE];
34.
35. memset(buf, 0, MAXDATASIZE);
36. num = recvfrom(fd, buf, MAXDATASIZE, 0, (struct sockaddr*)&client, &addrlen);
37. if (num < 0)
38. {
39. perror("recvfrom() error\n");
40. exit
(1);
41. }
42.
43. printf("You got a message (%s) from client.\nIt's ip is%s, port is %d.\n",
44. buf, inet_ntoa(client.sin_addr), htons(client.sin_port));
45.
46. sendto(fd, buf, num, 0, (struct sockaddr *)&client, addrlen);
47.}
48.
49.ULONG udp_init(VOID)
50.{
51. int sockfd;
52. struct sockaddr_in server;
53.
54. /* The caller has already set up fd1, fd2 somehow, and make them
55. nonblocking. */
56. sockfd = socket(AF_INET, SOCK_DGRAM, 0);
57. if(INVALID_FD == sockfd)
58. {
59. perror("Creatingsocket failed.");
60. exit
(1);
61. }
62.
63. bzero(&server, sizeof(server));
64. server.sin_family = AF_INET;
65. server.sin_port= htons(PORT);
66. server.sin_addr.s_addr= htonl(INADDR_ANY);
67. if(-1 == bind(sockfd, (struct sockaddr *)&server, sizeof(server)))
68. {
69. perror("Bind()error.");
70. exit
(1);
71. }
72.
73. g_iudpFd = sockfd;
74.
75. return EROOR_SUCCESS;
76.}
77.
78.VOID udp_fini(VOID)
79.{
80. int sockfd = g_iudpFd;
81.
82. if (INVALID_FD !
= sockfd)
83. {
84. close(sockfd);
85. }
86.}
87.VOID main_loop(VOID)
88.{
89. INT ifd = g_iudpFd;
90. struct event *ev1;
91. struct timeval five_seconds = {5,0};
92. struct event_base *base = event_base_new();
93.
94. /* upd 服务器采用libevet进行处理 */
95. ev1 = event_new(base, ifd, EV_TIMEOUT|EV_READ|EV_PERSIST, udp_callback, NULL);
96.
97. event_add(ev1, &five_seconds);
98. event_base_dispatch(base);
99.
100. return ;
101.}
102.INT main()
103.{
104. if(EROOR_SUCCESS !
= udp_init())
105. {
106. return -1;
107. }
108.
109. main_loop();
110.
111. udp_fini();
112.
113. return 0;
114.}
1./*********************************************************************************
2. *Copyright(C),2010-2011,
3. *Author :
wph
4. *Version :
1.0
5. *Date :
2014/03/01
6. *Description:
udp client
7. *Others :
8. *History :
9.**********************************************************************************/
10.#include
11.#include
12.#include
13.#include
14.#include
15.#include
16.#include
17.#include
18.
19.#include "errocode.h"
20.#include "basetype.h"
21.
22.#define INVALID_FD -1
23.#define PORT 1234
24.#define MAXDATASIZE 512
25.
26.INT main(INT argc, CHAR *argv[])
27.{
28. INT isockfd = INVALID_FD;
29. UINT uinum = 0;
30. char buf[MAXDATASIZE];
31. socklen_t addrlen;
32. struct hostent *he;
33. struct sockaddr_in server;
34. struct sockaddr_in peer;
35.
36. if (3 !
= argc)
37. {
38. printf("Usage:
%s
39. exit
(1);
40. }
41.
42. if (NULL == (he=gethostbyname(argv[1])))
43. {
44. printf("gethostbyname()error\n");
45. exit
(1);
46. }
47.
48. if (INVALID_FD == (isockfd = socket(AF_INET, SOCK_DGRAM,0)))
49. {
50. printf("socket() error\n");
51. exit
(1);
52. }
53.
54. bzero(&server,sizeof(server));
55. server.sin_family = AF_INET;
56. server.sin_port = htons(PORT);
57. server.sin_addr= *((struct in_addr *)he->h_addr);
58. sendto(isockfd, argv[2],strlen(argv[2]),0,(struct sockaddr *)&server,sizeof(server));
59. addrlen=sizeof(server);
60. while
(1)
61. {
62. if((uinum=recvfrom(isockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&peer, &addrlen))== -1)
63. {
64. printf("recvfrom() error\n");
65. exit
(1);
66. }
67. if (addrlen !
= sizeof(server) || memcmp((const void *)&server, (const void *)&peer, addrlen) !
= 0)
68. {
69. printf("Receive message from otherserver.\n");
70. continue;
71. }
72.
73. buf[uinum]='\0';
74. printf("Server Message:
%s\n", buf);
75. break;
76. }
77.
78. close(isockfd);
79.}
演示:
[root@localhostserver]#./udpserver&
[1]1389
[root@localhostserver]#./udpclient127.0.0.1"ilikeyou"
Yougotamessage(ilikeyou)fromclient.
It'sipis127.0.0.1,portis34340.
ServerMessage:
ilikeyou
[root@localhostserver]#netstat-aun
ActiveInternetconnections(serversandestablished)
【编辑推荐】
1.网络协议之UDP协议
2.基于UDP传输协议的实现分析之流量和拥塞控制
3.基于UDP的网络通信之屏幕共享
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UDP 用户 数据 协议