-
应用层:为操作系统或者应用程序提供可用的网络接口。
表示层:信息格式和语法转化
会话层:验证访问和会话管理
传输层:为应用程序之间提供端对端的逻辑通信
网络层:选择合适的网间路由完成两个计算机之间的多个数据链路,通过路由协议和地址解析协议(ARP)。IP,RIP(路由信息协议),OSPF(最短路径优先协议)
数据链路层:在无力撑提供的比特流的基础上,建立相邻节点之间的数据链路,不可靠的物理介质提供可靠传输ppp协议
物理层:规定通信设备,通信链路的特性 -
简述 TCP三次握手、四次回收的流程。(3分)
三次握手:1)发送端首先发送一个带有SYN(synchronize)标志地数据包给接收方。
2)接收方接收后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了。
3)最后,发送方再回传一个带有ACK标志的数据包,代表我知道了,表示’握手‘结束。
四次挥手:
1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手
-
TCP和UDP的区别?(3分)
tcp 上传下载\发邮件 可靠 面向连接 速度慢 能传递的数据长度不限 流式传输 全双工
udp 即时通讯工具 不可靠 面向数据报 速度快 能传递的数据长度有限度 一对一 一对多 多对多 -
什么是黏包?(2分)
发送的每一条数据之间没有边界,当多条消息发送时接受变成了一条或者出现接受不准确的情况
-
什么 B/S 和 C/S 架构?(2分)
C/S :qq 微信 浏览器 英雄联盟 穿越火线 王者荣耀
C:client 客户端
S:server 服务端
B/S :百度 淘宝 码云 只要在浏览器输入网址就可以直接使用
B:browser 浏览器 -
请实现一个简单的socket编程(客户端和服务端可以进行收发消息)(3分)
import struct
import socket
sk = socket.socket()
def proto_recv():
len_msg = sk.recv(4)
len_msg = struct.unpack('i', len_msg)[0]
msg = sk.recv(len_msg)
return msg
sk.connect(('192.168.12.26',9001))
msg1 = proto_recv()
print(msg1)
msg2 = proto_recv()
print(msg2)
-----------------------------------------------------------------------------------------------------
服务器端
import struct
import socket
def proto_send(msg):
msg = msg.encode('utf-8')
len_msg = len(msg)
proto_len = struct.pack('i', len_msg) # 把字节的长度编程4字节,i代表int
conn.send(proto_len)
conn.send(msg)
sk = socket.socket()
sk.bind(('192.168.12.26',9001))
sk.listen()
conn,addr = sk.accept()
msg1 = 'hello'
msg2 = 'world'
proto_send(msg1)
proto_send(msg2) -
简述进程、线程、协程的区别?(3分)
进程,计算机中分配资源的最小单位:线程,是计算机中cpu调度的最小单位,协程又称为'微线程',是基于代码人为创造出来的,而进程和线程是计算机中真是存在的
一个进程中可以有多个线程/一个线程中可以创建多个协程, -
什么是GIL锁?(2分)
GIL 全局解释器锁
1.同一时刻保证一个进程中只有一个线程可以被cpu调度,所以在使用
2.列表/字典线程安全起到了作用 -
进程之间如何进行通信?(2分)
通过队列
-
Python如何使用线程池、进程池?(2分)
-
请通过yield关键字实现一个协程? (2分)
-
什么是异步非阻塞? (2分)
对于调用者来说发起一个请求后不用等待,被调用者收到请求后直接给出反馈再去做任务
-
什么是死锁?如何避免?(2分)
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。 -
程序从flag a执行到falg b的时间大致是多少秒?(2分)
import threading
import time
def _wait():
time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.setDeamon(False)
t.start()
# flag b -
程序从flag a执行到falg b的时间大致是多少秒?(2分)
import threading
import time
def _wait():
time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.setDeamon(True)
t.start()
# flag b
60秒
主进程结束后 守护进程才会被杀死 -
程序从flag a执行到falg b的时间大致是多少秒?(2分)
import threading
import time
def _wait():
time.sleep(60)
# flag a
t = threading.Thread(target=_wait)
t.start()
t.join()
# flag b
快 -
读程序,请确认执行到最后number是否一定为0(2分)
import threading
loop = int(1E7)
def _add(loop:int = 1):
global number
for _ in range(loop):
number += 1
def _sub(loop:int = 1):
global number
for _ in range(loop):
number -= 1
number = 0
ta = threading.Thread(target=_add,args=(loop,))
ts = threading.Thread(target=_sub,args=(loop,))
ta.start()
ta.join()
ts.start()
ts.join()
不为零 -
读程序,请确认执行到最后number是否一定为0(2分)
import threading
loop = int(1E7)
def _add(loop:int = 1):
global number
for _ in range(loop):
number += 1
def _sub(loop:int = 1):
global number
for _ in range(loop):
number -= 1
number = 0
ta = threading.Thread(target=_add,args=(loop,))
ts = threading.Thread(target=_sub,args=(loop,))
ta.start()
ts.start()
ta.join()
ts.join()
为零 -
MySQL常见数据库引擎及区别?(3分)
关系型数据库 mysql oracle sqlserver sqllite
非关系型数据库 redis mongodb memcache hbase -
简述事务及其特性? (3分)
-
事务的隔离级别?(2分)
-
char和varchar的区别?(2分)
首先明确的是,char的长度是不可变的,而varchar的长度是可变的
-