UDP协议与TCP协议都是传输层协议,应用层把数据拷贝到传输层,后续动作由下层自行决定。
UDP协议端格式
![](https://i-blog.csdnimg.cn/blog_migrate/a31f8fe86274c1cd4de868302139f55b.png)
16位 UDP 长度 , 表示整个数据报 (UDP 首部 +UDP 数据 ) 的最大长度 ;(也就是65535字节)如果校验和出错 , 就会直接丢弃 ;
UDP的特点(相对于TCP)
无连接 : 知道对端的 IP 和端口号就直接进行传输 , 不需要建立连接 ;不可靠 : 没有确认机制 , 没有重传机制 ; 如果因为网络故障该段无法发到对方 , UDP 协议层也不会给应用层返回任何错误信息;面向数据报 : 不能够灵活的控制读写数据的次数和数量 ;
面向数据报
应用层交给
UDP
多长的报文
, UDP
原样发送
,
既不会拆分
,
也不会合并
;
用
UDP
传输
100
个字节的数据
:
如果发送端调用一次
sendto,
发送
100
个字节
,
那么接收端也必须调用对应的一次
recvfrom,
接收
100
个字节;
而不能循环调用
10
次
recvfrom,
每次接收
10
个字节
;
UDP的缓冲区
UDP
没有真正意义上的
发送缓冲区
.
调用
sendto
会直接交给内核
,
由内核将数据传给网络层协议进行后续的传输动作;
UDP
具有接收缓冲区
.
但是这个接收缓冲区不能保证收到的
UDP
报的顺序和发送
UDP
报的顺序一致
;
如果缓冲区满了,
再到达的
UDP
数据就会被丢弃
;
UDP
的
socket
既能读
,
也能写
,
这个概念叫做
全双工。
UDP使用注意事项
我们注意到
, UDP
协议首部中有一个
16
位的最大长度
.
也就是说一个
UDP
能传输的数据最大长度是
64K(
包含
UDP
首部).
然而
64K
在当今的互联网环境下
,
是一个非常小的数字
.
如果我们需要传输的数据超过
64K,
就需要在应用层手动的分包
,
多次发送
,
并在接收端手动拼装
;
基于UDP的应用层协议
NFS:
网络文件系统
TFTP:
简单文件传输协议
DHCP:
动态主机配置协议
BOOTP:
启动协议
(
用于无盘设备启动
)
DNS:
域名解析协议(也可以使用TCP)
当然
,
也包括你自己写
UDP
程序时自定义的应用层协议
;
问题1:报头和有效载荷如何分离,如何交付?
报头有16位报文长度,减去8字节固定报头长度就是有效载荷。