1、简述 OSI 七层协议。

  1. 1、物理层
  2. 为数据链路层提供物理连接,实现比特流的透明传输,所传输数据的单位是比特,该层定义了通信设备与传输线接口硬件的电气、机械以及功能和过程的特性。
  3. 2、数据链路层
  4. 在通信的实体之间建立数据链路连接,传送以帧为单位的数据,通过检查发生在连接通信系统间传送路上的比特错误并进行恢复,确保比特序列组成为数据流准确无误地传送给对方的系统。数据链路层在相邻的节点之间实现透明的高可靠性传输。
  5. 3、网络层
  6. 解决多节点传送时的路由选择、拥挤控制及网络互连等,控制分组传送系统的操作,它的特性对高层是透明的,同时,根据传输层的要求选择服务质量,并向传输层报告未恢复的差错。
  7. 4、传输层
  8. 为两个端系统(源站和目标站)的会话层之间建立一条传输连接,可靠、透明地传送报文,执行端一端差错控制、顺序和流量控制、管理多路复用等。本层提供建立、维护和拆除传送连接的功能,并保证网络连接的质量。它向高层屏蔽了下层数据通信的细节,因而是OSI网络参考模型中最需要的一层。
  9. 5、会话层
  10. 不参与具体的数据传输,但对数据传输的同步进行管理。它主要负责提供两个进程之间建立、维护和结束会话连接功能,同时要对进程中必要的信息传送方式、进程间的同步以及重新同步进行管理。
  11. 6、表示层
  12. 解决在两个通信系统中交换信息时不同数据格式的编码之间的转换,语法选择,数据加密与解密及文本压缩等。
  13. 7、应用层
  14. 负责向用户提供各种网络应用服务,如文件传输、电子邮件、远程访问等。把进程中于对方进程通信的部分放入应用实体中,同时,对各种业务内容的通信功能进行管理。

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

  1. C/S架构软件(即客户机/服务器模式)分为客户机和服务器两层:第一层是在客户机系统上结合了表示与业务逻辑,第二层是通过网络结合了数据库服务器。简单的说就是第一层是用户表示层,第二层是数据库层。客户端和服务器直接相连,这两个组成部分都承担着重要的角色。
  2. B/S型模式,即浏览器/服务器结构。它是C/S架构的一种改进,可以说属于三层C/S架构。主要是利用了不断成熟的WWW浏览器技术,用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能,并节约了开发成本,是一种全新的软件系统构造技术。

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

  1. 所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发
  2. 1. 第一次握手:
  3. Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给ServerClient进入SYN_SENT状态,等待Server确认。
  4. 1. 第二次握手:
  5. Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYNACK都置为1ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
  6. 1. 第三次握手:
  7. Client收到确认后,检查ack是否为J+1ACK是否为1,如果正确则将标志位ACK置为1ack=K+1,并将该数据包发送给ServerServer检查ack是否为K+1ACK是否为1,如果正确则连接建立成功,ClientServer进入ESTABLISHED状态,完成三次握手,随后ClientServer之间可以开始传输数据了。
  8. 所谓四次挥手(Four-Way Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发
  9. 第一次挥手:
  10. Client发送一个FIN,用来关闭ClientServer的数据传送,Client进入FIN_WAIT_1状态。
  11. 第二次挥手:
  12. Server收到FIN后,发送一个ACKClient,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
  13. 第三次挥手:
  14. Server发送一个FIN,用来关闭ServerClient的数据传送,Server进入LAST_ACK状态。
  15. 第四次挥手:
  16. Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACKServer,确认序号为收到序号+1Server进入CLOSED状态,完成四次挥手。

4、什么是arp协议?

  1. 地址解析协议,即ARPAddress Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。

5、TCP和UDP的区别?

  1. 基于连接与无连接
  2. TCP要求系统资源较多,UDP较少;
  3. UDP程序结构较简单
  4. 流模式(TCP)与数据报模式(UDP);
  5. TCP保证数据正确性,UDP可能丢包
  6. TCP保证数据顺序,UDP不保证

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

  1. 局域网和广域网是按规模大小而划分的两种计算机网络。范围在几千米以内的计算机网络统称为局域网;而连接的范围超过10千米的,则称为广域网,因特网(Intenet)就是目前最大的广域网。

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

  1. TCP的可靠保证,是它的三次握手双向机制,这一机制保证校验了数据,保证了他的可靠性。而UDP就没有了,udp信息发出后,不验证是否到达对方,所以不可靠。

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

  1. Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

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

  1. 指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。出现粘包现象的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。
  2. socket粘包:  
  3.   socket 交互send时,连续处理多个send时会出现粘包,soket会把两条send作为一条send强制发送,会粘在一起。
  4.   send发送会根据recv定义的数值发送一个固定的数值,如果最后一次,所剩的数值小于recv定义数就会连带两条send数据同时发送,发生粘包状况。
  5. 解决方案:
  6.   方案1:可以使用time.sleep 在两send之间加上时间(不建议)
  7.   方案2:可以在send两条之间加入一条 conn.recv(1024)

10、IO多路复用的作用?

  1. I/O多路复用是通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
  2. 首先,输入操作一般包含两个步骤:
  3. 等待数据准备好(waiting for data to be ready)。对于一个套接口上的操作,这一步骤关系到数据从网络到达,并将其复制到内核的某个缓冲区。
  4. 将数据从内核缓冲区复制到进程缓冲区(copying the data from the kernel to the process)。
  5. 阻塞I/O模型
  6. 非阻塞I/O模型
  7. I/O复用模型
  8. 正因为阻塞I/O只能阻塞一个I/O操作,而I/O复用模型能够阻塞多个I/O操作,所以才叫做多路复用。

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

  1. 简单的来说,防火墙就是一种,避免你的电脑被黑客入侵的一种防护工具,一种确保网络安全的方法!
  2. 1.允许网络管理员定义一个中心点来防止非法用户进入内部网络。
  3. 2.可以很方便地监视网络的安全性,并报警。
  4. 3.可以作为部署NATNetwork Address Translation,网络地址变换)的地点,利用NAT技术,将有限的IP地址动态或静态地与内部的IP地址对应起来,用来缓解地址空间短缺的问题等

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

  1. 1selectpoll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用 epoll_wait不断轮询就绪链表,期间也可能多次睡眠和唤醒交替,但是它是设备就绪时,调用回调函数,把就绪fd放入就绪链表中,并唤醒在 epoll_wait中进入睡眠的进程。虽然都要睡眠和交替,但是selectpoll在“醒着”的时候要遍历整个fd集合,而epoll在“醒着”的 时候只要判断一下就绪链表是否为空就行了,这节省了大量的CPU时间。这就是回调机制带来的性能提升。
  2. 2selectpoll每次调用都要把fd集合从用户态往内核态拷贝一次,并且要把current往设备等待队列中挂一次,而epoll只要 一次拷贝,而且把current往等待队列上挂也只挂一次(在epoll_wait的开始,注意这里的等待队列并不是设备等待队列,只是一个epoll 部定义的等待队列)。这也能节省不少的开销。

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

  1. 进程拥有自己的堆和栈,既不共享堆也不共享栈 进程由操作系统调度
  2. 线程拥有自己的堆和共享的栈 共享栈 但不共享堆 线程也是由操作系统调度
  3. 协程和线程一样有自己的堆和共享的栈 共享栈但不共享堆 协程由开发人员在适当情况调用

14、GIL锁是什么鬼?

  1. GIL:全局解释器锁。当我们用多线程的时候,
  2. 每一个进程中只有一个GIL锁,那么这多个线程中谁拿到GIL锁,
  3. 谁即可以用cpu(ps:多个进程有多个Gil锁,但每个进程中只有一个GIL)

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

  1. 进程池:使用multiprocessing.Pool
  2. 线程池:使用ThreadPool模块

16、threading.local的作用?

  1. threadLocal解决了参数在一个线程中各个函数之间相互传递的问题
  2. 一个threadLocal变量虽然是全局变量,但每个线程都只能读写自己线程的独立副本 互不干扰

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

  1. 创建一个queue队列,或使用 from multiprocessing import Manage管理要进行通信的数据

18、什么是并发和并行?

  1. 并发(concurrency)和并行(parallellism)是:
  2. 解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
  3. 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
  4. 解释三:在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群
  5. 所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

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

  1. 当多进程或多线程是不用进程访问相同一个变量
  2. 是会造成同一时间执行相同的事 而得不到正确的结果 所以需要用锁锁上这个全局变量,
  3. 当某一个进程或线程访问时其他进程或线程均无法访问

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

  1. 异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,
  2. 所以在发送的信息中就要有提示接收方开始接收的信息,如开始位,同时在结束时有停止位。
  3. 非阻塞模式是指利用socket事件的消息机制,Server端与Client端之间的通信处于异步状态。

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

  1. 一、工作所在的OSI层次不一样(根本区别,导致接下来的区别)
  2. 交换机工作在 OSI模型的数据链路层,所以工作原理比较简单;
  3. 路由器工作在OSI模型的网络层,具备更多的网络协议信息,所以可以做出更好的数据转发策略。
  4. 二、数据转发所依据的对象也不一样。
  5. 交换机工作在数据链路层,所以交换机转发数据依靠的是每个物理地址(MAC地址),MAC地址一般是设备生产商在设备出厂时固定在设备中的,不能进行更改。
  6. 路由器工作在网络层,所以其交换数据依靠网络地址(IP地址),而IP地址是由网络管理员自己分配或者系统自动获取的。
  7. 三、是否可以分割广播域
  8. 由交换机连接的所有端口仍然属于同一个广播域,所以极有可能会产生数据拥堵;
  9. 连接到路由器上的所有端口不在属于同一个广播域,所以不会产生类似的数据拥堵问题。

22、什么是域名解析?

  1. 域名解析是把域名指向网站空间IP,让人们通过注册的域名可以方便地访问到网站的一种服务

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

  1. # 127.0.0.1 localhost
  2. # ::1 localhost
  3. 127.0.0.1 www.gkate.com
  4. 修改后用浏览器访问“www.gkate.com”会被解析到127.0.0.1,导致无法显示该网页

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

  1. 应用于一个生产数据一个处理数据的场景
  2. 优势生产者和消费者之间不直接进行通信 而是通过一个队列相当于一个缓冲区,
  3. 平衡了生产者和消费者的处理能力

25、什么是cdn?

  1. 尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,
  2. 使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、
  3. 负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

26、LVS是什么及作用?

  1. LVS Linux Virtual Server Linux 虚拟服务器;是一个虚拟的服务器集群【多台机器 LB IP】。LVS 集群分为三层结构:
  2. 负载调度器(load balancer):它是整个LVS 集群对外的前端机器,负责将client请求发送到一组服务器[多台LB IP]上执行,而client端认为是返回来一个同一个IP【通常把这个IP 称为虚拟IP/VIP
  3. 服务器池(server pool):一组真正执行client 请求的服务器,一般是我们的web服务器;除了web,还有FTPMAILDNS
  4. 共享存储(shared stored):它为 server pool 提供了一个共享的存储区,很容易让服务器池拥有相同的内容,提供相同的服务[不是很理解]
  5. LVS :单向的
  6. End user ------>LVS --------> tomcat .......> end user
  7. Ngnix 有个来回
  8. End user ------>Ngnix--------> tomcat---->Ngnix .......> end user

27、Nginx是什么及作用?

  1. Nginx是一个http服务器。同效果的http服务器还有Apachetomcat
  2. 作用:
  3. 1 http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
  4. 2 虚拟主机。可以实现在一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。基于端口的,不同的端口基于域名的,不同域名
  5. 3 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。

30、什么是负载均衡?

  1. asyncioPython 3.4版本引入的标准库,直接内置了对异步IO的支持。
  2. asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个
  3. EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO

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

  1. 当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet
  2. 等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,
  3. 经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO
  4. 由于切换是在IO操作时自动完成,所以gevent需要修改Python自带的一些标准库,
  5. 这一过程在启动时通过monkey patch完成

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

  1. Twisted是用Python实现的基于事件驱动的网络引擎框架,
  2. Twisted支持许多常见的传输及应用层协议,包括TCPUDPSSL/TLSHTTPIMAPSSHIRC以及FTP。就像Python一样,Twisted也具有“内置电池”(batteries-included)的特点。
  3. Twisted对于其支持的所有协议都带有客户端和服务器实现,同时附带有基于命令行的工具,
  4. 使得配置和部署产品级的Twisted应用变得非常方便。