㈠ 【網路協議筆記】mac地址和ip地址簡介
每個網卡都有一個唯一(6個位元組48bit)的MAC地址(Media Access Control Address)。
這個地址是由硬體設備生成的,是網路設備的唯一標識。物塵襲
固化在網卡的ROM中,有IEEE802標准規定的MAC地址格式。
當48位都是1,代表的是廣播地址:FF-FF-FF-FF-FF-FF
mac地址可以修改:當遇到限制MAC上網時,修改成白名單的MAC地址就能蹭網。
IP地址(Internet Protocol Address): 互聯網山的每個主機都有一個IP地址。
目前有2個版本: IPv4版本(32bit 4個位元組),IPv6版本(128bit 16個位元組)。
圖片備用地址
我們查看IP會看到一下兩種地址。
IP地址: 192.168.1.10
子網掩碼: 255.255.255.0
每一個IP地址都有一個子網掩碼,每一個子網掩碼都是一個32位的二進制數,每一位代表一個IP地址的每一位。
子網掩碼的作用是什麼? 用子網掩碼來計算IP的【網段network segment】。
我們知道兩個設備的IP地址如果是在不同的網段,是不能通信的。
先看下圖:
圖片備用地址
圖中第1行是ip地址,第二行是子網掩碼,第三行是網段。
網段是怎麼計算出來的?子網掩碼的數字是1,就取IP地址的值,子網掩碼的數字是0,結果就是0。
1111 1111 是 255。
那上述的
網段是 192.168.1.0
IP地址根據網路ID的不同分為5種類型,A類地址、B類地址、C類地址、D類地址和E類地址。
下面看看這個幾個分類是如何罩兄分的。
A類地址:
網路ID(8bit)必須是0開頭。
圖片備用地址
B類地址:
網路ID(16bit)必須是10開頭。
圖片備用地址
C類地址:
網路ID(24bit)必須是110開頭。
圖片備用地址
D類地址: 1110開頭,多播地址。
E類地址: 1111開頭,為今後保留。
子網掩碼CIDR(Classless Inter-Domain Routing)表示方法如下:
192.168.1.100/24 => 代表子網掩碼有24個1,也就是 255.255.255.0
123.168.100.39/16 => 代表子網掩碼有16個1,也就是 255.255.0.0
那如果這樣呢?
123.168.100.39/15 => 代表子網掩碼有15個1,也就是 255.254.0.0
IPv4用A類B類C類劃分,會浪費很多資源。
舉例子我分到了B類地址,但是我只需要一半的資源,那剩下的一般是不是浪費了?
為了防止這種現象發生,就需要用到子網。
我們看看下列圖:
圖片備用地址
看看下圖如何分4段:
圖片備用地址
那超網是什麼呢? 子網是網右邊挪子網掩碼,那超網是往左邊挪。
看下圖:
圖片兄帆備用地址
計算機A: 192.168.0.10/24
計算機B: 192.168.10.10/16
直鏈(交叉線)能通信嗎?
我們先算一算兩個計算機的網段:
計算機A的網段 => 192.168.0.0
計算機B的網段 => 192.168.0.0
看網段相同,貌似可以通信,但是計算機A給計算機B發通信的時候會先判斷是不是在同一個網段里。
這時計算機A是沒有計算機B的子網掩碼,所以用自己的子網掩碼來計算計算機B的網段後,計算出結果是網段不一樣,所以發不出通信。
雖然計算機B是可以發送給計算機A,但是計算機A也不能發送給計算機B。所以他兩是無法通訊的。
歡迎大家的意見和交流
email: [email protected]
㈡ 計算機的MAC地址(物理地址)和IP地址的區別
如下:
MAC地址是Ethernet協議使用的地址。一般稱為網路的物理地址,長度為48位的二進制序列。每個Ethernet網卡生產廠家必須向IEEE組織申請一組MAC地址,在生產網卡時在網卡的串列EEPROM中寫入一個唯一的MAC地址。
IP地址是指互聯網協議地址(英語:InternetProtocolAddress,又譯為網際協議地址),是談做IP
Address的縮寫。一般也稱為網路的邏輯地址。IP地址是IP協議提供的一種統一的地址格式,它為互聯網上的每一個網路和每一台主機分配一個邏輯地址,以此來屏蔽物理地址的差異。是一個32位的二進制數。正在擴充到128位。
網路中每台設備都有一個唯一的網路標識,這個地址叫MAC地址或網卡地址,由網路設備製造商生產時寫在硬體內部。MAC地址則是48位的(6個位元組),通常表示為12個16進制數,每2個16進制數之間用冒號隔開,如08:00:20:0A:8C:6D就是一個MAC地址。
具體如下圖所示,其前3位元組表示OUI(Organizationally Unique Identifier),橡鬧是IEEE的注冊管理機構給不同廠家梁侍罩分配的代碼,區分不同的廠家。後3位元組由廠家自行分配。
MAC地址最高位元組(MSB)的低第二位(LSb)表示這個MAC地址是全局的還是本地的,即U/L(Universal/Local)位,如果為0,表示是全局地址。所有的OUI這一位都是0。
㈢ MAC地址和IP地址的區別與聯系(計算機網路篇)
最近工作中,總是遇到mac地址的相關問題,於是在網上做一個知識整理,記得這些知識還是大二的時候學的計算機組成原理的知識,當時大學上課大家都懂的,以前挖的坑,未來總是要填的。
簡單地說:ip地址是服務商給你的,mac地址是你的網卡物理地址。
一、IP地址
對於IP地址,相信大家都很熟悉,即指使用TCP/IP協議指定給主機的32位地址。IP地址由用點分隔開的4個8八位組構成,如192.168.0.1就是一個IP地址,這種寫法叫點分十進制格式。IP地址由網路地址和主機地址兩部分組成,分配給這兩部分的位數隨地址類(A類、B類、C類等)的不同而不同。網路地址用於路由選擇,而主機地址用於在網路或子網內部尋找一個單獨的主機。一個IP地址使得將來自源地址的數據通過路由而傳送到目的地址變為可能。
二、MAC地址
對於MAC地址,由於我們不直接和它接觸,所以大家不一定很熟悉。在OSI(Open System Interconnection,開放系統互連)7層網路協議(物理層,數據鏈路層,網路層,傳輸層,會話層,表示層,應用層)參考模型中,第二層為數據鏈路層(Data Link)。它包含兩個子層,上一層是邏輯鏈路控制(LLC:Logical Link Control),下一層即是我們前面所提到的MAC(Media Access Control)層,即介質訪問控制層。所謂介質(Media),是指傳輸信號所通過的多種物理環境。常用網路介質包括電纜(如:雙絞線,同軸電纜,光纖),還有微波、激光、紅外線等,有時也稱介質為物理介質。MAC地址也叫物理地址、硬體地址或鏈路地址,由網路設備製造商生產時寫在硬體內部。這個地址與網路無關,也即無論將帶有這個地址的硬體(如網卡、集線器、路由器等)接入到網路的何處,它都有相同的MAC地址,MAC地址一般不可改變,不能由用戶自己設定。
三、MAC地址的長度、表示方法、分配方法及其唯一性
MAC地址的長度為48位(6個位元組),通常表示為12個16進制數,每2個16進制數之間用冒號隔開,如:08:00:20:0A:8C:6D就是一個MAC地址,其中前6位16進制數08:00:20代表網路硬體製造商的編號,它由IEEE(Istitute of Electrical and Electronics Engineers,電氣與電子工程師協會)分配,而後3位16進制數0A:8C:6D代表該製造商所製造的某個網路產品(如網卡)的系列號。每個網路製造商必須確保它所製造的每個乙太網設備都具有相同的前三位元組以及不同的後三個位元組。這樣就可保證世界上每個乙太網設備都具有唯一的MAC地址。
四、IP地址與MAC地址在互連網中的作用
既然每個乙太網設備在出廠時都有一個唯一的MAC地址了,那為什麼還需要為每台主機再分配一個IP地址呢?或者說為什麼每台主機都分配唯一的IP地址了,為什麼還要在網路設備(如網卡,集線器,路由器等)生產時內嵌一個唯一的MAC地址呢?主要原因有以下幾點:(1)IP地址的分配是根據網路的拓樸結構,而不是根據誰製造了網路設置。若將高效的路由選擇方案建立在設備製造商的基礎上而不是網路所處的拓樸位置基礎上,這種方案是不可行的。(2)當存在一個附加層的地址定址時,設備更易於移動和維修。例如,如果一個乙太網卡壞了,可以被更換,而無須取得一個新的IP地址。如果一個IP主機從一個網路移到另一個網路,可以給它一個新的IP地址,而無須換一個新的網卡。(3)無論是區域網,還是廣域網中的計算機之間的通信,最終都表現為將數據包從某種形式的鏈路上的初始節點出發,從一個節點傳遞到另一個節點,最終傳送到目的節點。數據包在這些節點之間的移動都是由ARP(Address Resolution Protocol:地址解析協議)負責將IP地址映射到MAC地址上來完成的。下面我們來通過一個例子看看IP地址和MAC地址是怎樣結合來傳送數據包的。
假設網路上要將一個數據包(名為PAC)由北京的一台主機(名稱為A,IP地址為IP_A,MAC地址為MAC_A)發送到華盛頓的一台主機(名稱為B,IP地址為IP_B,MAC地址為MAC_B)。這兩台主機之間不可能是直接連接起來的,因而數據包在傳遞時必然要經過許多中間節點(如路由器,伺服器等等),我們假定在傳輸過程中要經過C1、C2、C3(其MAC地址分別為M1,M2,M3)三個節點。A在將PAC發出之前,先發送一個ARP請求,找到其要到達IP_B所必須經歷的第一個中間節點C1的MAC地址M1,然後在其數據包中封裝(Encapsulation)這些地址:IP_A、IP_B,MAC_A和M1。當PAC傳到C1後,再由ARP根據其目的IP地址IP_B,找到其要經歷的第二個中間節點C2的MAC地址M2,然後再將帶有M2的數據包傳送到C2。如此類推,直到最後找到帶有IP地址為IP_B的B主機的地址MAC_B,最終傳送給主機B。在傳輸過程中,IP_A、IP_B和MAC_A不變,而中間節點的MAC地址通過ARP在不斷改變(M1,M2,M3),直至目的地址MAC_B。
綜合上面所述,我們可以歸納出IP地址和MAC地址相同點是它們都唯一,不同的特點主要有:
1. 對於網路上的某一設備,如一台計算機或一台路由器,其IP地址可變(但必須唯一),而MAC地址不可變。我們可以根據需要給一台主機指定任意的IP地址,如我們可以給區域網上的某台計算機分配IP地址為192.168.0.112 ,也可以將它改成192.168.0.200。而任一網路設備(如網卡,路由器)一旦生產出來以後,其MAC地址永遠唯一且不能由用戶改變。
2. 長度不同。IP地址為32位,MAC地址為48位。
3. 分配依據不同。IP地址的分配是基於網路拓樸,MAC地址的分配是基於製造商。
4. 定址協議層不同。IP地址應用於OSI第三層,即網路層,而MAC地址應用在OSI第二層,即數據鏈路層。 數據鏈路層協議可以使數據從一個節點傳遞到相同鏈路的另一個節點上(通過MAC地址),而網路層協議使數據可以從一個網路傳遞到另一個網路上(ARP根據目的IP地址,找到中間節點的MAC地址,通過中間節點傳送,從而最終到達目的網路)。
mac地址和ip地址有什麼區別
IP地址是指Internet協議使用的地址,而MAC地址是Ethernet協議使用的地址。IP地址與MAC地址之間並沒有什麼必然的聯系,MAC地址是Ethernet網卡上帶的地址,長度為48位。 每個Ethernet網卡生產廠家必須向IEEE組織申請一組MAC地址,在生產網卡時在網卡的串列EEPROM中寫入一個唯一的MAC地址。任何兩個Ethernet網卡的MAC地址,不管是哪一個廠家生產的都不應相同。Ethernet晶元廠家不必負責MAC地址的申請,MAC地址存在於每一個Ethernet包中,是Ethernet包頭的組成部分,Ethernet交換機根據Ethernet包頭中的MAC源地址和MAC目的地址實現包的交換和傳遞。
IP地址是Internet協議地址,每個Internet包必須帶有IP地址,每個Internet服務提供商(ISP)必須向有關組織申請一組IP地址,然後一般是動態分配給其用戶。IP地址現是32位長,正在擴充到128位。IP地址與MAC地址無關,因為Ethernet的用戶,仍然可通過Modem連接Internet,取得一個動態的IP地址,這個地址每次可以不一致。IP地址通常工作於廣域網,路由器處理的就是IP地址。 MAC地址工作於區域網,區域網之間的互連一般通過現有的公用網或專用線路,需要進行網間協議轉換。可以在Ethernet上傳送IP信息,此時IP地址只是Ethernet信息包數據域的一部分,Ethernet交換機或處理器看不見IP地址,只是將其作為普通數據處理。
原文鏈接:https://blog.csdn.net/yang_best/article/details/41643589
㈣ 計算機三級網路技術考試中mac地址的標准寫法是什麼要不要短橫線和空格
MAC地址的長度為48位(6個位元組),通常表示為12個16進制數,每2個16進制數之間用冒號隔開,如:08:00:20:0A:8C:6D就是一派返培個MAC地址,其中前6位16進制數08:00:20代表網路硬體製造商的編號。
它由IEEE(Istitute of Electrical and Electronics Engineers,電氣與電子工程師協會)分配,而後3位16進制數0A:8C:6D代表該製造商所製造的某個網路產品(如網卡)的系列號。
每個網路製造商必須確保它所製造的每個乙太網設備都具有相同的前三個位元組以及不同的後三個位元組。這樣就可保證世界上每個乙太網設備都具有唯一的MAC地址。
Mac地址就是在媒體接入層上使用的地址,通俗點說就是世枝網卡的物理地址,現在的Mac地址一般都採用6位元組48bit(在早期還有2位元組16bit的Mac地址)。
MAC地址前24位是由生產廠家向IEEE申請的廠商地址。後24位塵唯就由生產廠家自行定擬了。
㈤ mac地址格式
MAC地址的格式由6個位元組,共計48個比特組成,前3個位元組是由IEEE分配給各個申請的公司組織的標識符OUI,後3個位元組是由耐褲廠商分配的介面標識符。
MAC地址一般被固化在網卡(網路適配器)的電可擦只讀存儲器EEPROM中,因此MAC地址也被稱為硬體地址。一般用戶的主機會擁有兩個全球唯一的MAC地址,因為主機上有有限區域網適配器和無線區域網適配器。嚴格來說,MAC地址是對網路上各介面的唯一標識。
MAC地址,英文全稱Medium Access Control,直譯為介質訪問控制,它通常被固化在每個乙太網網昌衫簡卡(NIC,Network Interface Card)。MAC(硬體)地址長48位(6位元組),採用十六進制格式。
MAC地址是乙太網的MAC子層所使用的地址,處在數據鏈路層。當多個主機連接在同一個廣播信道上,要想實現兩個主機都必須有一個唯一的標識,即一個數據鏈路層地址。在每個主機發送的幀中必須攜帶標識發送主機和接收主機的地址,由於這類地址是用於媒體接入控制MAC(Media Access Control)。
mac地址示例
00-01-6C-06-A6-29或00:01:6C:06:A6:29。
組織唯一標識符(OUI)由IEEE(電氣和電子塌埋工程師協會)分配給廠商,它包含24位。廠商再用剩下的24位(EUI,擴展唯一標識符)為其生產的每個網卡分配一個全球唯一的全局管理地址,一般來說大廠商都會購買多個OUI。
I/G(Indivial/Group)位,如果I/G=0,則是某台設備的MAC地址,即單播地址;如果I/G=1,則是多播地址(組播+廣播=多播)。
G/L(Global/Local,也稱為U/L位,其中U表示Universal)位,如果G/L=0,則是全局管理地址,由IEEE分配;如果G/L=1,則是本地管理地址,是網路管理員為了加強自己對網路管理而指定的地址。
對於I/G和G/L位的位置,目前有兩種說法,或者說兩種格式。對於數據傳輸來說,數據是按每個位元組中一位一位地傳輸的,一個位元組傳輸完了才到下一個位元組。
㈥ 網卡地址 MAC格式是什麼樣的
MAC(Media Access Control, 介質訪問控制)橘廳地址是識別LAN(區域網)節點的標識。網卡的物理地址通常是由網卡生產廠家燒入網卡的EPROM(一種快閃記憶體晶元,通常可以通過程序擦寫),它存儲的是傳輸數據時真正賴以標識發出數據的電腦和接收數據的主機的地址。
也就是說,在網路底層的物理傳輸過程中,是通過物理地址來識別主機的,它一般也是全球唯一的。比如,著名的乙太網卡,其物理地址是48bit(比特位)的整數,如:44-45-53-54-00-00,以機器可讀的方式存入主機介面中。乙太網地址管理機構(IEEE)將乙太網地址,也就是48比特的不同組合,分為若干獨立的連續地址組,生產乙太網網卡的廠家就購買其中一組,具體生產時,逐個將唯一地址賦予乙太網卡。
第一種方法使用Microsoft的Netbios API。 這是一套通過Winsock提供底層網路支持的命令。使用Netbios的最大缺點是您必須在系統中安裝了Netbios服務(如果您在windows網路中啟用了文件共享的話,這就圓迅隱不是問題了)。除此此外,這種方法又快又准確。
Netbios API只包括了一個函數,就叫做Netbios。這個函數使用網路控制塊(network control block)結構作為參數,這個結構告訴函數要做什麼。結構的定義如下:
typedef struct _NCB {
UCHAR ncb_command;
UCHAR ncb_retcode;
UCHAR ncb_lsn;
UCHAR ncb_num;
PUCHAR ncb_buffer;
WORD ncb_length;
UCHAR ncb_callname[NCBNAMSZ];
UCHAR ncb_name[NCBNAMSZ];
UCHAR ncb_rto;
UCHAR ncb_sto;
void (CALLBACK *ncb_post) (struct _NCB *);
UCHAR ncb_lana_num;
UCHAR ncb_cmd_cplt;
#ifdef _WIN64
UCHAR ncb_reserve[18];
#else
UCHAR ncb_reserve[10];
#endif
HANDLE ncb_event;
} NCB, *PNCB;
重點在於ncb_command 成員。這個成員告訴Netbios該作什麼。我們使用三個命令來探測MAC地址。他們在MSDN的定義如下:
命令描述:
NCBENUM Windows NT/2000: 列舉系統中網卡的數量。使用此命令後,ncb_buffer成員指向由LANA_ENUM結構填充的緩沖區。昌正
NCBENUM 不是標準的 NetBIOS 3.0 命令。
NCBRESET 重置網卡。網卡在接受新的NCB命令之前必須重置。
NCBASTAT 接受本地或遠程介面卡的狀態。使用此命令後,ncb_buffer成員指向由ADAPTER_STATUS結構填充的緩沖區,隨後是NAME_BUFFER結構的數組。
下面就是取得您系統MAC地址的步驟:
1》列舉所有的介面卡。
2》重置每塊卡以取得它的正確信息。
3》查詢介面卡,取得MAC地址並生成標準的冒號分隔格式。
下面就是實例源程序。
netbios.cpp
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
#define bzero(thing,sz) memset(thing,0,sz)
bool GetAdapterInfo(int adapter_num, string &mac_addr)
{
// 重置網卡,以便我們可以查詢
NCB Ncb;
memset(&Ncb, 0, sizeof(Ncb));
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = adapter_num;
if (Netbios(&Ncb) != NRC_GOODRET) {
mac_addr = "bad (NCBRESET): ";
mac_addr += string(Ncb.ncb_retcode);
return false;
}
// 准備取得介面卡的狀態塊
bzero(&Ncb,sizeof(Ncb);
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = adapter_num;
strcpy((char *) Ncb.ncb_callname, "*");
struct ASTAT
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
} Adapter;
bzero(&Adapter,sizeof(Adapter));
Ncb.ncb_buffer = (unsigned char *)&Adapter;
Ncb.ncb_length = sizeof(Adapter);
// 取得網卡的信息,並且如果網卡正常工作的話,返回標準的冒號分隔格式。
if (Netbios(&Ncb) == 0)
{
char acMAC[18];
sprintf(acMAC, "%02X:%02X:%02X:%02X:%02X:%02X",
int (Adapter.adapt.adapter_address[0]),
int (Adapter.adapt.adapter_address[1]),
int (Adapter.adapt.adapter_address[2]),
int (Adapter.adapt.adapter_address[3]),
int (Adapter.adapt.adapter_address[4]),
int (Adapter.adapt.adapter_address[5]));
mac_addr = acMAC;
return true;
}
else
{
mac_addr = "bad (NCBASTAT): ";
mac_addr += string(Ncb.ncb_retcode);
return false;
}
}
int main()
{
// 取得網卡列表
LANA_ENUM AdapterList;
NCB Ncb;
memset(&Ncb, 0, sizeof(NCB));
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (unsigned char *)&AdapterList;
Ncb.ncb_length = sizeof(AdapterList);
Netbios(&Ncb);
// 取得本地乙太網卡的地址
string mac_addr;
for (int i = 0; i < AdapterList.length - 1; ++i)
{
if (GetAdapterInfo(AdapterList.lana[i], mac_addr))
{
cout << "Adapter " << int (AdapterList.lana[i]) <<
"'s MAC is " << mac_addr << endl;
}
else
{
cerr << "Failed to get MAC address! Do you" << endl;
cerr << "have the NetBIOS protocol installed?" << endl;
break;
}
}
return 0;
}
file://---------------------------------------------------------------------------
第二種方法-使用COM GUID API
這種方法使用COM API創建一個GUID(全局唯一標識符)並從那裡繼承MAC地址。GUID通常用來標識COM組件以及系統中的其他對象。它們是由MAC地址(結合其他東西)計算得來的,表面上MAC地址就包含在其中。我說表面上是因為事實上並沒有包含。
我提供這種方法更多的是為了作為反面教材。您也許用這種方法能夠得到MAC地址,但有時候您只會得到隨機的十六進制數值。
下面的例子十分簡單,無需多講。我們使用CoCreateGuid創建GUID,並將最後六個位元組放入字元串中。它們可能是MAC地址,但並不是必然的。
uuid.cpp
#include <windows.h>
#include <iostream>
#include <conio.h>
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",
uuid.Data4[2],uuid.Data4[3],uuid.Data4[4],
uuid.Data4[5],uuid.Data4[6],uuid.Data4[7]);
cout << mac_addr << endl;
getch();
return 0;
}
第三種方法- 使用SNMP擴展API
我要討論的第三種方法是使用Windows的SNMP(簡單網路管理協議)擴展來取得MAC地址。在我的經驗里,這個協議很簡單。代碼也是直勾勾的向前的。基本步驟和Netbios相同:
1》取得網卡列表
2》查詢每塊卡的類型和MAC地址
3》保存當前網卡
我個人對SNMP了解不多,但如我剛剛所言,代碼十分清楚。
snmp.cpp
#include <snmp.h>
#include <conio.h>
#include <stdio.h>
typedef bool(WINAPI * pSnmpExtensionInit) (
IN DWORD dwTimeZeroReference,
OUT HANDLE * hPollForTrapEvent,
OUT AsnObjectIdentifier * supportedView);
typedef bool(WINAPI * pSnmpExtensionTrap) (
OUT AsnObjectIdentifier * enterprise,
OUT AsnInteger * genericTrap,
OUT AsnInteger * specificTrap,
OUT AsnTimeticks * timeStamp,
OUT RFC1157VarBindList * variableBindings);
typedef bool(WINAPI * pSnmpExtensionQuery) (
IN BYTE requestType,
IN OUT RFC1157VarBindList * variableBindings,
OUT AsnInteger * errorStatus,
OUT AsnInteger * errorIndex);
typedef bool(WINAPI * pSnmpExtensionInitEx) (
OUT AsnObjectIdentifier * supportedView);
void main()
{
HINSTANCE m_hInst;
pSnmpExtensionInit m_Init;
pSnmpExtensionInitEx m_InitEx;
pSnmpExtensionQuery m_Query;
pSnmpExtensionTrap m_Trap;
HANDLE PollForTrapEvent;
AsnObjectIdentifier SupportedView;
UINT OID_ifEntryType[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 3};
UINT OID_ifEntryNum[] = {1, 3, 6, 1, 2, 1, 2, 1};
UINT OID_ipMACEntAddr[] = {1, 3, 6, 1, 2, 1, 2, 2, 1, 6};
AsnObjectIdentifier MIB_ifMACEntAddr =
{ sizeof(OID_ipMACEntAddr) sizeof(UINT), OID_ipMACEntAddr };
AsnObjectIdentifier MIB_ifEntryType =
{sizeof(OID_ifEntryType) sizeof(UINT), OID_ifEntryType};
AsnObjectIdentifier MIB_ifEntryNum =
{sizeof(OID_ifEntryNum) sizeof(UINT), OID_ifEntryNum};
RFC1157VarBindList varBindList;
RFC1157VarBind varBind[2];
AsnInteger errorStatus;
AsnInteger errorIndex;
AsnObjectIdentifier MIB_NULL = {0, 0};
int ret;
int dtmp;
int i = 0, j = 0;
bool found = false;
char TempEthernet[13];
m_Init = NULL;
m_InitEx = NULL;
m_Query = NULL;
m_Trap = NULL;
/* 載入SNMP DLL並取得實例句柄 */
m_hInst = LoadLibrary("inetmib1.dll");
if (m_hInst < (HINSTANCE) HINSTANCE_ERROR)
{
m_hInst = NULL;
return;
}
m_Init =
(pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");
m_InitEx =
(pSnmpExtensionInitEx) GetProcAddress(m_hInst,
"SnmpExtensionInitEx");
m_Query =
(pSnmpExtensionQuery) GetProcAddress(m_hInst,
"SnmpExtensionQuery");
m_Trap =
(pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap");
m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView);
/* 初始化用來接收m_Query查詢結果的變數列表 */
varBindList.list = varBind;
varBind[0].name = MIB_NULL;
varBind[1].name = MIB_NULL;
/* 在OID中拷貝並查找介面表中的入口數量 */
varBindList.len = 1; /* Only retrieving one item */
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);
ret =
m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
&errorIndex);
printf("# of adapters in this system : %in",
varBind[0].value.asnValue.number);
varBindList.len = 2;
/* 拷貝OID的ifType-介面類型 */
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType);
/* 拷貝OID的ifPhysAddress-物理地址 */
SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr);
do
{
/* 提交查詢,結果將載入 varBindList。
可以預料這個循環調用的次數和系統中的介面卡數量相等 */
ret =
m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
&errorIndex);
if (!ret)
ret = 1;
else
/* 確認正確的返回類型 */
ret =
SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType,
MIB_ifEntryType.idLength); if (!ret) {
j++;
dtmp = varBind[0].value.asnValue.number;
printf("Interface #%i type : %in", j, dtmp);
/* Type 6 describes ethernet interfaces */
if (dtmp == 6)
{
/* 確認我們已經在此取得地址 */
ret =
SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr,
MIB_ifMACEntAddr.idLength);
if ((!ret) && (varBind[1].value.asnValue.address.stream != NULL))
{
if((varBind[1].value.asnValue.address.stream[0] == 0x44)
&& (varBind[1].value.asnValue.address.stream[1] == 0x45)
&& (varBind[1].value.asnValue.address.stream[2] == 0x53)
&& (varBind[1].value.asnValue.address.stream[3] == 0x54)
&& (varBind[1].value.asnValue.address.stream[4] == 0x00))
{
/* 忽略所有的撥號網路介面卡 */
printf("Interface #%i is a DUN adaptern", j);
continue;
}
if ((varBind[1].value.asnValue.address.stream[0] == 0x00)
&& (varBind[1].value.asnValue.address.stream[1] == 0x00)
&& (varBind[1].value.asnValue.address.stream[2] == 0x00)
&& (varBind[1].value.asnValue.address.stream[3] == 0x00)
&& (varBind[1].value.asnValue.address.stream[4] == 0x00)
&& (varBind[1].value.asnValue.address.stream[5] == 0x00))
{
/* 忽略由其他的網路介面卡返回的NULL地址 */
printf("Interface #%i is a NULL addressn", j);
continue;
}
sprintf(TempEthernet, "%02x%02x%02x%02x%02x%02x",
varBind[1].value.asnValue.address.stream[0],
varBind[1].value.asnValue.address.stream[1],
varBind[1].value.asnValue.address.stream[2],
varBind[1].value.asnValue.address.stream[3],
varBind[1].value.asnValue.address.stream[4],
varBind[1].value.asnValue.address.stream[5]);
printf("MAC Address of interface #%i: %sn", j,
TempEthernet);}
}
}
} while (!ret); /* 發生錯誤終止。 */
getch();
FreeLibrary(m_hInst);
/* 解除綁定 */
SNMP_FreeVarBind(&varBind[0]);
SNMP_FreeVarBind(&varBind[1]);
}
㈦ 什麼是ip地址什麼是mac地址
IP地址是指互聯網協議地址(英語:Internet Protocol Address,又譯為網際協議悄乎地址),是IP Address的縮寫。
mac地址是指網路啟辯悉電子設備的(包括電腦)物理地址。
二者的差別是: 1、IP地址是可以修改的,mac地址是電子設備的唯一地址,它是不可修改的;
2、表達格式不一樣:IPV4的格式(192.168.1.44);
mac地址的格式(D9-AF-7B-FC-45);
3、為了用戶方便連接到網路,所以才使用IP地址的;
如果你想在Windows系灶型統裡面查看IP地址及MAC地址 你可以打開命令提示符,
輸入ipconfig /all;
㈧ 計算機 在網路上MAC地址和IP地址的區別
IP地址,這個應該知道吧,即指使用TCP/IP協議指定給主機的32位地址。IP地址由用點分隔開的4個8八位組構成,如192.168.0.1就是一個IP地址,這種寫法叫點分十進制格式。IP地址由網路地址和主機地址兩部分組成,分配給這兩部分的位數隨地喊物址類(A類、B類、C類等)的不同而不同。網路地址用於路由選擇,而主機地址用於在網路或子網內部尋找一個單獨的主機。一個IP地址使得將來自源地址的數據通過路由而傳送到目的地址變為可能。
現在有很多計算機都是通過先組建區域網,然後通過交換機和Internet連接的。然後給每個用戶分配固定的IP地址,由管理中心統一管理,這樣為了管理方便就需要使用Mac地址來標志用戶,防止發生混亂,明確責任(比如網路犯罪巧山)。另外IP地址和Mac地址是有區別的,雖然他們在區域網中是一一對應的關系。IP地址是跟據現在的IPv4標准指定的,不受硬體限制比較容易記憶的地址,而Mac地址卻是用網卡的物理地址,多少與硬體有關系,比較難於記憶。
MAC地址,長度為孝滲中48位(6個位元組),通常表示為12個16進制數,每2個16進制數之間用冒號隔開,如:08:00:20:0A:8C:6D就是一個MAC地址,其中前6位16進制數08:00:20代表網路硬體製造商的編號,它由IEEE(Istitute of Electrical and Electronics Engineers,電氣與電子工程師協會)分配,而後3位16進制數0A:8C:6D代表該製造商所製造的某個網路產品(如網卡)的系列號。每個網路製造商必須確保它所製造的每個乙太網設備都具有相同的前三個位元組以及不同的後三個位元組。這樣就可保證世界上每個乙太網設備都具有唯一的MAC地址。
既然每個乙太網設備在出廠時都有一個唯一的MAC地址了,那為什麼還需要為每台主機再分配一個IP地址呢?或者說為什麼每台主機都分配唯一的IP地址了,為什麼還要在網路設備(如網卡,集線器,路由器等)生產時內嵌一個唯一的MAC地址呢?主要原因有以下幾點:(1)IP地址的分配是根據網路的拓樸結構,而不是根據誰製造了網路設置。若將高效的路由選擇方案建立在設備製造商的基礎上而不是網路所處的拓樸位置基礎上,這種方案是不可行的。(2)當存在一個附加層的地址定址時,設備更易於移動和維修。例如,如果一個乙太網卡壞了,可以被更換,而無須取得一個新的IP地址。如果一個IP主機從一個網路移到另一個網路,可以給它一個新的IP地址,而無須換一個新的網卡。(3)無論是區域網,還是廣域網中的計算機之間的通信,最終都表現為將數據包從某種形式的鏈路上的初始節點出發,從一個節點傳遞到另一個節點,最終傳送到目的節點。數據包在這些節點之間的移動都是由ARP(Address Resolution Protocol:地址解析協議)負責將IP地址映射到MAC地址上來完成的。下面我們來通過一個例子看看IP地址和MAC地址是怎樣結合來傳送數據包的。
假設網路上要將一個數據包(名為PAC)由臨沭的一台主機(名稱為A,IP地址為IP_A,MAC地址為MAC_A)發送到北京的一台主機(名稱為B,IP地址為IP_B,MAC地址為MAC_B)。這兩台主機之間不可能是直接連接起來的,因而數據包在傳遞時必然要經過許多中間節點(如路由器,伺服器等等),我們假定在傳輸過程中要經過C1、C2、C3(其MAC地址分別為M1,M2,M3)三個節點。A在將PAC發出之前,先發送一個ARP請求,找到其要到達IP_B所必須經歷的第一個中間節點C1的MAC地址M1,然後在其數據包中封裝(Encapsulation)這些地址:IP_A、IP_B,MAC_A和M1。當PAC傳到C1後,再由ARP根據其目的IP地址IP_B,找到其要經歷的第二個中間節點C2的MAC地址M2,然後再將帶有M2的數據包傳送到C2。如此類推,直到最後找到帶有IP地址為IP_B的B主機的地址MAC_B,最終傳送給主機B。在傳輸過程中,IP_A、IP_B和MAC_A不變,而中間節點的MAC地址通過ARP在不斷改變(M1,M2,M3),直至目的地址MAC_B。
希望對你有幫助