协议分析器设计源代码
Windows下截获网络数据——winpcap源代码分析

Windows下截获网络数据——winpcap源代码分析王守彦1简介在本刊的前期中,介绍用于截获网络数据的通用库libpcap的高层实现,及在linux/unix 下底层实现。
Winpcap是libpcap的windows版本,它们虽然提供了同样的高层接口,但底层实现却截然不同。
对于linux/unix,网络数据的截获作为系统的一项基本功能,大多直接实现于内核中,用户只要调用简单的接口函数,就能截获通过网络适配器的数据,windows 系统本身不提供截获网络数据的接口,但提供一套和网络适配器交互的网络驱动器接口规范(NDIS),可以通过NDIS实现网络数据的截获。
本文作为前文的补充,详细分析winpcap 的结构和如何通过NDIS实现网络数据的截获和过滤。
本文分为三个部分:winpcap结构、NDIS概述和winpcap包截获驱动器源代码分析。
2Winpcap结构图1 winpcap结构图1描述了winpcap的结构,其中windump.exe是一个使用winpcap的外部程序,winpcap 包括libpcap通用接口、packet.dll动态链接库和NDIS包截获驱动器三个部分。
NDIS包截获驱动器用于从网络适配器(Network Adapter)截获数据,并提供一套标准的接口函数,如read,write,ioctl等;packet.dll提供对NDIS包截获驱动器接口函数的封装,对上层(libpcap)提供更为方便的接口;libpcap调用packet.dll中的函数,提供和linux/unix平台上libpcap相同的接口,实现代码的通用性。
实际上在windows编程中使用packet.dll提供的接口函数和使用libpcap函数一样方便,它们都是对其它函数的封装,本文不做分析,而是着重分析NDIS包截获驱动器的实现。
3NDIS概述包截获驱动器通过NDIS(网络驱动器接口规范)与网络适配器交互,NDIS是win32网络代码的一部分。
Resiprocate-源码分析

协议栈的层次SIP为应用层(Application-Layer)的协议,所以不需要改变操作系统便可以支持。
SIP 已经获得3GPP (Third GenerationPartnership Project)、3GPP2 (Third Generation Partnership ProjectNumber 2)等机构认证,成为未来第三代行动通讯(3G) 的标准。
下面是SIP的分层图示,IETF坚持分层,不同模块功能相对独立,各层之间松散耦合。
关于Resiprocate设计首先祭出这面大旗,”类是对概念的描述,面向接口编程;封装变化的概念。
”---这不是我讲的,是大师们的口水。
Resiprocate中大部分类就是对RFC3261各种SIP元素、组件的封装,并且也体现了RFC协议设计的层次。
在面向对象的设计中我们首先就要厘清问题域的所在;SIP Stack的设计就是要充分考虑完整展现RFC定义的各种元素和概念以及让这些独立而又关联的元素互动起来成为一个活的系统。
可以这样来考虑,比如我们知道RFC定义了一个SIP MESSAGE的概念;下面是从RFC文档拷贝的内容:SIP 消息= 起始行*消息头部CRLF(空行)[消息体]因此SIP Message这个概念元素还包括了更多的元素和概念;SIP Message中我们能抽象出更通用的概念我们暂且叫它Message; 起始行的概念E文Request Line以及Status Line又包括了很多消息头(这是包容的关系),SIPURL也包括消息头,等等,还有什么参数什么的元素呢;当我们在考虑和提炼这些概念和元素的时候,我们思考怎么抽象他们呢,它们又有什么基本的元素及其共性呢?他们之间的关系如何组织呢?Resiprocate的源码告诉了我们如何去设计和封装这些概念的上佳实现。
在Resiprocate中一些RFC3261中定义元素的对应:建议:利用CRC卡片的方式去记录理解Resiprocate中的大量的类及其关系。
基于TCPIP的协议分析器设计

基于TCP/IP的协议分析器设计【摘要】网络分析技术作为一种积极的安全监测技术,能实时监测网络中发生的一些事件,也更加有效地保障被监测网络的安全性。
基于TCP/IP的分析技术也是具有入侵监测能力网络系统的核心技术之一。
所以,研究以捕获数据包为基础的网络分析方法在当今是非常必要的。
本课题针对10Mbps以太网,设计一个具有实时性的网络数据包捕获和统计分析系统。
本系统使用具有数据包捕获功能的winpcap开源包,对流经本机的网络数据包进行嗅探和统计分析。
在循环捕获网络上的数据包的同时,对数据包进行分析与归类。
本系统以TCP/IP 体系结构为根本,对数据包实现由下至上的层层解析,最终实现对HTTP协议报文的读取,FTP文件传输协议的命令读取,也可以实现以UDP协议或TCP协议为基础的QQ数据包的判断。
本论文首先介绍了捕获网络数据包的工具,其次是重点介绍了winpcap开源库的相关知识、捕获数据包的理论过程以及数据包的分析过程等。
【关键词】winpcap开源包,TCP/IP协议,数据包捕获,协议分析Design a protocol analyzer based on TCP/IP protocolAbstractNetwork analysis technology as a positive safety monitoring technology, it can occur in the real-time monitoring of network events and more effective protection of the security of the network to be monitored. The network analysis technology is also one of the core technologies for network intrusion detection systems. Therefore, the study to capture the packet-based network monitoring is necessary in todays.The topic designs a real-time network packet capture and statistical analysis system for 10Mbps Ethernet. The system uses winpcap comes with network packet capture mechanism for monitoring and statistical analysis of data packets flowing through the local computer. In the loop capturing data packets at the same time, synchronization is achieved on the analysis of data packets classified. It is mainly done to the TCP/IP protocol stack-based network packet capture. The system is based on the TCP/IP architecture and analysis packets from the bottom layers. Ultimately, the system can read the HTTP protocol packets, the FTP file transfer protocol command and it can also implement the judgments of the QQ data packets based on UDP or TCP protocol.This paper introduces a network packet capture tool firstly. And the paper focuses on the winpcap knowledge, the principle of packet capture and analysis of data packets mechanism secondly.Key word: winpcap open-source packet, TCP/IP protocol, packet capture, protocol analysis目录第一章绪论 (1)1.1.课题背景 (1)1.2.研究现状 (1)1.3.本文研究内容 (2)1.4.论文结构 (2)第二章网络数据捕获及winpcap的相关知识 (3)2.1 网络数据捕获 (3)2.11 网卡的工作模式 (3)2.12 共享式的网络数据捕获 (3)2.13 交换式的的网络数据捕获 (4)2.2 网络开发工具 (4)2.21 网络开发现有的函数库 (4)2.22 数据包的捕获工具 (5)2.3 winpcap的相关知识 (5)2.31 winpcap简介 (5)2.32 winpcap的各功能模块 (5)2.33 winpcap的主要函数及相关功能 (7)第三章TCP/IP协议分析模块 (8)3.1 TCP/IP分析过程 (8)3.21 TCP/IP模型 (8)3.22 数据包的封装与分用 (9)3.23 主要协议数据包格式 (10)3.2 基于winpcap的网络数据捕获程序 (15)3.21 获得本地网络驱动器列表 (16)3.22 获得已安装的网络设备的高级信息 (17)3.23 打开网卡准备捕获数据包 (17)3.24 数据包的过滤设定 (18)3.25 开始捕获数据包 (19)3.26 数据包的分析 (20)第四章程序的实现 (21)4.1 winpcap的安装使用方法 (22)4.2 程序的运行 (23)4.3 捕获程序性能的调整 (29)第五章总结与展望 (30)5.1 总结 (30)5.2 展望 (30)致谢.................................................................................................................................... 错误!未定义书签。
Nacos2.0源码分析-Distro协议详解

Nacos2.0源码分析-Distro 协议详解温馨提⽰:本⽂内容基于个⼈学习Nacos 2.0.1版本代码总结⽽来,因个⼈理解差异,不保证完全正确。
如有理解错误之处欢迎各位拍砖指正,相互学习;转载请注明出处。
在这篇⽂章内简要的从全局⾓度来分析了Distro 协议的整体⾯貌。
若还未阅读过的同学可以去看⼀下,⼤脑中对相关的组件有个映像。
在章节介绍了Distro 协议是从这⾥开始的,本⽂将围绕这个⼊⼝展开分析。
Distro 协议的初始任务在章节介绍道,从构造⽅法中它启动了⼀个startDistroTask()任务,内部⼜分为验证任务和同步任务。
private void startDistroTask() {if (EnvUtil.getStandaloneMode()) {isInitialized = true;return;}startVerifyTask(); startLoadTask();}在真正开始分析任务的具体操作之前,请允许我先介绍内部的⼀些属性:/*** 节点管理器*/private final ServerMemberManager memberManager;/*** Distro 组件持有者*/private final DistroComponentHolder distroComponentHolder;/*** Distro 任务引擎持有者*/private final DistroTaskEngineHolder distroTaskEngineHolder;其中和的基本概念已经在⼀⽂中介绍过,请点击名称跳转查看。
此处介绍⼀下他们的初始化。
初始化Distro 协议的组件DistroHttpRegistry 是v1版本中的组件,这⾥介绍v1相关内容是想让各位读者直观的对⽐⼀下v1和v2的巨⼤差异。
因为此篇⽂章先于《Distro 协议概览》完成,并且当初学习的时候并未注意即便使⽤了2.0.1版本的代码,它还是默认开启了对v1的兼容。
HttpClient源码分析

HttpClient源码分析/*** 此接⼝仅代表HTTP请求执⾏的最基本约定。
* 它对请求执⾏过程没有任何限制或特定的细节,并将状态管理、⾝份验证和重定向处理的细节留给单个实现。
*/public interface HttpClient {HttpResponse execute(HttpUriRequest request);}/*** ⽤于提供创建{@link CloseableHttpClient}实例⼯⼚⽅法.*/public class HttpClients {public static CloseableHttpClient createDefault() {return HttpClientBuilder.create().build();}}/*** HTTP消息包括从客户机到服务器的请求和从服务器到客户机的响应。
* HTTP-message = Request | Response ; HTTP/1.1 messages** {@link HttpRequest} and {@link HttpResponse} 接⼝继承{@link HttpMessage }*/public interface HttpMessage {}/*** 从客户机到服务器的请求消息包括,* 在该消息的第⼀⾏中,要应⽤于该资源的⽅法、资源的标识符以及正在使⽤的协议版本。
* method uri http/1.1*/public interface HttpRequest extends HttpMessage {RequestLine getRequestLine(); // 获取请求⾏}/*** 在接收和解释请求消息后,服务器⽤HTTP响应消息响应。
* 设置/获取状态⾏、状态码、原因短语、实体、locale*/public interface HttpResponse extends HttpMessage {}/*** Extended version of the {@link HttpRequest} interface that provides convenience methods to access request properties such as request URI and method type. * {@link HttpRequest}接⼝的扩展版本,提供访问请求属性(如请求URI和⽅法类型)的⽅便⽅法。
uIP地址解析协议ARP分析

地址解析协议 ARPuIP是什么?uIP是一款TCP/IP协议套件,该套件为使用者的网络会话提供网络协议栈支持。
我曾尝试将uIP提供的TCP/IP协议栈移植到单片机中,当然在只有单片机而没有网卡(MAC+PHY)的情况下,这项工作是不能完成的。
在做这项工作之前,我也在网络上搜索整理了很多资料,用以充实自己的知识体系。
单方面看,TCP/IP 协议栈是一组纵向生长的协议集合;多方面看,TCP/IP协议栈是实现双方正确,有效交互的一种机制,它实现了等层协议实体之间的透明传输。
而uIP是一款轻型TCP/IP协议栈,设计目标是为无法运行开源或者付费系统的广大接入终端提供一种网络接入交互机制。
鉴于国内几乎没有开发协议栈的工作,而国外一款比较好的协议栈大概在数十万美金,对于国内的很多软件开发,设备生产的公司来说,无疑是有点奢侈,因为我们的设备不需要对网络协议的完全支持。
对接入设备而言,“通道”和对“通道上的流”的规则,是他们的关注重点。
但是,就是这么简单的需求,对网络协议的最小化支持的软件,国内几乎无有。
以单片机为例,一个简单的网络模块就是给单片机外接资源增加一个网络控制器—一般是dm9000X或者marvell等厂家的以太网控制器,通过编程实现网卡驱动后(一般u-boot源码中都提供了这些厂家芯片的裸编程序),封装一个初始化、一个接收和发送接口,就可以同uIP整合,完成运行在单片机上的网络协议处理模块了。
UIP对基本的网络协议支持的比较好,当然一个人不是一个团队,开发协议栈还是相当有挑战性的。
我想将自己调试过程中遇到的问题,以及对uIP为什么这样做的理解,沿着我的思路做一个解说。
笔墨浅显,仅供自己和需要的人参考。
做这一系列的分析,前提需要一个主题框架。
但是一时又想不起来该怎么系统的完成这些任务,所以编边写边看,边看边修改。
二层请求协议:地址解析协议-ARP。
ARP/RARP作为一个二层协议,提供在局域网内请求对端MAC(ARP)地址或者逆向请求对端IP(RARP)地址的协议。
SMTP及POP3协议分析报告
网络协议分析与设计实验报告五、实验结果与分析(含程序、数据记录及分析和实验总结等):1、SMTP报文是如何封装的?客户端软件在发送时,向SMTP服务器发送了哪些SMTP报文?SMTP 服务器的响应信息是什么?请列出上述SMTP报文和SMTP服务器的响应信息。
依次封装在tcp报文的数据区域,ip数据包的数据区域,以太网帧的数据区域。
三次握手建立连接00 0F E2 45 B9 C2 00 E5 7C 07 DF 45 08 00 45 0000 40 CE F2 40 00 40 06 79 87 0A 84 FE 9F DC B50C 65 08 B7 00 6E 93 9D 52 22 00 00 00 00 B0 02FF FF 54 DB 00 00 02 04 05 B4 01 03 03 03 01 0108 0A 00 00 00 00 00 00 00 00 01 01 04 02 0C2、POP3报文是如何封装的?在使用客户端软件接收时,向POP3服务器发送了哪些POP报文?POP3服务器的响应信息是什么?请列出上述POP3报文和POP3服务器的响应信息。
依次封装在tcp报文的数据区域,ip数据包的数据区域,以太网帧的数据区域。
三次握手建立连接00 E5 7C 07 DF 45 00 0F E2 45 B9 C2 08 00 45 0000 34 00 00 40 00 35 06 53 86 DC B5 0C 65 0A 84FE 9F 00 6E 08 B7 6B 9C 45 4F 93 9D 52 23 80 1216 D0 C6 21 00 00 02 04 05 B4 01 01 04 02 01 0303 07 003、给出利用TCP连接工具与SMTP/POP3服务器建立TCP连接后,利用SMTP/POP3命令发送和4、使用16进制形式分别各给出一个封装了SMTP/POP3命令的物理帧,并对其中帧头、IP头、TCP头的取值进行解释。
eMule电驴eDonkey源代码精辟分析
eMule电驴eDonkey源代码精辟分析最近给一家公司写一个类似电驴的P2P客户端.写的相当的累,但是收获也很大,对电驴的代码进行了深入的分析,现在把所得贡献给大家,网上有很多对电驴协议的分析,其实有些地方是误导大家了,中国的程序员还是很小家子气,就是怕别人超过自己.进入正题,电驴的协议和各种常量参数定义在opcodes.h中,#define OP_EDONKEYHEADER 0xE3#define OP_KADEMLIAHEADER 0xE4这是他的协议码,他大部分的通信包第一个字节都是OP_EDONKEYHEADER 0xE3,这是他的客户端之间的协议#define OP_HELLO 0x01 // 0x10<HASH 16><ID 4><PORT 2><1 Tag_set>#define OP_SENDINGPART 0x46 // <HASH 16><von 4><bis 4><Daten len:(von-bis)>#define OP_REQUESTPARTS 0x47 // <HASH 16><von[3] 4*3><bis[3] 4*3>#define OP_FILEREQANSNOFIL 0x48 // <HASH 16>#define OP_END_OF_DOWNLOAD 0x49 // <HASH 16>#define OP_ASKSHAREDFILES 0x4A // (null)#define OP_ASKSHAREDFILESANSWER 0x4B // <count 4>(<HASH 16><ID 4><PORT 2><1 Tag_set>)[count]#define OP_HELLOANSWER 0x4C // <HASH 16><ID 4><PORT 2><1 Tag_set><SERVER_IP 4><SERVER_PORT 2>#define OP_CHANGE_CLIENT_ID 0x4D // <ID_old 4><ID_new 4>#define OP_MESSAGE 0x4E // <len 2><Message len>#define OP_SETREQFILEID 0x4F // <HASH 16>#define OP_FILESTA TUS 0x50 // <HASH 16><count 2><status(bit array) len:((count+7)/8)> #define OP_HASHSETREQUEST 0x51 // <HASH 16>#define OP_HASHSETANSWER 0x52 // <count 2><HASH[count] 16*count>#define OP_STARTUPLOADREQ 0x54 // <HASH 16>#define OP_ACCEPTUPLOADREQ 0x55 // (null)#define OP_CANCELTRANSFER 0x56 // (null)#define OP_OUTOFPARTREQS 0x57 // (null)#define OP_REQUESTFILENAME 0x58 // <HASH 16> (more correctly file_name_request)#define OP_REQFILENAMEANSWER 0x59 // <HASH 16><len 4><NAME len>#define OP_CHANGE_SLOT 0x5B // <HASH 16>#define OP_QUEUERANK 0x5C // <wert 4> (slot index of the request)#define OP_ASKSHAREDDIRS 0x5D // (null)#define OP_ASKSHAREDFILESDIR 0x5E // <len 2><Directory len>#define OP_ASKSHAREDDIRSANS 0x5F // <count 4>(<len 2><Directory len>)[count]#define OP_ASKSHAREDFILESDIRANS 0x60 // <len 2><Directory len><count 4>(<HASH 16><ID 4><PORT 2><1 Tag_set>)[count]#define OP_ASKSHAREDDENIEDANS 0x61 // (null)这是他的客户端到服务器的通信协议// client <-> server#define OP_LOGINREQUEST 0x01 //<HASH 16><ID 4><PORT 2><1 Tag_set>#define OP_REJECT 0x05 //(null)#define OP_GETSERVERLIST 0x14 //(null)client->server#define OP_OFFERFILES 0x15 // <count 4>(<HASH 16><ID 4><PORT 2><1 Tag_set>)[count]#define OP_SEARCHREQUEST 0x16 // <Query_Tree>#define OP_DISCONNECT 0x18 // (not verified)#define OP_GETSOURCES 0x19 // <HASH 16>#define OP_SEARCH_USER 0x1A // <Query_Tree>#define OP_CALLBACKREQUEST 0x1C // <ID 4>#define OP_QUERY_CHA TS 0x1D // (deprecated not supported by server any longer)#define OP_CHA T_MESSAGE 0x1E // (deprecated not supported by server any longer)#define OP_JOIN_ROOM 0x1F // (deprecated not supported by server any longer)#define OP_QUERY_MORE_RESULT 0x21 // (null)#define OP_SERVERLIST 0x32 // <count 1>(<IP 4><PORT 2>)[count] server->client#define OP_SEARCHRESULT 0x33 // <count 4>(<HASH 16><ID 4><PORT 2><1 Tag_set>)[count]#define OP_SERVERSTA TUS 0x34 // <USER 4><FILES 4>#define OP_CALLBACKREQUESTED 0x35 // <IP 4><PORT 2>#define OP_CALLBACK_FAIL 0x36 // (null notverified)#define OP_SERVERMESSAGE 0x38 // <len 2><Message len>#define OP_CHA T_ROOM_REQUEST 0x39 // (deprecated not supported by server any longer)#define OP_CHA T_BROADCAST 0x3A// (deprecated not supported by server any longer)#define OP_CHA T_USER_JOIN 0x3B // (deprecated not supported by server any longer)#define OP_CHA T_USER_LEA VE 0x3C // (deprecated not supported by server any longer)#define OP_CHA T_USER 0x3D // (deprecated not supported by server any longer)#define OP_IDCHANGE 0x40 // <NEW_ID 4><server_flags 4><primary_tcp_port 4 (unused)><client_IP_address 4>#define OP_SERVERIDENT 0x41 // <HASH 16><IP 4><PORT 2>{1 TAG_SET}#define OP_FOUNDSOURCES 0x42 // <HASH 16><count 1>(<ID 4><PORT 2>)[count]#define OP_USERS_LIST 0x43 // <count 4>(<HASH 16><ID 4><PORT 2><1 Tag_set>)[count]#define OP_GETSOURCES_OBFU 0x23#define OP_FOUNDSOURCES_OBFU 0x44电驴的Socket网络通信部分写的超级搞笑,听我慢慢道来首先EMSocket.h这个类是他的业务通信类可以清楚的看到他的协议头部分是个#define PACKET_HEADER_SIZE 6字节看他的接收是一个静态缓冲区static char GlobalReadBuffer[10*1024*1024];10M大小在接收时候大于8K的使用10M设置,小于8k的使用8Kuint32 recvbufferlimit = 2*ret;if (recvbufferlimit > (10*1024*1024)) {recvbufferlimit = (10*1024*1024);} else if (recvbufferlimit < 8192) {recvbufferlimit = 8192;}if (recvbufferlimit > m_uCurrentRecvBufferSize) {SetSockOpt(SO_RCVBUF, &recvbufferlimit, sizeof(recvbufferlimit), SOL_SOCKET);}int ilen = sizeof(int);GetSockOpt(SO_RCVBUF, &recvbufferlimit, &ilen, SOL_SOCKET);发送的时候Send(1300, 0, true);以1300MTU发送.然后在谈一下他的爷爷,他的爸爸CEncryptedStreamSocket先略去不讲class CEncryptedStreamSocket : public CAsyncSocketEx讲CAsyncSocketEx这个可是电驴最核心的通信类,他直接继承于MFC的祖宗CObject大家注意我这里会讲到电驴SOCKET的命脉所在,这是在整个互联网上还没有人讲的,我最先发布电驴的网络控制是在每一个CAsyncSocketEx中包含了一个窗口句柄,利用这个窗口来派发所有的socket通信控制这是他的SOCKETstruct t_AsyncSocketExData{SOCKET hSocket; //Socket handleint nSocketIndex; //Index of socket, required by CAsyncSocketExHelperWindow} m_SocketData;这是他的那个消息窗口struct t_AsyncSocketExThreadData{CAsyncSocketExHelperWindow *m_pHelperWindow;int nInstanceCount;DWORD nThreadId;} *m_pLocalAsyncSocketExThreadData;这是包含所有窗口句柄的链表//List of the data structures for all threadsstatic struct t_AsyncSocketExThreadDataList{t_AsyncSocketExThreadDataList *pNext;t_AsyncSocketExThreadData *pThreadData;} *m_spAsyncSocketExThreadDataList;然后大家去AsyncSocketEx.cpp中看class CAsyncSocketExHelperWindow的类实现吧,他的所有的SOCKET行为都在这里了.当然这只是通信的开始,后续代码分析我会在今后的博客中为大家见讲解。
网络协议分析器设计与实现
第 2 卷第 1 9 期
V0 .9 No 1 12 .
企 业 技 术 开 发
TECHNOL OGI CAL DEVELOPMENT OF ENTERPRI SE
21 0 0年 1 月
Jn2 0 a .01
网络协议分 析器设计 与实现
黄俊杰 , 王建新 , 张 静
( 中南 大学 信息科学与T程学院 , 湖南 长沙 4 0 8 ) 10 3
De i n a d i p e e t to f n t r r t c l a a y e sg n m l m n a i n o e wo k p o o o n l z r
H A G J n j , N in xn Z A G J g U N u -j WA G J — i , H N i e a n
Lbe i t n .We cos iu n ta te dvl m n p t r n dp a l fky t ho g s sc ss nl hoe Lnx ad Q s h ee p et l f m ad aot o o e e nl i uh a i a o ao t c oe g s
于网络协议具有很强 的抽象性且对 上层 用户完全透 明, 传统的教授方式或教材 自学很难让学习者深入理解协议
件 如 e eel , 由 于关 注 的重 点 不 同 , 往 比较 复杂 , t ra等 又 h 往 不适 合 应用 于 网络 协议 教 学 。 因此 , 现 一 款 真正 适 合 教 实 学 的 ห้องสมุดไป่ตู้络 协议 分 析 器很 有 必 要 。本 文 在 对 网 络数 据 包 捕 获 和构 造 技 术 研 究 的基 础 上 , 网络 协议 分 析 器 的设 计 对
openvswitch源代码分析
Openvswitch(OVS)源代码分析系列转载请注明原文出处,原文地址为:/yuzhihui_no1/article/details/39161515openVswitch(OVS云计算是现在IT行业比较流行的,但真正什么是云计算业界也没有个什么统一的定义(很多公司都是根据自己的利益狭隘的定义云计算),更别说什么标准规范了。
所以现在就有很多人说云计算只不过是个幌子,是个嘘头,没点实用的,嘴上说说而已,虽然我也不太清楚什么叫做云计算,云计算的定义究竟是什么,但我根据我公司现在做的云计算产品来说,对于云计算服务还是懂些的。
我觉得那并不是什么幌子、嘘头,但如果说这云计算技术还不太成熟,我倒还勉强认可的。
若把云计算比作一个人的话,我个人觉得现在它正是二十岁的样子,到三十多岁就算是比较成熟了,所以大概就能想象的到云计算现在的境况了。
下面就来简介下实现云计算的一些技术,我对云计算并没有什么研究,也没能达到从全局的角度来分析云计算技术,更别说从一些更高的位置来分析问题,我所能介绍的仅仅是我一个小程序员在工作中所遇到的一些和云计算有关的技术,日积月累,希望终有一天能成为云计算“砖家”。
云计算是个全世界的话题,所以也有全世界的能人异士来为实现这个云计算而奋斗。
我现阶段遇到的有关云计算的技术就是openVswitch、openStack技术和Docker技术。
那就先从openVswitch开始介绍起,我会用一系列blog来分析openVswitch的相关数据结构和工作流程,以及各个重要模块的分析。
所有的介绍都是基于源码的分析,希望对初学着有点用。
openVswitch,根据其名就可以知道这是一个开放的虚拟交换机(open virtual switch);它是实现网络虚拟化SDN的基础,它是在开源的Apache2.0许可下的产品级质量的多层虚拟交换标准。
设计这个openVswitch的目的是为了解决物理交换机存在的一些局限性:openVswitch较物理交换机而言有着更低的成本和更高的工作效率;一个虚拟交换机可以有几十个端口来连接虚拟机,而openVswitch本身占用的资源也非常小;可以根据自己的选择灵活的配置,可以对数据包进行接收分析处理;同时还支持标准的管理接口和协议,如NetFlow,sFlow,SPAN,RSPAN等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include #include #include #include #include #include #include
typedef unsigned char UCHAR; typedef unsigned short USHORT;
void pcap_handle(u_char *user,const struct pcap_pkthdr *header, const u_char *pkt_data); typedef struct{ //定义以太帧的头部数据类型 UCHAR DestMac[6]; UCHAR SrcMac[6]; UCHAR Etype[2]; }ETHHEADER; typedef struct { //IP头部的数据类型 UCHAR header_len:4; UCHAR version:4; UCHAR tos:8; // type of service USHORT total_len:16; // length of the packet USHORT ident:16; // unique identifier USHORT flags:16; UCHAR ttl:8; UCHAR proto:8; // protocol ( IP , TCP, UDP etc) USHORT checksum:16; UCHAR sourceIP[4]; UCHAR destIP[4];
}IPHEADER; typedef struct {//定义端口数据类型用于解析TCP和UDP中的源端口和目的端口 USHORT srcPort; USHORT decPort; }PORT; char *Proto[] = {"Reserved", "ICMP", "IGMP", "GGP", "IP", "ST", "TCP", "UCL", "EGP", "IGP", "BBN-RCC-MON", "NVP-II", "PUP", "ARGUS", "EMCON", "XNET", "CHAOS", "UDP", "MUX", "DCN-MEAS", "HMP", "PRM", "XNS-IDP", "TRUNK-1", "TRUNK-2", "LEAF-1", "LEAF-2", "RDP", "IRTP", "ISO-TP4", "NETBLT","MFE-NSP", "MERIT-INP", "SEP", "3PC", "IDPR", "XTP", "DDP", "IDPR-CMTP", "TP++", "IL", "SIP", "SDRP", "SIP-SR", "SIP-FRAG", "IDRP", "RSVP", "GRE", "MHRP", "BNA", "SIPP-ESP", "SIPP-AH", "I-NLSP", "SWIPE", "NHRP", "unassigned", "unassigned","unassigned", "unassigned", "unassigned", "unassigned","any host internal protocol", "CFTP", "any local network", "SAT-EXPAK", "KRYPTOLAN", "RVD", "IPPC", "any distributed file system", "SAT-MON", "VISA", "IPCV", "CPNX", "CPHB", "WSN", "PVP", "BR-SAT-MON", "SUN-ND", "WB-MON", "WB-EXPAK", "ISO-IP", "VMTP", "SECURE-VMTP", "VINES", "TTP", "NSFNET-IGP", "DGP", "TCF", "IGRP", "OSPFIGP", "Sprite-RPC", "LARP", "MTP", "AX.25", "IPIP", "MICP", "SCC-SP", "ETHERIP", "ENCAP", "any private encryption scheme", "GMTP"};
int npacketnum; int main(int argc, char *argv[]) { char *device = "eth0"; char errbuf[PCAP_ERRBUF_SIZE]; pcap_t *phandle; bpf_u_int32 ipaddress, ipmask; struct bpf_program fcode; int datalink; fprintf(stderr,"input filter is%s\n",argv[1]); if ((device = pcap_lookupdev(errbuf)) == NULL) { perror(errbuf); return 0; } else { fprintf(stderr,"device: %s\n", device); }
phandle = pcap_open_live(device, 200, 0, 500, errbuf); if (phandle == NULL) { perror(errbuf); return 0; }
if (pcap_lookupnet(device, &ipaddress, &ipmask, errbuf) == -1) { perror(errbuf); return 0; } else { char net[INET_ADDRSTRLEN], mask[INET_ADDRSTRLEN]; if (inet_ntop(AF_INET, &ipaddress, net, sizeof(net)) == NULL) { perror("inet_ntop"); } else if (inet_ntop(AF_INET, &ipmask, mask, sizeof(net)) == NULL) { perror("inet_ntop"); } fprintf(stderr,"IP Address: %s, Network Mask: %s\n", net, mask); }
int bflag = 1; while(bflag) { fprintf(stderr,"Input Packet Filter:>"); //char filterString[1024]; //scanf("%s",filterString); //if (pcap_compile(phandle, &fcode, filterString, 0, ipmask) == -1) { if (pcap_compile(phandle, &fcode, argv[1], 0, ipmask) == -1) { fprintf(stderr, "pcap_compile: %s,please input again\n", pcap_geterr(phandle)); } else bflag = 0; }
if (pcap_setfilter(phandle, &fcode) == -1) { fprintf(stderr, "pcap_setfilter: %s\n", pcap_geterr(phandle)); return 0; }
if ((datalink = pcap_datalink(phandle)) == -1) { fprintf(stderr, "pcap_datalink: %s\n", pcap_geterr(phandle)); return 0; } printf("datalink = %d\n", datalink); // capture_packet(datalink, phandle, fcode); npacketnum = 1; pcap_loop(phandle, 0, pcap_handle, NULL);// return 1; } //void dispatcher_handler(u_char *user,const struct pcap_pkthdr *header, const u_char *pkt_data) void pcap_handle(u_char *user,const struct pcap_pkthdr *header, const u_char *pkt_data) {
ETHHEADER *eth_header = (ETHHEADER *)pkt_data;//解析数据包的以太帧头部 fprintf(stderr,"Begin Analysis %d Packet\n",npacketnum++); fprintf(stderr,"packet length:%ld \n",header->len); if (header->len >= 14)// 解析数据包的IP头部 {
IPHEADER *ip_header=(IPHEADER *)(pkt_data+14); // 解析出协议类型 char strtype[100]; if (ip_header->proto > 99) strcpy(strtype ,"IP/UNKNOWN"); else strcpy(strtype, Proto[ip_header->proto]);
fprintf(stderr,"Source MAC:%02X-%02X-%02X-%02X-%02X-%02X", eth_header->SrcMac[0], eth_header->SrcMac[1], eth_header->SrcMac[2], eth_header->SrcMac[3], eth_header->SrcMac[4], eth_header->SrcMac[5]);// 提取源MAC地址 fprintf(stderr,"Dest MAC:%02X-%02X-%02X-%02X-%02X-%02X \n", eth_header->DestMac[0], eth_header->DestMac[1], eth_header->DestMac[2], eth_header->DestMac[3], eth_header->DestMac[4], eth_header->DestMac[5]);//提取目的MAC地址 // 提取源IP地址 fprintf(stderr,"Source IP:%d.%d.%d.%d",ip_header->sourceIP[0] ,ip_header->sourceIP[1],ip_header->sourceIP[2], ip_header->sourceIP[3]); // 提取目的IP地址 fprintf(stderr,"Dest IP:%d.%d.%d.%d\n",ip_header->destIP[0] ,ip_header->destIP[1],ip_header->destIP[2], ip_header->destIP[3]);