zoukankan      html  css  js  c++  java
  • 第五章 网络编程和并发编程

    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的代码。

        

      

  • 相关阅读:
    LeetCode 79. 单词搜索
    LeetCode 1143. 最长公共子序列
    LeetCode 55. 跳跃游戏
    LeetCode 48. 旋转图像
    LeetCode 93. 复原 IP 地址
    LeetCode 456. 132模式
    LeetCode 341. 扁平化嵌套列表迭代器
    LeetCode 73. 矩阵置零
    LeetCode 47. 全排列 II
    LeetCode 46. 全排列
  • 原文地址:https://www.cnblogs.com/490144243msq/p/11517298.html
Copyright © 2011-2022 走看看