• Python 经典面试题汇总之网络篇


     网络篇

    1.简述 OSI 七层协议

     

    物理层:定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质。

    数据链路层:定义如何传输格式化数据,以及如何访问物理介质。

    网络层:定义逻辑网络地址。

    传输层:定义传输协议和端口。

    会话层:定义客户端与服务端的连接。

    表示层:定义数据格式转换,对来自应用层的数据进行解释。

    应用层:定义应用程序。

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

    c/s架构,就是client(客户端)与server(服务端)即:客户端与服务端的架构。

    b/s架构,就是brosver(浏览器端)与sever(服务端)即:浏览器端与服务端架构

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

    三次握手 ---> 请求连接
    第一次握手
      客户端先向服务端发起一次询问建立连接的请求,并随机生成一个值作为标识
    第二次握手
      服务端向客户端先回应第一个标识,再重新发一个确认标识
    第三次握手
      客户端确认标识,建立连接,开始传输数据
    四次挥手 ---> 断开连接
    第一次挥手
        客户端向服务端发起请求断开连接的请求
    第二次挥手
        服务端向客户端确认请求,表示知道了
    第三次挥手
        服务端向客户端发起断开连接请求
    第四次挥手
        客户端向服务端确认断开请求,表示已断开

    4.TCP和UDP的区别

    TCP/UDP区别
     TCP协议:面向连接,高可靠性的传输层协议
     UDP协议:不面向连接,数据会丢失,不可靠的传输层协议 (短信和QQ基于UDP协议)

    5.为何基于TCP协议的通信比基于UDP协议的通信更可靠?

    TCP:可靠,因为只要对方回了确认收到信息,才发下一个,如果没收到确认信息就重发
    UDP:不可靠,它是一直发数据,不需要对方回应
    流式协议:TCP协议,可靠传输
    数据报协议:UDP协议,不可传输

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

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。
    在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,
    对用户来说,一组简单的接口就是全部。 服务端:
    创建socket对象;
    绑定IP和端口bind();
    创建双工通信,等待连接;
    send(), recv(), 收发数据;
    close() 客户端:
    创建socket对象;
    与服务端创建双工通信,请求连接;
    send(),recv(), 收发数据;
    close()

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

    只有TCP有粘包现象,UDP永远不会粘包!
    粘包
    :在接收数据时,一次性多接收了其它请求发送来的数据(即多包接收)。如,对方第一次发送hello,第二次发送world,
       在接收时,应该收两次,一次是hello,一次是world,但事实上是一次收到helloworld,一次收到空,这种现象叫粘包。 原因 粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。 什么情况会发生: 1、发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据很小,会合到一起,产生粘包) 2、接收方不及时接收缓冲区的包,造成多个包接收(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)

    8.IO多路复的作用

    socketserver,多个客户端连接,单线程下实现并发效果,就叫多路复用。

    与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

    9.select、poll、epoll 模型的区别?(属于多路复用IO的模型)

    都是i/o多路复用的机制,监视多个socket是否发生变化,本质上都是同步i/o
    select,poll实现需要自己不断轮询所有监测对象,直到对象发生变化,在这个阶段中,
    可能要睡眠和唤醒多次交替,而epoll也需要调用epoll_wait不断轮询就绪链表,但是当对象发生变化时,
    会调用回调函数,将变化的对象放入就绪链接表中,并唤醒在epoll_wait中进入睡眠的进程。
    虽然都会睡眠和唤醒,但是select和poll在被唤醒的时候要遍历整个监测对象集合,
    而epoll只要判断就绪链表是否为空即可,节省了大量cpu的时间。
     select、poll、epoll都是IO多路复用的机制,但select,poll,epoll本质上都是同步I/O,
     因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的.
    
    FD(文件描述符)
    select模型
    优点:
        1:可移植性好,在某些Unix系统不支持poll()
        2:对于超时值提供了更好的精度:微妙,而poll是毫秒
    缺点:
        1:最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048 ,因此 Select 模型的最大并发数就被相应限制了。
        2:效率问题,select每次调用都会线性扫描全部的FD集合,所以将FD_SETSIZE 改大,会越慢
        3:需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。 
    
    poll本质上和select 没有区别,它将用户传入的数组拷贝到内核空间,
    它没有最大连接数的限制,原因是它基于链表来存储的但是同样有一个缺点:
    大量的fd的数组被整体复制于用户态和内核地址空间,而不管这样的复制是不是有意义。

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

    防火墙是一个分离器、一个限制器,也是一个分析器,有效地监控了内部网和Internet之间的任何活动,保证了内部网络的安全。
    
    作用
      网络安全的屏障
      对网络存取和访问进行监控审计
      防止内部信息的外泄
      除了安全作用,防火墙还支持具有Internet服务特性的企业内部网络技术体系VPN(虚拟专用网)

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

    线程是指进程内的一个执行单元,
    
    # 进程 进程拥有自己独立的堆和栈,既不共享堆,亦不共享栈,进程由操作系统调度。 # 线程 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度。 # 协程 协程是运行在单线程中的"并发",协程相比多线程的一大优势就是省去了多线程之间的切换开销,获得了更高的运行效率。所以可以用协程取代多线程。协程避免了无意义的调度,由此可以提高性能;但同时协程也失去了线程使用多核CPU的能力。 进程与线程的区别
    如果把进程比喻成项目组办公室,那么线程就是办公室里的员工,一个办公室可以有多个员工,每个员工的任务不同,但他们共享办公司资源。 (1)地址空间:线程是进程内的一个执行单位,进程内至少有一个线程,他们共享进程的地址空间,而进程有自己独立的地址空间 (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内多线程共享进程的资源 (3)线程是处理器调度的基本单位,但进程不是 (4)二者均可并发执行 (5)每个独立的线程有一个程序运行的入口 协程与线程 (1)一个线程可以有多个协程,一个进程也可以有多个协程,这样Python则能使用多核CPU (2)线程、进程都是同步机制,而协程是异步 (3)协程能保留上一次调用时的状态

    12.GIL锁是什么?

    GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串行,以此来控制同一时间内共享数据只能被一个任务所修改,进而保证数据安全。

    GIL保护的是解释器级的数据,保护用户自己的数据则需要自己加锁处理。

    应用(总结):
    多线程用于IO密集型,如socket,爬虫,web
    多进程用于计算密集型,如金融分析
      1. 每个cpython进程内都有一个GIL
      2. GIL导致同一进程内多个进程同一时间只能有一个运行
      3. 之所以有GIL,是因为cpython的内存管理不是线程安全的

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

    因为在切换线程/进程的时候,需要切换上下文环境,线程很多的时候,依然会造成CPU的大量开销。为解决这个问题,线程池的概念被提出来了。
    预先创建好一个数量较为优化的线程/进程组,在需要的时候立刻能够使用,就形成了线程/进程池。
    如果池还没有满,那么就会创建一个新的线程/进程用来执行该请求;但如果池中的线程/进程数已经达到规定最大值,那么该请求就会等待。

    from multiprocessing import Pool
    
    p = Pool(processes=4)        # 允许最多同时放入4个进程,自由调配子程序。默认是本机的CPU核数。
    for i in range(20):          # 开启20个进程
        res = p.apply_async(func=task, args=(x,), callback='回调函数')    # 异步运行进程池,func传入函数,arg是元组,有返回结果
                                                                                
    p.close()                    # 调用join()之前必须先调用close()
    p.join()                     # 等待目前子进程结束后,继续运行下一个子进程。如果没有则进入主进程

    14.threading.local()的作用

    实现线程的不同函数之间局部变量的传递。

    threading.local()最常用的地方:
    为每个线程绑定一个资源(数据库连接,HTTP请求,用户身份信息等),这样一个线程的所有调用到的处理函数都可以非常方便地访问这些资源。

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

    线程/进程彼此之间互相隔离,要实现线程/进程间通信,Python提供了队列Queue(线程通信)、管道Pipe(进程通信)等多种方式来交换数据。

    Queue主要方法:put(),get()

    Pipe主要方法:send(),recv()

    16.什么是并发和并行?

    # 并发:同一时刻只能处理一个任务,但可以交替处理多个任务。(一个处理器同时处理多个任务)
    # 并行:同一时刻可以处理多个任务。(多个处理器或者是多核的处理器同时处理多个不同的任务)
    # 类比:并发是一个人同时吃三个馒头,而并行是三个人同时吃三个馒头。 

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

    为了保证数据安全,Python设计了锁,即同一时刻只允许一个线程或进程操作数据。

    18.同步和异步,阻塞和非阻塞的区别?

    同步:执行一个操作之后,需要主动等待返回结果;
    异步:执行一个操作之后,不需要主动等待返回结果,若接收到结果通知,再回来执行刚才没执行完的操作。
    同步和异步关心的问题是:要不要主动等待结果。
    
    阻塞:在执行一个操作时,不能做其他操作;
    非阻塞:在执行一个操作时,能做其他操作。
    阻塞和非阻塞关心的问题是:能不能做其他操作。

    19.路由器和交换机的区别

    1:交换机:是负责内网里面的数据传递(arp协议)根据MAC地址寻址。
       路由器:在网络层,路由器根据路由表,寻找该ip的网段。
    2:路由器可以把一个IP分配给很多个主机使用,这些主机对外只表现出一个IP。
       交换机可以把很多主机连起来,这些主机对外各有各的IP。
    3:交换机是做端口扩展的,也就是让局域网可以连进来更多的电脑。
       路由器是用来做网络连接,也就是连接不同的网络。

    20.什么是域名解析?

    在互联网上,所有的地址都是ip地址,现阶段主要是IPv4(比如:110.110.110.110)。
    但是这些ip地址太难记了,所以就出现了域名(比如http://baidu.com)。
    域名解析就是将域名,转换为ip地址的这样一种行为。

    21.如何修改本地hosts件?

    Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,
    当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,
    一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交给DNS域名解析服务器进行IP地址的解析。 文件路径:C:WINDOWSsystem32driversetc。 将127.0.0.1 www.163.com 添加在最下面 修改后用浏览器访问“www.163.com”会被解析到127.0.0.1,导致无法显示该网页。

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

    生产者与消费者模式是通过一个容器来解决生产者与消费者的强耦合关系,生产者与消费者之间不直接进行通讯,
    而是利用阻塞队列来进行通讯,生产者生成数据后直接丢给阻塞队列,消费者需要数据则从阻塞队列获取,
    实际应用中,生产者与消费者模式则主要解决生产者与消费者的生产与消费的速率不一致的问题,达到平衡生产者与消费者的处理能力,而阻塞队列则相当于缓冲区。 应用场景:用户提交订单,订单进入引擎的阻塞队列中,由专门的线程从阻塞队列中获取数据并处理。 优势: 1;解耦 假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。 将来如果消费者的代码发生变化,可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了。 2:支持并发 生产者直接调用消费者的某个方法,还有另一个弊端。由于函数调用是同步的(或者叫阻塞的),在消费者的方法没有返回之前,生产者只能一直等着 而使用这个模型,生产者把制造出来的数据只需要放在缓冲区即可,不需要等待消费者来取。 3:支持忙闲不均 缓冲区还有另一个好处。如果制造数据的速度时快时慢,缓冲区的好处就体现出来了。 当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来,消费者再慢慢处理掉。

    23.什么是cdn?

    目的是使用户可以就近到服务器取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
    
    cdn 即内容分发网络

    24.LVS是什么及作用?

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

    25.Nginx是什么及作用

     Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器,同时也是一个IMAP、POP3、SMTP代理服务器。

    可以用作HTTP服务器、方向代理服务器、负载均衡。

    26.什么是负载均衡?

    将服务器接收到的请求按照规则分发的过程,称为负载均衡。

    27.twisted框架的应用

     twisted是异步非阻塞框架。爬虫框架Scrapy依赖twisted。
     
    来自转载,有较大改动。
  • 相关阅读:
    【二十五】cookie与session学习总结
    【二十四】使用mysqli扩展类批量执行多条sql语句
    【二十三】php之预定义超全局变量
    【二十二】mysqli事务处理与预处理总结
    【二十一】基于mysqli的表格数据练习
    【二十】mysqli基于面向过程与面向对象的编程
    为什么所有浏览器的userAgent都带Mozilla
    如何快速的搜索自己想要的资料
    从汇编看c++成员函数指针(三)
    从汇编看c++中指向成员变量的指针(二)
  • 原文地址:https://www.cnblogs.com/wcwnina/p/10300053.html
Copyright © 2020-2023  润新知