UDP 是什么?
提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)
UDP 的特点有哪些?
1)UDP 是无连接的;
2)UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态(这里面有很多参数)
3)UDP 是面向报文的
4)UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 IP 电话,实时视频会议等);
5)UDP 支持一对一、一对多、多对一和多对多的交互通信;
6)UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
UDP 对应的应用层协议
DNS :用于域名解析服务,使用 53 号端口
SNMP:简单网络管理协议,使用 161 号端口
TFTP(Trival File Transfer Protocal):简单文件传输协议,使用 69 号端口
UDP 和 TCP 的区别
1)TCP 面向连接(如打电话要先拨号建立连接)。UDP 是无连接的,即发送数据之前不需要建立连接。
2)TCP 提供可靠的服务。也就是说,通过 TCP 连接传送的数据,无差错,不丢失,不重复,且按序到达。UDP 尽最大努力交付,既不保证可靠交付。
3)TCP 面向字节流,实际上是 TCP 把数据看成一连串无结构字节流。UDP 是面向报文的,UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 IP 电话,实时视频会议等)。
4)每一条 TCP 连接只能是点到点的。UDP 支持一对一、一对多、多对一和多对多的交互通信。
5)TCP 首部开销 20 字节。UDP 的首部开销小,只有 8 个字节。
6)TCP 的逻辑通信信道是全双工的可靠信道,UDP 则是不可靠信道。
7)UDP 是面向报文的,发送方的 UDP 对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层,论应用层交给 UDP 多长的报文,它统统发送,一次发送一个。而对接收方,接到后直接去除首部,交给上面的应用层就完成任务了。因此,他需要应用层控制报文的大小。TCP 是面向字节流的,他把上面应用层交下来的数据看成无结构的字节流会发送,可以想象成流水形式的,发送方 TCP 会将数据放入“ 蓄水池 ” (缓存区),等到可以发送的时候就发送,不能发送就等着 ,TCP 会根据当前网络的拥塞状态来确定每个报文段的大小。
为什么域名解析用 UDP 协议?
1、报文开销小:UDP 是一种无连接的传输层协议,其报文头部相对简单,只有 8 个字节,相比之下,TCP 的报文头部至少为 20 个字节。在进行域名解析时,通常查询请求和响应的数据量都比较小,UDP 的小报文头部可以减少网络传输的开销。
2、快速传输:UDP 不需要建立链接,直接将数据封装成报文发送出去,因此可以快速地进行数据传输,对于域名解析这种对响应时间要求较高的应用来说,UDP 的快速传输性非常重要。
在进行 UDP 编程的时候,一次发送多少 bytes 好?
在进行 UDP 编程时,一次发送的数据量并没有一个绝对的最佳值,因为它受到多种因素影响,对于不同的系统,不同的要求,其得到的答案是不一样的。
我这里仅对像 ICQ 一类的发送聊天信息的情况做分析,对于其他情况,你或许也能得到一点帮助:首先,我们知道,TCP/IP 通常被认为是一个四层协议系统,包括链路层、网络层、运输层、应用层。UDP 属于运输层,下面我们由下至上一步一步来看:
以太网(Ethernet) 数据帧的长度必须在 46 - 1500 字节之间,这是由以太网的物理特性决定的。这个 1500 字节被称为链路层的 MTU (最大传输单元)。但这并不是指链路层的长度被限制在 1500 字节,其实这个 MTU 指的是链路层的数据区。并不包括链路层的首部和尾部的 18 个字节。
所以,事实上,这个 1500 字节就是网络层 IP 数据报的长度限制。因为 IP 数据报的首部为 20 字节,所以 IP 数据报的数据区长度最大为 1480 字节。而这个 1480 字节就是用来放 TCP 传来的 TCP 报文段或 UDP 传来的 UDP 数据报的。又因为 UDP 数据报的首部 8 字节,所以 UDP 数据报的数据区最大长度为 1472 字节就是我们可以使用的字节数。
当我们发送的 UDP 数据大于 1472 的时候会怎么样呢?
这也就是说 IP 数据报大于 1500 字节,这个时候发送方 IP 层就需要分片。把数据报分成若干片,使每一片都小于 MTU 。而接收方 IP 层则需要进行数据报的重组。这样就会多做许多事情,而更严重的是,由于 UDP 的特性,当某一片数据传送中丢失时,接收方便无法重组数据报,将导致丢弃整个 UDP 数据报。
因此,在普通的局域网环境下,建议将 UDP 的数据控制在 1472 字节以下为好。
进行 Internet 编程时则不同,因为 Internet 上的路由器可能会将 MTU 设为不同的值。
如果我们假定 MTU 为 1500 来发送数据的,而途径的某个网络的 MTU 值小于 1500 字节,那么系统将会使用一系列机制来调整 MTU 值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作。鉴于 Internet 上的标准 MTU 值为 576 字节,所以建议在进行 Internet 的 UDP 编程时。最好将 UDP 的数据长度控制在 548 字节(576-8-20)以内。