分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
Python是世界上最好的语言!它使用不可见的制表键作为其语法的一部分!
Vim和Emacs的区别在于,它可以帮助乌干达的儿童...
不讨论哲学,不看第一印象,也没有KPI相逼,但是
Python真的做到了”你不用操心语言本身,只需要关注你自己的业务逻辑需求“!
我的需求比较简单,那就是:
使用tcpdump/tshark抓取且仅抓取一类TCP流,该TCP流是HTTP流,访问特定的URL,如果用我们熟悉的tcpdump命令来表示,它可能是以下的样子:
tcpdump -i eth0 tcp port 80 and url 'www.baidu.com' -n ...
这个需求在经理看来,是比较简单的,无非就是加一个参数嘛,然而经理永远都不会关注实现的细节(其实不是他们不关注,而是他们对此根本就不懂,都是领域外的)。我来问,请经理来答。首先,数据包在被抓取的地方,是无连接信息的,一个网卡不可能记录一个数据包属于哪个数据流,网卡抓取的数据包就是孤立的数据包,即便BPF可以过滤出特定的五元组信息,请问这个五元组怎么跟HTTP协议关联?
好吧!如果不知道我在说什么,那么我可以更进一步。我们知道,一个访问特定URL的HTTP流的识别只有在客户端发出GET request的时候才能完成,而一个流的五元组的识别是在TCP连接发起的时候进行的,即SYN在GET之前。这可怎么办?
事情做起来总是要比想的时候更难,这个问题是我工作中的一个真实的需求,我也确实需要这个功能。找方案是需要时间的,有这个时间的话,我如果能用一种编程语言把以上的需求描述出来,那就成功了。作为从业这么多年的底层程序员,我表示除了C和BASH之外,别的编程语言都不会,连C++都不会!学Python学了好几年都没有结果,但是对于这个需求,我想试试。
Python以其功能丰富且强大的库著称,这也是其吸引诸多程序员的重要原因,然而,我更看重的是它简单的语法和语义,因为我没有时间去配置和学习那些纷乱的库。我看重的是Python组织数据的能力,虽然它并不直观的表达C语言中struct这样的东西,但是其pack/unpack以及List完全就可以满足我的需要。在我看来pack/unpack以及List就是一个结构和一个容器,结构+容器简直是万能的。所以,在本文中,我没有使用Python的pcap库,没有使用dpkt,而是字节解析pcap格式的文件。
Python的List容器里面可以放进去几乎所有的类型,你只需要知道放进去的是什么,那么日后取出来的时候,它就是什么。
现在,该展示脚本了。要承认的是,我不会编程,但也不是一点也不会,所以,我可以写出下面的代码,而且也能用,然而我的代码写得非常垃圾,我只是表达一下Python比较简单,如果有人有跟我一样的需求,看到这个代码,也可以拿去用,仅此而已。
把整个pcap文件看作是一个数据集合,每一个数据包当作一个数据项,这个任务就是执行一次按照五元组排序的过程,此时我也再一次印证了最基础的排序算法是多么重要。需要强调的是,这个排序过程必须是稳定排序,也就是说排序过后,数据包的相对顺序不能发生改变,这是为了保证同一个流数据包的时间序。
这么简单的想法以至于我真想马上就做!
然而当我想到各种在处理期间必须要面对的问题是,我就退缩了,比如要处理文件解析,字符串匹配,内存管理,内存比对...把这些加起来都是一个巨大的工程了(我在此奉劝那些眼高手低的博学之士或者那些没有做过一线coder的经理,不要再说”这个实现起来有什么困难吗?真的就那么难吗“,千万别再说这话,有本事你自己试一下就知道了,光说不练假把式)...
于是,我想到了Python,号称可以不必处理内存分配之类,毕竟解释语言嘛,你写出语句表达你的处理逻辑即可,至于编程,交给解释器吧,这就是解释语言代码写起来就跟写600字作文一样,异常轻松,而诸如C语言,则更像是面对计算机的”兽语“,能信手拈来的,都是猛士。
看情况吧,如果还有点时间,我会在最后给出Python版本的基于归并排序(其实嘛,只要是稳定排序均可)的数据流分离的实现,如果没有时间,就算了,这里仅仅作为一些个Tips。
看看有什么系统可以替我们做的。
记得前年,也就是2014年的时候,当时要搞一个检测平台的UI。我们知道UI是一个复杂无比的东西,需要层次数据结构来管理其结构,一般会选用树,我不怎么懂Python,事实上我是一个长期搞底层的,除了用C或者BASH做实验之外,别的编程语言对我而言都太陌生,然而我也知道C语言搞UI简直就是噩梦,需要你自己完成所有的数据组织,那怎么办?
用BASH做UI!
这好像是在说笑话,然而确实,我真的用BASH完成了一个树形结构管理的UI,类似make menuconfig那样的(编程者们可能会笑我,这些难道不是很简单吗?Tcl,Perl,Lua不是都可以秒间完成吗?是可以秒间完成,然而我不会这些,我不怎么会编程...)。我的这个BASH UI代码量十分短,并且简单。我是怎么做的呢?
我使用了文件系统。
如果用C语言来做一个树形结构,我们首先要定义结构体,然后分配内存对象并用数据填充,最后对这些数据进行增删改查。仔细考虑一下,建立一个内存文件系统,然后按照自己的需要去创建目录,文件,并且对这些个目录,文件的内容进行读写
Vim和Emacs的区别在于,它可以帮助乌干达的儿童...
不讨论哲学,不看第一印象,也没有KPI相逼,但是
Python真的做到了”你不用操心语言本身,只需要关注你自己的业务逻辑需求“!
我的需求比较简单,那就是:
使用tcpdump/tshark抓取且仅抓取一类TCP流,该TCP流是HTTP流,访问特定的URL,如果用我们熟悉的tcpdump命令来表示,它可能是以下的样子:
tcpdump -i eth0 tcp port 80 and url 'www.baidu.com' -n ...
这个需求在经理看来,是比较简单的,无非就是加一个参数嘛,然而经理永远都不会关注实现的细节(其实不是他们不关注,而是他们对此根本就不懂,都是领域外的)。我来问,请经理来答。首先,数据包在被抓取的地方,是无连接信息的,一个网卡不可能记录一个数据包属于哪个数据流,网卡抓取的数据包就是孤立的数据包,即便BPF可以过滤出特定的五元组信息,请问这个五元组怎么跟HTTP协议关联?
好吧!如果不知道我在说什么,那么我可以更进一步。我们知道,一个访问特定URL的HTTP流的识别只有在客户端发出GET request的时候才能完成,而一个流的五元组的识别是在TCP连接发起的时候进行的,即SYN在GET之前。这可怎么办?
事情做起来总是要比想的时候更难,这个问题是我工作中的一个真实的需求,我也确实需要这个功能。找方案是需要时间的,有这个时间的话,我如果能用一种编程语言把以上的需求描述出来,那就成功了。作为从业这么多年的底层程序员,我表示除了C和BASH之外,别的编程语言都不会,连C++都不会!学Python学了好几年都没有结果,但是对于这个需求,我想试试。
Python以其功能丰富且强大的库著称,这也是其吸引诸多程序员的重要原因,然而,我更看重的是它简单的语法和语义,因为我没有时间去配置和学习那些纷乱的库。我看重的是Python组织数据的能力,虽然它并不直观的表达C语言中struct这样的东西,但是其pack/unpack以及List完全就可以满足我的需要。在我看来pack/unpack以及List就是一个结构和一个容器,结构+容器简直是万能的。所以,在本文中,我没有使用Python的pcap库,没有使用dpkt,而是字节解析pcap格式的文件。
Python的List容器里面可以放进去几乎所有的类型,你只需要知道放进去的是什么,那么日后取出来的时候,它就是什么。
现在,该展示脚本了。要承认的是,我不会编程,但也不是一点也不会,所以,我可以写出下面的代码,而且也能用,然而我的代码写得非常垃圾,我只是表达一下Python比较简单,如果有人有跟我一样的需求,看到这个代码,也可以拿去用,仅此而已。
0.pcap文件分流与归并排序
起初,我认为将一个偌大的包含N多个TCP流的pcap文件分解成一个个的包含单独TCP流的pcap文件,这是一件简单的事情。把整个pcap文件看作是一个数据集合,每一个数据包当作一个数据项,这个任务就是执行一次按照五元组排序的过程,此时我也再一次印证了最基础的排序算法是多么重要。需要强调的是,这个排序过程必须是稳定排序,也就是说排序过后,数据包的相对顺序不能发生改变,这是为了保证同一个流数据包的时间序。
这么简单的想法以至于我真想马上就做!
然而当我想到各种在处理期间必须要面对的问题是,我就退缩了,比如要处理文件解析,字符串匹配,内存管理,内存比对...把这些加起来都是一个巨大的工程了(我在此奉劝那些眼高手低的博学之士或者那些没有做过一线coder的经理,不要再说”这个实现起来有什么困难吗?真的就那么难吗“,千万别再说这话,有本事你自己试一下就知道了,光说不练假把式)...
于是,我想到了Python,号称可以不必处理内存分配之类,毕竟解释语言嘛,你写出语句表达你的处理逻辑即可,至于编程,交给解释器吧,这就是解释语言代码写起来就跟写600字作文一样,异常轻松,而诸如C语言,则更像是面对计算机的”兽语“,能信手拈来的,都是猛士。
看情况吧,如果还有点时间,我会在最后给出Python版本的基于归并排序(其实嘛,只要是稳定排序均可)的数据流分离的实现,如果没有时间,就算了,这里仅仅作为一些个Tips。
1.编码之前
虽然我知道Python来实现排序算法要比C更加简洁和直接,但是在着手去编码之前,还是要经过一些思考,因为可能连排序算法都不用实现。看看有什么系统可以替我们做的。
记得前年,也就是2014年的时候,当时要搞一个检测平台的UI。我们知道UI是一个复杂无比的东西,需要层次数据结构来管理其结构,一般会选用树,我不怎么懂Python,事实上我是一个长期搞底层的,除了用C或者BASH做实验之外,别的编程语言对我而言都太陌生,然而我也知道C语言搞UI简直就是噩梦,需要你自己完成所有的数据组织,那怎么办?
用BASH做UI!
这好像是在说笑话,然而确实,我真的用BASH完成了一个树形结构管理的UI,类似make menuconfig那样的(编程者们可能会笑我,这些难道不是很简单吗?Tcl,Perl,Lua不是都可以秒间完成吗?是可以秒间完成,然而我不会这些,我不怎么会编程...)。我的这个BASH UI代码量十分短,并且简单。我是怎么做的呢?
我使用了文件系统。
如果用C语言来做一个树形结构,我们首先要定义结构体,然后分配内存对象并用数据填充,最后对这些数据进行增删改查。仔细考虑一下,建立一个内存文件系统,然后按照自己的需要去创建目录,文件,并且对这些个目录,文件的内容进行读写