第二章-Python网络编程课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第二章-Python网络编程课件.pptx》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二 Python 网络 编程 课件
- 资源描述:
-
1、第二章 Python网络编程第二章 Python网络编程2.1 网络网络基础基础2.2 Socket模块模块2.3 SocketServer模块模块2.4 Scapy基础基础2.5 Scapy高级用法高级用法2.6 urllib2和和cookielib模模块块2.7 Scrapy模块模块习题习题第二章 Python网络编程2.1 网网 络络 基基 础础2.1.1 OSI参考模型与参考模型与TCP/IP参考模型参考模型开放系统互连(OSI)参考模型是为实现开放系统互连所建立的通信功能分层模型,简称OSI参考模型。OSI参考协议为异种计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性
2、和兼容性提供共同的参考。这里所说的开放系统,实质上指的是遵循OSI参考模型和相关协议能够实现互连的具有各种应用目的的计算机系统。OSI参考模型以及在通信中具体的功能如图2-1所示。 第二章 Python网络编程图2-1 OSI参考模型第二章 Python网络编程TCP/IP参考模型及相关协议如图2-2所示,其中各层的含义如下:(1) 应用层:向用户提供的各种应用服务协议,典型的有域名服务、网页服务等。(2) 传输层:在两个进程或者主机之间提供可靠或者不可靠的传输服务。(3) 网际层(或称网络互联层):处理来自传输层的分组发送请求。将分组装入IP数据报,填充报头,根据路由算法选择去往目的节点的路
3、径,然后将数据包发送适当的端口。第二章 Python网络编程(4) 网络接入层:该层的功能包括IP地址与物理硬件地址的映射,将上层数据封装成帧;基于不同类型的网络接口,网络接入层定义了通信方式和物理介质;作为TCP/IP协议的最底层,负责接收从网际层传来的IP数据报,并且将IP数据报通过底层物理网络发出去,或者从底层的物理网络上接收物理帧,解封装出IP数据报,交给网络层处理。第二章 Python网络编程图2-2 TCP/IP参考模型第二章 Python网络编程2.1.2 TCP三次握手以及五元组三次握手以及五元组“三次握手”指的是发送数据前的准备阶段。服务端和客户端之间通过TCP三次交互,建立
4、起可靠的双工连接,然后开始传送数据。三次握手的详细流程如下:(1) 第一次握手:客户端发送SYN分组(SYN=1, seq=j)到服务端,表示客户端请求同服务端建立连接,客户端的序列号是j,然后等待服务端确认。第二章 Python网络编程(2) 第二次握手:服务端收到客户端发来的SYN分组后,响应客户的SYN分组,置ACK位,应答序列号为j+1(ACK=1, seqack=j+1),同时也置位SYN(SYN=1, seq=k),服务端的序列号为k,即SYN+ACK分组。(3) 第三次握手:客户端收到服务端的SYN+ACK分组,向服务端返回确认分组ACK(ACK=1, seqack=k+1),此
5、分组发送完毕,客户端和服务端进入连接建立状态,完成三次握手。图2-3和图2-4分别给出了三次握手的工作方式以及实际抓取的数据包。第二章 Python网络编程图2-3 三次握手工作方式第二章 Python网络编程图2-4 三次握手数据包第二章 Python网络编程在实际通信过程中,客户端或者服务端往往有大量的网络连接,为了确保不同网络连接的数据互相之间不会串扰,比如浏览器收到的数据不会被送往邮件客户端,引入了五元组的概念用于识别每条网络连接。这个五元组为:源IP地址 源端口 目的IP地址 目的端口和传输层协议第二章 Python网络编程例如,图2-4对应的五元组就是192.168.1.19 20
6、588 52.81.9.223 80 TCP,其意义是,一个IP地址为192.168.1.19的客户机通过端口20588,利用TCP协议,和IP地址为52.81.9.223、端口为80的服务端建立了网络连接。五元组在网络编程中也称为Socket(套接字)。有了套接字,就可以唯一确定一条网络连接,也就是通信双方及其通信协议。网络编程的第一步就是建立套接字。第二章 Python网络编程2.2 Socket模块模块2.2.1 Socket基础基础Socket的字面意思就是插座,其本意就是通过插座可以连接电网,获得电力服务。而网络也是一样的,可以通过Socket获得网络连接的服务,只要建立标准的Soc
7、ket,程序就可以实现网络的通信服务。因此在Socket网络编程中,首先就是建立Socket,然后就是通信双方互相传输数据。第二章 Python网络编程1. 常量常量在Python语言提供的Socket模块中,常量主要分为地址簇和socket类型两部分,具体参数如表2-1中所示。第二章 Python网络编程2. Socket函数函数Socket模块中包含很多网络服务相关的函数,其中最常使用的是创建一个socket对象:socket.socket(family, type, proto)其中,family为地址簇;type为socket类型;proto默认为0或缺省。此外还有一些常用的函数如表2
8、-2所示。第二章 Python网络编程第二章 Python网络编程3. Socket对象方法对象方法在实际编程过程中,对象方法是编程中经常会用到的,也是我们学习的重点,表2-3中给出了一些常用的Socket对象方法。第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程2.2.2 Socket编程编程1. 客户端客户端/服务端通信模型服务端通信模型基于Socket连接的客户端与服务端通信模型如图2-5所示,整个通信过程如下:(1) 通信模型中服务端处于被动侦听状态,随时接受客户端的连接请求,是服务提供方。(2) 通信模型中的客户端是主动连接服务端的,是服务需求方。
9、第二章 Python网络编程(3) 通信模型中的客户端和服务端实际上都不是传统的主机或者计算机,而是进程。因此一台主机可以同时运行多个不同的客户端或者服务端。客户端和服务端可以在同一台或不同的主机上。进程根据协议的端口号识别。(4) 客户端通过connect函数调用同服务端建立连接。(5) 客户端和服务端互相传递数据。(6) 客户端和服务端关闭网络连接。第二章 Python网络编程图2-5 客户端/服务端通信模型第二章 Python网络编程2. TCP客户端客户端编写TCP客户端的思路比较简单,大体上是先创建一个Socket对象,然后将其与服务端相连接并发送数据,最后等待服务端的响应并将响应结
10、果输出。该编程的思路如图2-6所示。第二章 Python网络编程图2-6 TCP客户端第二章 Python网络编程第二章 Python网络编程3. TCP服务端服务端TCP服务端与客户端的主要区别是:服务端是等待客户来连接,所以在思路上应该进行相应的调整。编写TCP服务端的思路是,首先创建一个socket实例,然后将其与需要监听的地址端口进行绑定并开启监听,随后等待客户来连接并进行通信。图2-7给出了TCP服务端的工作流程。第二章 Python网络编程图2-7 TCP服务端第二章 Python网络编程4. TCP代理代理通过前面对TCP客户端、服务端的编写,我们已经对Socket编程有了初步的
11、了解。下面将完成一个TCP代理程序的编码。该TCP代理主要实现的是图2-8中所示的功能。第二章 Python网络编程图2-8 TCP代理功能示意图第二章 Python网络编程在这里,我们要实现的代理是将服务端的端口A代理到代理端口B上。所有客户端访问代理端口B的流量都被重定向到服务端的端口A,相当于代理端在客户端和服务端之间进行中转,因此上述流量可以在代理端进行劫持或者修改,其详细工作流程如图2-9所示。 第二章 Python网络编程图2-9 代理工作流程第二章 Python网络编程实现这样的TCP代理并不困难,核心的思想就是创建两个Socket,一个和客户端(C)被动通信,一个和服务端(S)
12、主动通信。下面先在函数server_loop中建立监听本地主机的Socket,具体代码如下:第二章 Python网络编程第二章 Python网络编程在server_loop中开启了一个新线程用于执行proxy_handler,创建监听服务端的Socket,具体代码如下:第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程最后将其余代码补全,分别编写main函数用于命令行解析和hexdump函数实现十六进制显示转换,receive_from函数实现数据接收,request_handler函数和response_handler函数分别实现
13、对数据包的修改,具体代码如下:第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程这里以代理FTP服务为例,在代理端将的端口21代理到本机的端口21,然后访问FTP服务。首先开启代理:rootkali:# python /root/TCP_Proxy.py 0.0.0.0 21 21 True然后,在客户端访问FTP服务,如图2-10所示。第二章 Python网络编程图2-10 FTP连接 第二章 Python网络编程与此同时,可以在代理端得到如下的结果:第二章 Python网络
14、编程第二章 Python网络编程第二章 Python网络编程2.3 SocketServer模块模块2.3.1 SocketServer基础基础SocketServer中包含了两种类,一种为服务类(server class);另一种为请求处理类(request handle class)。一般情况下,所有的服务都是先建立连接,也就是建立一个服务类的实例;然后开始处理用户请求,也就是建立一个请求处理类的实例。第二章 Python网络编程1. 服务类服务类SocketServer中提供了五种服务类,并提供了服务类的相关方法。常用的SocketServer服务类和相关方法分别如表2-4与表2-5所示
15、。第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程2. 请求处理类请求处理类要实现一项网络服务,还必须派生一个handler class请求处理类,并重写父类的handle( )方法。handle( )方法是用来专门处理客户端请求的。SocketServer模块提供的请求处理类有BaseRequestHandler,以及它的派生类StreamRequestHandler和DatagramRequestHandler。从名字可以看出,一个处理流式套接字;另一个处理数据报套接字。请求处理类的方法有三种,如表2-6所示。第二章 Python网络编程第二章 Pyth
16、on网络编程2.3.2 SocketServer编程编程根据服务类BaseServer和请求处理类BaseRequestHandle,创建服务端程序的基本流程如下:(1) 创建一个请求处理类,合理选择StreamRequestHandler和DatagramRequestHandler之中的一个作为父类(当然,也可使用BaseRequestHandler作为父类),并重写它的handle()方法。(2) 实例化一个服务类对象,在实例化时需要两个参数:服务类地址和之前创建的请求处理类的实例。(3) 调用服务类对象的handle_request()或serve_forever()方法开始处理请求。
17、第二章 Python网络编程具体的代码如下所示:第二章 Python网络编程第二章 Python网络编程2.4 Scapy基础基础Scapy(网址为https:/ Python网络编程图2-11 Scapy功能应用第二章 Python网络编程Scapy内置大量的操作命令,支持Internet使用的各种网络协议,从而使得Scapy成为名副其实的交互式网络操作工具。Scapy的lsc命令可以显示模块中可用的命令,每条命令的详细用法可以用help查阅,具体代码如下:第二章 Python网络编程第二章 Python网络编程第二章 Python网络编程运行ls()命令可以获取Scapy支持的所有协议,具
18、体代码如下:第二章 Python网络编程2.4.1 数据包的查看数据包的查看Scapy提供多种方法显示网络分组的详细信息。其中,方法ls( )显示的信息较为详细,包括字段类型、字段默认值和实际值,具体代码如下: ls(IP() # 只显示IP协议层的数据包第二章 Python网络编程第二章 Python网络编程命令show( )也能显示网络分组的相关信息,而且更为简洁和直观,在实际中经常使用。第二章 Python网络编程使用pdfdump( )函数以及psdump( )函数可以将数据包转化为pdf文件和eps文件,以实现图形化显示数据包内容,见图2-12。在这里以pdfdump( )为例,具体
19、代码如下:第二章 Python网络编程图2-12 pdf图形化显示数据包内容第二章 Python网络编程此外,还可以通过各种形式解析数据包,比如转化成字符串或十六进制的形式,甚至转化为字符串的数据包也能通过Ether( )方法进行解析。第二章 Python网络编程2.4.2 数据包的构造数据包的构造1. 简单构造简单构造网络中所有数据的交换都是通过数据包的传输实现的,如果想要创建一个自己想要的数据包,Scapy提供了非常简单的实现方法。前面我们已经通过ls()函数可知Scapy所支持的各种网络协议。第一种方法,是在构造每种网络协议数据包的同时修改字段信息,具体代码如下:第二章 Python网络
20、编程第二章 Python网络编程第二种方法,则是先构造默认数据包,再对字段值进行修改,也可以达到同样的效果。具体代码如下:第二章 Python网络编程上例中给出了创建IP数据包的方式,数据包中的每一个字段都是可以设置的,也可以通过笛卡尔积的方式一次性生成多个数据包。第二章 Python网络编程2. 协议栈协议栈我们知道,计算机网络采用的是分层体系结构,也就是说,通常一个完整的数据包是由多个协议组成的。为此,Scapy也是采用分层次的方式实现各层协议,利用运算符“/”实现不同层协议数据的拼接。除此以外,Scapy各层协议的数据包均继承于Packet,各层之间又彼此包含。Scapy协议栈的工作方式
21、如图2-13所示。 第二章 Python网络编程图2-13 Scapy协议栈第二章 Python网络编程从图中可知,协议字段可以分为三种类型:默认字段、根据上层协议自动设置的重载字段以及用户设置字段。例如:第二章 Python网络编程2.4.3 数据包的发送与接收数据包的发送与接收知道了如何构造、查看数据,我们进一步学习通过数据包实现信息的传输。单纯实现数据包发送的函数包括send()和sendp(),唯一的区别是send()函数在第三层协议(网络层)发送数据包,而sendp()函数在第二层协议(数据链路层)发送数据包。例如:第二章 Python网络编程sr()函数包含参数inter、retr
展开阅读全文