1.UDP协议,发送方有一个虚拟的发送缓存区。假的,意思是UDP应用程序生成数据报,就直接发送出去,不做任何处理。发送缓存区主要是限制单个数据报的大小。如果写一个太大的数据报,内核返回该进程一个EMSGSIZE错误。因为UDP是不可靠的,它不必保存应用进程数据的一个副本,因此无需一个真正的发送缓存区。
2.UDP接收方具有接收缓存区,输出队列是FIFO的。
3.接收缓存区有固定大小,可以通过SO_RCVBUF套接字选项调节大小。
4.当接收缓存区满了之后,一定会丢弃不能再接收的数据报,有可能会发送ICMP源站抑制差错。“可能”是因为即使接收方有发送这个差错,但是发送方会选择忽略这个差错报文。TCP协议与之不同,他会根据这个差错报文,放慢在该连接上的数据传输速度。UDP忽略的原因在于,发送方发送完数据报,就可能立即中止了,没有机会接受差错报文。就算接受了差错报文,也不可能重发。
5.接收方从接收缓存区中只读取一条数据报。读取函数recvfrom中,有设置能够读取的最大数据报长度的字段,但是通常读取一条不够参数显示长度的完整的数据报。这里有一个问题:假设一条完整数据报长度大于recvfrom参数设置长度。有3种处理方法:
(1)截断:对数据报进行截断,最终长度是recvfrom设置的长度
(2)不截断:剩下的部分在后续读取操作中返回。
(3)不截断并通知:返回一个标志表明可以获取更多数据。后续读操作则返回剩余部分。