⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 93.htm

📁 unix高级编程原吗
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="54.htm">上一层</a>][<a href="94.htm">下一篇</a>]
<hr><p align="left"><small>发信人: clown (梧桐叶), 信区: UNP <br>

标  题: unp第十九章学习体会 <br>

发信站: UNIX编程 (2001年10月09日16:17:46 星期二), 站内信件 <br>

  <br>

本章介绍的是多播,下面主要介绍在TCP/IP协议栈中是如何处理多播的。 <br>

  <br>

多播主要是为了克服广播的缺点,特别是一些多媒体应用给不需要的主机带 <br>

来的处理负担。另外广播只能在一个局域网内,而多播可以跨越Internet。 <br>

  <br>

在IPv4中,专门有一个D类地址(224.0.0.0--239.255255.255)用于多播,其 <br>

中有一些D类地址已经用于固定的用途。例如224.0.0.0--224.0.0.255只能 <br>

在局域网内传播,不能出现在Internet上。 <br>

  <br>

1 数据链路层多播接收过程 <br>

有一个IP到MAC地址的映射关系(多对一),而且多播MAC地址的前3个字节 <br>

已经固定,格式为01:00:5e:##:##:##,这样网卡就能识别出一个多播地址。 <br>

对于广播,是多播的一个特例(单播也可以说是一个特例),其MAC地址为 <br>

ff:ff:ff:ff:ff:ff。 <br>

  <br>

下面是接收者的数据链路处理过程:1)目的mac地址是否为本接口地址? <br>

2)目的mac地址是不是广播地址?3)目的mac地址是不是上层已经通知的 <br>

多播地址? <br>

如果符合以上一条,则会接受该数据报,否则丢弃。 <br>



  <br>

对于发送多播的主机来说,发送的数据报是1到多,但是返回的应答数据报 <br>

是1对1的,应为返回的数据报的源地址和目的地址都已经确定。 <br>

  <br>

如果一个多播数据报要跨越局域网,那么由路由器进行转发,对用户是透明的。 <br>

  <br>

2 多播的发送和接收 <br>

在继续介绍之前,先介绍一个概念:多播组。 <br>

对于一个多播地址,例如224.0.1.1,所有希望接收目的ip为该多播地址的主机 <br>

都应该在自己网卡中设置为接收相应的多播mac地址,这样所有接收该多播地址的 <br>

主机就组成了一个组,称为224.0.1.1多播组。主机的这一设置过程称为加入多 <br>

播组,在socket中通过setsockopt函数中的IP_ADD_MEMBERSHIP来进行。 <br>

  <br>

对于socket编程,发送多播与发送udp数据报完全相同,不需要做任何特殊的处理, <br>

也不需要加入多播组,唯一不同的是目的ip是一个多播ip地址。 <br>

  <br>

接收方与接收普通的udp数据报相比,也没有很大的区别,只需要使用setsockopt <br>

加入到一个多播组就可以了。 <br>

  <br>

  <br>

3 多播在TCP/IP协议栈的处理 <br>

  <br>

  <br>

对于数据链路层传递上来的数据数据报,首先是IP层进行处理,它比较数据报的 <br>

目的ip是否是本机中的应用程序已经加入的多播组,如果是就向udp层传递,否则就 <br>

丢弃。然后udp层比较数据报的目的端口,是否是本机已经绑定的端口,如果是就 <br>

将数据传递给应用进程。 <br>

  <br>

由此可知,多播所使用的端口和普通udp套接口所使用的端口完全相同,属于同一个 <br>

资源,因此要注意端口冲突。 <br>

  <br>

对于这种情况,我曾经作过测试:客户端bind端口8001(使用了SO_REUSEADDR选项), <br>

发送多播到多播服务器。同时在该主机上打开一个udp服务器,bind的端口同样是 <br>

8001(使用了SO_REUSEADDR选项),当多播服务器的应答数据返回时,结果该数据 <br>

被udp服务器,而不是多播客户端得到。 <br>

  <br>

4 关于SO_REUSEADDR <br>

  <br>

以前已经讨论过该选项,但是现在有了更深的体会。:) <br>

  <br>

对于UDP套接口,如果使用了该选项,那么就允许完全重复的绑定(TCP不允许), <br>

也就是不同的套接口所绑定的ip地址和端口完全相同。而且这些套接口可以在 <br>

不同的进程中。对于完全重复的套接口,当数据到达时,如果该数据报的目的 <br>

地址是广播或者多播,那么每个套接口都会收到一份数据的拷贝,如果该数据 <br>

报的目的地址是单播地址,那么只有一个套接口收到该数据报。 <br>



  <br>

下面有一个测试多播发送接收的例子。 <br>

注意: 多播客户端和服务器端不能在同一台机器上. <br>

  <br>

-- <br>

易朽的是生命,似那转瞬即谢的花朵;然而永存的,是对未来的渴望, <br>

是那生生世世传递下来的,不朽的,生的激情。每一朵勇敢开放的花, <br>

都是一个死亡唇边的微笑。 <br>

※ 修改:·clown 於 10月09日17:59:27 修改本文·[FROM: 211.69.205.23] <br>

※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.69.205.23] <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="54.htm">上一层</a>][<a href="94.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -