首页 > 技术文章 > 网络编程和并发--【python】面试题汇总

bk770466199 2020-04-10 10:42 原文

1.简述OSI七层协议

 物理层,
        硬件连接,光纤,电缆,无线电波
    数据链路层,
        电信号分组
        head包含固定18字节>发送者,接收者,数据类型
        data包含
        mac地址
    网络层,
        ip协议
    传输层,
        端口,tcp协议,udp协议
    会话层,
    表示层,
    应用层

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

  C/S  client/Server
        客户端/服务器
        第一层:客户端--表示层
        第二层:服务器模块--数据库层

    优点:
        1.C/S架构的界面和操作可以很丰富,客户端操作界面可以随意排列,满足客户的需求
        2.安全性能可以很容易保证,因为只有两层的传输,而不是中间有很多层
        3.由于只有一层交互,因此响应速度较快
    缺点:
        1.适用面窄,通常用于局域网中
        2.用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户
        3.维护成本高,发生一次升级,需要更新客户端

    B/S  browser server
        浏览器/服务器
        第一层表现层:主要完成用户和后台的交互及最终查询结果的输出功能
        第二层逻辑层:主要是利用服务器完成客户端的应用逻辑功能
        第三层数据层:主要是接受客户端请求后独立进行各种运算

        Browser指的是Web浏览器,极少数事物逻辑在前端实现,但主要事物逻辑在服务器端实现
        B/S架构的系统无须安装,浏览器浏览即可

    优点:
        1.客户端无需安装,有Web浏览器即可
        2.BS架构可以直接放在广域网上,通过一定的权限控制实现多客户访问的目的,交互性较强
        3.BS架构无需升级多个客户端,升级服务器即可。可以随时更新版本,而无需用户重新下载
    缺点:
        1.在浏览器上,BS架构不尽如人意
        2.表现要达到CS程序的程度需要花费不少精力
        3.在速度和安全性上需要花费巨大的设计成本,这是BS架构的最大问题
        4.客户端服务器端的交互是请求-响应模式,通常需要刷新页面,这并不是客户乐意看到的

    B/S架构几种形式
        1.客户端-服务器-数据库
            1.客户端向服务器发起Http请求
            2.服务器中的web服务层能够处理Http请求
            3.服务器中的应用层部分调用业务逻辑,调用业务逻辑上的方法
            4.如果有必要,服务器会和数据库进行数据交换,然后将模板+数据渲染成最终的html,返回给客户端
        2.客户端 - web服务器 - 应用服务器 - 数据库
            1.客户端向web服务器发起http请求
            2.web服务能够处理http请求,并且调用服务器暴露在外的RESTFUL接口
            3.应用服务器的RESTFUL接口被调用,会执行对应的暴露方法。如果有必要和数据库进行数据交互,应用服务器会和数据库进行交互后,将json数据返回给web服务器
            4.web服务器将模板 + 数据组合渲染成html返回给客户端

        3.客户端 - 负载均衡(nginx) - 中间服务器(Node) - 应用服务器 - 数据库
            这种模式一般用在有大量的用户,高并发的应用中
            1.正在暴露在外的不是真正web服务器的地址,而是负载均衡器的地址
            2.客户向负载均衡器发起http请求
            3.负载均衡器能够将客户端的http请求均匀的转发给Node服务器集群
            4.Node服务器接收到Http请求之后,能够对其进行解析,并且能够调用应用服务器暴露在外的RESTFUL接口
            5.应用服务器的RESTFUL接口被调用,会执行对应的暴露方法,如果有必要和数据库进行数据交互,应用服务器会和数据库进行交互后,将json数据返回给Node
            6.Node层将模板+数据组合渲染成html返回反向代理服务器
            7.反向代理服务器将对应html返回给客户端
    Nginx的优点有:
        1.它能够承受高并发的大量请求,然后将这些请求均匀的转发给内部服务器,分摊压力
        2.反向代理能够解决跨域引起的问题,因为Nginx,Node,应用服务器,数据库都处于内网中
        3.Nginx非常擅长处理静态资源,所以也经常作为静态资源服务器,也就是我们平时所说的CDN

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

  建立TCP连接:三次握手协议
        1.客户端发起连接请求,发送SYN包,进入SYN-SEND状态(同步已发送)
        2.服务器收到请求报文,若同意建立连接,则回复报文中不仅有上一步客户端的请求答复信息,还有一个额外的确认号,然后进入SYN-RCVD(同步已接收)
        3.客户端收到服务器的同步确认后,对服务器发送确认的确认,然后进入已连接状态
        服务器端收到客户端的确认后也进入已连接状态

    三次握手到此完成

    关闭TCP连接:四次挥手协议
        1.客户端发起关闭连接请求
        2.服务器端收到请求后,回传收到你要关闭连接的请求
        3.客户端等待服务器端,直到服务器端再次传送先行关闭连接的消息
        4.客户端收到服务器的关闭连接消息,回传已收到服务器端的关闭连接消息
        然后客户端断开连接,服务器端收到消息后也断开连接

 

4.什么是arp协议?

 arp--Address Resolution Protocol -- 地址解析协议
    当一个上层协议要发包时,有了该节点的ip地址,arp就能提供该节点的MAC地址

5.TCP和UDP的区别

 1.TCP面向连接;UDP是无连接的
    2.TCP提供可靠的服务;UDP尽最大努力交付,但不保证可靠交付
    3.TCP面向字节流;UDP面向报文
    4.TCP是点到点的;UDP支持一对一,一对多,多对多
    5.TCP首部开销20字节;UDP的首部开销小,只有8个字节
    6.TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

 

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

 局域网也就是内网,是指在某一区域内由多台计算机互联成的计算机组
    广域网也就是外网,例如因特网就是世界范围内最大的广域网

 

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

  tcp会先建立连接再传输数据,udp不需要连接

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

  socket--套接字:一种通信机制,是不同主机间进程进行双向通信的端点
    Socket = IPaddress + TCP/UDP + port

    1.服务器先用socket函数来建立一个套接字,用这个套接字完成对端口的监听
    2.用bind函数来绑定一个端口号和ip地址
    3.服务器调用listen函数,使服务器的这个端口和IP处于监听状态,等待客户机的连接
    4.客户机用socket函数建立一个套接字,设定远程ip和端口
    5.客户机调用connect函数连接远程计算机指定的端口
    6.服务器用accept函数来接受远程计算机的连接,建立与客户机之间的通信
    7.建立连接后,客户机用write函数向socket中写入数据,也可以用read函数读取服务器发送来的数据
    8.服务器用read函数读取客户机发送来的数据,也可以用write函数来发送数据
    9.完成通信以后,用close函数关闭socket连接

 

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

  tcp传输,在接收数据时,一次性多接收了其他请求发送来的数据
    原因:
        粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的
    1.发送端需要等待缓冲区满才发送出去,造成粘包
    2.接收方不及时接收缓冲区的包,造成多个包接收

    发送之前先打个招呼,告诉对方字节要发送的字节长度。

 

10.IO多路复用的作用

  I/O多路复用实际上就是用select,poll,epoll监听多个io对象,当io对象有变化(有数据)的时候就通知用户进程。好处就是单个进程可以处理多个socket。

    阻塞I/O模型
        老李去火车站买票,排队三天买到一张退票
    非阻塞I/O模型
        老李去火车站买票,隔12小时去火车站问有没有退票,三天后买到一张票
    I/O复用模型
        1.select/poll
            老李去火车站买票,委托黄牛,然后每隔6小时电话黄牛询问,黄牛三天内买到票,然后老李去火车站交钱领票
        2.epoll
            老李去火车站买票,委托黄牛,黄牛买到后即通知老李去领,然后老李去火车站交钱领票
    信号驱动I/O模型
        老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李,然后老李去火车站交钱领票
    异步I/O模型
        老李去火车站买票,给售票员留下电话,有票后,售票员电话通知老李并快递送票上门

    一个线程,通过记录I/O流的状态来同时管理多个I/O,可以提高服务器的吞吐能力

 

11.简述iptables工作流程以及规则过滤顺序

 1.防火墙是一层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的
    2.如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不能向下匹配新规则了
    3.如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过
    4.防火墙的默认规则是对应链的所有的规则执行才会执行的

 

12.select,poll,epoll模型的区别

  select
        1.单个进程监控的文件描述符有限,通常为1024*8个文件描述符
            文件描述符数量越多,性能越差
        2.内核/用户数据拷贝频繁,操作复杂

        3.轮回时间效率低
            select返回的是整个数组的句柄,应用程序需要遍历整个数组才知道谁发生了变化
        4.select是水平触发

    poll
        1.poll操作比select稍微简单点。select采用三个位图来表示fd_set,poll使用pollfd的指针pollfd结构包含了要监视的event和发生的event,不再使用select传值的方法
        2.select的缺点依然存在

    epoll
        epoll通过在linux申请一个建议的文件系统,把select调用分为了三部分
            1.调用epoll_create建立一个epoll对象,这个对象包含了一个红黑树和一个双向链表,并与底层建立回调机制
            2.调用epoll_ctl向epoll对象中添加这100万个连接的套接字
            3.调用epoll_wait收集发生事件的连接

    select和poll需要拷贝socket句柄给内核,这是效率低的根本原因,epoll则不需要拷贝,我们调用epoll_wait就相当于之前的select/poll,但是这里不需要拷贝句柄

 

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

  进程是资源分配的最小单位
    进程的生命周期有调入,执行,保存的过程,这里都指上下文

    线程是cpu调度的最小单位
    线程是共享了进程的上下文环境,单核任务中划分更为细小的cpu时间段

    协程是线程的一种表现形式
    协程又叫微线程,在单线程上执行的多个任务,用函数切换,开销极小


    I/O密集型,且I/O请求比较耗时,使用协程
    I/O密集型,且I/O请求比较快,用多线程
    计算密集型,考虑可以使用多核CPU,使用多进程

    多进程、多线程
    区别:

        进程:每个进程都有自己独立的内存空间,不同进程之间的内存不共享,进程间的通信有操作系统传递导致通讯效率降低切换开销大的问题

        线程:一个进程可以有多个线程,所有线程共享进程的内存空间,通讯效率高,切换开销小,但是共享意味着竞争,导致数据不安全,这里需要引入"互斥锁",一个线程访问内存空间的时候,其他线程不允许访问

        互斥锁:一种安全有序的多个线程访问内存空间的机制

    多线程、协程

        共同点:都是并发操作,多线程同一时间点只能有一个线程在执行,协程同一时间点只能有一个任务在执行

        不同点:多线程,是在I/O阻塞时通过切换线程来达到并发效果,在什么情况下做线程切换是由操作系统来决定的
        协程是用函数切换,开销极小。不通过操作系统调度,没有进程,线程的切换开销

 

14.GIL锁是什么

  全局解释器锁,多线程之间存在数据不安全的问题,GIL就是python的互斥锁实现
    python的多线程部署真正的多线程,不能充分利用多核CPU资源

 

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

  进程池
        池的功能是限制启动的进程数或线程数
        当并发的任务数远远超出计算机的承受能力时,即无法一次性开启过多的进程数或线程数时就应该用池的概念将开启的进程数或线程数限制在计算机可以承受的范围内

    concurrent.futures  ThreadPollExecutor ProcessPoolExecutor

    shutdown关闭进程池
    submit同步调用,异步调用

 

16.threading.local的作用

  为每个线程创建一个独立空间,使得线程对自己的空间中的数据进行操作(数据隔离)

 

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

  管道:
        无名管道
            半双工,数据只能在一个方向上流动,具有固定的读端和写端
            只能用于父子进程或者兄弟进程之间的通信
            它是一种只存在内存中的特殊文件
        命名管道
            FIFO,是一种文件类型
            FIFO可以在无关的进程之间交换数据
            FIFO有路径与之相关联,以一种特殊设备文件形式存在于文件系统中
    消息队列
        消息队列是消息的链接表,存放在内核中。
        消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级
        消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除
        消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取
    信号量
        信号量用于进程间同步,若要在进程间传递数据需要结合共享内容
        信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作
        每次对信号量的PV操作不仅限于对信号量值加1或减1,而且可以加减任意正整数
        支持信号量组

    共享内存
        共享内存是最快的一种IPC,因为进程是直接对内存进行存取
        因为多个进程可以同时操作,所以需要进行同步
        信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问

 

18.什么是并发和并行

 并发:同一时刻只能处理一个任务,但一个时间段内可以对多个任务进行交替处理
    并行:同一时刻可以处理多个任务

 

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

  线程同步,进程同步:解决共享资源冲突的问题

    互斥锁和条件变量可以用来同步一个进程内的各个线程,如果一个互斥锁或者条件变量存放在多个进程共享的某个内存区中,那么他用在这些进程间的同步

    区别在于锁是放在私有空间还是共享空间

 

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

  同步
        A调用B,一直等待B返回结果这是同步
    阻塞
        A等待B的时候挂起,什么也不做这个叫阻塞
    异步
        A调用B,B立即返回,无需等待,当B处理完之后会通过通知或者回调函数来告诉A这叫异步
    非阻塞
        A调用B,自己不挂起可以去干别的事这是非阻塞

 

推荐阅读