1. 程式人生 > >網路協議及網路軟體框架設計

網路協議及網路軟體框架設計

網路協議

  • TCP/IP (網路控制協議和網際協議)

OSI 與 UNIX系統中協議的對應關係圖,及不同網路在OSI中的位置

  OSI 開放式系統互聯參考模型 UNIX系統
應用層(Application) ------>

------>

------>

------>

------>

Network 網路檔案系統(NFS)

表示層(Presentation)
會話層 (Session) SNMP FTP SMTP Telnet..
傳輸層(Transport)

TCP 

UDP

網路層(Network)
ICMP,IGMP,RIP

IP

ARP

資料鏈路層(Data Link)

LAN驅動器 LLC            -----------------------介質訪問控制 MAC CSMA/CD(載波偵聽/多路訪問)

在多個網絡卡驅動程式間交換
WinNT(NDIS) IEEE802.3 Ethernet MAC IEEE802.5 Token ring MAC FDDI DMAC 網路介面卡驅動器
物理層(Physical) 物理層
  • 普通網絡卡的MAC層介面
網絡卡內部匯流排
<========>

802.3 MAC引擎(Engine)

<====>

譯碼器/解碼器(Encoder/decoder) & PLL

<========>

10/100 Base-T網路 & AUI

||

LED邏輯顯示

收包過程

  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客戶端通訊的程式過程

  伺服器

客戶機

建立一個Socket

sFd =socket (AF_INET, SOCK_STREAM, 0)

把Socket和本機的IP,TCP口繫結

bind (sFd, (struct sockaddr *) &serverAddr, sockAddrSize)

為客戶連線建立等待佇列

listen (sFd, SERVER_MAX_CONNECTIONS)

這裡迴圈等待,如有客戶連線請求,則接受客戶機連線要求

accept (sFd, (struct sockaddr *) &clientAddr, &sockAddrSize))

接受客戶機發來的資訊

fioRead (sFd, (char *) &clientRequest, sizeof (clientRequest)))

給客戶機發資訊

write (sFd, replyMsg, sizeof (replyMsg))

關閉Socket,通訊終止

close (sFd)

兩個淺藍色的函式是兩個Sockets的握手函式,即在這裡建立連線
建立一個Socket

sFd =socket (AF_INET, SOCK_STREAM, 0)

注意:客戶端不需要繫結,因為TCP口是動態的.
向伺服器端傳送連線請求,並在這裡等待迴應,如收到迴應則向下執行

connect (sFd, (struct sockaddr *) &serverAddr, sockAddrSize)

伺服器接受連線請求後,讀伺服器發過來的資訊

read(sFd,buffer,20)

向伺服器發信息

write(sFd, buffer, 20);

關閉Sockets

close (sFd)

  • UDP伺服器端和一個UDP客戶端通訊的程式過程

  伺服器

客戶機

建立一個Socket

sFd =socket (AF_INET, SOCK_DGRAM, 0)

把Socket和本機的IP,TCP口繫結

bind (sFd, (struct sockaddr *) &serverAddr, sockAddrSize)

不需要建立等待佇列
這裡迴圈等待,如有客戶連線則接受,並讀取客戶發來的資訊

recvfrom (sFd, (char *) &clientRequest, sizeof (clientRequest), 0, (struct sockaddr *) &clientAddr, &sockAddrSize)

關閉Socket,通訊終止

close (sFd)

這裡不建立連線,只是資料收發

<----------

建立一個Socket

sFd =socket (AF_INET, SOCK_DGRAM, 0)

注意:客戶端不需要繫結,因為UCP口是動態的.
向伺服器端傳送連線請求和資訊,這裡不等待伺服器的響應

sendto (sFd, (caddr_t) &myRequest, sizeof (myRequest), 0, (struct sockaddr *) &serverAddr, sockAddrSize)

關閉Sockets

close (sFd)

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 ;
}

網路軟體設計框圖(個人理解,僅供參考)

  • 裝置管理服務軟體架構
 

PC端(Windows NT,UNIX,Novell...平臺)
管理伺服器(HTTP,FTP...Server)

伺服器程式

程式接收使用者請求,向下傳送

從下接收處理結果,傳送給使用者

|
|
|
v

^
|
|
|

通訊方式:Socket, Namedpipe等

||
||
||

後臺核心程式

處理請求,接收發送資料

SNMP客戶

<=============>
Internet(HTTP,..協議)

如使用者PC缺少相應驅動,伺服器會動態為使用者PC載入安裝

Internet
(SNMP協議)

<=============>

終端PC使用者
(IE瀏覽器...)

網路裝置
(嵌入式作業系統)

SNMP伺服器

  • 資訊家電(IA)的架構
 

網路裝置(嵌入式作業系統平臺)

嵌入式伺服器(Embedded Web Server, HTTP, FTP... )

伺服器程式

程式接收使用者請求,向下傳送

從下接收處理結果,傳送給使用者

|
|
|
v

^
|
|
|

通訊方式: Socket, Namedpipe等

||
||
||

後臺核心程式

處理請求,接收發送資料

||

嵌入式系統SNMP介面

||

裝置SNMP(MIB)

<===========>
Internet(HTTP,..協議)

終端PC使用者
(IE瀏覽器...)

  • 無線行動通訊的架構
 

基站無線傳送接收裝置(無線通訊協議)

接收端處理軟體

程式接收處理資料包頭,實質符合Internet傳輸的某種協議(如X.25),放到Internet上 從下接收資料包,加上自自己無線通訊協議的包頭,無線發出給使用者終端

||
||

通訊方式:Internet(雙向)

X.25,ATM....等協議

||
||

閘道器(GATEWAY)

處理資料包的內容,相關內容讀取存放資料庫

||
||

資料庫

||
||

HTTP協議

對資料庫操作,新增,刪除,列印... 
終端PC(IE瀏覽器)

<============>
無線通訊協議
(Mobitex或DataTAC,..協議)

行動通訊裝置
(嵌入式作業系統)