网络协议_UDP详谈
Posted LHlucky_2
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络协议_UDP详谈相关的知识,希望对你有一定的参考价值。
文章目录
1. UDP简介
- Internet 协议集支持一个无连接的传输协议,该协议称为
用户数据报协议
(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接
就可以发送封装的IP 数据包
的方法。 - TCP 协议在进行数据传输时,需要建立连接,并且每次传输的数据都需要进行确认。当不再进行传输数据时,还需要断开连接。这样做虽然安全,但是效率较低。而 UDP 协议正好避免了这些过程,它是一种没有复杂控制,提供面向无连接的通信服务协议。
传输层
:
传输层是整个网络体系结构中的关键层次之一,主要负责向两个主机中进程之间的通信提供服务。由于一个主机同时运行多个进程,因此运输层具有复用和分用功能。传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层在给定的链路上通过流量控制、分段/重组和差错控制来保证数据传输的可靠性。传输层的一些协议是面向链接的,这就意味着传输层能保持对分段的跟踪,并且重传那些失败的分段。- TCP/IP 五层(或四层)模型
2.UDP特点
-
UDP 是
无连接
的,即发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延。 -
UDP 使用
尽最大努力交付
,即不保证可靠交付,因此主机不需要维持复杂的连接状态表。 -
UDP 是
面向报文
的。发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。UDP对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。因此,应用程序必须选择合适大小的报文。 -
UDP
没有拥塞控制
,因此网络出现的拥塞不会使源主机的发送速率降低。很多的实时应用(如IP电话、实时视频会议等)要去源主机以恒定的速率发送数据,并且允许在网络发生拥塞时丢失一些数据,但却不允许数据有太多的时延。UDP正好符合这种要求。 -
UDP 的首部开销小,只有8个字节,比TCP的20个字节的首部要短。
-
不重新排序
,对到达顺序混乱的数据包不进行重新排序。 -
没有确认
:发送数据包无须等待对方确认。因此,使用 UDP 协议可以随时发送数据,但无法保证数据能否成功被目标主机接收。
- 虽然某些实时应用需要使用没有拥塞控制的UDP,但当很多的源主机同时都向网络发送高速率的实时视频流时,网络就有可能发生拥塞,结果大家都无法正常接收。因此,不使用拥塞控制功能的UDP有可能会引起网络产生严重的拥塞问题。
- 还有一些使用UDP的实时应用,需要对UDP的不可靠的传输进行适当的改进,以减少数据的丢失。在这种情况下,应用进程本身可以在不影响应用的实时性的前提下,增加些提高可靠性的措施,如采用前向纠错或重传已丢失的报文。
3. UDP首部格式
- UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,由4个字段组成,每个字段的长度都是两个字节。各字段意义如下:
- 源端口:源端口号。在需要对方回信时选用。不需要时可用全0。
- 目的端口:目的端口号。这在终点交付报文时必须要使用到。
- 长度: UDP用户数据报的长度,其最小值是8(仅有首部),发送一个带0字节数据的UDP数据报是允许的。值得注意的是,UDP长度字段是冗余的;IPV4头部包含了数据报的总长度,同时IPV6头部包含了负载长度。因此,一个UDP/IPV4数据报的长度等于IPV4数据报的总长度减去IPV4头部的长度。一个UDP/IPV6数据报的长度等于包含在IPV6头部中的负载长度(payload length)字段的值减去所有扩展头部(除非使用了超长数据报)的长度。这两种情况下,UDP长度字段应该与从IP层提供的信息计算得到的长度是一致的。
- 校验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。
具体的UDP校验和方法
->link & ->link
-
当运输层从 IP 层收到 UDP 数据报时,根据目的端口,通过相应的端口上交给应用进程(自底向上交付)。
-
如果接收方 UDP发现报文中的目的端口号不正确(即不存在对应于该端口号的应用进程),就丢弃该报文,并由网际控制报文协议 ICMP 发送“端口不可达”差错报文给发送方。
4. UDP伪首部
- 伪首部并非TCP&UDP数据报中实际的有效成分。伪首部是一个
虚拟的数据结构
,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。这样的校验和,既校验了TCP&UDP用户数据的源端口号和目的端口号以及TCP&UDP用户数据报的数据部分,又检验了IP数据报的源IP地址和目的地址。伪报头保证TCP&UDP数据单元到达正确的目的地址。因此,伪报头中包含IP地址并且作为计算校验和需要考虑的一部分。最终目的端根据伪报头和数据单元计算校验和以验证通信数据在传输过程中没有改变而且到达了正确的目的地址。
5. UDP面向数据报
- 应用层交给UDP多长的报文, UDP原样发送, 既不会拆分, 也不会合并。
- 用UDP传输100个字节的数据:
如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节,而不能循环调用10次recvfrom, 每次接收10个字节。 - UDP的socket既能读, 也能写, 这个概念叫做
全双工
。
6. UDP的缓冲区
- UDP
没有真正意义上的发送缓冲区
. 调用sendto会直接交给内核, 由内核将数据传给网络层协议进行后续的传输动作。 - UDP
具有接收缓冲区
. 但是这个接收缓冲区不能保证收到的UDP报的顺序和发送UDP报的顺序一致; 如果缓冲区满了, 再到达的UDP数据就会被丢弃。
7. 基于UDP的应用层协议
NFS
: 网络文件系统TFTP
: 简单文件传输协议DHCP
: 动态主机配置协议BOOTP
: 启动协议(用于无盘设备启动)DNS
: 域名解析协议
8. UDP套接字编程
- 关于基于UDP的网络套接字编程在之前博客中右详细的讲解->【Linux网络编程必学!】——Linux_网络编程_UDP
以上是关于网络协议_UDP详谈的主要内容,如果未能解决你的问题,请参考以下文章