網路協議及網路軟體框架設計
網路協議
- TCP/IP (網路控制協議和網際協議)
OSI 與 UNIX系統中協議的對應關係圖,及不同網路在OSI中的位置
OSI 開放式系統互聯參考模型 | UNIX系統 |
應用層(Application) | ------>
------> ------> ------> ------> |
Network 網路檔案系統(NFS) |
|||||||
表示層(Presentation) | |||||||||
會話層 (Session) | SNMP | FTP | SMTP | Telnet.. | |||||
傳輸層(Transport) |
TCP |
UDP |
|||||||
網路層(Network) |
IP
|
||||||||
資料鏈路層(Data Link) |
LAN驅動器 LLC -----------------------介質訪問控制 MAC CSMA/CD(載波偵聽/多路訪問) |
在多個網絡卡驅動程式間交換 | |||||||
WinNT(NDIS) | IEEE802.3 Ethernet MAC | IEEE802.5 Token ring MAC | FDDI DMAC | 網路介面卡驅動器 | |||||
物理層(Physical) | 物理層 |
- 普通網絡卡的MAC層介面
|
<========> |
|
<====> |
|
<========> |
|
||||
|| |
||||||||||
|
收包過程
MAC從譯碼/解碼器接收到來的資料包,首先檢查SFD,檢查完畢後,MAC認為SFD後面所有的位為幀資料位.讀目的地址DA,把它和已變成的地址過濾中地址比較,如果DA通過了地址過濾層,這個幀會被放入網絡卡的儲存空間.在整個整接收完成後,MAC檢查FCS的有效性.
- 以太幀格式(Ethernet Frame Format)
101010... | SFD | 目的地址DA | 源地址SA | Length Field | LLC Data | Pad | FCS |
可多達7位元組 | 1位元組 | 6位元組 | 6位元組 | 2位元組 | 4位元組 | ||
幀引導頭(preamble) | 幀的長度約64位元組-----1500位元組 | ||||||
<========傳輸方向 |
SFD=Start of Frame Delimite
DA=Destination Address
SA=Source Address
LLC=Logical Link Control
FCS=Frame Check Sequence or Cyclic Redundancy Check(CRC)
- SNMP (簡單網路管理協議 Simple Network Management Protocol)
SNMP
用來管理網路裝置和獲得外圍裝置資訊,屬於TCP/IP的一部分,具有協議獨立性.利用SNMP, 一個管理工作站可以遠端管理所有支援這種協議的網路裝置,包括監視網路狀態、修改網路裝置配置、接收網路事件警告等。
管理資訊庫(MIB):
兩種型別 MIB-1, MIB-2.MIB是一個樹形結構,SNMP協議訊息通過遍歷MIB樹形目錄中的節點(OID)來訪問網路中的裝置.
MIB 樹的每個節點被指定為一個數字(非負數),同一層的節點用不同的數字區分.這些節點數字由標準組織指定.MIB樹中的任何一個節點由其所處的位置來命名.因為同一層的節點數字皆不同,到達某個節點的路由可以由從樹根到此節點所經過的節點的數字串來表示.這個數字串稱為相應MIB物件的物件識別符號(OID).
例如, ODI,1.3.6.1.2.1.1 代表的物件是從 命名為“1”的根節點開始,後續的下級節點“3”,再下一級是“6”,依此類推.
管理資訊結構標識(SMI): 定義MIB中行的技術規範.
SNMP目前有兩種版本 SNMP v1 和 SNMP v2.
SNMP協議單元(PDU)實現代理和管理站間的通訊,及Server 和 Target的通訊.
通訊型別
型別 |
PDU型別 |
傳輸方向 |
說明 |
0 | GetRequest | Server--->Target | 用來從Target上獲得一個或多個SNMP的物件(OID)值 |
1 | GetNextRequest | Server--->Target | 在Target上的MIB中獲得下一個SNMP的物件(OID)值 |
2 | GetResponse | Target---->Server | Target響應ServerSNMP物件請求 |
3 | SetRequest | Server--->Target | Server上程式為TargetMIB中的OID賦值 |
4 | Trap | Target---->Server | Target用它來通知Server有一個特定時間發生 |
目前好的SNMP網路管理軟體是惠普公司的 OpenView.
- BSD套接字(BSD Sockets)
BSD Sockets 使用的最廣泛的網路程式程式設計方法,主要用於應用程式的編寫,用於網路上主機與主機之間的相互通訊.
UNIX,Linux,VxWorks均支援BSD Sockets,Windows的Winsock基本上是來自BSD Sockets
Socket分為Stream Sockets和Data Sockets.
Stream Sockets是可靠性的雙向資料傳輸用TCP,如HTTP,FTP等
Data Sockets是不可靠連線用UDP,如多點廣播,DHCP,SNMP,RIP等.
- TCP伺服器端和一個TCP客戶端通訊的程式過程
伺服器 |
客戶機 |
|
兩個淺藍色的函式是兩個Sockets的握手函式,即在這裡建立連線 |
|
- UDP伺服器端和一個UDP客戶端通訊的程式過程
伺服器 |
客戶機 |
|
這裡不建立連線,只是資料收發 <---------- |
|
UDP廣播包程式示例
傳送UDP廣播包,查詢本地網路中所有執行SNMP服務裝置的IP資訊。
winsock, win32控制檯程式。
#define SNMP_PORT 161
void SearchIP_In_LAN()
{
WSADATA wsaData;
SOCKET sockListener;
SOCKADDR_IN saUdpCli,saUdpServ;
BOOL fBroadcast = TRUE;
char sendBuff[40]= //SNMP查詢包內容
{
'\x30','\x26','\x02','\x01','\x00',
'\x04','\x06','\x70','\x75','\x62',
'\x6c','\x69','\x63','\xa0','\x19',
'\x02','\x01','\x03','\x02','\x01',
'\x00','\x02','\x01','\x00','\x30',
'\x0e','\x30','\x0c','\x06','\x08',
'\x2b','\x06','\x01','\x02','\x01',
'\x01','\x01','\x00','\x05','\x00'
};
char recvBuff[600];
int nSize,err,timeoutnum = 1;;
ULONG HostIpAddr;
int rv;
int ncount=0;
if(WSAStartup(MAKEWORD( 2, 2),&wsaData)!=0)
{
printf("Winsocket start error!\n");
return;
}
sockListener=socket(AF_INET,SOCK_DGRAM,0);
err = setsockopt ( sockListener,
SOL_SOCKET,
SO_BROADCAST,
(CHAR *)&fBroadcast,
sizeof ( BOOL ));
if ( SOCKET_ERROR == err ) return ;
int TimeOut=10000;
err = setsockopt ( sockListener,
SOL_SOCKET,
SO_RCVTIMEO,
(CHAR *) &TimeOut,
sizeof (TimeOut)
);
if ( SOCKET_ERROR == err ) return ;
saUdpCli.sin_family = AF_INET;
saUdpCli.sin_port = htons(0);
saUdpCli.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind( sockListener, (SOCKADDR *)&saUdpCli, sizeof(SOCKADDR_IN))!=0)
{
printf("Can't bind socket to local port!Program stop.\n");
return;
}
err = gethostname(recvBuff,sizeof(recvBuff));
if ( SOCKET_ERROR == err )
return ;
struct hostent *hp = gethostbyname(recvBuff);
if (!hp) return ;
saUdpServ.sin_family = AF_INET;
memcpy(&(saUdpServ.sin_addr),hp->h_addr,hp->h_length);
HostIpAddr=ntohl(saUdpServ.sin_addr.s_addr);
saUdpServ.sin_addr.s_addr = htonl ( INADDR_BROADCAST );
saUdpServ.sin_port = htons (SNMP_PORT);
nSize = sizeof ( SOCKADDR_IN );
if((rv = sendto ( sockListener,
sendBuff,
sizeof(sendBuff),0,
(SOCKADDR *) &saUdpServ,
sizeof ( SOCKADDR_IN )))==SOCKET_ERROR)
{
printf("Send error!\n");
closesocket(*((SOCKET*)sockListener));
return;
}
printf("Send successful!\n");
do // waiting to receive
{
if((rv=recvfrom ( sockListener,
recvBuff,sizeof(recvBuff),0,
(SOCKADDR *) &saUdpCli,&nSize))==SOCKET_ERROR)
{
if(WSAGetLastError()==WSAETIMEDOUT)
{
if (timeoutnum > 6 ) //Wait for 1 minute.
break;
else
timeoutnum++;
}
}
else
{
CString Ip(inet_ntoa ( saUdpCli.sin_addr ));
printf("\t IP Adress-> %s ",Ip);
}
}while(TRUE);
closesocket(*((SOCKET*)sockListener));
return ;
}
網路軟體設計框圖(個人理解,僅供參考)
- 裝置管理服務軟體架構
|
- 資訊家電(IA)的架構
|
- 無線行動通訊的架構
|