【网络】UDP协议详解

目录

UDP的感性理解

UDP协议格式

UDP协议格式感性理解

 UDP特点

UDP的缓冲区


UDP的感性理解

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

UDP协议格式

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

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

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

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

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

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

UDP协议格式感性理解

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

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

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

 UDP特点

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

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

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

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

UDP的缓冲区

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


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

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值