python面试题-网络编程和并发

第二部分 网络编程和并发(34题)

1.简述 OSI 七层协议。

# 物理层:第一层、建立、维护、断开物理连接,传递介质 bit流,就是那个啥电生磁。

# 数据链路层:第二层、进行硬件的地址寻址,差错校验,MAC地址和分组交换 

# 网络层:第三层、进行逻辑寻址,实现不同网络间的路径选择。

# 传输层:第四层、对数据分包分组,定义传输数据的协议和端口号,比如TCP,UDP

# 应用层、表示层、会话层:提供用户接口,应用需要完成的事情(五层模型中三个一体,统称应用层)
# 会话层:第五层  发送sql语句
# 表示层: 第六层 加密
# 应用层:第七层  http请求
View Code

 

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

# C/S (Client/Server)结构,即客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,
#    将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。

# B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。
View Code

 

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

#第一次握手:建立连接。将SYN(同步序号)位置为1,Seq(序列号)为x(x是一个随机数),即:SYN=1 Seq=x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

#第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Ack(确认号)为Ack=x+1(x是上面的随机数);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Seq为y(y是另一个随机数)即:SYN=1 Seq=y Ack=x+1;此时服务器进入SYN_RECV状态;

#第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Ack(确认号)设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
View Code

 

4.什么是arp协议?

# ARP (Address Resolution Protocol) 是个地址解析协议。最直白的说法是:在IP以太网中,当一个上层协议要发包时,有了该节点的IP地址,ARP就能提供该节点的MAC地址。 
View Code

 

5.TCP和UDP的区别?

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

# 局域网(Local Area Network,LAN)是在一个局部的地理范围内(如一个学校、工厂和机关内),一般是方圆几千米以内,将各种计算机,外部设备和数据库等互相联接起来组成的计算机通信网.

# 广域网(Wide Area Network),简称WAN,是一种跨越大的、地域性的计算机网络的集合。通常跨越省、市,甚至一个国家。
View Code

 

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

# https://blog.csdn.net/baidu_35692628/article/details/78255476
[1] 确认和重传机制
建立连接时三次握手同步双方的“序列号 + 确认号 + 窗口大小信息”,是确认重传、流控的基础
传输过程中,如果Checksum校验失败、丢包或延时,发送端重传
View Code

 

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

1、服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket
2、服务器为socket绑定ip地址和端口号
3、服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
4、客户端创建socket
5、客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
6、服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求
7、客户端连接成功,向服务器发送连接状态信息
8、服务器accept方法返回,连接成功
9、客户端向socket写入信息
10、服务器读取信息
11、客户端关闭
12、服务器端关闭
View Code

 

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

# http://www.cnblogs.com/linhaifeng/articles/6129246.html#_label10
# 所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。
# 两种情况下会发生粘包。

1.发送端需要等缓冲区满才发送出去,造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包)

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

 

10.IO多路复用的作用?

# 关于I/O多路复用(又被称为“事件驱动”),首先要理解的是,操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一个通知。这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不做纯返回-1和EAGAIN的无用功。写操作类似。操作系统的这个功能通过select/poll/epoll/kqueue之类的系统调用函数来使用,这些函数都可以同时监视多个描述符的读写就绪状况,这样,多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的“复用”指的是复用同一个线程。

下面举一个例子,模拟一个tcp服务器处理30个客户socket。
假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择:

1. 第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C、D。。。这中间如果有一个学生卡主,全班都会被耽误。
这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。
2. 第二种选择:你创建30个分身,每个分身检查一个学生的答案是否正确。 这种类似于为每一个用户创建一个进程或者线程处理连接。
3. 第三种选择,你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。。。 
这种就是IO复用模型,Linux下的select、poll和epoll就是干这个的。将用户socket对应的fd注册进epoll,然后epoll帮你监听哪些socket上有消息到达,这样就避免了大量的无用操作。此时的socket应该采用非阻塞模式。
这样,整个过程只在调用select、poll、epoll这些调用的时候才会阻塞,收发客户消息是不会阻塞的,整个进程或者线程就被充分利用起来,这就是事件驱动,所谓的reactor模式。
View Code

 

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

# 防火墙是指设置在不同网络(如可信任的企业内部网和不可信的公共网)或网络安全域之间的一系列部件的组合。 它可通过监测、限制、更改跨越防火墙的数据流,尽可能地对外部屏蔽网络内部的信息、结构和运行状况, 以此来实现网络的安全保护。 
View Code

 

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

# http://www.cnblogs.com/Anker/p/3265058.html
# select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。
View Code

 

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

进程:资源管理单位,包含多个线程
线程:资源执行单位
协程:程序级,自定义切换时机
View Code

 

14. GIL锁是什么鬼?

# 加在全局解释器中的锁,同一时刻只有一个线程在运行
View Code

 

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

进程池:
import multiprocessing
import time

pool = multiprocessing.Pool(processes=4)

线程池:
from multiprocessing.dummy import Pool as ThreadPool
import time
View Code

 

16. threading.local的作用?

# threading.local()这个方法的特点用来保存一个全局变量,但是这个全局变量只有在当前线程才能访问,
View Code

 

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

1. 管道(pipe),流管道(s_pipe)和有名管道(FIFO)

2. 信号(signal)

3. 消息队列

4. 共享内存

5. 信号量

6. 套接字(socket)
View Code

 

18. 什么是并发和并行?

并发:交替做不同事的能力
并行:同时做不同事的能力 多CPU

行话解释:
并发:不同代码块交替执行的性能
并行:不同代码块同时执行的性能 多CPU
View Code

 

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

# 线程锁:大家都不陌生,主要用来给方法、代码块加锁。当某个方法或者代码块使用锁时,那么在同一时刻至多仅有有一个线程在执行该段代码。当有多个线程访问同一对象的加锁方法/代码块时,同一时间只有一个线程在执行,其余线程必须要等待当前线程执行完之后才能执行该代码段。但是,其余线程是可以访问该对象中的非加锁代码块的。

# 进程锁:也是为了控制同一操作系统中多个进程访问一个共享资源,只是因为程序的独立性,各个进程是无法控制其他进程对资源的访问的,但是可以使用本地系统的信号量控制(操作系统基本知识)。

# 分布式锁:当多个进程不在同一个系统之中时,使用分布式锁控制多个进程对资源的访问。
View Code

 

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

# 小结:同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。

# 小结:阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程。
View Code

 

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

# https://www.cnblogs.com/Lynn-Zhang/articles/5754336.html
View Code

 

22. 什么是域名解析?

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

 

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

# 文件路径:C:\WINDOWS\system32\drivers\etc。
# 操作系统规定,在进行DNS请求以前,先检查系自己的Hosts文件中是否有这个域名和IP的映射关系。
# 127.0.0.1 www.163.com
View Code

 

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

# 生产者给队列中存放消息,消费者从队列中取消息
View Code

 

25. 什么是cdn?

# CDN主要功能是在不同的地点缓存内容,通过负载均衡技术,将用户的请求定向到最合适的缓存服务器上去获取内容,比如说,是北京的用户,我们让他访问北京的节点,深圳的用户,我们让他访问深圳的节点。通过就近访问,加速用户对网站的访问。解决Internet网络拥堵状况,提高用户访问网络的响应速度。
View Code

 

26. LVS是什么及作用?

# LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器。
# LVS主要用于多服务器的负载均衡。
View Code

 

27. Nginx是什么及作用?

# Nginx(发音同engine x)是一个 Web服务器,也可以用作反向代理,负载平衡器和 HTTP缓存。
# Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。
View Code

 

28. keepalived是什么及作用?

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

 

29. haproxy是什么以及作用?

# 在日常生活中,http主要用于做为公司的正向代理,通过SNAT技术为互联网节省了很多的IP地址,相反haproxy是作为反向代理,接收普通用户的请求。代理的作用主要有访问控制、web缓存(加速)、反向代理、内容路由(根据流量及内容类型等条件将请求转发至特定的服务器)、转码器,以及在代理服务器上添加Via首部,用于分析经过的路由等作用。

# HAProxy,字面意思是高可靠性代理服务器,它是一款流行的开源的TCP/HTTP负载均衡和代理服务解决方案,可以运行在Linux,Solaris和FreeBSD上。
View Code

 

30. 什么是负载均衡?

# 负载平衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。

# 使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载平衡服务通常是由专用软件和硬件来完成。
View Code

 

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

RPC比较适合- 客户端调用哪个服务器比较明确 
    - 调用需要立即得到返回结果 
    - 架构简单 
    - 希望同步得到结果的场合,RPC合适。
在一个由多个微服务构成的大系统中,某些关键服务间的调用应当在较短的时间内返回,而且各个微服务的专业化程度较高,同一个请求的关注者只有一个。
View Code

 

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

# asyncio模块提供了一种关于事件循环的框架。事件循环就是等待一些任务发生,然后执行相应的事件。它也会处理例如IO操作或者系统事件。

# ascio模块是为编写在单线程中并发执行的代码,可以通过使用协程,套接字和其他资源的IO多路复用来运行网络客户端和服务器

# asyncio的核心运行机制是事件循环,通过将协程对象注册到事件循环,使其根据事件的发生来循环调用
View Code

 

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

# gevent是基于协程的Python网络库。
View Code

 

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

# Twisted是用Python实现的基于事件驱动的网络引擎框架。
# 异步非阻塞
View Code

 

posted @ 2018-06-10 15:39  _慕  阅读(130)  评论(0)    收藏  举报
Title
返回顶部