TCP/IP的秘密(6)UDP协议要点

520 阅读4分钟

这是我参与8月更文挑战的第22天,活动详情查看:8月更文挑战

UDP(User Datagram Protocol)是仅次于TCP的主流传输层协议,它提供的是最小化的协议机制,尽力而为的BE业务类型,基于IP网络,面向事务的消息传输,我们来看一下UDP的协议要点。

包头格式

image.png

  • 源端口, source port, 可选字段,非必填,对于一些不需要响应或回复的业务类型,可以不赋值,即全设为0;

  • 目的地端口,Destination Port;

  • 报文长度,length,单位是字节,包括了报头和所携带的有效数据,如果没有data的话,最小值是8字节;

  • 校验和,checksum, 可选字段,校验和是来自于伪首部(pseudo-header),UDP首部和数据部分,如果不足16bits则补0,主要是为了校验错误路由的数据包;

    • 伪首部是指:UDP的前缀,包括IP源地址,目的地IP地址,协议类型和UDP包长度。其中IP地址信息来自于上层的用户接口。伪首部只用来做校验,实际的UDP包中并不包含这部分内容

image.png

工作模式

UDP数据传输时不需要提前建立连接的,那么数据传输过程是怎样的呢?

image.png

  1. 首先server和client都需要绑定指定UDP端口;
  2. 发送方通过sendto方法发送数据,接收方不需要调用listen()方法,而是通过recvfrom()直接接收来自client的数据;
  3. 处理完数据后同样通过sendto()再发回给发送方指定端口;
  4. 双方通信完成后或超过一定时间没有数据传输,则关闭端口并释放资源;

这里补充一下UDP的发送接收模式中的阻塞与非阻塞:

  • 阻塞即数据还没准备好,或数据还没收到,则程序一直等待并占用端口,无法进行其他操作,可以理解为单线程串行;

  • 非阻塞即程序采用轮询的方式来探测端口是否有接收数据或缓存是否已经准备好数据,如果数据好了则处理,没好的话,则可以先返回一个结果,并处理其他事务;

  • 在UDP中,数据是不能阻塞发送,因为UDP并没有真正的发送缓冲区,它所做的只是将应用缓冲区拷贝给下层协议栈,在此过程中加上UDP头,IP头,数据准备和发送是一个过程;

  • 而接收端是可以进行配置的,一般选择阻塞模式,即接收数据到缓存,得到一个完整的UDP数据包才返回,有时如果发送端数据量太大可能会淹没接收端的缓存,所以需要确保接收端有足够的缓存空间;

UDP VS. TCP

  1. 协议栈:UDP与TCP一样,都处于传输层,网络层是基于IP传输;

  2. 面向连接与无连接:UDP是无连接的,也就是说在发送数据之前,并不会在发送方和接收方之间建立通信管道;

  3. 可靠与不可靠:UDP是不可靠的,原因在于它没有ack确认消息,不保证数据被接收,也没有重传机制,但可以通过应用层进行重传;

  4. 拥塞控制:UDP没有拥塞控制;

  5. 数据分段/分片:TCP支持将应用层数据进行分段segment,UDP并不能将数据分段,当长度超过了MTU时,而是让IP层去处理,而这造成分段后需要在接收方的网络层进行数据重组;

  6. 单播/组播:UDP支持组播和广播即一对多通信,TCP仅支持单播即一对一通信;

  7. 应用场景:UDP多应用于DNS查询,即时通信等对实时性要求高的业务,同时网络测试时经常使用UDP进行灌包测试;

感谢阅读,如有不准确和错误之处请留言指正,我会立即修正,感谢!




总结不易,请勿私自转载,否则别怪老大爷不客气

欢迎喜欢技术的小伙伴和我交流,微信1296386616

参考资料:

UDP 单播、广播和多播 www.cnblogs.com/jingliming/…

阻塞式I/0 和 非阻塞式I/O 同步异步详细介绍 www.cnblogs.com/anche/p/897…

从缓冲上看阻塞与非阻塞socket在发送接收上的区别 blog.csdn.net/jwybobo2007…