面试题
trp 三次握手和四次挥手
TCP是可靠连接,使用三次握手,四次挥手保证了可靠连接,数据不会丢失
-SYN: SYN=1 表示要建立连接
-FIN: 表示断开连接
-ACK: ACK=1 表示我收到了,允许
-seq: 随机数,建立连接无论客户端还是服务端要建立连接就要携带
-ack: 回应请求就要加1返回
三次握手:
第一次:喂(SYN=1),我是lqz(seq=随机数),客户端处于 SYN_SEND状态,服务端没收到的话就是 listen 状态,收到了是:SYN_RCVD 状态
第二次: 收到(ACK=1),是lqz啊(ack=随机数+1),喂(SYN=1),我是吴彦祖(seq=另外一个随机数) 服务端:SYN_RCVD状态,客户端:没收到服务端返回的第二次:SYN_SEND状态,一旦收到了就是 established
第三次:收到(ACK=1),吴彦祖你好(ack = 另外一个随机数+1) 客户端:连接建好的状态 established 服务端: 收到后,处于 established
大白话:
第一次: 客户端向服务端发送建立连接请求, [携带一个随机数](SYN=1,seq=随机数)
第二次: 服务端回应客户端的建立连接请求(ACK=1,ack=随机数+1),服务端发送建立连接请求(SYN=1,seq=另外一个随机数)
第三次: 客户端回应服务端的建立连接请求(ACK=1,ack=另外一个随机数+1)
四次挥手
第一次:客户端向服务端发起断开连接的请求(FIN=随机数)
第二次:服务端收到后,回复这个请求(ACK=1,ack=随机数+1)
第三次:服务端向客户端发起断开的请求(FIN=另一个随机数)
第四次:客户端收到后,回复这个请求(ACK=1,ack=另一个随机数+1)
洪水攻击:
同一时间有大量的客户端请求建立的连接 会导致服务端一直处于SYN_RCVD状态,服务端接收到了大量的syn请求,处于rcvd状态
osi七层协议,哪七层,每层有哪些,TCP/IP五层结构
osi七层:
应用层,表示层,会话层,传输层,网络层、数据链路层、物理连接层
五层结构:
应用层(三合一)、传输层、网络层、数据链路层、物理连接层
-应用层 表示层 会话层 (应用层)
-应用层协议: http,ftp,https,dns
-表示层: https=http+ssl 的加密
-会话层: 负责建立、管理和终止表示层实体之间的会话连接
-传输层:tcp协议, udp协议,端口:端口协议
-网络层: ip地址协议
-数据链路层: mac地址: 以太网协议, 数据帧:电信号的分组方式
-物理层: 物理介质,网线
tcp和udp的区别?udp用在哪里了?
-tcp是面向连接的可靠协议
-udp无连接的不可靠协议
-都是处于传输层
-比如:
udp: 一些聊天, dns协议用的udp协议
tcp: http mysql redis 客户端服务端通信
从浏览器输入一个地址,到看到页面信息,经历的过程
1. 在浏览器中输入的是: 域名---》要做域名解析---》把域名解析成ip地址+端口的形式----> dns解析--->(浏览器缓存,本机缓存,host文件,上一级递归解析服务,13台根dns)====>如果解析不到--->页面会报错
2.解析完后,向解析出的域名和端口,建立TCP连接,进行3次握手
3.像某个地址发送http的get请求
4 如果后端服务是使用nginx转发,nginx把http请求转发给web框架(django,flask)---> django请求生命周期
5 后端服务器以http响应的形式返回给客户端浏览器
6 客户端浏览器把http响应体的内容展示在浏览器上,但是http响应还有: 状态码,响应头。
7 四次挥手断开tcp连接----> http协议版本
# https://blog.csdn.net/m0_52165864/article/details/126313277
左连接,右连接,内连接,全连接:Mysql不能直接支持
数据通常不在同一张表中,这就涉及到连表操作,而表间连接方式有很多
# 内连接:
把两张表中共有的数据,连接到一起
# 左连接:
以左表为基准,把左表所有的数据都展示,有可能右表没有,用空补齐
# 右连接:
以右表为基准,把右表所有数据都展示,有可能左表没有,用空补齐
# 全连接:
以左右两表数据作为基准,左右两表数据都展示,有可能左或表没有,用空补齐
union和union all的区别?
select出来的结果: union,union all都是对结果进行合并,求并集
union 会取出重复的数据
union all 不会去除重复的数据
select name, id from user;
id name
1 lqz
2 zs
select name, id from book;
id name
1 lqz
2 西游记
3 金瓶qwsdqwd
select name,id form user union all selcet name, id form book;
id name
1 lqz
1 lqz
2 zs
2 西游记
3 金瓶wqwx
wgsi uwsgi uWSGI,cgi, fastcgi 分别是什么?
wgsi: wgsi的全称是Web Server Gateway Interface,翻译过来就是Web服务器网关接口。具体来说就是wsgi是一个规范,定义了web服务器如何与Python应用程序进行交互,使得使用Python写的Web应用程序可以和Web服务器对接起来。
uswgi:与WSGI一样是一种通信协议,是uW
cgi:(Common Gateway Interface)通用网关接口,是一个协议,是外部应用程序(CGI)与Web服务器之间的接口标准,该协议定义了 Web服务器调用外部应用程序的时候需要输入的参数,和给Web服务器的返回结果
如何自定制上下文管理器
在 Python 中,上下文管理器用于管理资源的分配和释放,以确保资源正确释放。一个上下文管理器是一个对象,它定义了一个 __enter__() 和 __exit__() 方法。当我们使用 with 语句时,这些方法将被自动调用,从而允许我们安全地获取和释放资源。
我们可以自定义一个上下文管理器,以便在使用 with 语句时,Python 会在需要时调用它的 __enter__() 方法,然后在退出 with 块时调用其 __exit__() 方法。
class MyContextManager:
def __init__(self, name):
self.name = name
def __enter__(self):
print("Entering", self.name)
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Exiting", self.name)
在上面的示例中,我们定义了一个名为 MyContextManager 的上下文管理器类。它有一个名为 name 的属性。在 __enter__() 方法中,我们打印一条消息,表示我们正在进入上下文。在 __exit__() 方法中,我们打印一条消息,表示我们正在离开上下文。
现在我们可以使用上下文管理器,如下所示:
with MyContextManager("my context"):
print("In the context")
输出:
Entering my context
In the context
Exiting my context
python是值传递还是引用传递
在 Python 中,函数参数的传递是按照引用传递的方式,即传递的是对象的地址。当我们把一个变量作为参数传递给函数时,实际上是将该变量所引用的对象的地址传递给了函数,函数内部会通过该地址来访问原始对象。
但需要注意的是,Python 中的不可变类型(如数字、字符串、元组等)在传递时,其实是传递的该值的副本,即相当于值传递。这是因为不可变类型在赋值时,实际上是创建了一个新的对象,并将该变量指向新对象,而原始对象并没有改变。因此,当不可变类型的变量作为函数参数传递时,相当于传递了该值的副本。