第五章 网络编程和并发编程

一、python的底层网络交互模块有哪些?

  socket, urllib,urllib3 , requests, grab, pycurlpython

二、简述OSI七层协议

  应用层:HTTP,FTP,NFS程序员

  表示层:Telnet,SNMP算法

  会话层:SMTP,DNS编程

  传输层:TCP,UDP设计模式

  网络层:IP,ICMP,ARP,数组

  数据链路层:Ethernet,PPP,PDN,SLIP,FDDI浏览器

  物理层:IEEE 802.1A,IEEE 802.11安全

三、什么是C/S和B/S架构

  C/S架构:是指客服端和服务端,交互性好,对服务器压力小,安全,可是更新服务端的是后客户端也得更新。服务器

  B/S架构:是指浏览器和服务器,优势是不须要更新客服端,缺点是交互性差,安全性低。网络

四、简述TCP三次握手四次挥手的过程。

  创建链接:

  第一次握手:客户端向服务器发出请求。

  第二次握手:服务器收到请求,赞成链接,想客服端发送确认报文。

  第三次握手:客服端接收到报文,向上层应用传达已创建链接。

  释放链接:

  第一次挥手:数据传输结束后,客服端发送链接释放报文段,并结束数据传输。

  第二次挥手:服务端接收到链接释放报文段后,向客户端发送确认报文。

  第三次挥手:服务器没有要发送的数据后,其应用进程就通知服务器释放TCP链接。这个阶段服务器所发出的最后一个报文。

  第四次挥手:客户端收到链接释放报文段以后,必须发出确认。再通过2MSL(最长报文端寿命)后,本次TCP链接真正结束,通讯双方完成了他们的告别。

五、什么事arp协议?

  arp协议是地址解析协议,使用ARP协议可实现经过IP地址得到对应主机的物理地址(MAC地址)。

六、TCP协议和UDP协议的区别?为何TCP协议更可靠?

  一、TCP是面向链接的,发送数据以前必须创建链接,UDP不须要创建链接就能够发送数据。

  二、TCP协议提供可靠的服务,经过TCP传输数据,无差错,不丢失,不重复,且按序到达,UDP是尽最大努力交付,且不保证可靠交付。

  三、TCP面向字节流,其实是TCP把数据当作一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,所以网络出现拥塞不会使源主机的发送速率下降(对实时应用颇有用,如IP电话,实时视频会议等)

  四、每一条TCP链接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通讯。

  五、TCP首部开销20字节;UDP的首部开销小,只有8个字节。

  六、TCP的逻辑通讯信道是全双工的可靠信道,UDP则是不可靠信道

  tcp:可靠 对方给了确认收到信息,才发下一个,若是没收到确认信息就重发  

  udp:不可靠 一直发数据,不须要对方回应

七、什么是局域网和广域网?

  局域网,LAN(Local Area Network)是指在某一区域内(如一个学校、工厂和机关内)由多台计算机互联成的计算机组。

  广域网,WAN(Wide Area Network)也称远程网。一般跨接很大的物理范围,所覆盖的范围从几十千米到几千千米,它能链接多个城市或国家,或横跨几个洲并能提供远距离通讯,造成国际性的远程网络。

八、什么是socket?简述基于TCP协议的套接字通讯流程。

  Socket是应用层与TCP/IP协议族通讯的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来讲,一组简单的接口就是所有。  

九、什么是黏包?socket中形成黏包的缘由是什么?哪些状况会发生黏包现象。

  黏包就是数据黏在一块儿,TCP协议是面向字节流的,基于tcp的套接字客户端往服务端上传文件,发送时文件内容是按照一段一段的字节流发送的,在接收方看了,根本不知道该文件的字节流从何处开始,在何处结束

  所谓粘包问题主要仍是由于接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所形成的。

  只有TCP有粘包现象,UDP永远不会粘包。

  客户端粘包:

  发送端须要等缓冲区满才发送出去,形成粘包(发送数据时间间隔很短,数据量很小,TCP优化算法会当作一个包发出去,产生粘包)

  服务端粘包:

  接收方不及时接收缓冲区的包,形成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候仍是从缓冲区拿上次遗留的数据,产生粘包)

十、IO多路复用的做用

  阻塞IO:特色就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被阻塞了。

  非阻塞IO:特色就是,数据准备阶段,用户发出read操做时,若是数据没有准备完成,会马上返回一个error,用户进程能够去作其余事情,须要不断的轮询查看数据是否准备完成,可是在数据拷贝期间,进程仍是阻塞的。

  IO多路复用:select和epoll可让单个线程同时处理多个链接,内核会监视全部select负责的socket,当有一个数据准备完成时,select就会返回,这是用户进程就能够直接进行read操做了。适用于多个链接。

  异步IO:用户进程发出read操做时就能够去干其余事了,内核会等数据准备完成时,将数据拷贝到进程,这一切完成后,内核会给用户进程发一个报文,告知一切都已完成。

十一、什么是防火墙以及做用?

  防火墙做为一个边界防护工具,其监控流量——要么容许它、要么屏蔽它。

十二、select, poll, epoll的区别

  select:它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至所有),咱们只能无差异轮询全部流,找出能读出数据,或者写入数据的流,对他们进行操做。因此select具备O(n)的无差异轮询复杂

  度,同时处理的流越多,无差异轮询时间就越长。

  poll:本质上和select没有区别,它将用户传入的数组拷贝到内核空间,而后查询每一个fd对应的设备状态, 可是它没有最大链接数的限制,缘由是它是基于链表来存储的.

  epoll:epoll能够理解为event poll,不一样于忙轮询和无差异轮询,epoll会把哪一个流发生了怎样的I/O事件通知咱们。因此咱们说epoll其实是事件驱动(每一个事件关联上fd)的,此时咱们对这些流的操做都是有意义的。

1三、请简述进程、线程、协程的区别,以及应用场景。

  进程:操做系统是由一个个的进程组成的,一个应用程序就能够看做一个进程,他有本身独立的运行空间,有本身独立的堆和栈,进程是操做系统资源分配的最小单位。

  线程:线程是属于进程的,进程能够建立线程,线程之间共享堆不共享栈,线程是操做系统资源调动的最小单位。

  协程:协程也是共享堆不共享栈,他是由程序员调度的。

1四、什么是GIL锁。

  GIL是全局解释锁,这个机制只容许一个线程控制python解释器。

1五、python中如何使用线程池和进程池?

   concurrent.futures 模块中的 Executor,Executor 提供了两个子类,即 ThreadPoolExecutor 和 ProcessPoolExecutor,其中 ThreadPoolExecutor 用于建立线程池,而 ProcessPoolExecutor 用于建立进程池。

1六、threading.local的做用?

  threading.local()这个方法的特色用来保存一个全局变量,可是这个全局变量只有在当前线程才能访问,若是你在开发多线程应用的时候  须要每一个线程保存一个单独的数据供当前线程操做,能够考虑使用这个方法,简单有效。

1七、进程之间如何进行通讯?

  一、管道,一般指无名管道,是 UNIX 系统IPC最古老的形式。

  特色:单向的,具备固定的读端和写端,他只能用于有亲缘关系的进程之间(父子进程、兄弟进程),他能够看做特殊的文件,能够读写,可是寻在于内存中。

  二、FIFO,也称为命名管道,它是一种文件类型。 

  特色:他能够在无关进程之间通讯,能够看做一种特殊的设备文件,存在于文件系统中。

  三、消息队列,是消息的连接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。 

  特色:他是面向记录的,有必定特殊的格式和优先级,消息队列是独立于进程的,进程消失,消息队列不会消失,消息不必定是先进先出的顺序,也能够根据类型读取。

  四、信号量(semaphore)与已经介绍过的 IPC 结构不一样,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通讯数据。

  特色:信号量用于进程间同步,若要想在进程间传递顺序须要共享内存。

  五、共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。

  特色:共享内存是最快的一种IPC,由于进程是直接堆内存进行存取,由于多个进程能够同时操做,因此须要进行同步,信号量和共享内存一般一块儿使用。

1八、什么是并发和并行?

  并发:在计算机领域开发过程当中,并发指的是应用可以交替执行不一样的任务,好比多线程,多线程并不是是同时执行多个任务,而是经过时间轮转发等算法的调度,时多个任务以咱们察觉不到的速度交替执行。

  并行:指多个任务同时执行。

  区别:一个是交替,一个是同时。

1九、解释什么是异步非阻塞。

  同步阻塞:调用结果返回前,进程会被挂起,直到调用结果返回,效率低。

  异步阻塞:不一样的是,调用结果返回前会用回调或者消息的方式通知进程,可是调用结果返回前,进程仍是会被挂起,效率同样的低。

  同步非阻塞:调用结果返回前,进程能够去作其余事情,可是须要经过轮询不断的查看调用结果是否返回,效率比前两个高,可是耗CPU,也通常。

  异步非阻塞:调用结果返回以前,进程能够去作其余事情,当函数调用完成后,会以回调或者消息的形式通知进程,效率最高。

20、路由器和交换机的区别?

  区别一:路由器能够给局域网自动分配IP,虚拟拨号。交换机则只是用来分配网络数据的。

  区别二:路由器能够把一个IP分配给不少个主机使用,这些主机对外只表现出一个IP。交换机能够把不少主机连起来,这些主机对外各有各的IP。

  区别三:交换机工做在中继层,根据MAC地址寻址,不能处理TCP/IP协议。

      路由器工做在网络层,根据IP地址寻址,能够处理TCP/IP协议。

  区别四:路由器提供防火墙服务,交换机不能提供该功能。

2一、什么是域名解析?

  域名解析是把域名指向网站空间IP,让人们经过注册的域名能够方便地访问到网站一种服务。IP地址是网络上标识站点的数字地址,为方便记忆,采用域名来代替IP地址标识站点地址。域名解析就是域名到IP地址的转换过程。

2二、如何修改本地的hosts文件?

  vi/ etc/host

2三、生产者消费者模型应用场景

  不少的生产者同时生产数据到流水线上,而后消费者在从流水线上取下,这样咱们能够有多个生产者同时生产提高了效率,同时也能够容纳多个消费者在流水线上消费。

  爬虫的时候,会将网上的大量数据爬取下来放入本地或者云端供将来使用,若是数据量太大,咱们的处理器会处理不过来,这时候就能够引入生产者,流水线,消费者的概念,就能够解决这个问题。

2四、什么是cdn?

  CDN的全称是Content Delivery Network,即内容分发网络。CDN是一组分布在多个不一样地理位置的Web服务器,用于更加有效地向用户发布内容,在优化性能时,会根据距离的远近来选择。

2五、程序从FlagA执行到FlagB的时间大体为多少秒?

import threading
import time

def _wait():
    time.sleep(60)
#FlagA
t = threading.Thread(target=_wait, daemon=False)
t.start()
#FlagB

  大体为0秒,由于线程开启速度很是快,start()方法为异步非阻塞,因此不会等待任务的结束。

2六、有A.txt和B.txt两个文件,使用多进程和进程池的方式分别读区者两个文件。

2七、如下哪些是常见的TCP Flags?

  SYN, ACK

2八、下面有关网络七层和四层的描述哪格式错误的?

  SNMP工做在四层

2九、tracerroute通常使用的是哪一种网络层协议?

  ICMP

30、iptables知识考察,根据要求写出防火墙规则。

  A、屏蔽192.168.1.5访问本机dns服务端口。

     BLOCK_THIS_IP="192.168.1.5"

  B、容许10.1.1.0/24访问本机的udp 8888 9999 端口

     iptables -t filter -A INPUT -s 192.168.1.0/24 -p udp -m state --state NEW -m udp --dport 8888 9999 -j ACCEPT

3一、

3二、请实现一个简单的socket编程,要求:

  一、实现server端的功能便可

  二、遵循基本语言编程规范

import socket

sk = socket.socket()
sk.bind(('127.0.0.1', 8800))  # 把地址绑定到套接字
sk.listen()  # 监听连接
conn, addr = sk.accept()  # 接受客户端连接
ret = conn.recv(1024)  # 接受客服端发来的数据
print(ret)  # 保存客户端数据
conn.send(b'hi')  # 想客户端发送信息
conn.close()  # 关闭客户端连接
sk.close()  # 关闭服务器套接字套接字

  顺便把客户端的也放上来吧

import socket

sk = socket.socket()
sk.connect(('127.0.0.1', 8800))
sk.send(b'hi')
ret = sk.recv(1024)
print(ret)
sk.close()

3三、谈一下对于多线程编程的理解,对于CPU密集型怎样使用多线程,说说线程池,线程锁的用法,有没有用过multiprocessing和concurrent.future?

  多线程是为了解决多个任务同时执行的需求,同个进程内的多线程共享资源,他们是并发的,各个线程是在交替执行,同一时间只有一个线程在运行,他能够防止CPU资源浪费,防止阻塞,增长任务执行效率。

  CPU密集型就是计算密集型,应该使用多核多线程,这样多个线程能够真正意义上的并行处理,大大增长了运行效率,若是是IO密集型,多核就没有用了,由于多核的状况下,一个线程发出IO请求,也是会阻塞,并无在单核的状况下有什么提升,反而会增长CPU的损耗,因此应该使用单核多线程。

  线程池:去你妈的

  线程锁:去你妈的

  没有用过

3四、关于守护线程,正确的是

  全部守护线程终止运行时,即便存在非守护线程,进程运行终止。

  主线程:main,不是守护线程

  守护线程:指程序运行期间在后台提供通用服务的一种线程。

  非守护线程:用户线程,有用户建立。

  主线程和守护线程一块儿被销毁,主线程和用户想程互不影响。

3五、TCP协议在每次创建或者拆除链接时,都要在收发双方之间交换几回报文?

  三次

3六、描述多进程开发中join与deamon的区别。

  deamon是主线程会设置子线程为守护线程,主线程一旦终止运行,所有线程都会被终止执行,即便子线程尚未执行完成。‘

  join的工做是线程同步,主线程执行结束后,会进入阻塞状态,等所有子线程运行结束后,主线程在终止。

3七、请简述GIL对python性能的影响。

  GIL是全局解释器锁,线程以后获取GIL才能运行,因此在python的多线程中,实际上同个进程内同一时间只能有一个线程在工做,者无疑对python的多线程的效率有着不小的影响。

3八、曾经在哪里使用过线程,进程,协程?

  没有用过

3九、请使用yield实现一个协程。

  

40、请使用python内置的async语法实现一个协程

  

4一、简述线程死锁是如何形成的,如何避免?

  死锁是在多线程或者多进程的状况下,两个线程或者进程在争夺资源的时候,形成的一种互相等待的现象,被称为死锁。

4二、asynio是什么?

  异步IO

4三、gevent模块是什么?

  Gevent是一种基于协程的Python网络库,它用到Greenlet提供的,封装了libevent事件循环的高层同步API。它让开发者在不改变编程习惯的同时,用同步的方式写异步I/O的代码。

相关文章
相关标签/搜索