一,UDP简介
UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议。
UDP协议是英文UserDatagramProtocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的C/S模式的网络应用都需要使用UDP协议。UDP协议直接位于IP(网际协议)协议的顶层。
特点:
1)无连接,发送数据之前不需要建立连接。开销和发送之前的时间延迟较短。
2)尽最大努力交付。(可以采取一定策略实现可靠传输)
3)面向报文,UDP对应用程序交付的报文,添加UDP首部后直接交给IP层。不合并,不拆分。
4)没有拥塞控制,网络拥塞不会使源主机发送率降低。
5)UDP支持一对一,一对多,多对一的交互通信
6)UDP首部开销较小,8字节(TCP为20字节、IP为20字节)
二,UDP首部格式
源端口:2字节 = 16bit =0 ~ 65535
目的端口:2字节
长度:2字节 用户数据包的长度(最短为8字节,仅有头部)
检验和:2字节
三,常见问题
1,如果接受方UDP发现收到报文中目的端口不正确(不存在对应端口的应用程序)怎么办?
丢弃该报文,由ICMP发送“端口不可达”差错报文给发送发。
traceroute 工作原理,一种利用ICMP的TTL,另一种利用UDP的端口
四,程序实例
Windows C++ 源码 (开发环境:VS2005 ,Win7)
1)发送端
#include <winsock2.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
SOCKET sock; //socket
char szMsg[] = "this is a UDP test package";//被发送的字段
/*typedef unsigned short WORD*/
WORD wVersionRequested;//1.启动SOCKET库,版本为2.0
WSADATA wsaData;//这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets数据
int err;
wVersionRequested = MAKEWORD( 2, 0 );//创建一个被指定变量连接而成的WORD变量。返回一个WORD变量
err = WSAStartup(wVersionRequested, &wsaData );//Winsock服务的初始化
if ( err != 0 )
{
cout<<"Socket2.0初始化失败,Exit!";
}
if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) //判断是否是 2.0版本的socket
{
WSACleanup( );
}
//2.创建socket
sock = socket(
AF_INET, //代表TCP/IP协议族: UDP, TCP, etc
SOCK_DGRAM, //SOCK_DGRAM说明是UDP类型,SOCK_STREAM是TCP类型
0 //protocol
);
if (sock == INVALID_SOCKET ) {
cout<<"Socket 创建失败,Exit!";
}
//3.设置发往的地址
sockaddr_in addrto; //发往的地址
memset(&addrto,0,sizeof(addrto));
addrto.sin_family=AF_INET;
//以127开头的ip,并且客户和服务器在同一个局域网,服务方都可以接收(相当于广播);
//指定服务方ip的可以接收
addrto.sin_addr.s_addr=inet_addr("127.0.0.1");
addrto.sin_port=htons(7861);//端口号必须和服务器绑定的端口号一致
int nlen=sizeof(addrto);
unsigned int uIndex = 1;
while(true)
{
Sleep(1000);
//从广播地址发送消息
if( sendto(sock,szMsg,strlen(szMsg),0,(sockaddr*)&addrto,nlen)== SOCKET_ERROR )
cout<<WSAGetLastError()<<endl;
else
cout<<uIndex++<<":an UDP package is sended."<<endl;
}
if (!closesocket(sock))
{
WSAGetLastError();
}
if (!WSACleanup())
{
WSAGetLastError();
}
}
2)接收端
#include <winsock2.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
void main(void)
{
SOCKET sock;
//1.启动SOCKET库,版本为2.0
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
cout<<"Socket2.0初始化失败,Exit!";
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 )
{
WSACleanup();
return;
}
//2.创建套接字
sock = socket(AF_INET,SOCK_DGRAM,0);
if (sock == INVALID_SOCKET )
{
cout<<"Socket 创建失败,Exit!";
return;
}
//3.绑定
sockaddr_in myaddr; //sockaddr_in相当于sockaddr结构
memset(&myaddr,0,sizeof(myaddr));
myaddr.sin_family=AF_INET;
//如果绑定地址不是本机地址或者ADDR_ANY,则recvfrom函数不会正确接收,而是立刻返回
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
//端口号必须和客户发往的端口号一致
myaddr.sin_port=htons(7861);
bind(sock,(sockaddr*)&myaddr,sizeof(myaddr));
int fromlength = sizeof(SOCKADDR);
char buf[256]="";
long number=0;
while(1)
{
if(recv(sock,buf,sizeof(buf),0))
{
cout<<number<<":"<<buf<<endl;
number++;
}
memset(buf,0,sizeof(buf));
}
if (!closesocket(sock))
{
WSAGetLastError();
return;
}
if (!WSACleanup())
{
WSAGetLastError();
return;
}
}
分享到:
相关推荐
IP协议 tcp协议 UDP协议详细报文格式,用于FPGA开发网卡传输层协议,谢谢
UDP层,这一层属于传输层应用,UDP协 议基于IP层,而UDP程序基于UDP协议。其实UDP无所谓什么协议,它没有自己的状态 机,仅仅是在IP层上做了一些封装,不保证报文能准确到达,没有请求应答机制,所有的 行为,和IP...
TCP 是位于传输层的协议,他还有一个兄弟就是 UDP ,他们两共同构成了传输层。显然他们之间有很大的区别要不然的话在传输层只需要一个就好了。 其中最重要的区别就是一个面向连接另外一个不是,这个区别就导致...
本文档详细阐述了传输层的两大协议:TCP/UDP协议。对TCP 中的链接管理(握手过程与挥手过程),可靠传输、流量控制进行了详细的介绍,图文并茂,希望能帮到大家!
C#完整的通信代码详解(点对点,点对多,同步,异步,UDP,TCP).文件文件夹传输.注:不是拿来就能运行的那种,是代码详解文档!!! 一步一步的讲解层次分明思路清晰,比纯源码好多了。好不容易找到的分享了
TCP IP\第八章传输层.ppt TCP,UDP协议详解
UDP是一个简单的面向数据报的传输层协议,进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据包
UDP 协议(User Datagram Protocol),中文名是用户数据报协议,是 OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。 从这个定义中...
RFC7959定义了CoAP协议的块输出规范,对于resource ...CoAP基于UDP,最大传输数据报的长度为64KByte,无法支持FW升级(除非开发基于CoAP的特定应用) 避免数据报文分片(基于IP) 避免适配层分片(基于RFC4919 6LoWPAN)
IP位于TCP/IP模型的网络层(相当于OSI模型的网络层),对上可载送传输层各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层,通过以太网、令牌环网络等各种技术来传送。 IP提供一种无连接的传输机制,这就...
第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU 21 2.10 串行...
而第二层则是传输层,著名的TCP和UDP协议就在这个层次(不要告诉我你没用过udp玩星际)。第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据(后面会讲到)以确定传输的目标。第四层是叫数据链路...
SNMP(Simple Network Management Protocol)是被广泛接受并投入使用的工业标准,它的目标是保证管理信息在任意两点中传送,便于网络管理员在网络上的任何...它只要求无证实的传输层协议UDP,受到许多产品的广泛支持
第二十三章 UDP:用户数据报协议 第二十四章 TCP:传输控制协议 第二十五章 TCP的定时器 第二十六章 TCP输出 第二十七章 TCP的函数 第二十八章 TCP的输入 第二十九章 TCP的输入(续) 第三十章 TCP的用户需求 第三十...
非扫描版TCP/IP详解卷一,你值得拥有: 《TCP/IP详解,卷1:协议》是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序...
TCP/IP概述 20 3.1 TCP/IP的优点 20 3.2 TCP/IP的层和协议 21 3.2.1 体系结构 21 3.2.2 传输控制协议 21 3.2.3 IP协议 23 3.2.4 应用层 25 3.2.5 传输层 25 3.2.6 网络层 25 3.2.7 链路...
第2章 链路层 15 第3章 IP:网际协议 24 第4章 ARP:地址解析协议 38 第5章 RARP:逆地址解析协议 47 第6章 ICMP:Internet控制报文协议 50 第7章 Ping程序 61 第8章 Traceroute程序 71 第9章 IP选路 83 第10章 动态...
(3)传输层会检查TCP或UDP报文头中的目的端口号,以此来识别特定应用。 (4)服务器可以只通过源IP地址识别两台主机的HTTP流量,另外TCP报文头中包含的源端口也可以被用来区分同一台主机通过不同的浏览器发起的...
《TCP/IP详解,卷1:协议》(共3卷,其他卷请到我的空间下载)是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序来捕获...
第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 ...