📄 ip组播技术综述4.htm
字号:
<TD
class=a14>1992年,组播技术还处于实验阶段。当时提出以IP遂道(Tunneling)联结组播岛,组播岛是支持组播服务的区域,最小的组播岛是一个支持组播的LAN。</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD
class=a14>Mbone使用DVMRP协议,而DVMRP在UNIX下是由标准守护进程mrouted得以实现,所以许多用户使用UNIX主机接入Mbone。由于UNIX主机上的I/O处理能力、对IP遂道的处理能力、网络接口数量等方面都不及商用路由器,这都无形制约了Mbone的发展。</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD
class=a14>Mbone自从出现就不断发展。今天,从基于mrouted的UNIX主机到商用路由器的迁移已超过了50%;Mbone也采用剪枝、封装等技术。新的域间组播路由协议和转发算法、流量控制与管理、可靠组播也将对Mbone产生影响。</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14><I>5.2 组播应用程序接口与编程</I></TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>RFC1112推荐了一些支持组播的应用程序接口:</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>●加入一个组播组;</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>●离开一个组播组;</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>●为调整范围对一个组播数据的IP TTL值进行设定;</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>●为组播传输和接收设定本地的接口;</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>●禁止输出的组播数据回送。</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>现在,许多TCP/IP实现都支持RFC1112所提到的要求,下面简要介绍UNIX(Berkeley
Socket)和Windows(Winsock) API。</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>5.2.1 Berkeley Socket组播API</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>所有Berkeley Socket
API都采用setsockopt()的“套接字选项”功能来设置(对于某些选项,getsockopt()功能可用来获得当前的设置)。表3描述了Berkeley
BSD的set sockopt()/getsockopt()组播命令。</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>
<P align=center>表3 BSD
setsockopt()/getsockopt()组播命令的说明</P></TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>
<TABLE class=MsoNormalTable
style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN-LEFT: 59.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black 1.5pt; mso-yfti-tbllook: 63; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .75pt solid black; mso-border-insidev: .75pt solid black"
cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR>
<TD
style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; mso-border-alt: solid black 1.5pt; mso-border-right-alt: solid black .75pt"
vAlign=top width=234>
<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">setsockopt()/getsockopt()</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组播命令</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><O:P>
</O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; mso-border-left-alt: solid black .75pt"
vAlign=top width=234>
<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">命令说明</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><O:P>
</O:P></SPAN></P></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; mso-border-right-alt: .75pt; mso-border-left-alt: 1.5pt; mso-border-top-alt: 1.5pt; mso-border-bottom-alt: .75pt; mso-border-color-alt: black; mso-border-style-alt: solid"
vAlign=top width=234>
<P class=MsoNormal
style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">IP_MULTICAST_TTL<O:P>
</O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; mso-border-right-alt: 1.5pt; mso-border-left-alt: .75pt; mso-border-top-alt: 1.5pt; mso-border-bottom-alt: .75pt; mso-border-color-alt: black; mso-border-style-alt: solid"
vAlign=top width=234>
<P class=MsoNormal
style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置输出组播数据的</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">TTL</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">值</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><O:P>
</O:P></SPAN></P></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; mso-border-alt: solid black .75pt; mso-border-left-alt: solid black 1.5pt; mso-border-top-alt: solid black .75pt"
vAlign=top width=234>
<P class=MsoNormal
style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">IP_ADD_MEMBERSHIP<O:P>
</O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; mso-border-alt: solid black .75pt; mso-border-right-alt: solid black 1.5pt; mso-border-left-alt: solid black .75pt; mso-border-top-alt: solid black .75pt"
vAlign=top width=234>
<P class=MsoNormal
style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在指定接口上加入组播组</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><O:P>
</O:P></SPAN></P></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; mso-border-alt: solid black .75pt; mso-border-left-alt: solid black 1.5pt; mso-border-top-alt: solid black .75pt"
vAlign=top width=234>
<P class=MsoNormal
style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">IP_DROP_MEMBERSHIP<O:P>
</O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; mso-border-alt: solid black .75pt; mso-border-right-alt: solid black 1.5pt; mso-border-left-alt: solid black .75pt; mso-border-top-alt: solid black .75pt"
vAlign=top width=234>
<P class=MsoNormal
style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">退出组播组(在</SPAN><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">IGMPv2</SPAN><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中实现)</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><O:P>
</O:P></SPAN></P></TD></TR>
<TR>
<TD
style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; mso-border-alt: solid black .75pt; mso-border-left-alt: solid black 1.5pt; mso-border-top-alt: solid black .75pt"
vAlign=top width=234>
<P class=MsoNormal
style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">IP_MULTICAST_IF<O:P>
</O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; mso-border-alt: solid black .75pt; mso-border-right-alt: solid black 1.5pt; mso-border-left-alt: solid black .75pt; mso-border-top-alt: solid black .75pt"
vAlign=top width=234>
<P class=MsoNormal
style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获取默认接口或设置接口</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><O:P>
</O:P></SPAN></P></TD></TR>
<TR style="mso-yfti-lastrow: yes">
<TD
style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; mso-border-right-alt: .75pt; mso-border-left-alt: 1.5pt; mso-border-top-alt: .75pt; mso-border-bottom-alt: 1.5pt; mso-border-color-alt: black; mso-border-style-alt: solid"
vAlign=top width=234>
<P class=MsoNormal
style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><SPAN
lang=EN-US
style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">IP_MULTICAST_LOOP<O:P>
</O:P></SPAN></P></TD>
<TD
style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 175.5pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; mso-border-left-alt: solid black .75pt; mso-border-top-alt: solid black .75pt"
vAlign=top width=234>
<P class=MsoNormal
style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0"><SPAN
style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">禁止组播数据回送</SPAN><SPAN
lang=EN-US style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"><O:P>
</O:P></SPAN></P></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD
class=a14>对于套接字编程,首先要使用函数socket()建立一个数据包套接字,然后用bind()函数将套接字与一个地址和端口号连接起来。</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD
class=a14>为了发送一个组播数据包,需要在sendto()调用中指定一个组播地址作为目的地址(所有IP地址都使用网络字节顺序)。</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>为了接收一个组播数据包,需要在recvfrom()调用中指定所要接收的组播地址。</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD
class=a14>IP_MULTICAST_TTL允许将随后的组播数据的TTL设定成从0到255之间的任何值,例如:</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>u_char ttl;</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD
class=a14>setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,&ttl,sizeof(ttl));</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
<TR>
<TD class=a14>关于TTL的讨论见上文。</TD></TR></TBODY></TABLE>
<TABLE width=620 align=center>
<TBODY>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -