Python网络相关笔试/面试题

1. 简述OSI七层模型以及列举各层协议

应用层:HTTP,FTP,NFS
表示层:Telnet,SNMP
会话层:SMTP,DNS
传输层:TCP,UDP
网络层:IP,ICMP,ARP
数据链路层:Ethernet,PPP,PDN,SLIP,FDDI
物理层:IEEE 802.1A,IEEE 802.11

2. 简述三四握手和四次挥手

三次握手是连接建立阶段。第一次握手:客户端的应用进程主动打开,并向客户端发出请求报文段;第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文;第三次握手:客户端收到确认报文之后,通知上层应用进程连接已建立,并向服务器发出确认报文。

四次挥手是连接释放阶段,。第一次挥手:数据传输结束以后,客户端的应用进程发出连接释放报文段; 第二次挥手:服务器端收到连接释放报文段之后,发出确认报文。此时本次连接就进入了半关闭状态,客户端不再向服务器发送数据,而服务器端仍会继续发送;第三次挥手:若服务器已经没有要向客户端发送的数据,其应用进程就通知服务器释放TCP连接。这个阶段服务器所发出的最后一个报文的首部应为:FIN=1,ACK=1,seq=w,ack=u+1。 第四次挥手:客户端收到连接释放报文段之后,必须发出确认:ACK=1,seq=u+1,ack=w+1。 再经过2MSL(最长报文端寿命)后,本次TCP连接真正结束,通信双方完成了他们的告别。

3. 简述TCP和UDP的区别

TCP是面向连接的,而UDP是无连接的,发送数据之前不需要建立连接。

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

UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信。

每一条TCP连接只能是点到点的,UDP支持一对一、一对多、多对一和多对多地交互通信。

TCP对系统资源要求较多,UDP对系统资源要求较少。

简答UDP直接连接和直接发送,是否收到不管,可能会丢包。而TCP数据是面向连接的,能够保证传送数据的完整。

5. ARP协议

ARP协议是地址解析协议,是根据IP地址获取主机的物理地址。

6. DNS解析解析流程

用户输入域名后,回到本地hosts文件(/etc/host)中查找解析记录。如果没有记录,会到本地DNS缓存中查找记录。如果还没有记录,会通过公网DNS服务器查找记录。查找到记录后,会将此解析记录缓存到本地DNS中,用于下次加速解析。最后浏览器访问域名对应的ip,发送http请求。

简答做域名和ip的对应关系,将域名转换成ip地址。

7. HTTP和HTTPS

http:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从www服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

http的特点是:1. 支持客户/服务器模式;2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记;4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。5. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

HTTPS特点:1. 相比于http,https可以提供更加优质保密的信息,保证了用户数据的安全性,此外https同时也一定程度上保护了服务端,使用恶意攻击和伪装数据的成本大大提高。2. 缺点也同样很明显,第一https的技术门槛较高,多数个人或者私人网站难以支撑,CA机构颁发的证书都是需要年费的,此外对接Https协议也需要额外的技术支持;其二,目前来说大多数网站并不关心数据的安全性和保密性,其https最大的优点对它来说并不适用;其三,https加重了服务端的负担,相比于http其需要更多的资源来支撑,同时也降低了用户的访问速度;第四,目前来说Http网站仍然大规模使用,在浏览器侧也没有特别大的差别,很多用户不关心的话根本不感知。

简答:使用https时数据在发送的时候对数据进行加密。

8. 进程、线程、协程的区别

一个应用程序就是一个软件,一个软件中有多个进程,一个进程可以有多个线程。进程是资源分配的最小单位,线程是程序执行(资源调度)的最小单位。进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。进程拥有自己的堆和栈,不共享堆也不共享栈。线程是CPU调用的最小单位,线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。线程拥有自己的堆和栈,是共享栈但是不共享堆的。线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。协程是不存在的,是由程序员来定义的,协程只使用一个线程。协程是微细线程,将线程进行分片,在一个线程中规定某个代码块执行顺序。协程的适用场景是当程序中存在大量不需要CPU的操作时(IO)适用于协程。协程如果处理计算型的任务,速度不快。如果处理IO操作再加上非阻塞的,使用协程那么就会很快。遇到IO切到别的地方,相当于这个线程没有停下来。所以说单纯的协程是不会快的,遇到IO才会快。

Python中如果开多线程想使用多核,我们希望两个线程分别被CPU调度,这是不可以的。如果在python中想要用多核,就必须开多进程。计算密集型的使用多进程,IO操作不用CPU,使用IO可以开多线程,IO的时候不经过锁。

9. GIL锁

GIL锁,即全局解释器锁。全局解释器锁的存在,使python解释器在同一时刻只能运行一个线程的代码,这大大影响了python多线程的性能。而这个解释器锁由于历史原因,现在几乎无法消除。python GIL之所以会影响多线程等性能,是因为在多线程的情况下,只有当线程获得了一个全局锁的时候,那么该线程的代码才能运行。然而全局锁只有一个,所以使用python多线程,在同一时刻也只有一个线程在运行,因此在即使在多核的情况下也只能发挥出单核的性能。

简答: 全局解释器锁,保证同一时刻一个进程只有一个线程被CPU调度。如果想要保证数据的安全,需要自己加锁。

10. HTTP工作流程

第一步:建立TCP/IP连接,客户端与服务器通过Socket三次握手进行连接
第二步:客户端向服务端发起HTTP请求
第三步:客户端发送请求头信息和请求内容,最后会发送一空白行,标示客户端请求完毕
第四步:服务器做出应答,表示对于客户端请求的应答,服务器向客户端发送应答头信息
第五步:服务器向客户端发送应答头信息后,也会发送一空白行,标示应答头信息发送完毕,接着就以Content-type要求的数据格式发送数据给客户端
第六步:服务端关闭TCP连接,如果服务器或者客户端增Connection:keep-alive就表示客户端与服务器端继续保存连接,在下次请求时可以继续使用这次的连接

11. 一次完整的HTTP请求从客户端到服务器端所经过的各个环节

1. 域名解析
2. 发起TCP的3次握手
3. 建立TCP连接后发起http请求
4. 服务器端响应http请求,浏览器得到html代码
5. 浏览器解析html代码,并请求html代码中的资源(如javascript、css、图片等)
6. 浏览器对页面进行渲染呈现给用户

在浏览器中输入www.bysj39.com后执行的全部过程:

1. 浏览器获取输入的域名www.bysj39.com
2. 浏览器向DNS请求解析www.bysj39.com的IP地址
3. 域名系统DNS解析出39毕设网的服务器的IP地址
4. 浏览器与该服务器建立TCP连接(默认端口号80)
5. 浏览器发出HTTP请求,请求39毕设网的首页
6. 服务器通过HTTP响应把首页文件发送给浏览器
7. TCP连接释放
8. 浏览器将首页文件进行解析,并将Web页显示给用户

12. 简述C/S和B/S

C/S是客户端/服务器模式,如我是使用的手机手机软件微信等,C/S架构的优点是交互性好,对服务器压力小。缺点是服务器更新时需要同步更新客户端。

B/S是浏览器/服务器模式,通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。优点是不需要更新客户端, 缺点是交互性差,安全性低。

13. IO多路复用的作用,并列举实现机制以及区别?

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小。系统不必创建进程或线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

实现机制:通过一种机制,可以监视多个文件描述符,一旦描述符就绪(读就绪和写就绪),能通知程序进行相应的读写操作,I/O多路复用避免阻塞在io上。

区别:原本为多进程或多线程来接收多个连接的消息变为单进程或单线程保存多个socket的状态后轮询处理。

IO多路复用适用如下场合:
1. 当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。
2. 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。
3. 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。
4. 如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。
5. 如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。

14. 什么是防火墙,防火墙的作用是什么?

防火墙:在互联网上防火墙是一种非常有效的网络安全模型,通过它可以隔离风险区域(即Internet或有一定风险的网络)与安全区域(局域网)的连接,同时不会妨碍人们对风险区域的访问。所以,它一般连接在核心交换机与外网之间。

防火墙的作用:过滤进出网络的数据、管理进出访问网络的行为、封堵某些禁止业务、记录通过防火墙信息内容和活动、对网络攻击检测和告警

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

TCP协议是可靠的通信,对方给了确认收到信息,才发下一个,如果没收到确认信息就重发;UDP协议的通信是不可靠的,一直发数据,不需要对方回应。

16. 流式协议指的是什么协议,数据报协议指的是什么协议?

流式协议:TCP协议,可靠传输
数据报协议:UDP协议,不可传输

17. 什么是粘包,出现粘包的原因

粘包:多个数据包被连续存储于连续的缓存中,在对数据包进行读取时由于无法确定发生方的发送边界,而采用某一估测值大小来进行数据读出,若双方的size不一致时就会使指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。

出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。
发送方引起的粘包:由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。
接收方引起的粘包:由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。

18. 发生粘包现象如何处理

1. 对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;
2. 对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;
3. 由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。

19. threading.local的作用

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

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

1. 共享内存,通过mmap模块实现。
2. 信号
3. 通过Queue队列
4. 通过Pipe管道
5. 通过socket

21. 什么是并发和并行

并发:应用能够交替执行不同的任务,如多线程的并发,多线程并发是同时执行多个任务。如果你开两个线程执行,就是在你几乎不可能察觉到的速度不断去切换这两个任务,以达到“同时执行的效果”。

并行:指应用能够同时执行不同的任务

两者的区别:并发是多个事件在同一时间内执行,并行是多个事件在统一时刻执行。

22. 什么是cdn

cdn:是内容分发网络,其目的是让用户能够更快速的得到请求的数据。cdn就是用来加速的,他能让用户就近访问数据,这样就更更快的获取到需要的数据。

23. 守护线程,守护进程是什么

守护线程:守护线程会在"该进程内所有非守护线程全部都运行完毕后,守护线程才会挂掉"。并不是主线程运行完毕后守护线程挂掉。这一点是和守护进程的区别之处;守护线程守护的是当前进程内所有的子线程;主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。

守护进程:守护进程本身就是一个子进程;守护进程会在主进程代码运行结束的情况下,立即挂掉;主进程在其代码结束后就已经算运行完毕了(守护进程在此时就被回收),然后主进程会一直等非守护的子进程都运行完毕后回收子进程的资源(否则会产生僵尸进程),才会结束。

24. 简述多进程开发中join和deamon的区别

join:当子线程调用join时,主线程会被阻塞,当子线程结束后,主线程才能继续执行。

deamon:当子进程被设置为守护进程时,主进程结束,不管子进程是否执行完毕,都会随着主进程的结束而结束。

35. GIL锁对python性能的影响以及如何避免

1. 会降低多线程的效率。可以说python就是个单线程的程序。
2. 如何避免:使用多进程代替多线程,使用其它解释器。

36. 什么是twisted框架

twisted是用python实现的基于事件驱动的网络引擎框架

37. LVS是什么

LVS是linux虚拟服务器,是一个虚拟的linux集群系统。

38. 什么是Nginx

nginx是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。

39. keepalived

Keepalived是Linux下一个轻量级别的高可用解决方案

40. 什么是负载均衡

负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡其意思就是分摊到多个操作单元上进行执行。

41. 什么是正向代理和反向代理
42. 如何实现进程共享

queue、pipe、manager来实现进程的共享。

发布了54 篇原创文章 · 获赞 138 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Thanlon/article/details/100865589
今日推荐