Python面试题,第二部分:网络编程和并发(34题)

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

1、简述 OSI 七层协议。

应用层:
与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的。
例如,一个没有通信功能的字处理程序就不能执行通信的代码,
从事字处理工作的程序员也不关心OSI的第7层。
但是,如果添加了一个传输文件的选项,
那么字处理器的程序员就需要实现OSI的第7层。
示例:TELNET,HTTP,FTP,NFS,SMTP等。

表示层:
这一层的主要功能是定义数据格式及加密。
例如,FTP允许你选择以二进制或ASCII格式传输。
如果选择二进制,那么发送方和接收方不改变文件的内容。
如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。
在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。

会话层:
它定义了如何开始、控制和结束一个会话,
包括对多个双向消息的控制和管理,
以便在只完成连续消息的一部分时可以通知应用,
从而使表示层看到的数据是连续的,在某些情况下,
如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。

传输层:
这层的功能包括是否选择差错恢复协议还是无差错恢复协议,
及在同一主机上对不同应用的数据流的输入进行复用,
还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。

网络层:
这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,
还定义了路由实现的方式和学习的方式。
为了适应最大传输单元长度小于包长度的传输介质,
网络层还定义了如何将一个包分解成更小的包的分段方法。
示例:IP,IPX等。

数据链路层:
它定义了在单个链路上如何传输数据。
这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。

物理层:
OSI的物理层规范是有关传输介质的特这些规范通常也参考了其他组织制定的标准。
连接头、帧、帧的使用、电流、编码及光调制等都属于各种物理层规范中的内容。
物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等。

自己说:理解这OSI七层模型后,我们就能明白网络的工作原理,
比如一条微信是怎样发送给对方,对方又是怎么收到的。
事实上此模型并没有大规模采用,我们常用的是TCP/IP四层模型,请参考下面的阅读。

参考阅读:网络七层协议

TCP/IP四层模型简述

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

C/S(Client/Server)结构,即客户机和服务器结构。它是软件系统体系结构,
通过它可以充分利用两端硬件环境的优势,
将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。
C/S结构可以看做是胖客户端架构。客户端实现绝大多数的业务逻辑处理和界面展示,
作为客户端的部分需要承受很大的压力,从分利用客户端的资源,对客户机的要求较高。

B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,
对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,
极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,
形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,
减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。
B/S结构可以看作是瘦客户端,只是把显示的较少的逻辑交给了Web浏览器,
事务逻辑数据处理在放在了Server端,这样就避免了庞大的胖客户端,减少了客户端的压力。
B/S结构的系统无须特别安装,只有Web浏览器即可。
当然AJAX\Flex等等的普遍使用也有富客户端的发展方向。
参考阅读:C/S和B/S结构概念

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

三次握手:

第一次握手:客户端的应用进程主动打开,并向客户端发出请求报文段。其首部中:SYN=1,seq=x。

第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。

第三次握手:客户端收到确认报文之后,通知上层应用进程连接已建立,并向服务器发出确认报文,
其首部:ACK=1,ack=y+1。当服务器收到客户端的确认报文之后,也通知其上层应用进程连接已建立。

在这个过程中,通信双方的状态如下图,其中CLOSED:关闭状态、LISTEN:收听状态、SYN-SENT:同步已发送、SYN-RCVD:同步收到、ESTAB-LISHED:连接已建立

四次挥手:
第一次挥手:数据传输结束以后,客户端的应用进程发出连接释放报文段,
并停止发送数据,其首部:FIN=1,seq=u。

第二次挥手:服务器端收到连接释放报文段之后,发出确认报文,其首部:ack=u+1,seq=v。
此时本次连接就进入了半关闭状态,客户端不再向服务器发送数据。而服务器端仍会继续发送。

第三次挥手:若服务器已经没有要向客户端发送的数据,其应用进程就通知服务器释放TCP连接。
这个阶段服务器所发出的最后一个报文的首部应为:FIN=1,ACK=1,seq=w,ack=u+1。

第四次挥手:客户端收到连接释放报文段之后,必须发出确认:ACK=1,seq=u+1,ack=w+1。
 再经过2MSL(最长报文端寿命)后,本次TCP连接真正结束,通信双方完成了他们的告别。

在这个过程中,通信双方的状态如下图,其中:ESTAB-LISHED:连接建立状态、
FIN-WAIT-1:终止等待1状态、FIN-WAIT-2:终止等待2状态、CLOSE-WAIT:关闭等待状态、
LAST-ACK:最后确认状态、TIME-WAIT:时间等待状态、CLOSED:关闭状态

参考阅读:简述TCP连接的建立与释放(三次握手、四次挥手)

4、什么是arp协议?

 在数据链路层的以太网的协议中,每一个数据包都有一个MAC地址。
 我们知道每一块以太网卡都有一个MAC地址,这个地址是唯一的,
 那么IP包是如何知道这个MAC地址的?这就是ARP协议的工作。

ARP(地址解析)协议是一种解析协议,本来主机是完全不知道这个IP对应的是哪个主机的哪个接口,
当主机要发送一个IP包的时候,会首先查一下自己的ARP高速缓存表(最近数据传递更新的IP-MAC地址对应表),
如果查询的IP-MAC值对不存在,那么主机就向网络广播一个ARP请求包,
这个包里面就有待查询的IP地址,而直接收到这份广播的包的所有主机都会查询自己的IP地址,
如果收到广播包的某一个主机发现自己符合条件,那么就回应一个ARP应答包(将自己对应的IP-MAC对应地址发回主机),
源主机拿到ARP应答包后会更新自己的ARP缓存表。源主机根据新的ARP缓存表准备好数据链路层的的数据包发送工作。
参考阅读:ARP(地址解析协议)

5、TCP和UDP的区别?

TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;
UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
  UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

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

一、局域网 
局域网(Local Area Network),简称LAN,是指在某一区域内由多台计算机互联成的计算机组。
“某一区域”指的是同一办公室、同一建筑物、同一公司和同一学校等,一般是方圆几千米以内。
局域网可以实现文件管理、应用软件共享、打印机共享、扫描仪共享、工作组内的日程安排、
电子邮件和传真通信服务等功能。局域网是封闭型的,可以由办公室内的两台计算机组成,
也可以由一个公司内的上千台计算机组成。 

二、广域网 
广域网(Wide Area Network),简称WAN,是一种跨越大的、地域性的计算机网络的集合。
通常跨越省、市,甚至一个国家。广域网包括大大小小不同的子网,子网可以是局域网,也可以是小型的广域网。 

三、局域网和广域网的区别 
局域网是在某一区域内的,而广域网要跨越较大的地域,那么如何来界定这个区域呢?
例如,一家大型公司的总公司位于北京,而分公司遍布全国各地,
如果该公司将所有的分公司都通过网络联接在一起,
那么一个分公司就是一个局域网,而整个总公司网络就是一个广域网。

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

TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;
UDP尽最大努力交付,即不保证可靠交付

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


TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。
套接字用(IP地址:端口号)表示。
它是网络通信过程中端点的抽象表示,包含进行网络通信必需的五种信息:
连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

套接字通信流程:
 服务端先初始化Socket实例化一个类拿到对象(才能调用下面的接口),
 然后绑定IP端口(bind),监听(listen)就是说客户端可以来连我了,调用accept接收链接;
 这时客户端初始化一个socket,然后connect与服务端建立好双向链接与accept对应。
 客户端发送请求数据,服务端处理请求并给客户端回应数据,
 这样一个通信循环;最后关闭套接字,一次交互结束。

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

 如客户端只recv(1024), 可结果比1024长那怎么办,
 只好在服务器端的IO缓冲区里把客户端还没收走的暂时存下来,
 等客户端下次再来收,
 所以当客户端第2次调用recv(1024)就会首先把上次没收完的数据先收下来,
 再收df命令的结果。

这个现象叫做粘包,就是指两次结果粘到一起了。它的发生主要是因为socket缓冲区导致的。

所谓粘包问题原因:
(1)主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。
(2)发送方引起的粘包是由TCP协议本身造成的,TCP为提高传输效率,
    发送方往往要收集到足够多的数据后才发送一个TCP段。
    若连续几次需要send的数据都很少,
    通常TCP会根据优化算法把这些数据合成一个TCP段后一次发送出去,
    这样接收方就收到了粘包数据。

发生粘包的情况:(1)发送端需要等缓冲区满才发送出去,
造成粘包(发送数据时间间隔很短,数据了很小,会合到一起,产生粘包)
(2)接收方不及时接收缓冲区的包,造成多个包接收
(客户端发送了一段数据,服务端只收了一小部分,服务端下次再收的时候还是从缓冲区拿上次遗留的数据,产生粘包)

10、IO多路复用的作用?

这个自己没看明白,请参考下面的文章。
参考阅读: IO多路复用总结

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

它可通过监测、限制、更改跨越防火墙的数据流,
尽可能地对外部屏蔽网络内部的信息、结构和运行状况,
 以此来实现网络的安全保护。
在逻辑上,防火墙是一个分离器,一个限制器,
也是一个分析器,有效地监控了内部网和Internet之间的任何活动,
 保证了内部网络的安全。

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

在第10中有详细介绍。

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

1.线程和进程: 
线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,
当进程退出时该进程所产生的线程都会被强制退出并清除。
线程可与属于同一进程的其它线程共享进程所拥有的全部资源,
但是其本身基本上不拥有系统资源,
只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。

2.线程、进程与协程:
线程和进程的操作是由程序触发系统接口,
最后的执行者是系统;协程的操作则是程序员
协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,
线程切换时需要耗时(保持状态,下次继续)。
协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。
协程的适用场景: 当程序中存在大量不需要CPU的操作时(IO),适用于协程;
参考阅读:进程、线程、协程之概念理解

14、GIL锁是什么鬼?

线程全局锁(Global Interpreter Lock),即Python为了保证线程安全而采取的独立线程运行的限制,
说白了就是一个核只能在同一时间运行一个线程.对于io密集型任务,
python的多线程起到作用,但对于cpu密集型任务,
python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢。
参考阅读:Python的GIL是什么鬼,多线程性能究竟如何

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

请参考下面的文章。
参考阅读:Python并发编程之线程池/进程池

16、threading.local的作用?

threading.local的目的是为了解决线程间对数据的访问问题,有点类似于全局变量与局部变量。请参考下面的文章。
参考阅读:深入理解Python中的ThreadLocal变量

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

Python: 进程间通讯有多种方式,包括信号,管道,消息队列,信号量,共享内存,socket等
参考阅读:Python的进程间通信

18、什么是并发和并行?

1、并行就是两个任务同时运行,就是甲任务进行的同时,乙任务也在进行。

2、并发是指两个任务都请求运行,而处理器只能按受一个任务,
就把这两个任务安排轮流进行,由于时间间隔较短,使人感觉两个任务都在运行。

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

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

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

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

同步、异步:

    概念:消息的通知机制
    解释:涉及到IO通知机制;所谓同步,就是发起调用后,被调用者处理消息,
    必须等处理完才直接返回结果,没处理完之前是不返回的,调用者主动等待结果;
    所谓异步,就是发起调用后,被调用者直接返回,但是并没有返回结果,
    等处理完消息后,通过状态、通知或者回调函数来通知调用者,调用者被动接收结果。

阻塞、非阻塞:

    概念:程序等待调用结果时的状态
    解释:涉及到CPU线程调度;所谓阻塞,就是调用结果返回之前,
    该执行线程会被挂起,不释放CPU执行权,线程不能做其它事情,
    只能等待,只有等到调用结果返回了,才能接着往下执行;
    所谓非阻塞,就是在没有获取调用结果时,不是一直等待,线程可以往下执行,
    如果是同步的,通过轮询的方式检查有没有调用结果返回,
    如果是异步的,会通知回调。

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

交换机:
1. 用于同一网络内部数据的快速传输
2. 转发决策通过查看二层头部完成
3. 转发不需要修改数据帧
4. 工作在 TCP/IP 协议的二层 —— 数据链路层工作简单,
5. 直接使用硬件处理

路由器:
1. 用于不同网络间数据的跨网络传输
2. 转发决策通过查看三层头部完成
3. 转发需要修改 TTL ,IP 头部校验和需要重新计算,数据帧需要重新封装
4. 工作在 TCP/IP 协议的三层 —— 网络层
5. 工作复杂,使用软件处理

22、什么是域名解析?

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

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

Linux: /etc/hosts

Windows: C:\Windows\System32\drivers\etc

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

某些模块负责生产数据,这些数据由其他模块来负责处理。
产生数据的模块称为生产者,而处理数据的模块称为消费者。
在生产者与消费者之间的缓冲区称之为仓库。生产者负责往仓库运输商品,
而消费者负责从仓库里取出商品,这就构成了生产者消费者模式。
参考阅读:用Python多线程实现生产者消费者模式

25、什么是cdn?

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

26、LVS是什么及作用?

 一.LVS是什么?

LVS的英文全称是Linux Virtual Server,即Linux虚拟服务器。它是我们国家的章文嵩博士的一个开源项目。
在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
二.LVS能干什么?

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

Linux服务器集群系统(一)

27、Nginx是什么及作用?

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,
并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力强,
事实上nginx的并发能力确实在同类型的网页服务器中表现较好,
中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

28、keepalived是什么及作用?

 Keepalived是Linux下一个轻量级别的高可用解决方案。高可用(High Avalilability,HA),
 其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是之主机的冗余和接管,

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

29、haproxy是什么以及作用?

HAProxy是一个使用C语言编写的自由及开放源代码软件[1],
其提供高可用性、负载均衡,以及基于TCP和HTTP的应用程序代理。
HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。
HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。
并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,
同时可以保护你的web服务器不被暴露到网络上。

30、什么是负载均衡?


负载均衡 建立在现有网络结构之上,
它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、
增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性

负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,
例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

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

RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,
而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,
为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。
RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。
首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。
在服务器端,进程保持睡眠状态直到调用信息到达为止。
当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,
然后等待下一个调用信息,最后,客户端调用进程接收答复信息,
获得进程结果,然后调用执行继续进行。

RPC是只远程过程调用,也就是说两台服务器A,B, 一个应用部署在A服务器上,
另一个应用部署在B服务器上,A服务器上的应用想要调用B服务器上的应用提供的方法/函数,
由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语意和传递调用的参数。

32、简述 asynio模块的作用和应用场景?

这个不太懂,请参考下面的文章。
参考阅读:python中重要的模块–asyncio

Python并发编程之协程/异步IO

33、简述gevent模块的作用和应用场景?

gevent是基于协程的Python网络库。特点:

    基于libev的快速事件循环(Linux上epoll,FreeBSD上kqueue)。

    基于greenlet的轻量级执行单元。

    API的概念和Python标准库一致(如事件,队列)。

    可以配合socket,ssl模块使用。

    能够使用标准库和第三方模块创建标准的阻塞套接字(gevent.monkey)。

    默认通过线程池进行DNS查询,也可通过c-are(通过GEVENT_RESOLVER=ares环境变量开启)。

    TCP/UDP/HTTP服务器

    子进程支持(通过gevent.subprocess)

    线程池
参考阅读:gevent - 廖雪峰的官方网站

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

请参考下面的文章。
Python Twisted介绍

 上一篇
腾讯云申请SSL证书并配置Apache服务器(Centos7) 腾讯云申请SSL证书并配置Apache服务器(Centos7)
在腾讯云申请SSL证书并配置Apache服务器 使用SSL可以避免很多问题,关于SSL的介绍,看这里 因为自己的主机使用的是腾讯云 的,所以也就选择了在腾讯云购买SSL证书,他们有免费的,可以直接申请。其他的云服务商应该也是如此。 申请非常
2018-07-07
下一篇 
Python面试题,第一部分:基础篇(80题) Python面试题,第一部分:基础篇(80题)
第一部分 Python基础篇(80题)1、为什么学习Python?高层语言 :无需考虑如何管理你的程序使用的内存一类的底层细节等。 可移植性 :由于Python的开源本质,它已经被移植在许多平台上。 面向对象 :Python既支持面向过
2018-07-07