-
多播的Sender端就类似与客户端,Receiver端就类似与服务端;
-
多播的实现过程:
- Sender端设置TTL;
- Sender端向一个D类IP地址发送UDP数据报(此IP地址可以随便指定一个D类的即可);
- Receiver端将本次使用的socket所对应的本主机IP(可以用
INADDR_ANY
)存放于一个iq_mreq
结构体中,并将一个与Sender端一致的D类IP也存放于上述结构体中; - 将上述设置好地址的结构体注册到多播组中;
- Receiver端设置本次使用的socket所对应的本主机IP(可以用
INADDR_ANY
)和端口(使用bind()
函数设置); - Receiver端使用
recvfrom()
接收UDP数据报。
-
多播数据传输特点:
- 多播服务器针对特定多播组,只发送一次数据;
- 即使只发送一次数据,但该组内的所有客户端都会接收到数据;
- 多播组数可在IP地址范围内任意增加;
- 加入特定组即可接收发往该多播组的数据。
-
向大量客户端发送相同数据时,可以使用多播,因为多播的主机方只发送一次数据,然后路由器负责将数据复制,并发往不同的客户端。这样,处于网络中的数据报就比较少(因为会在最终位置被复制为多份,然后发给不同的主机,所以在路由器之间流通的数据报就相对比较少)。多播主要用于“多媒体数据的实时传输”;
-
TTL是决定数据包传递距离的主要因素,每经过一个路由器就减去1。TTL变为0时数据包就无法再被传递,只能销毁;
-
多播的Sender端使用的是D类地址和一个指定的端口来发送UDP数据报,而Receiver端一般是使用本机的一个IP地址和一个与Sender端相同的端口来接收数据;
-
多播并不是使用本主机的真实IP来通信,它需要额外的一个D类地址,通过D类地址来通信。因此,多播的路由过程与普通的TCP和UDP路由过程不一样,多播需要尽可能的将数据报发送到任何能够到达的主机上,然后查看对应的端口中对应的socket上有木有设置对应的多播组,如果有,那就将数据存到缓冲区等待读取。所以需要TTL,不然就会无限的扩展下去。普通的TCP和UDP直接使用传递进去的IP地址,通过地址路由,来找到一条合适的路线;
-
广播也可以一次性向多个主机发送数据,只不过传输范围有区别。多播可以跨越不同的网络(指不同的网络号),而广播只能向某一个网络号中对应的所有主机号发送相同的数据;
-
广播分为直接广播和本地广播。直接广播是指定对方的网络地址(IP中的主机IP全部用255来替换,只留下网络号,比如发送给
192.12.34
网络中的所有主机,则设置为192.12.34.255
即可),本地广播是直接发送给本主机所在的网络中的所有主机(此时把对方的IP设置为255.255.255.255
就行了); -
多播的发送端只需要设置TTL即可(接收端要设置加入多播组),而广播的发送端只需要设置套接字允许进行广播即可(设置
SOL_SOCKET
协议下的SO_BROADCAST
即可); -
广播除了设置允许套接字进行广播外,其他与UDP通信的代码几乎一模一样(客户端可服务端都一样);
-
Windows下实现多播和广播,除了要包含
<winsock2.h>
外,还要包含ws2tcpip.h>
。
TCP/IP网络编程学习笔记(七)
最新推荐文章于 2024-09-11 10:28:06 发布