【网络】UDP协议详解

目录

UDP的感性理解

UDP协议格式

UDP协议格式感性理解

 UDP特点

UDP的缓冲区


UDP的感性理解

UDP的传输过程类似于寄信,假设你要写一封家书寄回家里:首先你要在信封上填写好寄件人和收件人的地址,其次在贴好邮票,最后将信件投放到邮筒中。寄信的特点就是信件是否送到,在寄送的过程中有没有丢失,对于寄件人来说是不知道的。所以寄信是一种不可靠的传递,同样的UDP也是一种不可靠的协议。

UDP协议格式

【网络】UDP协议详解_第1张图片

源端口号和目的端口号在计算机网络中用于标识数据包发送和接收的进程或应用程序。

a. 源端口号(16位):发送方计算机上的端口号。

b. 目的端口号(16位):接收方计算机上的端口号。

c. UDP长度(16位):表示整个数据报(UDP首部+UDP数据)的最大长度。

d. UDP校验和(16位):检测 UDP 用户数据报在传输过程中是否出错。如果校验和出错直接丢弃。

UDP的报头是固定的8字节。

UDP协议格式感性理解

linux内核是用C语言写的,所以报头实际上就是一种结构化的数据对象,用伪代码可表示为如下结构:

【网络】UDP协议详解_第2张图片

 解包分用的过程同样可以用上述的思路去分析:

我们知道UDP报头是固定大小的8字节,所以可以将要发送的数据拷贝到8字节后的位置,在填充udp_har的各个字段,用伪代码表示如下:

【网络】UDP协议详解_第3张图片

 UDP特点

a. 无连接,知道接收方的IP和端口号就可以直接进行传输,不需要建立连接。

b. 不可靠,没有确认机制,没有重传机制。如果因为网络或者其它原因没有传输成功,UDP协议层也不会给应用层返回任何错误信息,也不会重传。

c.面向数据报,应用层交给UDP多长的报文,UDP既不会拆分也不会合并,原样发送。也就是说发送端发送多少个报文,接收方就收取多少个报文,整读整取。

以一个例子理解面向数据报:如果发送端调用一次sendto, 发送200个字节, 那么接收端也必须调用对应的一次recvfrom, 接收200个字节; 而不能循环调用10次recvfrom, 每次接收20个字节。
 

UDP的缓冲区

UDP没有真正意义上的 发送缓冲区. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作;

【网络】UDP协议详解_第4张图片


UDP具有接收缓冲区, 但是这个接收缓冲区不能保证收到的UDP报文的顺序和发送UDP报文的顺序一致:

【网络】UDP协议详解_第5张图片

 如果接收缓冲区满了, 再到达的UDP数据就会被丢弃:

【网络】UDP协议详解_第6张图片

你可能感兴趣的:(网络,udp,网络协议)