IP多播及编程

IP多播及编程
IP多播及编程

IP多播(也称多址广播或组播)技术,是一种允许一台或多台主机(多播源)发送单一数据包到多台主机(一次的,同时的)的TCP/IP网络技术。多播作为一点对多点的通信,是节省网络带宽的有效方法之一。在网络音频/视频广播的应用中,当需要将一个节点的信号传送到多个节点时,无论是采用重复点对点通信方式,还是采用广播方式,都会严重浪费网络带宽,只有多播才是最好的选择。多播能使一个或多个多播源只把数据包发送给特定的多播组,而只有加入该多播组的主机才能接收到数据包。目前,IP多播技术被广泛应用在网络音频/视频广播、AOD/VOD、网络视频会议、多媒体远程教育、“push”技术(如股票行情等)和虚拟现实游戏等方面。

一、IP多播技术简介

1.IP多播地址和多播组

IP多播通信必须依赖于IP多播地址,在IPv4中它是一个D类IP地址,范围从224.0.0.0到239.255.255.255,并被划分为局部链接多播地址、预留多播地址和管理权限多播地址三类。其中,局部链接多播地址范围在224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包;预留多播地址为224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议;管理权限多播地址为239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。

使用同一个IP多播地址接收多播数据包的所有主机构成了一个主机组,也称为多播组。一个多播组的成员是随时变动的,一台主机可以随时加入或离开多播组,多播组成员的数目和所在的地理位置也不受限制,一台主机也可以属于几个多播组。此外,不属于某一个多播组的主机也可以向该多播组发送数据包。

2.IP多播技术的硬件支持

要实现IP多播通信,要求介于多播源和接收者之间的路由器、集线器、交换机以及主机均需支持IP多播。目前,IP多播技术已得到硬件、软件厂商的广泛支持。

(1)主机

支持IP多播通信的平台包括Windows CE 2.1、Windows 95、Windows 98、Windows NT 4和Windows 2000等,运行这些操作系统的主机都可以进行IP多播通信。此外,新生产的网卡也几乎都提供了对IP多播的支持。

(2)集线器和交换机

目前大多数集线器、交换机只是简单地把多播数据当成广播来发送接收,但一些中、高档交换机提供了对IP多播的支持。例如,在3COM SuperStack 3 Swith 3300交换机上可启用802.1p或IGMP多播过滤功能,只为已侦测到IGMP数据包的端口转发多播数据包。

(3)路由器

多播通信要求多播源节点和目的节点之间的所有路由器必须提供对Internet组管理协议

(IGMP)、多播路由协议(如PIM、DVMRP等)的支持。

当一台主机欲加入某个多播组时,会发出“主机成员报告”的IGMP消息通知多播路由器。当多播路由器接收到发给那个多播组的数据时,便会将其转发给所有的多播主机。多播路由器还会周期性地发出“主机成员查询”的IGMP消息,向子网查询多播主机,若发现某个多播组已没有任何成员,则停止转发该多播组的数据。此外,当支持IGMP v2的主机(如Windows 98/2000计算机)退出某个多播组时,还会向路由器发送一条“离开组”的IGMP消息,以通知路由器停止转发该多播组的数据。但只有当子网上所有主机都退出某个多播组时,路由器才会停止向该子网转发该多播组的数据。

使用多播路由协议,路由器可建立起从多播源节点到所有目的节点的多播路由表,从而实现在子网间转发多播数据包。例如,PIM(协议独立多播)就是一种多播路由协议,它有两种类型:稀疏模式(sparse- mode)和密集模式(dense-mode)。以Cisco 2621路由器为例,启用IP多播转发功能的基本设置如下:

c2621(config)# ip multicast-routing 启动IP多播,使路由器成为一个多播路由器

c2621(config)# int f0/0 配置快速以太网端口0

c2621(config-if)# ip pim dense-mode(或sparse-mode)启动PIM,同时激活IGMP协议

c2621(config-if)# int f0/1 配置快速以太网端口1

c2621(config-if)# ip pim dense-mode(或sparse-mode)

二、IP多播应用的编程方法

在实际应用中,编程人员通常需要自己编制底层网络应用程序来实现网上的底层通信,如具体实现IP多播通信的功能。编制底层网络应用程序通常要借助于网络数据通信编程接口,而在不同的操作系统中所提供的网络编程接口是有所不同的,如在Microsoft Windows 环境下的网络编程接口就是Windows套接字(Windows Socket,简称Winsock)。

Winsock提供了包括TCP/IP、IPX等多种通信协议下的编程接口。不同的Windows版本支持不同的Winsock版本,其中Windows 95等早期版本本身只支持Winsock1.1(16位)下的编程(可以通过安装相关的软件包使其支持Winsock2.0),而Windows98、Windows NT4.0、Windows 2000则直接支持Winsock2.0(32位)。Winsock2.0是Winsock1.1的扩展,除兼容Winsock1.1 API外,还定义了一套可支持IP多播的与协议无关的API。

使用Winsock 2.0实现IP多播的一般步骤如下:

1.初始化Winsock资源

在使用Winsock之前,必须调用WSAStartup()函数初始化Windows Sockets DLL。它允许应用程序或DLL指定Windows Sockets API要求的版本。

2.创建套接字

调用WSASocket()函数可以创建一个使用UDP协议的套接字,它是加入多播组的初始化套接字,并且以后数据的发送和接收都在该套接字上进行。针对IP多播通信,可将参数dwFlags设置为WSA_FLAG_MULTIPOINT_C_LEAF、WSA_FLAG_MULTIPOINT_D_LEAF和WSA_FLAG_OVERLAPPED的位和,指明IP多播通信在控制层面和数据层面都是“无根的”,只存在叶节点,它们可以任意加入一个多播组,而且从一个叶节点发送的数据会传送到每一个叶节点(包括它自己);创建的套接字具有重叠属性。

3.设置套接字的选项

调用setsockopt()函数为套接字设置SO_REUSEADDR选项,以允许套接字绑扎到一个已在使用的地址上。

4.绑定套接字

调用bind()函数绑定套接字,从而将创建好的套接字与本地地址和本地端口联系起来。对于多播通信来说,发送和接收数据通常采用同一个端口。

5.设置多播套接字的模式

WSAIoctl()函数的命令码SIO_MULTICAST_LOOP用来允许或禁止多播通信时发送出去的通信流量是否也能够在同一个套接字上被接收(即多播返回)。值得注意的是,在Windows 95/98/NT 4中,默认是允许多播返回,但不能设置禁止,否则会出错;只有在Windows 2000以上版本中,才能设置允许/禁止多播返回。

WSAIoctl()函数的命令码SIO_MULTICAST_SCOPE用来设置多播传播的范围,即生存时间TTL。每当多播路由器转发多播数据包时,数据包中的TTL值都会被减1,若数据包的TTL 减少到0,则路由器将抛弃该数据包。TTL的值是多少,多播数据便最多能经过多少个多播路由器。例如,TTL值为0,则多播只能在本地主机的多个套接字间传播,而不能传播到“网线”上;TTL值为1(默认值),则多播数据遇到第一个路由器,便会被它“无情”地丢弃,不允许传出本地网络之外,即只有同一个网络内的多播组成员才能收到多播数据。

6.加入一个多播组

调用WSAJoinLeaf()函数可加入一个多播组并指定角色(发送者/接收者)。调用时,参数 dwFlags可指定套接字作为发送者(JL_SENDER_ONLY)、接收者(JL_RECEIVER_ONLY)或身兼两者(JL_BOTH)。调用成功后会返回一个多播套接字,调用closesocket()函数关闭该套接字就离开了多播组,此时可以调用WSAJoinLeaf()函数再次加入多播组。注意,对多播组数据的接收和发送不能在该套接字上完成。

7.向多播组发送数据

调用sendto()函数,可在指定的UDP套接字上向指定的多播组发送多播数据。调用时,参数to应指向多播组的IP地址。值得注意的是,若一个应用程序只是打算给多播组发送数据,便不必加入一个多播组。

8.等待事件

调用WSAAsyncSelect()函数,使套接字置于非阻塞模式,这时应用程序就可在该套接字上接收以Windows消息为基础的网络事件通知。例如,若参数lEvent值为FD_READ,则应用程序可在套接字上接收到“数据正等待被读入”的通知。

9.从多播组接收数据

调用recvfrom函数,可在指定的UDP套接字上读取输入数据。多播通信中数据的发送与接收一般采用同一个端口,因此其发送套接字和接收套接字是一样的。

10.关闭套接字,释放Winsock资源。

在多播通信结束后,先调用closesocket()函数关闭多播套接字和UDP套接字,然后调用WSACleanup()函数结束对Windows Sockets DLL的使用。

三、应用实例

为了说明IP多播技术的应用方法,本人在Visual C++.NET环境下设计了一个简单的基于Windows Socket 2的IP多播应用程序,通过该例子读者可以掌握IP多播应用程序设计的一般方法。该程序的具体设计方法如下:

1.在Visual https://www.360docs.net/doc/1810709145.html,中建立一个基于对话框的MFC项目CMulticastSocket。注意在“高级功能”设置中不要选择“Windows套接字”,这是因为MFC只支持Windows Socket 1而不支持Windows Socket 2。为了能使用Winsock 2 API编程,在程序中应包含“winsock2.h”头文件,并在项目中加入ws2_32.lib的静态库,该静态库应设置在项目属性的“链接器”\“输

入”\“附加依赖项”中。

2.在对话框(类名CCMulticastSocketDlg)资源中,设置它的Caption为“WinSock 2多播应用程序”,并添加以下控件:

静态文本:Caption为“接收到的信息:”;

编辑框:ID为IDC_RECEIVE_EDIT,Read Only、Auto Vscroll、Vertical Scroll 和Multiline属性值都为True

静态文本:Caption为“发送的信息:”

编辑框:ID为IDC_SEND_EDIT

第一个按钮:Caption为“加入多播组(&J)”,ID为IDC_JOIN_BUTTON 第二个按钮:Caption为“多播发送(&S)”,ID为IDC_SEND_BUTTON

第三个按钮:Caption为“离开多播组(&L)”,ID为IDC_LEAVE_BUTTON 第四个按钮:Caption为“退出(&Q)”,ID为IDC_QUIT_BUTTON

为两个编辑框分别添加相关联的CString类型的变量m_SendMessage和

m_ReceiveMessage;为四个按钮添加相应的消息处理函数;为对话框添加定时器消息(用于定时显示接收到的消息)及其消息处理函数。

3.添加一个新的对话框资源,设置它的Caption为“加入多播组”,保留默认的两个按钮控件,同时添加添加以下控件:

静态文本:Caption为“IP多播组地址:”

编辑框:ID为IDC_IPADDRESS_EDIT

静态文本:Caption为“IP多播端口:”

编辑框:ID为IDC_PORT_EDIT

静态文本:Caption为“生存时间:”

编辑框:ID为IDC_TTL_EDIT

复选框:Caption为“多播返回:”,ID为IDC_LOOPBACK_CHECK,Left Text 属性值为True。

为该对话框添加新的类CJoinGroupDlg,它的基类为CDialog,然后为该对话框中的三个编辑框分别添加相

关联的变量,即CSting m_IPAddress、UINT m_nPort、UINT m_nTTL;为复选框添加相关联的BOOL类型的变量m_Loopback。

4.在CMulticastSocketDlg.h文件的前面添加CJoinGroupDlg的头文件:#include “JoinGroupDlg.h”,并在CCMulticastSocketDlg类中添加了一个CJoinGroupDlg类实例对象 m_JoinDlg。

5.为了能在对话框中接收网络事件通知,应增加一个用户自定义的消息及消息处理函数,具体实现方法如下:在 CMulticastSocketDlg.h文件的前面自定义消息:#define WM_SOCK_MSG(WM_USER+166),并在afx_msg块中说明消息处理函数:afx_msg LRESULT OnSocketMsg (WPARAM wParam,LPARAM lParam);在CMulticastSocketDlg.cpp文件中的消息映射块中,使用ON_MESSAGE

(WM_SOCK_MSG,OnSocketMsg)宏指令将消息映射到消息处理函数中,并具体实现消息处理函数:LRESULT CCMulticastSocketDlg:: OnSocketMsg(WPARAM wParam,LPARAM lParam){…}。

该程序的主要代码可参见程序清单,相关函数的详细说明可参看Microsoft MSDN 帮助系统。为了节省篇幅,程序中省略了部分自动生成的和用于错误处理的代码。

程序清单:

// CMulticastSocketDlg.cpp : 实现文件

#include "stdafx.h"

#include "winsock2.h"

#include "CMulticastSocket.h"

#include "CMulticastSocketDlg.h"

……

DWORD cbRet;

SOCKET Sock,SockM; file://UDP套接字,多播套接字

BOOL bFlag,bJoin;

SOCKADDR_IN local,Remote,From; file://分别指向本地、多播组和数据来源的IP地址与端口

int Fromlen;

char ReceiveBuf[32000]; file://接收缓冲区

BOOL bDataReceived;

……

BEGIN_MESSAGE_MAP(CCMulticastSocketDlg, CDialog)

……

ON_BN_CLICKED(IDC_JOIN_BUTTON, OnBnClickedJoinButton)

ON_BN_CLICKED(IDC_LEAVE_BUTTON, OnBnClickedLeaveButton)

ON_BN_CLICKED(IDC_QUIT_BUTTON, OnBnClickedQuitButton)

ON_BN_CLICKED(IDC_SEND_BUTTON, OnBnClickedSendButton)

ON_WM_TIMER()

ON_MESSAGE(WM_SOCK_MSG,OnSocketMsg)

END_MESSAGE_MAP()

BOOL CCMulticastSocketDlg::OnInitDialog()

{

CDialog::OnInitDialog();

……

SetTimer(1,100,NULL); file://设置定时器

Fromlen=sizeof(From);

bDataReceived=TRUE;

bJoin=FALSE;

return TRUE; // 除非设置了控件的焦点,否则返回 TRUE

}

……

void CCMulticastSocketDlg::OnBnClickedJoinButton() file://加入多播组{

if(m_JoinDlg.DoModal()==IDOK)

{

WORD wVersionRequested;

WSADATA wsaData;

int 北京中庆;

wVersionRequested = MAKEWORD(2,2);

北京中庆 = WSAStartup(wVersionRequested, &wsaData); file://初始化WinSock2资源

if(北京中庆!= 0){

AfxMessageBox("不能加载Windows套接字动态链接库,MB_OK");

return;

}

if (LOBYTE(wsaData.wVersion) !=2 || HIBYTE(wsaData.wVersion) !=2){ AfxMessageBox("WinSock DLL不支持2.0版本,MB_OK");

WSACleanup( );

return;

}

file://创建一个套接字

Sock=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,

(LPWSAPROTOCOL_INFO)NULL,0,WSA_FLAG_OVERLAPPED

| WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF);

bFlag=TRUE; file://设置套接字选项,使套接字为可重用端口地址

setsockopt(Sock,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag));

file://将套接字绑定到用户指定端口及默认的接口

memset(&local,0,sizeof(local));

local.sin_family=AF_INET;

local.sin_port=htons((USHORT)m_JoinDlg.m_nPort);

local.sin_addr.s_addr=htonl(INADDR_ANY);

bind(Sock,(struct sockaddr FAR *)&local,sizeof(local));

file://设置多播数据报传播范围(生存时间TTL)

WSAIoctl(Sock,SIO_MULTICAST_SCOPE,&m_JoinDlg.m_nTTL,sizeof(int), NULL,0,&cbRet,NULL,NULL);

file://设置多播返回(LOOKBACK)

BOOL nLoopBack=m_JoinDlg.m_Loopback;

WSAIoctl(Sock,SIO_MULTIPOINT_LOOPBACK,&nLoopBack,sizeof(nLoopBack), NULL,0,&cbRet,NULL,NULL);

memset(&Remote,0,sizeof(Remote));

Remote.sin_family=AF_INET;

Remote.sin_addr.s_addr=inet_addr(m_JoinDlg.m_IPAddress);

Remote.sin_port=htons(m_JoinDlg.m_nPort);

file://加入到指定的多播组,并指定为既作为发送者又作为接收者(JL_BOTH)SockM=WSAJoinLeaf(Sock,(sockaddr*)&Remote,sizeof(Remote),

NULL,NULL,NULL,NULL,JL_BOTH);

WSAAsyncSelect(Sock,m_hWnd,WM_SOCK_MSG,FD_READ); file://注册网络消息

及其网络事件

bJoin=TRUE;

}

}

void CCMulticastSocketDlg::OnBnClickedSendButton() file://多播发送{

if(bJoin){

UpdateData(TRUE);

const char* strMessage=LPCTSTR(m_SendMessage);

int nSize=m_SendMessage.GetLength()+1;

sendto(Sock,strMessage,nSize,0,(sockaddr*)&Remote,sizeof(Remote)); }

else

AfxMessageBox("请先加入多播组!");

m_SendMessage="";

UpdateData(FALSE);

}

void CCMulticastSocketDlg::OnBnClickedLeaveButton()

{ file://离开多播组

closesocket(SockM);

closesocket(Sock);

WSACleanup();

m_SendMessage="";

m_ReceiveMessage="";

bDataReceived=TRUE;

bJoin=FALSE;

UpdateData(FALSE);

}

void CCMulticastSocketDlg::OnBnClickedQuitButton()

{ file://退出

DestroyWindow();

}

void CCMulticastSocketDlg::OnTimer(UINT nIDEvent) file://定时器处理函数,实现接收信息的定时更新

{

if(bDataReceived)

{

m_ReceiveMessage+=ReceiveBuf;

m_ReceiveMessage+="\r\n";

bDataReceived=FALSE;

UpdateData(FALSE);

}

CDialog::OnTimer(nIDEvent);

}

LRESULT CCMulticastSocketDlg::OnSocketMsg(WPARAM wParam,LPARAM lParam) {

file://检索网络事件

switch(WSAGETSELECTEVENT(lParam)){

case FD_READ:

recvfrom(Sock,ReceiveBuf,32000,0,(sockaddr *)&From,&Fromlen); bDataReceived=TRUE; file://设置已接收到一条信息标志

break;

}

return TRUE;

}

IP路由表分析

CCNA考点精析---IP路由表分析 当frame到达路由器的接口后,路由器检查frame中的目标地址字段,如果目标地址为路由器接口的地址或者广播地址的时候,路由器把packet从frame中剥离出来,传递给network layer,然后packet中的目标地址将被检查,接下来还要检查protocol字段,最后再发送给合适的进程,如果packet是可路由的,路由器会查找自己路由表中寻找相应 的路由条目,路由条目至少包含两个要素: 1、目标地址,这个地址是路由器必须能够到达的地址; 2、到达目标地址的指针,这个指针也就是我们平时在路由表中看到的Via.或者是平 时听说的next-hop(下一跳) 路由器根据packet中的目标地址字段,在路由表中执行查询,查询的精确程度按如下顺序 递减: 1、主机地址 2、子网地址 3、汇总网络号 4、主类网络号 5、超网号(super net) 6、默认路由 如果在执行完所有的表查询后,还没有找到匹配的条目,则丢弃packet,并回送一个(Destinnation Unreachable)ICMP不可达的报文给发送方在CISCO路由器上要查看路由表,可以使用特权命令:show ip route R1#sh ip route Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2 E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2 ia - IS-IS inter area, * - candidate default, U - per-user static route o - ODR, P - periodic downloaded static route Gateway of last resort is not set C 192.168.123.0/24 is directly connected, FastEthernet0/0 1.0.0.0/24 is subnetted, 3 subnets C 1.1.1.0 is directly connected, Loopback0 C 1.1.2.0 is directly connected, Loopback1 C 1.1.3.0 is directly connected, Loopback2 C 192.168.14.0/24 is directly connected, Serial1/2

IP多播路由选择协议的分析与研究

IP多播技术的分析与研究 【摘要】随着高性能网络技术的不断发展, IP 多播路由技术已经成为网络领域的一个重要研究课题, 对未来网络发展有重要意义。本文论述了IP 多播路由技术的研究情况及IP 多播路由技术的发展现状, 介绍了几种重要的IP 多播路由协议并简单进行了对比, 同时介绍了几种IP 多播路由算法及其分类, 最后给出了IP 多播路由技术的应用领域和待研究的问题。 【关键词】计算机网络; IP 多播路由; 多播树; 1.IP多播技术简介 多播技术是TCP/IP传输方式的一种。TCP/IP有三种传输方式:单播、多播、广播。多播是由源点发送单个分组,然后一路上有各个路由器复制这个分组。所有分组副本的目的地址都是一样的。在多个单播中,从源点开始就发出多个分组。例如,如果有四个终点,那么源点就发送四个分组,且每个分组具有不同的单播终点。例如,向一组人放一份电子邮件报文时,就是使用了多个单播。电子邮件软件把报文复制多分,给每一份写入不同的目标地址。 传统的IP通信是在一个源IP主机和一个目标IP主机之间(单播)或者一个源IP主机和网络中所有的IP主机之间(广播)进行的。要将信息发送给网络中的多个而非所有的IP主机,采用传统的IP通信技术只有两种方法可以选择: 采用广播方式或者由源IP 主机分别向网络中的多个目标IP主机单播发送IP包。广播方式会将信息发送给不需要的IP主机而浪费带宽,而且可能的路由回环会引起广播风暴。单播方式由于IP包的重复发送会浪费大量的带宽,同时也增加了服务器的负载。可见,传统的IP通信技术不能有效地解决单点发送多点接收的问题。而IP多播却很好地解决了这个问题。 实现多播技术要解决的关键问题是多播路由问题。在IP 层上实现多播需要网络设备( 路由器) 的支持, 这样才能在主机上运行多播应用程序, 这大大限制了多播技术的发展。同时, 为了测试和研究新的多播协议和多播应用程序, 有必要找到一种方法, 使得无需将整个因特网上的设备都转换成支持多播的设备, 就可以运行多播应用程序, 这导致了多播主干实验网“MBone ”的诞生。实际上对Internet 的多播技术的研究始于80 年代后期S.Deering 的工作, 由他提出了IP 多播模型, 随着MBone 的出现, 且IETF 利用它在1992 年 3 月成功举行了第一次网络会议以来, 多播已经引起了广泛的重视, 对它的各方面进行了深入的研究。比如多播路由协议和算法, 基于QoS 的多播路由, 基于分布式的多播路由, 移动Internet中的IP 多播等等。 2 IP 多播路由协议 实现IP 多播路由一般方式是在多播组成员之间构造一棵多播树。多播树是根为源节点, 且覆盖所有多播成员的一棵生成树, 不同的IP 多播路由协议使用不同的技术来构造这些多播生成树, 一旦这个树构造完成, 所有的多播流量都将通过它来传播。 多播路由协议用来生成和维护多播生成树, 使用多播路由协议, 路由器可建立起从多播源节点到所有目的节点的多播路由表, 从而实现在子网间转发多播数据包。根据多播生成树实现方式, 可将域内多播路由协议分为两类: 基于源的多播生成树路由协议如DVMRP 、MO 2SPF 、PIM-DM 和基于核的

tcpip路由选择

在Tcp/Ip 互联网上的基本传送单元是IP 数据报,下面介绍路由器如何转发IP 数据报,以及如何把它们交付给最终目的站。 传统说法中,术语路由选择用在因特网之类的分组交换系统中,指的是为要发送的分组选择一条路径的过程,术语路由器则是之做出这种选择的一台计算机。近来,工程人员采用术语“转发”来表示为分组选择路径的过程。 在一个TCP/IP 互联网中,被称为IP 路由器或IP 网关的计算机提供了物理网络之间的所有连接。并且实际上,TCP/IP 互联网使用的路由器通常是小型的计算机。22 互联网中的转发: IP 路由选择(IP 转发) (IP 目的:提供包含多个物理网络的一个虚拟网络,并提供无连接的数据报交付服务) (IP 转发信息:用于做出转发决策的信息),与单个网络内的转发不同的是,IP 转发算法必须决定如何通过多个物理网络发送数据报。 IP 路由选择 对主机来说,若目的主机与源主机直接相连或在一个共享网络上,那么IP 数据报就直接送到目的主机上;否则,主机把数据报发往一默认的路由器上,由路由器来转发该数据报。 课本第9章:单个IP 层如何作出路由决策 路由选择(13章):核心网络、对等网络与算法 互联网体系结构与路由选择之间的关系,围绕主干网结构和对等主干网结构的互联网展开讨论,研究它们使用的路由选择体系结构, 对于互联网的路由器系统,一方面使用中心点交汇的方法是行不通的,因为没有哪一台机器的速度足够快,以至于能作为中心交换机来处理所有经过的通信量;另一方面,在所有路由器中保存全部可能目的站信息也是不切实际的,因为在网络发生变动或管理员需要检查一致性时,需要传播大量的信息,因此,我们寻求的 路由百度 最初的因特网体系结构与核心: 早期因特网的核心路由器系统可以看成是把本地局域网连接到ARPANET 的一组路由器。本体网网络上的主机把所有非本地的通信量传给最近的核心路由器 从核心网到对等主干网结构 路由选择协议有两个重要功能: 1、 负责计算一组最短的路径 ARPANET 主干网 R 1 R 2 R n 本地本地 本地 .

IP路由表管理讲解学习

IP路由表管理 1、路由表的显示和维护 通过查看路由表,有助于了解网络拓扑结构和定位路由问题。 查看路由表的信息是定位路由问题的基本手段,下面列举了通用的路由表信息显示及维护命令。 display命令可以在所有视图下使用。reset命令在用户视图下使用。 交换机引入较多的路由会占用较多的系统资源,在系统业务繁忙时,这就有可能影响设备的正常运行。为提高系统的安全性和可靠性,可以配置公网路由前缀限制,这样当路由前缀数超过预先设定的值时,系统会输出告警信息,从而提醒用户检查公网路由前缀的有效性。 操作步骤 1、查看IPv4路由表中当前激活路由的摘要信息。 display ip routing-table 2、查看IPv4路由表详细信息 display ip routing-table verbose 3、查看指定目的IPv4地址的路由信息。 display ip routing-table ip-address [ mask | mask-length ] [ longer-match ] [ verbose ] 4、查看指定目的IPv4地址范围内的路由信息。 display ip routing-table ip-address1 { mask1 | mask-length1 } ip-address2 { mask2 | mask-length2 } [ verbose ] 5、查看通过指定基本访问控制列表过滤的IPv4路由信息。 display ip routing-table acl { acl-number | acl-name } [ verbose ] 6、查看通过指定前缀列表过滤的IPv4路由信息。 display ip routing-table ip-prefix ip-prefix-name [ verbose ] 7、查看指定协议发现的IPv4路由信息。 display ip routing-table protocol protocol [ inactive | verbose ] 8、查看IPv4路由表的综合路由统计信息。 display ip routing-table statistics 9、查看IPv6路由表中当前激活路由的摘要信息 display ipv6 routing-table 10、查看IPv6路由表详细信息。 display ipv6 routing-table verbose 11、查看指定协议发现的IPv6路由信息。 display ipv6 routing-table protocol [ inactive | verbose ]

IP路由原理

IP路由原理 路由表要素: 目标网络地址/掩码 协议管理距离AD:衡量路由协议的可行度,以小为优 度量值:链路花费值,一小为优 出接口/下一跳 路由的AD值: 静态:出接口—0,下一跳—1,rip:120 Ospf:110,EIGRP:90,BGP:255。 路由表的度量值: 路由度量值表示到达这条路由所指目的地址的代价。 通常影响路由度量值的因素: 线路延迟,带宽,线路使用率,线路可信度,跳数,最大传输单元。 不同路由协议参考的因素不同:静态:0,ospf:带宽。 路由来源: 链路层发现协议:自动发现直连的网段,物理层UP和协议层UP。 静态路由:由管理员手工添加的路由条目。 动态路由协议:路由器之间运行路由协议,互相学习路由(RIP/OSPF)。 路由表查询:

精确匹配:以相同目标的掩码最长的为优 查找到出接口/下一跳(迭代查询): 如果出接口则转发 如是下一跳则进行迭代查找,直到找到出接口为止 找不到丢弃 路由表更新: 不同目标的路由条目放进路由表 相同目标比较AD 其次比较Metric(度量值) 其次都放入负载均衡 直连路由—静态路由: 基本概念 直连路由的建立:存在IP地址+物理层&链路层UP 配置命令: 全局模式ip route x.x.x.x(目标网络地址)x.x.x.x(掩码)##(出接口)/下一跳{distance-设定AD值} AD及Metric: 选择出接口:AD=0,M=0 选择下一跳:AD=1,M=0 特殊的静态路由: 缺省路由:当查找不到对应的表项则根据默认路由转发ip route0.0.0.0 0.0.0.0 ##出接口**下一跳。

深入理解IP路由选择过程

IP路由选择,是思科网络工程师必须要了解的一个基础知识。其实,IP路由并没有大家想的那么复杂。笔者在这篇文章中,将通过一个案例,来帮助大家深入了解IP路由的选择过程。希望这篇文章能够帮助大家扫清IP路由选择上的一些误区。 如下图,现在这么一个网络。主机甲与主机乙分别在两个不同的网段上,中间通过路由器进行连接。现在假设主机甲要跟主机乙进行通信,那么主机甲如何才能够找到主机乙的位置呢?笔者现在就通过这个例子,跟大家详细解释IP 路由选择的整个过程。在这里,笔者以Cisco的路由器为例进行介绍。 假设现在主机甲的用户利用Ping命令,来确认主机乙的连通性问题。这个网络架构虽然比较简单,但是其路由选择过程的步骤则是一步不缺的。主要通过如下步骤: 第一步:当用户在主机甲上输入PING 172.168.80.8之后,主机甲中有一个因特网控制报文协议,英文简称为ICMP。这个协议将创建一个回应请求数据包,在它的数据域中只包含有字母。 第二步:英特网控制报文协议会将这个有效负荷(即刚创建的数据包)交给因特网协议(英文简称IP)。然后这个因特网协议也会创建一个数据包。在这个英特网协议创建的数据包中,所包含的内容要比因特网控制报文协议所创建的数据包丰富的多。在这个包中包括主机甲的IP地址、目的地主机已的IP地址以及值为01h的协议字段。当数据包到达主机乙时,这些内容就是告诉对方,应该将这个有效负荷交给因特网控制报文协议来处理。 第三步:IP协议会判断目的IP地址是属于远程网络,还是在本地网络。由于根据IP地址规划规则,主机甲与主机已是属于不同的网络。此时,刚才英特网协议(IP)所创建的数据包将会被发送到默认的网关中去。在主机甲的网络属性配置中,除了有自身的逻辑IP地址,还有默认的网关地址。网关地址就是用来不同网络之间的主机进行通信的一扇门。只有通过网关,主机甲的数据包才能够被发送到不同网络的主机乙中。 第四步:确认路由器相应接口的MAC地址。假设主机甲(IP地址为172.168.60.6)的默认网关被配置为172.168.60.1。若主机甲的数据包要发送到这个默认网关上,则就必须知道其对应的路由器接口的物理地址,即MAC 地址。因为只有如此,数据包才能够被传递到更下一层的数据链路层并根据一

读懂IP路由表

在CMD中输入命令:route print 获取路由表如图 接口列表:指的是路由器的网络接口列表(Interface List)活动路由:当前激活的路由(Active Routes) 网络目标(Network Destination):目的网段

网络掩码(Netmask):子网掩码,将子网掩码换成二进制,“1”对应部分是网络地址(网 络ID,网络号,子网号),“0”对应部分是主机号。 网关(Gateway):下一跳路由器入口的ip,路由器通过interface和getway定义下一跳路由 器的链路,通常情况下,interface和gateway是同一网段 跃点数(Metric):该条路由记录的质量,一般情况下,如果有多条到达相同目的地的路由 记录,路由器会采用metric值小的那条路由 路由的匹配度:子网掩码中“1”的个数 以下逐条解释: 0.0.0.0 0.0.0.0 125.220.240.1 125.220.241.96 276 为缺省路由(匹配度为0),也即是说,当一个数据包的目的网段不在你的路由记录中,那 么你的路由器就该把那个数据包发送到那里。缺省路由网关是: 125.220.240.1 该记录的意思是:当我们收到一个数据包,但是其目 的网段不在我们的路由记录中,我们将该数据包通过125.220.241.96 这个接口发送到125.220.240.1这个地址,这个地址是下一个路由器 的接口,这样这个数据包就可以交付给下一个路由器处理了。125.0.0.0 255.0.0.0 在链路上125.220.241.96 276 直连网段的路由(匹配度为8):当路由器收到一个发往直连网段的数据包时,直接将数据 包通过125.220.241.96这个接口发送出去。网关地址为“在链路上” 表示没有网关或者说网关“在链路上” 125.220.241.96 255.255.255.255 在链路上125.220.241.96 276 本机主机路由(匹配度为32):当路由器收到一个发往自己(本机)的数据包时,直接通过 125.220.241.96这个接口发送给自己(本机)。由于匹配度高于 125.0.0.0这个目标网段,故优先选用此路由 125.255.255.255 255.255.255.255 在链路上125.220.241.96 276 本地广播路由(匹配度为32):当路由器收到发送给直连网段的本地广播时,直接将数据包 通过125.220.241.96这个接口以广播的形式发送出去。由于匹配度 高于125.0.0.0这个目标网段,故优先选用此路由 127.0.0.0 255.0.0.0 在链路上127.0.0.1 306 本地环路(匹配度为8):发往这个网段的数据包都通过127.0.0.1这个接口发送出去127.0.0.1 255.255.255.255 在链路上127.0.0.1 306 虚拟网卡测试回路(匹配度为32):直接通过127.0.0.1发送给自己。127.0.0.1这个地址是 虚拟网卡测试回路,不会真的传到网卡那边去 127.255.255.255 255.255.255.255 在链路上127.0.0.1 306 127的本机广播(匹配度为32):直接通过127.0.0.1这个接口以广播的形式发送出去

IP选择路由的具体过程

现在这么一个网络。主机甲与主机乙分别在两个不同的网段上,中间通过路由器进行连接。现在假设主机甲要跟主机乙进行通信,那么主机甲如何才能够找到主机乙的位置呢?笔者现在就通过这个例子,跟大家详细解释IP路由选择的整个过程。在这里,笔者以Cisco的路由器为例进行介绍。 假设现在主机甲的用户利用Ping命令,来确认主机乙的连通性问题。这个网络架构虽然比较简单,但是其路由选择过程的步骤则是一步不缺的。主要通过如下步骤: 第一步:当用户在主机甲上输入PING 172.168.80.8之后,主机甲中有一个因特网控制报文协议,英文简称为ICMP。这个协议将创建一个回应请求数据包,在它的数据域中只包含有字母。 第二步:英特网控制报文协议会将这个有效负荷(即刚创建的数据包)交给因特网协议(英文简称IP)。然后这个因特网协议也会创建一个数据包。在这个英特网协议创建的数据包中,所包含的内容要比因特网控制报文协议所创建的数据包丰富的多。在这个包中包括主机甲的IP 地址、目的地主机已的IP地址以及值为01h的协议字段。当数据包到达主机乙时,这些内容就是告诉对方,应该将这个有效负荷交给因特网控制报文协议来处理。 第三步:IP协议会判断目的IP地址是属于远程网络,还是在本地网络。由于根据IP地址规划规则,主机甲与主机已是属于不同的网络。此时,刚才英特网协议(IP)所创建的数据包将会被发送到默认的网关中去。在主机甲的网络属性配置中,除了有自身的逻辑IP地址,还有默认的网关地址。网关地址就是用来不同网络之间的主机进行通信的一扇门。只有通过网关,主机甲的数据包才能够被发送到不同网络的主机乙中。

第四步:确认路由器相应接口的MAC地址。假设主机甲(IP地址为172.168.60.6)的默认网关被配置为172.168.60.1。若主机甲的数据包要发送到这个默认网关上,则就必须知道其对应的路由器接口的物理地址,即MAC地址。因为只有如此,数据包才能够被传递到更下一层的数据链路层并根据一定的规则生成帧。然后主机甲才能够把数据包发送给 172.168.60.0网络连接的路由器接口。在本地局域网上,主机只可以通过硬件地址来相互之间进行通信。所以当主机甲要把数据包发送给特定的网关时,必须要知道这个网关所对应的MAC地址。这一个过程是不可避免的。为了达到这个目的,主机甲首先会检查自己的ARP缓存,查看一个默认网关的IP地址是否已经解析为对应接口的硬件地址。如果在ARP 缓存表中已经有对应的记录,表示已经被成功解析。此时,数据包将会被释放并传递到数据链路层并生成帧。其中目的方的硬件地址也将同数据包一起下传到数据链路层。通常情况下,在主机甲上,可以通过ARP命令来查看主机当前的IP地址与MAC地址的对应表。如下图。笔者现在电脑所设置的默认网关为192.168.0.254,后面的16位字符就是默认网关所对应的硬件地址。 第五步:生成帧。当这个数据包和目的方的硬件地址被传递给数据链路层之后,局域网驱动器将用来提供媒体访问服务,以通过以太网进行数据传输。一个数据帧即将产生,使用一些控制信息来封装这个数据包。在这个数据帧中会包含有目的方和源方的硬件地址。以及以太网类型字段。这个以太网类型字段主要用来描述的是交付这个数据包岛数据链路层的网络层协议。在这个帧的结尾,是一种被称作为帧校验序列的字段,它是装载循环冗余校验计算值的区域。也就是说,在这个帧中,主要包括目的MAC地址(对应路由器接口的MAC地址)、源MAC地址(主机甲的MAC地址)、以太网类型字段、数据包、帧校验序列五部分内容。注意,这里指的目的地址并不是主机乙的地址,而是里主机甲最近的默认网关地址。在第一

IP路由选择过程步骤

由于这段时间一直在看IP路由相关的东西,所以以一个简单的例子来描述一个网络上的主机A同另一个网络上的主机B通信会有哪些步骤。 如上图,主机A上某用户ping主机B的IP地址,其中的过程涉及以下步骤: 1.因特网报文控制协议(ICMP)将创建一个数据包(在它的数据域里只包含字母)2.ICMP将把这个有效负荷交给因特网协议(IP),然后IP协议会创建一个数据包。这个数据包将包含源IP地址、目的IP地址和值为01h的协议字段。在本例中,当数据包到达目的地时,所有这些内容会告诉接收方主机,它应该将这个有效负荷交给ICMP处理。3.一旦数据包被创建,IP协议将判断目的IP地址实在本地网络中,还是在一个远程网络上。 4.由于IP协议断定这是一个远程请求,这个数据包需要被发送到默认网关,这样数据包才会被路由到远程网络。在windows中的注册表将被用于查找被配置的默认网关。5.主机A(172.16.10.2)的默认网关为172.16.0.1,能够发送这个数据包到默认网关,必须知道路由器LAB_A的E0接口(其IP地址被配置为172.16.0.1,即网关地址)的硬件地址,即MAC地址。只有知道了E0的硬件地址数据包才能被下传到数据链路层,并成帧,然后发送给路由器与172.16.10.0网络的连接端口E0。在本地局域网中,主机只可以通过硬件地址进行通信。 6.检查ARP缓存,查看默认网关的IP地址是否已经被解析为硬件地址 如果被解析,数据包将被释放,传送到数据链路层并成帧(目的方硬件地址也同数据包一同下传至数据链路层) 如果这个硬件地址在主机ARP中缓存中尚未被解析,一个ARP广播将被发送到本地网络,以搜索172.16.10.1的MAC地址,路由器会响应这个请求并提供Ethernet0的硬件地址,接着主机A将缓存这个地址,同时路由器也将缓存主机A的硬件地址到ARP缓存中。 7.一旦这个数据包和目的方硬件地址被交付给数据链路层,局域网驱动器将被用来提供媒体访问以通过所用类型的局域网(在本例中即以太网)。一个数据帧将被产生,使用控制信息封装此数据包,在此帧中包含目的方和源方的硬件地址及以太网类型字段(这个字段里描述的是交付次数据包到数据链路层的网络层协议,在本例中,这个协议为IP协议)。这个帧的结尾处是被称为帧校验序列(FCS)的字段,它是装载循环冗余校验(CRC)计算值的区域。 8.一旦帧的封装被完成,这个帧将被交付到物理层,以一位一位的方式发往物理媒体(在本例中,是双绞线对)。 9.在此冲突域中的每个设备将接受这些位并重组成帧。它们都将运行CRC并核对保存在FCS字段中的内容,如果这两个值不匹配,此帧被丢弃。 如果这个CRC值吻合(在此例中指的是路由器的E0接口),然后目的方的硬件地址也将被检查,检查它们是否匹配。 如果他它们是匹配的,路由器将查看以太网类型字段,了解在网络层上使用的协议。

IP路由概述介绍

IP路由目录 目录 IP路由概述 (1) 路由表 (1) 静态路由与动态路由 (2) 负载分担与路由备份 (3) 负载分担 (3) 路由备份 (3) 路由迭代 (3) 路由信息共享 (3)

IP路由概述 在因特网中进行路由选择要使用路由器,路由器根据所收到的报文的目的地址选择 一条合适的路由(通过某一网络),并将报文传送到下一个路由器。路径中最后的 路由器负责将报文送交目的主机。 路由表 路由器转发分组的关键是路由表。每个路由器中都保存着一张路由表,表中每条路 由项都指明了要到达某子网或某主机的分组应通过路由器的哪个物理接口发送就可 到达该路径的下一个路由器,或者不需再经过别的路由器便可传送到直接相连的网 络中的目的主机。 根据来源不同,路由表中的路由通常可分为以下三类: z链路层协议发现的路由(也称为接口路由或直连路由) z由网络管理员手工配置的静态路由 z动态路由协议发现的路由 路由表中包含了下列关键项: z目的地址:用来标识IP数据报的目的地址或目的网络。 z网络掩码:与目的地址一起来标识目的主机或路由器所在的网段的地址。将目的地址和网络掩码“逻辑与”后可得到目的主机或路由器所在网段的地址。例 如:目的地址为129.102.8.10、掩码为255.255.0.0的主机或路由器所在网段 的地址为129.102.0.0。掩码由若干个连续“1”构成,既可以用点分十进制法 表示,也可以用掩码中连续“1”的个数来表示。 z出接口:指明IP报文将从该路由器哪个接口转发。 z下一跳IP地址:更接近目的网络的下一个路由器地址。如果只配置了出接口,下一跳IP地址是出接口的地址。 z本条路由加入IP路由表的优先级:对于同一目的地,可能存在若干条不同下一跳的路由,这些不同的路由可能是由不同的路由协议发现的,也可能是手工 配置的静态路由。优先级高(数值小)的路由将成为当前的最优路由。 根据路由目的地的不同,可划分为: z子网路由:目的地为子网 z主机路由:目的地为主机

相关主题
相关文档
最新文档