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

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

  socket, urllib,urllib3 , requests, grab, pycurl

2、简述OSI七层协议

  应用层:HTTP,FTP,NFS

  表示层:Telnet,SNMP

  会话层:SMTP,DNS

  传输层:TCP,UDP

  网络层:IP,ICMP,ARP,

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

  物理层:IEEE 802.1A,IEEE 802.11

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

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

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

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

  建立连接:

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

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

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

  释放连接:

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

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

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

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

5、什么事arp协议?

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

6、TCP协议和UDP协议的区别?为什么TCP协议更可靠?

  1、TCP是面向连接的,发送数据之前必须建立连接,UDP不需要建立连接就可以发送数据。

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

  3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

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

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

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

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

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

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

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

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

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

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

9、什么是黏包?socket中造成黏包的原因是什么?哪些情况会发生黏包现象。

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

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

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

  客户端粘包:

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

  服务端粘包:

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

10、IO多路复用的作用

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

  非阻塞IO:特点就是,数据准备阶段,用户发出read操作时,如果数据没有准备完成,会立刻返回一个error,用户进程可以去做其他事情,需要不断的轮询查看数据是否准备完成,但是在数据拷贝期间,进程还是阻塞的。

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

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

11、什么是防火墙以及作用?

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

12、select, poll, epoll的区别

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

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

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

  epoll:epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。

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

  进程:操作系统是由一个个的进程组成的,一个应用程序就可以看作一个进程,他有自己独立的运行空间,有自己独立的堆和栈,进程是操作系统资源分配的最小单位。

  线程:线程是属于进程的,进程可以创建线程,线程之间共享堆不共享栈,线程是操作系统资源调动的最小单位。

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

14、什么是GIL锁。

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

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

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

16、threading.local的作用?

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

17、进程之间如何进行通信?

  1、管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。

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

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

  特点:他可以在无关进程之间通信,可以看作一种特殊的设备文件,存在于文件系统中。

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

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

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

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

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

  特点:共享内存是最快的一种IPC,因为进程是直接堆内存进行存取,因为多个进程可以同时操作,所以需要进行同步,信号量和共享内存通常一起使用。

18、什么是并发和并行?

  并发:在计算机领域开发过程中,并发指的是应用能够交替执行不同的任务,比如多线程,多线程并非是同时执行多个任务,而是通过时间轮转发等算法的调度,时多个任务以我们察觉不到的速度交替执行。

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

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

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

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

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

  同步非阻塞:调用结果返回前,进程可以去做其他事情,但是需要通过轮询不断的查看调用结果是否返回,效率比前两个高,但是耗CPU,也一般。

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

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

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

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

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

      路由器工作在网络层,根据IP地址寻址,可以处理TCP/IP协议。

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

21、什么是域名解析?

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

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

  vi/ etc/host

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

  很多的生产者同时生产数据到流水线上,然后消费者在从流水线上取下,这样我们可以有多个生产者同时生产提升了效率,同时也可以容纳多个消费者在流水线上消费。

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

24、什么是cdn?

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

25、程序从FlagA执行到FlagB的时间大致为多少秒?

import threading
import time

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

  大致为0秒,因为线程开启速度非常快,start()方法为异步非阻塞,所以不会等待任务的结束。

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

27、以下哪些是常见的TCP Flags?

  SYN, ACK

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

  SNMP工作在四层

29、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

31、

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

  1、实现server端的功能即可

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

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()

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

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

  CPU密集型就是计算密集型,应该使用多核多线程,这样多个线程可以真正意义上的并行处理,大大增加了运行效率,如果是IO密集型,多核就没有用了,因为多核的情况下,一个线程发出IO请求,也是会阻塞,并没有在单核的情况下有什么提高,反而会增加CPU的损耗,所以应该使用单核多线程。

  线程池:去你妈的

  线程锁:去你妈的

  没有用过

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

  所有守护线程终止运行时,即使存在非守护线程,进程运行终止。

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

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

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

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

35、TCP协议在每次建立或者拆除连接时,都要在收发双方之间交换几次报文?

  三次

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

  deamon是主线程会设置子线程为守护线程,主线程一旦终止运行,全部线程都会被终止执行,即使子线程还没有执行完成。‘

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

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

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

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

  没有用过

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

  

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

  

41、简述线程死锁是如何造成的,如何避免?

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

42、asynio是什么?

  异步IO

43、gevent模块是什么?

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

    

  

原文地址:https://www.cnblogs.com/490144243msq/p/11517298.html