东营专业网站建设公司排行,书画网站的建设目标,响应式网站管理,上海徐汇龙华公司鞋子个人主页 #xff1a; 个人主页 个人专栏 #xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言UDP协议报头和有效载荷分离的问题有效载荷向上交付的问题#xff0c;也就是交给哪个进程#xff1f;怎么确定把报文收全了#xff1f;UDP报头是如何封装的呢… 个人主页 个人主页 个人专栏 《数据结构》 《C语言》《C》《Linux》 文章目录 前言UDP协议报头和有效载荷分离的问题有效载荷向上交付的问题也就是交给哪个进程怎么确定把报文收全了UDP报头是如何封装的呢 UDP特点UDP的缓冲区基于UDP的应用层协议 总结 前言
本文是对UDP协议的知识总结 UDP协议
UDP协议格式如下
16位源端口号标识发送数据报的应用程序所在的端口。16位目的端口号标识接收数据报的应用程序所在的端口。16位UDP长度表示整个UDP数据报的长度包括UDP头部和数据部分。16位UDP检验和表示整个UDP数据报的长度包括UDP头部和数据部分。
这里我们有几个问题
报头和有效载荷分离的问题
UDP协议使用固定报头长度(8字节)的方式来分离报头和有效载荷。
有效载荷向上交付的问题也就是交给哪个进程
UDP报头字段中16位目的端口号就是标识接受数据报的进程。
怎么确定把报文收全了
UDP协议对于小于8字节的报文会直接丢弃毕竟光是UDP报头大小就是8字节对于大于8字节的报文会用 16位UDP长度 - 报头大小 数据长度 和 16位UDP检验和 的方式来确定报文是否收全。
UDP报头是如何封装的呢
报头是一个结构化字段也就是结构体。 如果我们一次接受大量的UDP报文那操作系统要不要对这些报文进行管理要进行管理。如何管理先描述在组织。内核中为了管理报文定义了sk_buff结构体。 知道了上面两个结构体我们就可以以使用 udp 发送 hello 给127.0.0.1:8888为列子来了解UDP报头是如何封装的。
定义一个 sk_buff 和 一个缓冲区。刚开始 data 和 tail指向同一个地址。 data指针向前移动5个字节(hello 的长度)也就是开辟了5个字节的空间然后将 hello 从用户层拷贝到内核层。 定义一个 struct udphdr 结构体在将16位原端口号16位目的端口号16位UDP长度16位UDP检验和信息填充。然后data再前移8个字节再见报头字段拷贝到缓冲区。 到这里对报文进行UDP封装就完成了。 以下是 linux-2.6.11.10下的udphdr结构体 和 sk_buff结构体 UDP特点
无连接知道对端的IP和端口号就直接进行传输不需要建立链接不可靠没有确认应答机制没有重传机制如果因为网络故障导致报文无法发到对方UDP协议也不会给应用层返回任何错误信息面向数据报不能够灵活的控制读写数据的次数和数量(应用层交给UDP多长的有效载荷UDP会加上报头直接发送不会拆分也不会合并)
UDP的缓冲区
UDP没有真正意义上的发送缓冲区调用sendto会直接交给内核由内核将数据传给网络层协议进行后续传输动作UDP具有接收缓冲区但是这个接收缓冲区不能保证收到的UDP报文的顺序和发送UDP报文顺序的一致如果缓冲区满了再到达的接收端主机的UDP报文就会被丢弃
基于UDP的应用层协议
NFS网络文件系统TFTP简单文件传输协议DHCP动态主机配置协议BOOTP启动协议DNS域名解析协议 总结
以上就是我对于UDP协议的知识总结