第一部分 必答题
-
简述 OSI 7层模型及其作用?(2分)
-
应用层:要发送的数据 HTTP/https协议
-
表示层
-
会话层
-
传输层:定义端口,TCP/UDP协议,四层交换机,四层路由器
-
网络层:IP协议,路由器,三层交换机
-
数据链路层:mac arp协议,网卡,交换机(二层交换机)
-
物理层:建立,维护,断开物理连接
-
-
简述 TCP三次握手、四次回收的流程。(3分)
-
三次握手
-
client端将标志位SYN置为1,随机产生一个值sqe=J,并将该数据包发给server端,client端进入SYN_SENT状态,等待server端确认
-
server端收到数据包后,由SYN=1得知client要建立连接,server将标志位和ACK都置为1,确认client端的SYN(ack=j+1,ack是确认数据),随机产生一个值seq=K,将该数据包发给client端以确认连接请求,server端进入SYN_RECV状态
-
client端收到后,检查ack是否为J+1,ACK是否为1,如果正确,则将标志位ACK置为1,ack=k+1,并将数据包发送给server,server检查ack是否为K+1,ACK是否为1,如果正确则建立连接
-
-
四次挥手
-
client向server发送fin的标记报文,请求断开
-
server收到后,可能正在处理数据,此时向client发送ack报文
-
server端处理完数据后,再次向client端发送fin报文,此时可以断开连接
-
client端收到后,向server端发送ack报文,确认可以断开连接
-
-
-
TCP和UDP的区别?(3分)
-
TCP需要连接才能收发消息
-
可靠
-
速度慢
-
面向连接
-
全双工
-
流式传输
-
可传输大文件
-
适用于:文件传输,实时通信,邮件等
-
-
UDP不需要连接就可收发消息
-
不可靠
-
速度快
-
无链接
-
面向数据报
-
传输数据大小受限
-
可多次发送消息
-
多人通信
-
适用于:即时通讯工具
-
-
-
什么是黏包?(2分)
-
TCP协议特有
-
由于数据与数据之间是没有边界的,所以可能多个数据合在一起,叫做黏包
-
可能发生在:
-
客户端:client端处理/接收数据慢,造成多条数据黏包,或者接收的长度小于一次发送的长度
-
服务端:server端发送两条数据间隔时间太短,造成两条数据黏在一起
-
-
-
什么 B/S 和 C/S 架构?(2分)
-
浏览器/服务器架构:有浏览器就可以使用
-
也是C/S架构的一种
-
节省资源
-
不用更新
-
不依赖环境
-
-
客户端/服务器架构:需要下载客户端才可使用
-
安全性高
-
程序一般较大
-
-
-
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
# server
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",8888))
sk.listen()
conn,addr = sk.accept()
msg = conn.recv(1024).decode("utf-8")
print(msg)
conn.close()
sk.close()
# client
import socket
sk = socket.socket()
sk.connect(("127.0.0.1",8888))
sk.send("你好!".encode("utf-8"))
sk.close() -
简述进程、线程、协程的区别?(3分)
-
进程是计算机分配资源的最小单位
-
线程是能被cpu调度的最小单位
-
协程是不存在的,是程序员基于代码实现的
-
进程之间不能共享资源,但可以通过文件/队列/网络实现资源共享
-
一个进程中至少有一个线程
-
一个进程中可以有多个线程,同一进程中的线程可以资源共享
-
一个线程中可以有多个协程
-
计算密集型用多进程
-
io密集型用多协程/多线程
-
-
什么是GIL锁?(2分)
-
全局解释器锁
-
同一时刻一个进程中只有一个线程可以被cpu调度
-
-
进程之间如何进行通信?(2分)
-
通过文件/网络/队列实现通信
-
-
Python如何使用线程池、进程池?(2分)
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor(10)
def func():
print(11)
for i in range(10):
pool.submit(func)
pool.shutdown(True)from concurrent.futures import ProcessPoolExecutor
pool = ProcessPoolExecutor(10)
def func():
print(22)
for i in range(10):
pool.submit(func)
pool.shutdown(True)