网络并发编程重点面试题

1、OSI七层协议

"""
应用层:http
表示层
会话层:smtp,dns
传输层:tcp,udp
网络层:ip,icmp,arp
数据联络层
物理层

那我们需要重点关注的有5层:物理层,数据联络层,网络层,传输层,应用层
"""

2、简述tcp三次握手,四次挥手

"""
三次握手建连接:
1、客户端向服务端发送建立连接的请求
2、服务端返回收到的请求信息给客户端,并且发送向客户端建立连接的请求
3、客户端收到服务端的请求,返回请求成功给服务端,完成双向连接

一次请求必有一次响应
缺点:洪水攻击

四次挥手断连接:
由于tcp连接是双向通信的,因此每个方向都必须单独进行关闭
1、客户端向服务端发送断开连接的请求
2、服务端返回收到的请求信息给客户端,如果同意的话此时客户端向服务端的那条通道就关闭了
3、服务端确认所有的数据都接收完成以后,也向客户端发送断开连接的请求
4、客户端返回断开连接的请求给服务端,此时双向通道都关闭了
"""

3、tcp和udp的区别?为何tcp协议要比udp协议更可靠?

"""
1、tcp面向连接(比如说你打电话先拨号建立连接);udp是无连接的,即发送数据之前不需要建立连接
2、tcp提供的是安全的服务。通过tcp连接传送的数据,不会丢失,且有序到达;udp安全性较差,可能会有数据丢失
3、tcp是面向字节流的,实际上tcp是把数据看成是一连串无结构的字节流;udp是面向报文的,udp没有阻塞,对实时应用很有用,比如视频会议等


# tcp比udp更安全
tcp:可靠,对方确认收到信息之后,我才会继续发送下一个,如果没收到确认信息,就重新发送
udp: 不可靠,一只发送数据,不需要确认对方有没有收到信息
"""

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

"""
socket是一组接口。在设计模式中,socket其实就是一个门面模式。它吧复杂的tcp/ip协议隐藏在socket接口后面,对用户来说,一组简单的接口就是全部了

-sever端
import socket

sever = socket.socket()

sever.bind(
	('ip', 'port')
)

sever.listen(5)

coon,addr = sever.accept()

data = coon.recv(1024)

coon.send()

coon.close()


- client端

import socket
client = socket.socket()
client.connect(
	('ip', 'port')
)

client.send()
client.close()
"""

5、什么是粘包?为什么会出现粘包?

"""
粘包:即数据粘在一起。接收数据的一方不知道消息之间的界限,也不知道一次性应该提取多少个字节的数据,如果发送的数据量较小且发送的时间间隔是比较短的,就有可能合成了一个包

解决粘包:struct报头
"""

6、Nginx为啥这么强大牛逼呢?(socket,poll,epoll的区别)

"""
nginx其实是使用了epoll模型

i/o多路复用的本质其实就是用select/poll/epoll,去监听多个socket对象,如果其中的socket对象有变化,用户的进程就知道了

socket是不断轮询的去监听socket,socket的个数有限制,一般为1024个

poll也是采用的轮询的方式监听,只不过没有个数限制

epoll 并不是采用轮询方式去监听,而是当socket有变化时通过回调的方式主动告知用户进程


"""

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

"""
进程:是资源单位,开启一个进程会自带一个线程,进程与进程之间数据是隔离的
线程:是执行单位,也就是CPU调度的单位,线程与线程之间数据是可以共享的
协程:其实就是单线程实现并发,程序之间的切换是用户自行处理的,节省了CPU的调度时间


io密集型:多线程
计算密集型:多进程
"""

8、什么是GIL锁?

"""
GIL是python的全局解释器的锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使得该进程下的其他线程无法运行,等该线程运行完,其他线程才能运行。如果线程在运行过程中遇到了耗时操作,则把锁打开,使得其他线程运行,所以多线程中,线程的运行也是有先后顺序的
解释器
多进程中是因为每个进程都能被系统分配资源,相当于每个进程都有了一个python,所以多进程是可以同时运行的,缺点就是资源消耗大
"""

9、进程池,线程池, 回调函数

"""
from concurrent.futures import ThreadPoolExecutor   # 线程池
import time
# 池子对象:内部可以帮你提交50个启动线程的任务
p_pool =  ThreadPoolExecutor(50)

def task1(n):
    print(f'from task1...{n}')
    time.sleep(10)
    
    
if __name__ == '__main__':
    n = 1
    while True:
        p_pool.submit(task1, n)
        n += 1


from concurrent.futures import ProcessPoolExecuto   # 进程池
import time
#池子对象:内部帮你提交50个启动进程的任务
p_pool = ProcessPoolExecutor(50)

def task1(n):
    print(f'from task1...{n}')
    time.sleep(10)
    
if __name__ == '__main__':
    n = 1
    while True:
        #参数1:函数名
        #参数2:函数的参数1
        #参数3:函数的参数2
        #submit(参数1,参数2, 参数3)
        p_pool.submit(task1, n)
        n += 1
        
      
      
# 回调函数add_done_callback

from concurrent.futures import ThreadPoolExecutor
import time

p_pool = ThreadPoolExecutor(50)


def task1(n):
    print(f'from task1...{n}')
    time.sleep(5)
    return 'yafeng'


def get_result(obj):
    # print(obj.__dict__)
    #print(obj._result)   等同于 print(obj.)
    result = obj.result()
    print(result)



if __name__ == '__main__':
    n = 1
    while True:
        p_pool.submit(task1, n).add_done_callback(get_result)
        n += 1


"""

10、IPC进程之间的通信

"""
python提供了多种进程通信的方式,主要是queue以及pipe这两种方式,queue是用于多进程之间的通信,pipe是两个进程之间通信,通过队列就可以实现进程间通信
"""

11、什么是域名解析?

"""
在互联网上,所有的地址都是ip地址,但是这些ip地址太难记住了,所以就出现了域名(比如:http://baidu.com),那域名解析就是将域名转换为ip地址的这样一种行为

"""

12、生产者消费者模型与应用场景?

"""

生产者与消费者模式是通过一个容器来解决生产者与消费者的强耦合关系,生产者与消费者之间不直接进行通讯,
而是利用阻塞队列来进行通讯,生产者生成数据后直接丢给阻塞队列,消费者需要数据则从阻塞队列获取,
实际应用中,生产者与消费者模式则主要解决生产者与消费者的生产与消费的速率不一致的问题,达到平衡生产者与消费者的处理能力,而阻塞队列则相当于缓冲区。

应用场景:用户提交订单,订单进入引擎的阻塞队列中,由专门的线程从阻塞队列中获取数据并处理。

优势:
1;解耦
假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。
将来如果消费者的代码发生变化,可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了。
2:支持并发
生产者直接调用消费者的某个方法,还有另一个弊端。由于函数调用是同步的(或者叫阻塞的),在消费者的方法没有返回之前,生产者只能一直等着
而使用这个模型,生产者把制造出来的数据只需要放在缓冲区即可,不需要等待消费者来取。
3:支持忙闲不均
缓冲区还有另一个好处。如果制造数据的速度时快时慢,缓冲区的好处就体现出来了。
当数据制造快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中。等生产者的制造速度慢下来,消费者再慢慢处理掉。

"""

13、简述多进程开发中join与deamon的区别

"""
p.join():主线程等待p终止(强调的是:主线程处于等的状态,而p是处于运行的状态)
p.deamon:默认是false,如果设为true,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止
"""

14、gevent模块是什么?

"""
gevent是第三方库,通过greenlet实现协程,其基本思想是:
	当一个greenlet遇到io操作时,比如访问网络,就自动切换到其他的greenlet,等到io操作完成时,再在适当的时候切换回来继续执行。由于io操作非常耗时,经常使程序处于等待状态,有了gevent可以为我们自动为我们自动切换协程
"""

15、同步和异步,阻塞和非阻塞的区别?

"""
# 答案:
'''
同步:多个任务之间有先后执行的顺序,一个执行完才可以执行下一个;
异步:多个任务之间没有先后顺序,可以同时执行。有时候一个任务可能在必要的时候需要获取另一个任务的执行结果,这就叫回调
同步和异步关心的问题是:多任务的执行顺序。

阻塞:在执行一个操作时,不能做其他操作;
非阻塞:在执行一个操作时,能做其他操作。
阻塞和非阻塞关心的问题是:能不能做其他操作。
'''
"""

16、什么是Nginx?

"""
Nginx是一款自由的,开源的,高性能的HTTP服务器以及反向代理服务器,它可以动态分发实现负载均衡
"""

17、什么是负载均衡?

"""
系统的扩展分为纵向扩展和横向扩展。

纵向扩展:是从单机的角度通过增加硬件的处理能力,比如CPU处理能力,内存容量,磁盘等方面,实现服务器处理能力的提升,不能满足大型分布式系统的大流量,高并发,数据大等问题。

横向发展:通过添加机器老满足大型网站服务处理的能力。比如一台机器不能满足,就增加两台或者多态,共同承担访问压力。这就是典型的集群和负载均衡
"""

18、描述用浏览器访问www.baidu.com的过程

"""
先要解析出baidu.com对应的ip地址
- 要先使用arp获取默认网关的mac地址
- 组织数据发送给默认网关(ip还是dns服务器的ip,但是mac地址是默认网关的mac地址)
- 默认网关拥有转发数据的能力,把数据转发给路由器
- 路由器根据自己的路由协议,来选择一个合适的较快的路径转发数据给目的网关
- 目的网关(dns服务器所在的网关),把数据转发给dns服务器
- dns服务器查询解析出baidu.com对应的ip地址,并原路返回请求这个域名的client
得到了baidu.com对应的ip地址之后,会发送tcp的3次握手,进行连接
使用http协议发送请求数据给web服务器
- web服务器收到数据请求之后,通过查询自己的服务器得到相应的结果,原路返回给浏览器。
- 浏览器接收到数据之后通过浏览器自己的渲染功能来显示这个网页。
- 浏览器关闭tcp连接,即4次挥手结束,完成整个访问过程
"""

19、get请求post请求

"""
get请求会将请求的数据附加在url的后面,以?分割url以及传输的数据,如果有多个参数的话用&连接
url的编码格式采用的是ascll编码,而不是Unicode,那么因此所有的非ascall字符都要编码之后再传输


post请求会把请求的数据放在HTTP请求的包体中,不像get请求是直接暴露在外面的,所以post请求的安全性要比get请求高。post请求顾名思义是可以添加新的数据的,而get请求是获取数据的。
"""

20、cookies与session的区别

"""
1、cookie数据是存放在客户的浏览器上的,session数据是放在服务器上的
2、cookie不是很安全,别人可以通过分析存放在本地的cookie进行欺骗访问,考虑到安全应该使用session
3、session会在一定的时间内保存在服务器上,即它有一个过期的时间
4、单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie
5、建议:将登录等一些敏感的信息存放在session中,其他的信息我们可以存放在cookie中
"""

21、HTTP状态码

"""
通过状态码告诉客户端服务器的执行状态
1XX:表示服务器成功接收部分请求,要求客户端继续提交其余的请求,才能完成整个处理过程
2XX:表示福服务器成功接收请求并且已经完成处理,200表示请求OK
3xx:表示服务器进行一些重定向的操作,访问a页面跳转到b页面
4xx:客户端请求有误,403权限不足,404没有找到请求的页面
5xx:服务端出现错误,常用的比如500
"""

22、HTTP与HTTPS

"""
http协议传输的数据是未加密的,也就是明文的,因此使用HTTP协议传输的一些隐私的数据信息是不安全的,为了保证这些隐私的数据能加密传输,于是网景公司设计了ssl协议用来对数据进行加密,从此就诞生了HTTPS。简单来说HTTPS就是由ssl+http协议构建的可对数据进行加密的一种传输协议。

区别:
1、HTTPS协议是需要ca申请证书,需要数据费用
2、HTTP协议是明文,不安全的,HTTPS协议是加密的,安全性高
3、HTTP使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
4、HTTP的连接很简单,是无状态的,HTTPS协议是加密连接的
"""

23、HTTP常见的请求头

"""
1. Host (主机和端口号)
2. Connection (链接类型)
3. Upgrade-Insecure-Requests (升级为 HTTPS 请求)
4. User-Agent (浏览器名称)
5. Accept (传输文件类型)
6. Referer (页面跳转处)
7. Accept-Encoding(文件编解码格式)
8. Cookie (Cookie)
9. x-requested-with :XMLHttpRequest  (是 Ajax 异步请求)
"""
posted @ 2020-04-05 15:44  alen_zhan  阅读(228)  评论(0编辑  收藏  举报
返回顶部