python 小笔记(网络编程和并发)

1.OSI七层协议

OSI是一个开放性的通信系统互连参考模型,其中应用层 、表示层  、会话层、 传输层定义了应用程序的功能,下面网络层 、 数据链路层 、物理层主要面向通过网络的端到端的数据流。

OSI七层网络模型

TCP/IP四层概念模型  

对应网络协议

各层的作用    

应用层(Application)

应用层

HTTP、TFTP, FTP, NFS, WAIS、SMTP

直接为用户的应用进程提供服务

表示层(Presentation)

Telnet, Rlogin, SNMP, Gopher

定义数据格式及加密

会话层(Session)

SMTP, DNS

定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层

传输层(Transport)

传输层

TCP, UDP

向两个主机中进程之间的通信提供服务

网络层(Network)

网络层

IP, ICMP, ARP, RARP, AKP, UUCP

使用无连接的网际协议 IP 和许多种路由选择协议。负责为分组交换网上的不同主机提供通信服务,把运输层产生的报文段或用户数据报封装成分组(也叫IP数据报或数据报)或包进行传送。网络层的另一个任务就是选择合适的路由

数据链路层(Data Link)

数据链路层

FDDI, Ethernet, Arpanet, PDN, SLIP, PPP

定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关,将网络层交下来的 IP 数据报组装成帧,在两个相邻结点(主机和路由器,或两个路由器)之间的链路上“透明”地传送帧中的数据

物理层(Physical)

IEEE 802.1A, IEEE 802.2到IEEE 802.11

传送数据的单位是比特。物理层的任务就是透明地传送比特流

 

C/S和B/S架构

Client/Server结构(C/S结构)客户机和服务器结构,它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统执行后台服务,如ORACLE、SYBASE、InfORMix或 SQL Server。客户端需要安装专用的客户端软件,负责执行前台功能。优点就是客户端响应速度快,充分发挥客户端PC的处理能力。缺点:只适用于局域网;专用的客户端软件,维护和升级成本非常高;对客户端的操作系统一般也会有限制;

B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件,在这种结构下,用户界面完全通过WWW浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。

ARP协议

地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,

并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。

局域网(Local Area Network),简称LAN,是指在某一区域内由多台计算机互联成的计算机组。“某一区域”指的是同一办公室、同一建筑物、同一公司和同一学校等,一般是方圆几千米以内。局域网可以实现文件管理、应用软件共享、打印机共享、扫描仪共享、工作组内的日程安排、电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,也可以由一个公司内的上千台计算机组成。

广域网(Wide Area Network),简称WAN,是一种跨越大的、地域性的计算机网络的集合。通常跨越省、市,甚至一个国家。广域网包括大大小小不同的子网,子网可以

是局域网,也可以是小型的广域网。

socket

网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,是面向客户/服务器模型而设计的,解决了进程之间建立通信连接的问题。

基于TCP(面向连接)的socket编程,分为客户端和服务器端。

客户端的流程如下:

(1)创建套接字(socket)

(2)向服务器发出连接请求(connect)

(3)和服务器端进行通信(send/recv)

(4)关闭套接字

服务器端的流程如下:

(1)创建套接字(socket)

(2)将套接字绑定到一个本地地址和端口上(bind)

(3)将套接字设为监听模式,准备接收客户端请求(listen)

(4)等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)

(5)用返回的套接字和客户端进行通信(send/recv)

(6)返回,等待另一个客户请求。

(7)关闭套接字。

粘包:指TCP中,发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。

数据粘包问题的出现,是因为在客户端/服务器端都会有一个比较大的数据缓冲区,来存放接收的数据,为了保证能够完整的接收到数据,因此缓冲区都会设置的比较大。在收发数据频繁时,由于tcp传输消息的无边界,会导致客户端/服务器端不知道接收到的消息到底是第几条消息,因此,会导致类似一次性接收几条消息的情况,从而乱码。

发生粘包的情况

要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包。

接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包。

...

所谓I/O多路复用机制,就是说通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。select,poll,epoll都是IO多路复用的机制

select、poll、epoll模型的区别

进程、线程和协程的区别以及应用场景

1、进程多与线程比较

线程与进程的区别:

1) 地址空间:线程是进程内的一个执行单元,也是进程内的可调度实体。进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间

2) 资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

3) 线程是处理器调度的基本单位,但进程不是

4) 二者均可并发执行 

5) 每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制

2、协程多与线程进行比较 

1) 一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU。 

2) 线程进程都是同步机制,而协程则是异步 

3) 协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态

IO密集型一般使用多线程或者多进程,CPU密集型一般使用多进程,强调非阻塞异步并发的一般都是使用协程。其他情况也会使用多进程线程池结合的或者其他组合。

GIL

GIL全称Global Interpreter Lock全局解释器锁,一个防止多线程并发执行机器码的一个Mutex,解决解决多线程之间数据完整性和状态同步。作用:保证同一时刻,只有一个线程被CPU执行,无论你有多少个线程。全局锁的存在会对多线程的效率有不小影响。甚至就几乎等于Python是个单线程的程序

python如何使用线程池和进程池

Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我们就要编写自己的线程池/进程池,以空间换时间。但从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象,对编写线程池/进程池提供了直接的支持。

threading.local的作用

创建全局ThreadLocal线程局部变量对象,可以创建一个对象,每个线程都可以对他读写属性,但不会互相影响。

进程间通讯有多种方式

包括信号,管道,消息队列,信号量,共享内存,socket等,multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的。

异步非阻塞:可以同时监控多个事件,调用时是带超时时间的阻塞,准备好了就返回,没准备好放到epoll中等待。

同步非阻塞:立即返回EAGAIN,告知没准备好数据,可以做其他事情,但是需要去轮询

路由器和交换机有哪些区别:

A.工作层次不同,路由器在网络层,交换机在中继层。

B.数据转发所依据的对象不同,交换机是利用物理地址或者说MAC地址来确定转发数据的目的地址。而路由器则是利用不同网络的ID号(即IP地址)来确定数据转发的地址。

C.传统的交换机只能分割冲突域,不能分割广播域;而路由器可以分割广播域。

D.路由器提供了防火墙的服务。

域名解析

就是将域名重新转换为IP地址的过程。一个域名对应一个IP地址,一个IP地址可以对应多个域名;所以多个域名可以同时被解析到一个IP地址。域名解析需要由专门的域名解析服务器(DNS)来完成

生产者和消费者模型应用场景以及优势

 生产者不关心数据什么时候被处理,消费者不关心数据什么时候产生,实现了解耦,也解决了阻塞

CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输得更快、更稳定。

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。支持高并发请求的同时保持高效的服务。

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换,作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。

负载均衡(Load Balance,简称LB)是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性。负载均衡基本概念有:实服务、实服务组、虚服务、调度算法、持续性等,其常用应用场景主要是服务器负载均衡,链路负载均衡。

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程

asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。

gevent是第三方库,通过greenlet实现协程

twisted框架是一个异步机制的框架,用python语言写的事件驱动的网络框架

twisted网络框架的三个基础模块:Protocol, ProtocolFactory, Transport.这三个模块是构成twisted服务器端与客户端程序的基本。

Protocol:Protocol对象实现协议内容,即通信的内容协议
ProtocolFactory: 是工厂模式的体现,在这里面生成协议
Transport: 是用来收发数据,服务器端与客户端的数据收发与处理都是基于这个模块

猜你喜欢

转载自www.cnblogs.com/master-song/p/9128643.html