您好,欢迎访问三七文档
Drew的主页---网络协议主页VxWorksARMPowerPC硬件驱动网络协议程序示例下载个人兴趣网络协议及网络软件框架设计网络协议TCP/IP(网络控制协议和网际协议)OSI与UNIX系统中协议的对应关系图,及不同网络在OSI中的位置OSI开放式系统互联参考模型UNIX系统应用层(Application)------------------------------Network网络文件系统(NFS)表示层(Presentation)会话层(Session)SNMPFTPSMTPTelnet..传输层(Transport)TCPUDP网络层(Network)ICMP,IGMP,RIPIPARP数据链路层(DataLink)LAN驱动器LLC-----------------------介质访问控制MACCSMA/CD(载波侦听/多路访问)在多个网卡驱动程序间交换WinNT(NDIS)IEEE802.3EthernetIEEE802.5TokenFDDIDMAC网络MACringMAC接口卡驱动器物理层(Physical)物理层链接TCP/IP基础普通网卡的MAC层接口网卡内部总线========802.3MAC引擎(Engine)====译码器/解码器(Encoder/decoder)&PLL========10/100Base-T网络&AUI||LED逻辑显示收包过程MAC从译码/解码器接收到来的数据包,首先检查SFD,检查完毕后,MAC认为SFD后面所有的位为帧数据位.读目的地址DA,把它和已变成的地址过滤中地址比较,如果DA通过了地址过滤层,这个帧会被放入网卡的存储空间.在整个整接收完成后,MAC检查FCS的有效性.以太帧格式(EthernetFrameFormat)101010...SFD目的地址DA源地址SALengthFieldLLCDataPadFCS可多达7字节1字节6字节6字节2字节4字节帧引导头(preamble)帧的长度约64字节-----1500字节========传输方向SFD=StartofFrameDelimiteDA=DestinationAddressSA=SourceAddressLLC=LogicalLinkControlFCS=FrameCheckSequenceorCyclicRedundancyCheck(CRC)SNMP(简单网络管理协议SimpleNetworkManagementProtocol)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目前有两种版本SNMPv1和SNMPv2.SNMP协议单元(PDU)实现代理和管理站间的通信,及Server和Target的通信.通信类型类型PDU类型传输方向说明0GetRequestServer---Target用来从Target上获得一个或多个SNMP的对象(OID)值1GetNextRequestServer---Target在Target上的MIB中获得下一个SNMP的对象(OID)值2GetResponseTarget----ServerTarget响应ServerSNMP对象请求3SetRequestServer---TargetServer上程序为TargetMIB中的OID赋值4TrapTarget----ServerTarget用它来通知Server有一个特定时间发生目前好的SNMP网络管理软件是惠普公司的OpenView.BSD套接字(BSDSockets)BSDSockets使用的最广泛的网络程序编程方法,主要用于应用程序的编写,用于网络上主机与主机之间的相互通信.UNIX,Linux,VxWorks均支持BSDSockets,Windows的Winsock基本上是来自BSDSocketsSocket分为StreamSockets和DataSockets.StreamSockets是可靠性的双向数据传输用TCP,如HTTP,FTP等DataSockets是不可靠连接用UDP,如多点广播,DHCP,SNMP,RIP等.TCP服务器端和一个TCP客户端通信的程序过程服务器客户机创建一个SocketsFd=socket(AF_INET,SOCK_STREAM,0)把Socket和本机的IP,TCP口绑定bind(sFd,(structsockaddr*)&serverAddr,sockAddrSize)为客户连接创建等待队列listen(sFd,SERVER_MAX_CONNECTIONS)这里循环等待,如有客户连接请求,则接受客户机连接要求accept(sFd,(structsockaddr*)&clientAddr,&sockAddrSize))接受客户机发来的信息fioRead(sFd,(char*)&clientRequest,sizeof(clientRequest)))给客户机发信息write(sFd,replyMsg,sizeof(replyMsg))关闭Socket,通信终止close(sFd)两个浅蓝色的函数是两个Sockets的握手函数,即在这里建立连接创建一个SocketsFd=socket(AF_INET,SOCK_STREAM,0)注意:客户端不需要绑定,因为TCP口是动态的.向服务器端发送连接请求,并在这里等待回应,如收到回应则向下执行connect(sFd,(structsockaddr*)&serverAddr,sockAddrSize)服务器接受连接请求后,读服务器发过来的信息read(sFd,buffer,20)向服务器发信息write(sFd,buffer,20);关闭Socketsclose(sFd)UDP服务器端和一个UDP客户端通信的程序过程服务器客户机创建一个SocketsFd=socket(AF_INET,SOCK_DGRAM,0)把Socket和本机的IP,TCP口绑定bind(sFd,(structsockaddr*)&serverAddr,sockAddrSize)不需要创建等待队列这里循环等待,如有客户连接则接受,并读取客户发来的信息recvfrom(sFd,(char*)&clientRequest,sizeof(clientRequest),0,(structsockaddr*)&clientAddr,&sockAddrSize)关闭Socket,通信终止close(sFd)这里不建立连接,只是数据收发----------创建一个SocketsFd=socket(AF_INET,SOCK_DGRAM,0)注意:客户端不需要绑定,因为UCP口是动态的.向服务器端发送连接请求和信息,这里不等待服务器的响应sendto(sFd,(caddr_t)&myRequest,sizeof(myRequest),0,(structsockaddr*)&serverAddr,sockAddrSize)关闭Socketsclose(sFd)UDP广播包程序示例发送UDP广播包,查找本地网络中所有运行SNMP服务设备的IP信息。winsock,win32控制台程序。#defineSNMP_PORT161voidSearchIP_In_LAN(){WSADATAwsaData;SOCKETsockListener;SOCKADDR_INsaUdpCli,saUdpServ;BOOLfBroadcast=TRUE;charsendBuff[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'};charrecvBuff[600];intnSize,err,timeoutnum=1;;ULONGHostIpAddr;intrv;intncount=0;if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0){printf(Winsocketstarterror!\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;intTimeOut=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'tbindsockettolocalport!Programstop.\n);return;}err=gethostname(recvBuff,sizeof(recvBuff));if(SOCKET_ERROR==err)return;structhostent*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(Senderror!\n);closeso
本文标题:网络协议开发
链接地址:https://www.777doc.com/doc-2142215 .html