面试题03

发布时间 2023-04-12 22:54:03作者: 性格如此w

面试题

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 中的不可变类型(如数字、字符串、元组等)在传递时,其实是传递的该值的副本,即相当于值传递。这是因为不可变类型在赋值时,实际上是创建了一个新的对象,并将该变量指向新对象,而原始对象并没有改变。因此,当不可变类型的变量作为函数参数传递时,相当于传递了该值的副本。