MAC地址和人的身份z一样,可以在设路由的时候绑定你的MAC地址。\x0d\简单点说。是每一个网上的唯一的地址。MAC地址也叫物理地址、硬件地址或链路地址,由网络设备制造商生产时写在硬件内部。\x0d\MAC地址的作用 \x0d\\x0d\IP地址就如同一个职位,而MAC地址则好像是去应聘这个职位的人才,职位可以既可以让甲坐,也可以让乙坐,同样的道理一个节点的IP地址对于网卡是不做要求,基本上什么样的厂家都可以用,也就是说IP地址与MAC地址并不存在着绑定关系。本身有的计算机流动性就比较强,正如同人才可以给不同的单位干活的道理一样的,人才的流动性是比较强的。职位和人才的对应关系就有点像是IP地址与MAC地址的对应关系。比如,如果一个网卡坏了,可以被更换,而无须取得一个新的IP地址。如果一个IP主机从一个网络移到另一个网络,可以给它一个新的IP地址,而无须换一个新的网卡。当然MAC地址除了仅仅只有这个功能还是不够的,就拿人类社会与网络进行类比,通过类比,我们就可以发现其中的类似之处,更好地理解MAC地址的作用。 \x0d\\x0d\无论是局域网,还是广域网中的计算机之间的通信,最终都表现为将数据包从某种形式的链路上的初始节点出发,从一个节点传递到另一个节点,最终传送到目的节点。数据包在这些节点之间的移动都是由ARP(Address Resolution Protocol:地址解析协议)负责将IP地址映射到MAC地址上来完成的。其实人类社会和网络也是类似的,试想在人际关系网络中,甲要捎个口信给丁,就会通过乙和丙中转一下,最后由丙 转告给丁。在网络中,这个口信就好比是一个网络中的一个数据包。数据包在传送过程中会不断询问相邻节点的MAC地址,这个过程就好比是人类社会的口信传送过程。相信通过这两个例子,我们就可以进一步理解MAC地址的作用。 \x0d\\x0d\与MAC地址相关的命令与软件 \x0d\\x0d\在人类社会社交中,我们认识一个人往往只会知道他的姓名,而身份z号码在一般的人际交往中会被忽略。同样在网络中,我们往往只会知道同事或者网友的IP地址,并不会去过多地关心对方的MAC地址。要成长为网络高手,我们可以使用一些方法去了解对方的MAC地址。在这里介绍两种常用的方法,在Windows 9x 中可用WinIPcfg获得,在Windows 2000/XP中可用IPconfig -all获得。 \x0d\\x0d\使用命令只能单条获得MAC地址,而且使用起来也是很麻烦的。对于网管人员,更希望有一款简单化 *** 作的软件,我们可以利用“MAC扫描器”远程批量获取MAC地址。它是用于批量获取远程计算机网卡物理地址的一款网络管理软件。该软件运行于网络(局域网、Internet都可以)内的一台机器上,即可监控整个网络的连接情况,实时检测各用户的IP、MAC、主机名、用户名等并记录以供查询,可以由用户自己加以备注;能进行跨网段扫描,能和数据库中得IP和MAC地址进行比较,有修改IP的或使用虚假MAC地址的,都能报警。 \x0d\\x0d\更改MAC地址 \x0d\\x0d\一般MAC地址在网卡中是固定的,当然也有网络高手会想办法去修改自己的MAC地址。修改自己的MAC地址有两种方法,一种是硬件修改,另外一种是软件修改。 \x0d\硬件的方法就是直接对网卡进行 *** 作,修改保存在网卡的EPROM里面的MAC地址,通过网卡生产厂家提供的修改程序可以更改存储器里的地址。那么什么叫做EPROM呢?EPROM是电子学中一种存储器的专业术语,它是可擦写的,也就是说一张白纸你用钢笔写了一遍以后就不能再用橡皮擦去了,而EPROM这张白纸用铅笔写后可以再擦去,可以反复改变其中数据的存储器。 \x0d\当然软件修改的方法就相对来说要简单得多了,在Windows中,网卡的MAC保存在注册表中,实际使用也是从注册表中提取的,所以只要修改注册表就可以改变MAC。Windows 9x中修改:打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ \x0d\Service\Class\Net\下的0000,0001,0002。 \x0d\\x0d\Windows 2000/XP中的修改:同样打开注册表编辑器,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ \x0d\Class\4D36E970-E325-11CE-BFC1-08002BE10318 中的0000,0001,0002中的DriverDesc,如果在0000找到,就在0000下面添加字符串变量,命名为“NetworkAddress”,值为要设置的MAC地址,例如:000102030405 \x0d\\x0d\完成上述 *** 作后重启就好了。一般网卡发出的包的源MAC地址并不是网卡本身写上去的,而是应用程序提供的,只是在通常的实现中,应用程序先从网卡上得到MAC地址,每次发送的时候都用这个MAC作为源MAC而已,而注册表中的MAC地址是在Windows安装的时候从网卡中读入的,只要你的 *** 作系统不重新安装应该问题不大。 \x0d\\x0d\MAC地址的应用 \x0d\\x0d\平日身份z的作用并不是很大,但是到了有的关键时刻,身份z就是用来证明你的身份的。比如你要去银行提取现金,这时就要用到身份z。那么MAC地址与IP地址绑定就如同我们在日常生活中的本人携带自己的身份z去做重要事情一样的道理。有的时候,我们为了防止IP地址被盗用,就通过简单的交换机端口绑定(端口的MAC表使用静态表项),可以在每个交换机端口只连接一台主机的情况下防止修改MAC地址的盗用,如果是三层设备还可以提供:交换机端口/IP/MAC 三者的绑定,防止修改MAC的IP盗用。一般绑定MAC地址都是在交换机和路由器上配置的,是网管人员才能接触到的,对于一般电脑用户来说只要了解了绑定的作用就行了。比如你在校园网中把自己的笔记本电脑换到另外一个宿舍就无法上网了,这个就是因为MAC地址与IP地址(端口)绑定引起的。 \x0d\\x0d\MAC地址涉及到的安全问题 \x0d\\x0d\从上面的介绍可以知道,这种标识方式只是MAC地址基于的,如果有人能够更改MAC地址,就可以盗用IP免费上网了,目前网上针对小区宽带的盗用MAC地址免费上网方式就是基于此这种思路。如果想盗用别人的IP地址,除了IP地址还要知道对应的MAC地址。举个例子,获得局域网内某台主机的MAC地址,比如想得到局域网内名为TARGET主机的MAC地址,先用PING命令:PING TARGET,这样在我们主机上面的ARP表的缓存中就会留下目标地址和MAC映射的记录,然后通过ARP A命令来查询ARP表,这样就得到了指定主机的MAC地址。最后用ARP -s IP 网卡MAC地址,命令把网关的IP地址和它的MAC地址映射起来就可以了。 \x0d\\x0d\如果要得到其它网段内的MAC地址,那么可以用工具软件来实现,我觉得Windows优化大师中自带的工具不错,点击“系统性能优化”→“系统安全优化”→“附加工具”→“集群Ping”,可以成批的扫出MAC地址并可以保存到文件。 \x0d\\x0d\小知识:ARP(Address Resolution Protocol)是地址解析协议,ARP是一种将IP地址转化成物理地址的协议。从IP地址到物理地址的映射有两种方式:表格方式和非表格方式。ARP具体说来就是将网络层(IP层,也就是相当于OSI的第三层)地址解析为数据连接层(MAC层,也就是相当于OSI的第二层)的MAC地址。ARP协议是通过IP地址来获得MAC地址的。 \x0d\\x0d\ARP原理:某机器A要向主机B发送报文,会查询本地的ARP缓存表,找到B的IP地址对应的MAC地址后就会进行数据传输。如果未找到,则广播A一个ARP请求报文(携带主机A的IP地址Ia——物理地址Pa),请求IP地址为Ib的主机B回答物理地址Pb。网上所有主机包括B都收到ARP请求,但只有主机B识别自己的IP地址,于是向A主机发回一个ARP响应报文。其中就包含有B的MAC地址,A接收到B的应答后,就会更新本地的ARP缓存。接着使用这个MAC地址发送数据(由网卡附加MAC地址)。因此,本地高速缓存的这个ARP表是本地网络流通的基础,而且这个缓存是动态的。ARP表:为了回忆通信的速度,最近常用的MAC地址与IP的转换不用依靠交换机来进行,而是在本机上建立一个用来记录常用主机IP-MAC映射表,即ARP表。 \x0d\\x0d\如何解决MAC地址带来的安全问题 \x0d\\x0d\我们可以将IP地址和MAC地址捆绑起来来解决这个问题。进入“MS-DOS方式”或“命令提示符”,在命令提示符下输入命令:ARP -s 10885672 00-10-5C-AD-72-E3,即可把MAC地址和IP地址捆绑在一起。这样,就不会出现IP地址被盗用而不能正常使用网络的情况,可以有效保证小区网络的安全和用户的应用。 \x0d\\x0d\注意:ARP命令仅对局域网的上网代理服务器有用,而且是针对静态IP地址,如果采用Modem拨号上网或是动态IP地址就不起作用。 \x0d\\x0d\不过,只是简单地绑定IP和MAC地址是不能完全的解决IP盗用问题的。作为一个网络供应商,他们有责任为用户解决好这些问题之的后,才交给用户使用,而不是把安全问题交给用户来解决。不应该让用户来承担一些不必要盗用的损失。 \x0d\\x0d\作为网络供应商,最常用也是最有效的解决方法就是在IP、MAC绑定的基础上,再把端口绑定进去,即IP-MAC-PORT三者绑定在一起,端口(PORT)指的是交换机的端口。这就需要在布线时候做好端口定时管理工作。在布线时应该把用户墙上的接线盒和交换机的端口一一对应,并做好登记工作,然后把用户交上来的MAC地址填入对应的交换机端口,进而再和IP一起绑定,达到IP-MAC-PORT的三者绑定。这样一来,即使盗用者拥有这个IP对应的MAC地址,但是它不可能同样拥有墙上的端口,因此,从物理通道上隔离了盗用者
局域网管理中经常遇到已知某个MAC地址,要查询其IP地址的情况,有如下几种方法:
方法一:用ARP -A 查询
这种方法只能查到与本机通讯过(20分钟内)的主机MAC地址和IP地址。可在远程主机所属网段中的任一台主机上运行此命令,这样可查出IP欺骗类病毒的主机。
方法二:用专用软件查,如nbtscan
命令方式是:nbtscan -r 网络号/掩码位,这种方法可查询某网段的所有IP与MAC对应关系,但装有防火墙的主机则禁止查询。
方法三:
如果所连交换机有网管功能,可用ARP SHOW 命令显示交换机的arp缓存信息,这种方式基本可查询所有的IP 与MAC地址,但只有网管才有这个权限。
方法四:
用sniffer类的嗅探软件抓包分析,packet中一般都含用IP地址与MAC地址。
方法五:
用solarwinds类软件中的MAC ADDRESS DISCOVERY查询,但这个工具好象不能跨网段查询。
MAC只能是在本地通讯中使用,不能传送到路由以外。 远程与内部通讯,打个比方。有个人到你们学校找一个人,他不知道从哪里找,可能要从门卫或者校务那里查这个人,门卫和校务相当于网关,然后他们带这个人去找他要找的人。网关知道内部局域网哪个电脑是这个MAC。数据在传送中是经过添加,删除一些信息的。出去的时候是删除本地的一些信息发送发出,回来是删除一些外部信息,添加内部信息。
/// <summary>
/// 判断是否是IP地址格式 0000
/// </summary>
/// <param name="str1">待判断的IP地址</param>
/// <returns>true or false</returns>
public static bool IsIPAddress(string str1)
{
if (str1 == null || str1 == stringEmpty || str1Length < 7 || str1Length > 15) return false;
string regformat = @"^\d{1,3}[\]\d{1,3}[\]\d{1,3}[\]\d{1,3}$";
Regex regex = new Regex(regformat, RegexOptionsIgnoreCase);
return regexIsMatch(str1);
}
/// <summary>
/// 取得客户端真实IP。如果有代理则取第一个非内网地址
/// </summary>
public static string IPAddress
{
get
{
string result = StringEmpty;
result = >
1NDIS(DDK)通过驱动程序获取MAC地址
ndis规范中说明,网卡驱动程序支持ioctl_ndis_query_stats接口
参数如下:
OID_802_3_PERMANENT_ADDRESS :物理地址
OID_802_3_CURRENT_ADDRESS :mac地址
于是我们的方法就得到了。
首先,看看注册表,找一找网卡有几块,分别是什么设备名。
具体位置和os有关,2000下在hlm/software/microsoft/windows nt/current version/networkcards。
然后createfile(devicename,)注意,要用linkname,因此
还要加上"//////device//"
接着
deviceiocontrol(hmac,IOCTL_NDIS_QUERY_STATS,
OID_802_3_PERMANENT_ADDRESS/OID_802_3_CURRENT_ADDRESS)
具体的情况可以参看ddk下的
OID_802_3_CURRENT_ADDRESS条目
2NetAPI-2得到MAC (MSDN推荐方法)
#include <windowsh>
//#include <winconh>
#include <stdlibh>
#include <stdioh>
#include <timeh>
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, PASTAT;
ASTAT Adapter;
int main (void)
{
NCB Ncb;
UCHAR uRetCode;
char NetName[50];
LANA_ENUM lenum;
int i;
memset( &Ncb, 0, sizeof(Ncb) );
Ncbncb_command = NCBENUM;
Ncbncb_buffer = (UCHAR )&lenum;
Ncbncb_length = sizeof(lenum);
uRetCode = Netbios( &Ncb );
printf( "The NCBENUM return code is: 0x%x /n", uRetCode );
for(i=0; i < lenumlength ;i++)
{
memset( &Ncb, 0, sizeof(Ncb) );
Ncbncb_command = NCBRESET;
Ncbncb_lana_num = lenumlana;
uRetCode = Netbios( &Ncb );
printf( "The NCBRESET on LANA %d return code is: 0x%x /n",
lenumlana, uRetCode );
memset( &Ncb, 0, sizeof (Ncb) );
Ncbncb_command = NCBASTAT;
Ncbncb_lana_num = lenumlana;
strcpy( Ncbncb_callname, " " );
Ncbncb_buffer = (char ) &Adapter;
Ncbncb_length = sizeof(Adapter);
uRetCode = Netbios( &Ncb );
printf( "The NCBASTAT on LANA %d return code is: 0x%x /n",
lenumlana, uRetCode );
if ( uRetCode == 0 )
{
printf( "The Ethernet Number on LANA %d is:%02x%02x%02x%02x%02x%02x/n",
lenumlana,
Adapteradaptadapter_address[0],
Adapteradaptadapter_address[1],
Adapteradaptadapter_address[2],
Adapteradaptadapter_address[3],
Adapteradaptadapter_address[4],
Adapteradaptadapter_address[5] );
}
}
}
3用COM API获取网卡MAC地址
这种方法使用COM API创建一个GUID(全局唯一标识符)并从那里继承MAC地址。
GUID通常用来标识COM组件以及系统中的其他对象。它们是由MAC地址(结合其他东西)计算得来的,表面上MAC地址就包含在其中。
我说表面上是因为事实上并没有包含。我提供这种方法更多的是为了作为反面教材。您也许用这种方法能够得到MAC地址,但
有时候您只会得到随机的十六进制数值。下面的例子十分简单,无需多讲。我们使用CoCreateGuid创建GUID,并将最后六个字节
放入字符串中。它们可能是MAC地址,但并不是必然的。
uuidcpp
#include <windowsh>
#include <iostream>
#include <conioh>
using namespace std;
int main()
{
cout << "MAC address is: ";
// 向COM要求一个UUID。如果机器中有以太网卡,
// UUID最后的六个字节(Data4的2-7字节)应该是本地以太网卡的MAC地址。
GUID uuid;
CoCreateGuid(&uuid);
// Spit the address out
char mac_addr[18];
sprintf(mac_addr,"%02X:%02X:%02X:%02X:%02X:%02X",
uuidData4[2],uuidData4[3],uuidData4[4],
uuidData4[5],uuidData4[6],uuidData4[7]);
cout << mac_addr << endl;
getch();
return 0;
}
4用NetAPI来获取网卡MAC地址
首先在头文件定义中加入#include "nb30h"
#pragma comment(lib,"netapi32lib")
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
} ASTAT, PASTAT;
就可以这样调用来获取远程网卡MAC地址了:
CString GetMacAddress(CString sNetBiosName)
{
ASTAT Adapter;
NCB ncb;
UCHAR uRetCode;
memset(&ncb, 0, sizeof(ncb));
ncbncb_command = NCBRESET;
ncbncb_lana_num = 0;
uRetCode = Netbios(&ncb);
memset(&ncb, 0, sizeof(ncb));
ncbncb_command = NCBASTAT;
ncbncb_lana_num = 0;
sNetBiosNameMakeUpper();
FillMemory(ncbncb_callname, NCBNAMSZ - 1, 0x20);
strcpy((char )ncbncb_callname, (LPCTSTR) sNetBiosName);
ncbncb_callname[sNetBiosNameGetLength()] = 0x20;
ncbncb_callname[NCBNAMSZ] = 0x0;
ncbncb_buffer = (unsigned char ) &Adapter;
ncbncb_length = sizeof(Adapter);
uRetCode = Netbios(&ncb);
CString sMacAddress;
if (uRetCode == 0)
{
sMacAddressFormat(_T("%02x%02x%02x%02x%02x%02x"),
Adapteradaptadapter_address[0],
Adapteradaptadapter_address[1],
Adapteradaptadapter_address[2],
Adapteradaptadapter_address[3],
Adapteradaptadapter_address[4],
Adapteradaptadapter_address[5]);
}
return sMacAddress;
}
1、本机MAC地址获取,在CMD中输入ipconfig/all
2、远程主机MAC地址获取(前提是与远程主机网络连通),在CMD中用输入arp -a,如果没有通讯过,那就先在CMD中ping下对方
以上就是关于MAC地址有什么用怎么用全部的内容,包括:MAC地址有什么用怎么用、如何获得任意IP的MAC地址、局域网中数据传输通过MAC地址来确定主机,如果和远程主机通信又通过何种方式获取目的主机的MAC地址呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)