UDP实现技术

一、UDP简介

UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的 IP数据报。这与面向流字符的协议不同,如 TCP,应用UDP数据报程序产生的全体数据与真正发送的单个 IP数据报可能没有什么联系。

UDP不提供可靠性:它把应用程序传给 IP层的数据发送出去,但是并不保证它们能到达目的地。由于缺乏可靠性,我们似乎觉得要避免使用 UDP而使用一种可靠协议如 TCP。应用程序必须关心 IP数据报的长度。如果它超过网络的 MTU,那么就要对 IP数据报进行分片。如果需要,源端到目的端之间的每个网络都要进行分片,并不只是发送端主机连接第一个网络才这样做。

上图中 TCP和UDP用目的端口号来分用来自IP层的数据的过程。由于 IP层已经把IP数据报分配给 TCP或UDP(根据IP首部中协议字段值),因此TCP端口号由 TCP来查看,而 UDP端口号由 UDP来查看。 TCP端口号与 UDP端口号是相互独立的。尽管相互独立, 如果 TCP和UDP同时提供某种知名服务,两个协议通常选择相同的端口号。这纯粹是为了使用方便,而不是协议本身的要求。

二、UDP报文信息

(1)UDP首部

端口号表示发送进程和接收进程(虽然是废话,但是还要说一遍,万一有人不知道呢。),

UDP检验和

UDP检验和覆盖UDP首部和UDP数据。UDP和TCP在首部中都有覆盖它们首部和数据的检验和。UDP的检验和是可选的(如果UDP中校验和字段为0,表示不进行校验和计算),而 TCP的检验和是必需的。如果发送端没有计算检验和而接收端检测到检验和有差错,那么 UDP数据报就要被悄悄地丢弃。不产生任何差错报文。

计算检验和,首先把检验和字段置为0。然后对有效数据范围内中每个16位进行二进制反码求和,结果存在检验和字段中,如果数据长度为奇数则补一字节0。当收到数据后,同样对有效数据范围中每个16位数进行二进制反码的求和。由于接收方在计算过程中包含了发送方存在首部中的检验和,因此,如果首部在传输过程中没有发生任何差错,那么接收方计算的结果应该为全0或全1(具体看实现了,本质一样) 。如果结果不是全0或全1,那么表示数据错误。

(2)IP分片

物理网络层一般要限制每次发送数据帧的最大长度。任何时候IP层接收到一份要发送的 IP数据报时,它要判断向本地哪个接口发送数据(选路),并查询该接口获得其 MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机上,也可以发生在中间路由器上。

把一份 IP数据报分片以后,只有到达目的地才进行重新组装(这里的重新组装与其他网络协议不同,它们要求在下一站就进行进行重新组装,而不是在最终的目的地)。重新组装由目的端的 IP层来完成,其目的是使分片和重新组装过程对运输层( TCP和UDP)是透明的,除了某些可能的越级操作外。已经分片过的数据报有可能会再次进行分片(可能不止一次)。IP首部中包含的数据为分片和重新组装提供了足够的信息。

上图展示了在以太网中,发送超过MTU的数据长度时的分片情况(以太网的MTU为1500)。

1. frag 26304(第1行和第2行)和frag 26313(第3行和第4行)指的是 IP首部中标识字段的值。

2.位于冒号和 @号之间的 1480,是除IP首部外的片长。两份数据报第一片的长度均为 1480:UDP首部占8字节,用户数据占 1472字节(加上IP首部的20字节分组长度正好为 150 0字节)。第1份数据报的第 2片(第2行)只包含1字节数据 — 剩下的用户数据。第 2份数据报的第2片(第4行)包含剩下的 2字节用户数据

3.在分片时,除最后一片外,其他每一片中的数据部分(除 IP首部外的其余部分)必须是 8字节的整数倍。在本例中, 1480是8的整数倍.

(3)UDP数据报长度

理论上,IP数据报的最大长度是 65535字节,这是由IP首部16比特总长度字段所限制的。去除 20字节的 IP首部和 8个字节的 UDP首部, UDP数据报中用户数据的最长长度为65507字节。但是,大多数实现所提供的长度比这个最大值小。存在两个限制因素:

1. 应用程序可能会受到其程序接口的限制。 socket API提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。对于 UDP socket,这个长度与应用程序可以读写的最大 UDP数据报的长度直接相关。

2. 限制来自于 TCP/IP的内核实现。可能存在一些实现特性(或差错),使IP数据报长度小于65535字节。

IP能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据。因此, UDP编程接口允许应用程序指定每次返回的最大字节数。

三、广播与多播

广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。TCP是一个面向连接的协议,它意味着分别运行于两主机(由 IP地址确定)内的两进程(由端口号确定)间存在一条连接。

考虑包含多个主机的共享信道网络如以太网。每个以太网帧包含源主机和目的主机的以太网地址(48bit)。通常每个以太网帧仅发往单个目的主机,目的地址指明单个接收接口,因而称为单播(unicast)。在这种方式下,任意两个主机的通信不会干扰网内其他主机(可能引争夺共享信道的情况除外)。

然而,有时一个主机要向网上的所有其他主机发送帧,这就是广播。通过 ARP和RARP可以看到这一过程。多播(multicast) 处于单播和广播之间:帧仅传送给属于多播组的多个主机。

如果网卡收到一个帧,这个帧将被传送给设备驱动程序(如果帧检验和错,网卡将丢弃该帧)。设备驱动程序将进行另外的帧过滤。首先,帧类型中必须指定要使用的协议(IP、ARP等等)。其次,进行多播过滤来检测该主机是否属于多播地址说明的多播组。设备驱动程序随后将数据帧传送给下一层,比如,当帧类型指定为 IP数据报时,就传往IP层。IP根据IP地址中的源地址和目的地址进行更多的过滤检测。如果正常,就将数据报传送给下一层(如TCP或UDP)。

每次UDP收到由 IP传送来的数据报,就根据目的端口号,有时还有源端口号进行数据报

过滤。如果当前没有进程使用该目的端口号,就丢弃该数据报并产生一个 ICMP不可达报文(TCP根据它的端口号作相似的过滤)。如果UDP数据报存在检验和错,将被丢弃。

广播地址:FF:FF:FF:FF:FF:FF

多播地址:01:00:00:00:00:00

(1)广播的缺陷

使用广播的问题在于它增加了对广播数据不感兴趣主机的处理负荷。拿一个使用 UDP广播应用作为例子。如果网内有 50个主机,但仅有 20个参与该应用,每次这 20个主机中的一个发送 UDP广播数据时,其余 30个主机不得不处理这些广播数据报。一直到 UDP层,收到的UDP广播数据报才会被丢弃。这 30个主机丢弃 UDP广播数据报是因为这些主机没有使用这个目的端口。

(2)四种广播地址

受限的广播:

受限的广播地址是 255.255.255.255。该地址用于主机配置过程中 IP数据报的目的地址,此时,主机可能还不知道它所在网络的网络掩码(如果不了解网络掩码的意义,请看附录中的介绍),甚至连它的 IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅出现在本地网络中。

指向网络的广播:

指向网络的广播地址是主机号全为 1的地址。A类网络广播地址为 netid.255.255.255,其中netid为A类网络的网络号。一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。

指向子网的广播:

指向子网的广播地址为主机号为全 1且有特定子网号的地址。作为子网直接广播地址的 IP地址需要了解子网的掩码。例如,如果路由器收到发往 128.1.2.255的数据报,当 B类网络128.1的子网掩码为 255.255.255.0时,该地址就是指向子网的广播地址;但如果该子网的掩码为255.255.254.0,该地址就不是指向子网的广播地址(因为包含了两个网络)。

指向所有子网的广播:

指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分开。指向所有子网的广播地址的子网号及主机号全1。例如,如果目的子网掩码为255.255.2 55.0,那么 IP地址128.1.255.255是一个指向所有子网的广播地址。然而,如果网络没有划分子网,这就是一个指向网络的广播。

(3)多播

IP多播提供两类服务:

1.向多个目的地址传送数据。如果不采用多播,采用TCP来完成需要向每个目的地址传送一个单独的数据复制。即使使用多播,某些应用可能继续采用TCP来保证它的可靠性。

2. 客户对服务器的请求。例如,无盘工作站需要确定启动引导服务器。多播可降低不提供这项服务主机的负担。

多播组地址:

多播组地址包括为 1110的最高 4 bit 和多播组号。它们通常可表示为点分十进制数,范围从224.0.0.0到239.255.255.255。能够接收发往一个特定多播组地址数据的主机集合称为主机组 (host group)。

一个主机组可跨越多个网络。主机组中成员可随时加入或离开主机组。主机组中对主机的数量没有限制,同时不属于某一主机组的主机可以向该组发送信息。一些多播组地址被 IANA(互联网数字分配机构)确定为知名地址。它们也被当作永久主机组,这和 TCP及UDP中的熟知端口相似。

多播组地址到以太网地址的转换:

一个多播地址的太网地址的首字节必须是 01,并且IP多播相对应的以太网地址范围从 01:00:5e:00:00:00到01:00:5e:7f:ff:ff。以太网多播地址中的 23bit与IP多播组号对应起来,通过将多播组号中的低位23bit映射到以太网地址中的低位 23bit实现,这个过程如图所示。

由于多播组号中的最高 5 bit 在映射过程中被忽略,因此每个以太网多播地址对应的多播组是不唯一的。32 个不同的多播组号被映射为一个以太网地址。例如,多播地址224.128.64.32(十六进制e0.80.40.20)和224.0.64.32(十六进制e0.00.40.20)都映射为同一以太网地址01:00:5e:00:40:20。既然地址映射是不唯一的,那么设备驱动程序或 IP层就必须对数据报进行过滤。因为网卡可能接收到主机不想接收的多播数据帧。另外,如果网卡不提供足够的多播数据帧过滤功能,设备驱动程序就必须接收所有多播数据帧,然后对它们进行过滤。

此外,尽管存在地址映射不完美和需要硬件过滤的不足,多播仍然比广播好。(毕竟只对少数的主机造成影响。)单个物理网络的多播是简单的。多播进程将目的 IP地址指明为多播地址,设备驱动程序将它转换为相应的以太网地址,然后把数据发送出去。这些接收进程必须通知它们的 IP层,将它们想接收的数据报发往给定多播地址,并且设备驱动程序必须能够接收这些多播帧。这个过程就是“加入一个多播组”(使用“接收进程”复数形式的原因在于对一确定的多播信息,在同一主机或多个主机上存在多个接收者,这也是为什么要首先使用多播的原因)。当一个主机收到多播数据报时,它必须向属于那个多播组的每个进程均传送一个复制。这和单个进程收到单播UDP数据报的UDP不同。使用多播,一个主机上可能存在多个属于同一多播组的进程。当把多播扩展到单个物理网络以外需要通过路由器转发多播数据时,复杂性就增加了。需要有一个协议让多播路由器了解确定网络中属于确定多播组的任何一个主机。这个协议就是Internet组管理协议(IGMP)。

四、IGMP组管理协议简介

IGMP是用于支持主机和路由器进行多播的Internet组管理协议(IGMP)。它让一个物理网络上的所有系统知道主机当前所在的多播组,路由器需要知道这些信息以便知道多播数据报应该向哪些接口转发。IGMP被当作 IP 层的一部分。IGMP报文通过 IP数据报进行传输。不像我们已经见到的其他协议, IGMP有固定的报文长度,没有可选数据。

IGMP类型为1说明是由多播路由器发出的查询报文,为 2说明是主机发出的报告报文。检验和的计算和 ICMP协议相同。组地址为 D类IP地址。在查询报文中组地址设置为 0,在报告报文中组地址为要参加的组地址。

五、总结

对比TCP,UDP有以下的不同:

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接。

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)。
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节。

6、TCP的逻辑通信信道是全双工的可靠通道,UDP则是不可靠通道。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安卓UDP实现视频通话的过程如下: 首先,安卓设备需要连接到互联网并获取对方设备的IP地址。可以通过局域网或者服务器来实现设备间的IP地址交换和获取。 接下来,使用安卓的UDP套接字进行视频通话的实现UDP(用户数据报协议)是一种不可靠的传输协议,但对于实时性要求高、传输速率要求低的视频通话来说,UDP比TCP更适合。 在发送端,将视频数据分片,并将每个分片打包成UDP数据报。根据视频编码算法,可以将视频数据压缩、编码,并添加相应的标识信息。然后使用UDP套接字发送数据报到接收端的IP地址和端口。 在接收端,监听UDP套接字,接收到UDP数据报后,对接收到的数据进行解析、解码,并进行视频播放。可以使用相关的视频解码库来实现视频的解码和播放。 为了保证视频的实时性和流畅性,需要在发送端和接收端进行适当的延迟控制和带宽调整。可以通过设定发送频率、调整网络传输质量等方式来实现。 同时需要注意的是,UDP协议是不可靠的,因此在视频通话中可能会出现丢包、乱序等问题。可以通过添加冗余数据、数据重传和丢包恢复机制等方式来提高视频通话的质量和稳定性。 最后,为了保护通话的安全性,可以考虑在视频通话中加入加密机制,如使用SSL/TLS等方式对视频数据进行加密和解密,以保护通话内容的安全。 综上所述,安卓UDP实现视频通话涉及到IP地址交换、UDP套接字传输、数据分片、视频编码解码、延迟控制、带宽调整、冗余数据、数据重传、丢包恢复、加密等多个方面的技术。通过合理地应用这些技术,可以实现高效、实时的安卓UDP视频通话。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值