UDP( User Datagram Protocol)协议,用户数据报协议。
简单的UDP编程代码
1. UDP协议的三大特点
无连接:在给对方发送消息的时候,不需要建立连接,只要知道对方的IP地址及侦听的端口就可以直接发送数据了。
不可靠:对于UDP的发送方而言,不关心消息接收方是否工作正常,只关心发送函数调用是否成功(发送方调用sendto函数成功);
面向数据报:
- 应用层给传输层的UDP协议递交数据的时候,应用层的数会被临时写到UDP协议的发送缓冲区中,此时,在缓冲区当中打上UDP协议的报头之后,就递交给网络层。
注意一点:UDP的发送缓冲区,每一次只能放入一个数据报,当发送缓冲区的数据报被发送后,下一个数据报才能进去发送缓冲区中。 - UDP协议在接收到UDP数据之后,是整条整条的给应用层进行传递的。
2.UDP协议的报头字段
查看UDP的命名:vim /usr/include/netinet/udp.h
struct udphdr
{
u_int16_t uh_sport; /* source port */
u_int16_t uh_dport; /* destination port */
u_int16_t uh_ulen; /* udp length */
u_int16_t uh_sum; /* udp checksum */
};
参数 | 解释 |
---|---|
uh_sport | 源端口 |
uh_dport | 目的端口 |
uh_ulen | UDP数据长度 |
uh_sum | 校验和 |
2.1数据长度
UDP数据长度类型为u_int16_t,则范围为0 ~ 65535,UDP数据报长度最大是65535字节
UDP数据长度 = UDP头部(8字节) + 应用层递交的数据长度。
如果应用层递交给传输层UDP协议的数据超过65535字节,此时该怎么办?
在应用层自定制协议,将数据在应用层分割成为满足UDP传输的子块,再使用UDP协议进行传输。
UDP协议是面向数据报的,即UDP数据是整条整条收发的,如何保证在接收方的应用层表示若干个UDP数据是一个应用层数据包?
在设计应用层协议时,给属于同一个数据报的数据子块打上相同的ID,即不同的数据子块具有相同的ID。
UDP协议接收方并不能保证接收到数据报的顺序和发送数据报的顺序保持一致,如果达到的数据报顺序不对,则会导致具有相同ID的数据报无法解析得到正确数据 ,如何解决?
在报头当中加上数据的偏移量,偏移量是描述子块数据在整个应用层数据报当中的位置。
在设计应用层自定制协议字段:
- 属于同一个数据报的数据子块打上相同的ID,即不同的数据子块具有相同的ID;
- 在报头当中加上数据的偏移量,偏移量是描述子块数据在整个应用层数据报当中的位置;
- 记录分块数据长度
对于应用层而言,需要传输的数据被分成了不同的子块,本质上这些子块组合在一起,就是需要传输的数据;对于传输层UDP协议而言,应用层递交的子块数据,就是一个完整的UDP数据报。
2.2校验和
校验和是接收方用来校验UDP数据在传输过程中是否失真。
- 数据失真:发送方发送的UDP数据和接收方接收到的数据不一致
处理:接收方的传输层,就不会将失真的数据递交给应用层,直接就丢弃了。 - 无数据失真:直接递交给应用层。
2.2.1校验和计算方式
如何计算(发送方):
- 将UDP数据(UDP协议头 + 有效数据),分成多个16比特位的小段,除了校验和的16个比特位外,其余比特位进行相加操作;
- 将求得的结果反码运算,将反码运算的结果放到16个比特位的校验和当中。
如何校验(接收方):
- 将所有的16个比特位的小段全部加起来,如果比特位为全1,则表示数据是正常的。
例:
3.UDP协议缓冲区
- UDP缓冲区是整条数据接收和发送的
- 对于UDP的发送方而言,UDP是有发送缓冲区的,只不过在发送区打上UDP协议的报头之后就直接提交给网络层了
- 对于UDP接收方而言,UDP是有接收缓冲区的,只不过是整条UDP数据提交给应用层的,UDP不保证数据报是可靠且有序到达对端的。
查看UDP发送缓冲区和接收缓冲区的大小:
cat /proc/sys/net/core/rmem_default //发送缓冲区
cat /proc/sys/net/core/wmem_default //接收缓冲区
UDP发送缓冲区和接收缓冲区的大小均为:212992字节,208K。
4.UDP协议的应用
- DHCP协议:动态主机分配协议,谁上网就给谁分配IP,不上网就不分配
原因是ipv4版本的ip地址枯竭的问题,不够用;不可以作为一台机器的唯一标识。MAC地址可以。 - DNS协议:域名解析协议
将域名转化为ip地址,使用的就是UDP协议
5.传输层及端口
传输层是负责端与端(端点,端口)之间传输的,无论是UDP协议还是Tcp协议,都是负责端口与端口之间的数据传输。(传输层负责端口)
5.1端口划分
端口范围:0 ~ 2^16
知名端口:0 ~ 1023
http:80
https:443
ssh:22
ftp:21
telnet:23
要避免去使用知名端口。
非知名端口也不可随意去使用,一些常用软件使用的端口:
mysql:3306
oracle:1521
网络数据在传输过程中的五元组信息:
源端口,目的端口,源ip,目的ip,协议
任何一个要在网络中传输的数据,都会具备五元组信息,否则网络就不会转发。