Python面试网络编程和并发

Posted YangPython

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python面试网络编程和并发相关的知识,希望对你有一定的参考价值。

1.简述 OSI 七层协议。

  OSI 开放系统互联参考模型,它是理论的,参考模型
  七层:物理层->数据链路层->网络层->传输层->会话层->表示层->应用层

2.什么是C/S和B/S架构?

  c/s : 客户端/服务端        b/s : 浏览器/服务端

3.简述 三次握手、四次挥手的流程。

详情

4.什么是arp协议?

  ARP (Address Resolution Protocal) 地址解析协议,就是 把 IP->MAC(你听过ARP欺骗的)

5.TCP和UDP的区别?

  TCP是确认包的到达,所以不丢失包(数据),顺序也是好的。
  UDP不会确认包的到达,所以可能会丢失数据包,当然顺序也有可能会乱。
  除了这些以外:
    1. TCP是面向连接(三次握手)的,所以稳定、可靠,那相对就慢了
    比如平时的:文件传输,右键,http等用的都是tcp协议
    2. UDP是面向无连接的,所以不稳定,但是相对快,实时性高
    比如平时:做什么现场直播,视频通话啥的

6.什么是局域网和广域网?

  局域网和广域网是按规模大小而划分的两种计算机网络。范围在几千米以内的计算机网络统称为局域网;而连接的范围超过10千米的,则称为广域网,因特网(Intenet)就是目前最大的广域网

7.为何基于tcp协议的通信比基于udp协议的通信更可靠

  TCP的可靠保证,是它的三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。而UDP就没有了,udp信息发出后,不验证是否到达对方,所以不可靠。

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

  在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。

TCP Socket通信的基本流程

①服务端创建一个ServerSocket对象,指定端口号,ServerSocket对象等待客户端的连接请求。
②客户端创建一个Socket对象,指定主机地址和端口号,向服务端发出连接请求。
③服务端接收到客户端的连接请求,建立一条TCP连接,再创建一个Socket对象与客户端的Socket对象进行通信。
④服务端和客户端分别创建字节输入流和字节输出流,通过字节输入流获得对方发来的数据,通过字节输出流向对方发送数据。
⑤当一方决定结束通信时,向对方发送结束信息;另一方接收到结束信息后,双方分别关闭各自的TCP连接。
⑥ServerSocket对象停止等待客户端的连接请求。

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

  TCP是流式传送的 也就是连接建立后可以一直不停的发送 并没有明确的边界定义.发送端-接收端都存在这一个缓冲区
   由接收方造成的粘包
     当接收方不能及时接收缓冲区的包,造成多个包接收就产生了粘包
       客户端发送一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次
       遗留的数据
  由传输方造成的粘包
    tcp协议中会使用Nagle算法来优化数据。发送时间间隔短,数据量小的包会一起发送,造成粘包

10. IO多路路复用的作用?

  详情

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

  它是一种位于内部网络与外部网络之间的网络安全系统。一项信息安全的防护系统,依照特定的规则,允许或是限制传输的数据通过。
 
  防火可以使企业内部局域网(LAN)网络与Internet之间或者与其他外部网络互相隔离、限制网络互访用来保护内部网络。

12. select、poll、epoll 模型的区别?

  selete : 有最大连接数 遍历         支持win
  poll :    无最大连接数  遍历        支持win
  epoll :  无最大连接数  事件通知   不支持win

13. 简述 进程、线程、协程的区别 以及应用场景?

# 进程
一个任务,进程之间内存隔离,一个进程修改数据不会影响其他进程(创建变量,修改变量值)
# 线程
线程位于进程内
一个进程内至少有一个线程,线程之间资源共享.一个线程修改数据其他进程也会受影响所以有了锁的概念
# 协程
代码级别的保存状态+切换
 
多线程,协程用于IO密集型,如socket,爬虫,web,抢占cpu资源
多进程用于计算密集型,如金融分析,利用多核优势

14. GIL锁是什么鬼?

全局解释器锁,是的一个进程内只有一个线程在工作

15. Python中如何使用线程池和进程池?

# 进程池
from concurrent.futures import ProcessPoolExecutor
import time,os
def piao(name,n):
    print("%s is piaoing %s"%(name,os.getpid())) # 打印了进程id
    time.sleep(1)
 
if __name__ == "__main__":
    p = ProcessPoolExecutor(4) # 指定进程池最大进程个数
    for i in range(10):
        obj = p.submit(piao,"alex %s"%i,i) 提交任务
 
# 线程池
rom concurrent.futures import ThreadPoolExecutor
import time,os,random
def piao(name,n):
    print("%s is piaoing %s"%(name,os.getpid())) # 打印了进程id
    time.sleep(random.randint(1,3))
 
if __name__ == "__main__":
    p = ThreadPoolExecutor(4) # 指定线程池最大线程个数,不包含控制线程
    for i in range(10):
        obj = p.submit(piao,"alex %s"%i,i) # 提交任务

16. threading.local的作用?

创建一个对象,每个线程为该对象设置值数据都是隔离的

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

  queue

18. 什么是并发和并行?

并发 : 看上去是在同时工作,实际上是cpu一直在切换着工作

并行 : 利用多核同时工作多个任务

19. 进程锁和线程锁的作用?

进程锁 : 防止进程同时操作一套文件系统

线程锁 : 防止多个线程同时修改进程内数据

20. 解释什什么是异步非阻塞?

# 非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程
 
# 异步的概念和同步相对。当一个异步功能调用发出后,调用者不能立刻得到结果。当该异步功能完成后,
# 通过状态、通知或回调来通知调用者。

21. 路由器和交换机的区别?

路由器 : 连接外部网络,有接入外部的线

交换机 : 连接内部网络,可以没有接入外部的线

22.什么是域名解析?

我们在浏览器上输入网站域名时,会去请求DNS服务器获取该域名对应的IP地址,再去访问改地址

23.如何修改本地hosts文件?

win : C:\\Windows\\System32\\drivers\\etc\\hosts 

linux : /etc/hosts

按格式修改即可

24.生产者消费者模型应用场景及优势?

生产者与消费者模式是通过一个容器来解决生产者与消费者的强耦合关系,生产者与消费者之间不直接进行通讯,
而是利用阻塞队列来进行通讯,生产者生成数据后直接丢给阻塞队列,消费者需要数据则从阻塞队列获取,实际应
用中,生产者与消费者模式则主要解决生产者与消费者生产与消费的速率不一致的问题,达到平衡生产者与消费者
的处理能力,而阻塞队列则相当于缓冲区。
 
# 应用场景
由一个线程生成订单,并将其放入队列中.由多个线程去处理
 
# 优势
平衡生产者与消费者的处理能力

25.什么是cdn?

CDN的全称是Content Delivery Network,即内容分发网络。
其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。
 
通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根
据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近
的服务节点上。
 
其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

26.LVS是什么及作用?

LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器
 
LVS主要用于多服务器的负载均衡。它工作在网络层,可以实现高性能,高可用的服务器集群技术。它廉价,可把
许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定
可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。

27.Nginx是什么及作用?

处理静态文件
负载均衡
反向代理

28.keepalived是什么及作用?

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,
并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived
自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务
器。

29.haproxy是什么以及作用?

HAProxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性、负载均衡,以及基于TCP和HTTP
的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前
的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构
中, 同时可以保护你的web服务器不被暴露到网络上。
HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制
、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管
理的用户空间(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程
序通常扩展性较差。这就是为什么他们必须进行优化以 使每个CPU时间片(Cycle)做更多的工作。
包括 GitHub、Bitbucket[3]、Stack Overflow[4]、Reddit、Tumblr、Twitter[5][6]和 Tuenti[7]在内的知
名网站,及亚马逊网络服务系统都使用了HAProxy。
 
# 作用
负载均衡

30.什么是负载均衡?

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐
量、加强网络数据处理能力、提高网络的灵活性和可用性。
 
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务
器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
 
# 重点
拓展网络设备

31.什么是rpc及应用场景?

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要
了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在
OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容
易。
 
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进
程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息
到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最
后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
 
# 简单来说就是客户端与服务端并不直接通信,而是通过两个管道,多客户端通过一个管道向服务端发送消息,
 每个客户端都有一个管道来接收信息

32.简述 asynio模块的作用和应用场景。

  详情

33.简述 gevent模块的作用和应用场景。

  详情

34.twisted框架的使用和应用?

  详情

以上是关于Python面试网络编程和并发的主要内容,如果未能解决你的问题,请参考以下文章

python面试题三:Python 网络编程与并发

python面试题——网络编程和并发(34题)

面向面试编程代码片段之GC

Python经典面试题之网络编程与并发34问

Python面试简介及并行并发

python面试题 -- 网编并发