UDP 组播

IP 多播

假如,一个服务器要向 60 个主机发送数据。如果采用单播的形式,这个服务器要分别发送 60 个数据,到 60 个主机上。而如果采用多播的形式,服务器只需要发送1份数据,然后数据到路由器后,会复制几份,传到子路由器,然后子路由器在复制自己的几份。这样可以显著减少网络各种资源的消耗。

这 60 个主机都有一个多播地址,属于一个多播组。这和主机自己的 IP 地址是不一样的。

D 类地址叫作多播地址。

最小多播地址是 224.0.0.0,最大多播地址是 239.255.255.255

多播地址只能用作目的地址,不能用作源地址,一个 D 类地标识一个多播组。

使用同一个 IP 多播地址接收 IP 多播数据包的所有主机就构成了一个多播组。

每个多播组的成员可以随时变动,主机可以随时加入或离开。

多播组成员的数量和地理位置不受限制。

非多播组成员也可向多播组发送 IP 多播数据报。

IP 多播地址又分为预留的多播地址(不可使用),全球范围可用的多播地址(因特网),本地多播地址。

224.0.0.* 是永久多播地址。

224.0.1.0 ~ 238.255.255.255 是全球范围可用的多播地址。

239.*.*.* 是本地多播地址,仅在本地范围有效。

两种多播,一种是本地局域网硬件多播,另一种是因特网多播。

在因特网多播的最后阶段,还是要通过局域网硬件多播。


mac 地址有多播 mac 地址类型,因此只要把 IPv4 多播地址映射成多播mac地址,即可将 IP 多播数据报封装在局域网的Mac帧中。而Mac帧首部的目的Mac地址字段的值,就设置为由IPv4多播地址映射成的多播Mac地址。这样,就可以很方便地利用硬件多播来实现局域网内的IP多播。

明白了,Mac是也有个多播机制的,只要把 IP 多播地址映射到 Mac 多播地址,就用Mac多播实现了 IP 多播。

但是有mac多播地址小于 IP 多播地址,因此可能多个IP多播地址对应一个Mac 多播地址,因此可能会有 Mac层接收多播,而网际层又丢掉的情况。

因特网IP多播,IP多播数据包经过多个多播路由器进行转发。

主机ABC是226.128.9.26多播组的成员,路由器如何知道自己各接口所在局域网中,是否有某个多播组的成员?

IGMP,网际组管理协议,让连接在本地局域网上的多播路由器知道本地局域网上是否有主机加入或推出了某个多播组。

IGMP仅在本网络有效,使用IGMP不能知道多播组所包含的成员数量,也不知道多播组的成员都分布在哪些网络中。

仅使用 IGMP,并不能在因特网上进行IP多播。连接在局域网上的多播路由器,还必须和因特网上其他的多播路由器协同工作,以便把IP多播数据报,用最小的代价传送给所有的多播组成员,这就需要使用多播路由选择协议。

多播路由选择协议,在多播路由器之间为每个多播组建立一个多播转发树。

分布在不同局域网上的主机,假设都是某个多播组的成员。各路由器使用 IGMP,可以知道自己连接的局域网,是否有该多播组的成员。

多播路由选择协议,还会为多播组建立多播转发树,可以转发到含有多播组的路由器。发送到了,路由器再通过硬件多播,传递给自己的所有成员。

多播路由选择协议很复杂, 因为要适应多播组成员的变化。

因为即使某个主机不是任何多播组的成员,它也可以向任何多播组发送多播数据包。因此多播转发树可能会经过一些没有多播组成员的路由器。


IGMP定义了三种报文类型。

IGMP 报文被分装在 IP 报文中传送。

加一个IP首部,就成IP数据报了。

发送 IGMP 成员报告报文,封装在 IP 多播数据包中,进一步封装在以太网多播帧。(越底层的帧,反而在外面,更长)

报文会发送到局域网所有的主机。

如果主机在这个MAC多播组里,就接受。然后交给网际层,看看是不是一个IP多播帧。如果网际层发现的确是一样的,接收。将 IGMP 成员报告报文,交付给 IGMP 协议解析。

多播路由器收到后,解析后,就把它添加到自己的多播组列表中。

多播路由器每隔125s,向其直连网络发送一个IGMP 成员查询报文的IP多播数据报。

特殊的多播地址是 224.0.0.1,然后以太网多播帧的目的地址就是它映射来的。


UDP 支持单播、广播、多播。也就是一对一、一对多、一对全。

而 TCP 是面向连接的,一定是一对一的,因此仅支持单播。

UDP 在应用层报文上加一个 UDP 首部,就变成了 UDP 数据报,既不合并,也不拆分,很简单,是面向应用报文的。

TCP 会把应用报文,仅仅看作无结构的字节流,不知道这些字节流的含义,编号并存储在发送缓存中。

TCP 每次从发送缓存中提取一定数量的字节,添加TCP首部,并发送个接收方。

TCP不保证应用层报文和数据块之间大小的对应关系。

TCP 是面向字节流的,是实现可靠传输和流量控制的基础。否则,一个大包,丢一小块,就得全重传了。另外,怎么实现控制,也是通过数据包的数目决定的。

TCP 是全双工的。

UDP 首部仅有 4 个字段,源端口、目的端口、长度、检验和,每个字段长度为 2 个字节,总共就8个字节。

UDP 仅仅在网际层的基础上,添加了进程的端口。

TCP 报文段就复杂得多啦,最小长度为 20字节,最大长度为60字节。

UDP 内核提供的最小网络传输功能,但一般会有在应用层上做一些重传机制。

如果要传一个特别大的数据包,TCP 会自动分段,到 IP 层后,每隔包 不超过 MTU,IP 层一般不重新分片。

对于 UDP 不分段,IP层会分片,此时丢包,会重传整个大数据包。

如果使用 UDP 的应用层分段了,就不会出现上述问题了。