18, 传输控制协议tcp和用户数据报协议udp有哪些区别
第一,tcp是面向字节流的,基本的传输单位是tcp报文段;而udp是面向报文的,基本传输单位是用户数据报。
第二, tcp注重安全可靠性,连接双方在进行通信前,需要经过三次握手建立连接。udp是无连接的,使用最大努力交付,即不保证可靠交付。
第三,udp不需要连接等待,所以数据传输快,而tcp传输效率相对较低。
第四, tcp首部开销是20个字节;udp开销是8个字节,这也是减少网络传输开销的一方面。
第五, tcp有拥堵控制和流量控制,而udp没有拥堵控制和流量控制
第六, tcp支持点对点通信,提供全双工通信,不提供广播或多播服务;udp支持一对一,一对多,多对一,多对多的通信模式
19,从输入url到页面加载发生了什么
总体来说分为以下几个过程:
DNS解析
TCP连接
发送HTTP请求
服务器处理请求并返回HTTP报文
浏览器解析渲染画面
连接结束
20,HTTP中的请求方法和用途主要有哪些
get方法:一般用于查询
post方法:一般用于添加数据
put方法:一般用于修改全部数据
pacth方法:一般用于修改部分数据
delete方法:一般用于删除数据
21, get请求与post请求的差别
第一,get是从服务器上获取数据,post是向服务器传送数据
第二, get请求时通过URL直接请求数据,数据信息可以在URL中直接看到,比如浏览器访问;
而post请求时放在请求体中的,用户无法看到
第三, get传送的数据量小,有限制,不能大于2KB;主要是因为它受约于URL长度的限制。
post传送的数据量较大,一般被默认不受限制
22,Django的工作原理
1,用户通过浏览器请求一个页面的url
2, 请求到达Request Middlewares(中间件), 中间件对request做一些预处理或者直接response请求
3, URLconf通过urls.py文件和请求的URL找到相应的View(视图)
4,View Middlewares被访问,它同样可以对request做一些处理或者直接返回response
5,调用View中的函数
6, View中的方法可以选择 性的通过Models访问底层数据
7, 所有的Models_to_DB的交互都是通过manager完成的
8, 如果需要,View可以使用一个特殊的Context(上下文处理器)
9, Context被传给Template(存放前段文件)用来生成页面
23, 怎么理解MVC和MTV的区别
著名的MVC 模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层;他们之间以一种插件似的,松耦合的方式连接在一起。
模型负责业务对象与数据库的对象(ORM),视图负责与用户的交互(页面),控制器(C)接受用户的输入调用模型和视图完成用户的请求。
Django的MTV模式本质上就是与MVC模式没有什么差别,也是各个组件之间为了保持松耦合关系,只是定义上有些许不同。Django的MTV分别代表:
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模板):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个url分发器,它的作用是将一个个URL页面请求分发给不同的view处理,view再调用响应的Model和Template
24, 什么是缓存穿透?如何避免?
缓存穿透
一般的缓存程序,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫缓存穿透。
如何避免?
1,对查询结果为空也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存
2,对一定不存在的key进行缓存
25, 什么是缓存雪崩?如何避免?
缓存雪崩
当缓存服务器重启或者大量缓存集中在某一时间段失效,这样在失效的时候,会给后端系统带来压力。导致系统崩溃。
如何避免?
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。
3:不同的key ,设置不同的过期时间,让缓存失效的时间尽量均匀。
26, Django中间件
中间件是一个用来处理django的请求和响应和框架级别的钩子。它是一个轻量,低级别的插件系统,用于在全局范围内改变django的输入输出。每个中间件组件都负责做一些特别的功能。
中间件类中定义了几个方法,django框架会在请求的特定时间去执行这些方法。
process_request: 进入请求路由前
process_view:进入视图函数请
process_exception: 视图函数产生异常
process_template_response: render到模板前
process_respomse: 响应到浏览器前
27,CSRF 攻击的原理和防范措施
csrf跨站点请求伪造(Cross--Site Request Forgery), 跟XSS攻击一样,存在巨大的危害性,可以这样来理解:攻击者盗用我们的身份,以我们的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以我们的名义发送邮件,发送消息,盗取我们的账号,添加系统管理员,甚至购买商品,虚拟货币转账等。
攻击原理:
i. 用户C访问正常网站A时进行登录,浏览器保存A的cookie
ii. 用户C再访问攻击网站B,网站B上有一个隐藏的链接或者图片标签会自动请求网站A的URL网站,例如表单提交,传指定参数
iii.而网站A在接受到请求之后可判断当前用户是登录状态,所以根据用户的权限做具体的操作逻辑,造成网站攻击成功。
防范措施:
i. 在请求头里添加一个随机值作为参数
ii.在响应的cookie里面设置该随机值
iii.那么用户C再正常提交表单的时候会默认带上表单中的随机值,浏览器会自动带上cookie里面随机值,那么服务器下次接受到请求之后就可以取出两个值进行校验
iv.而对于网站B来说网站B在提交表单的时候不知道该随机值是什么,所以就形成不了攻击也可以用来设置避免表单的重复提交。
28,跨域产生的原因以及解决方案
浏览器的同源策略是浏览器上为了安全性考虑实施的非常重要的安全策略
何为同源:url由协议,域名,端口和路径组成,如果两个URL的协议,域名端口相同,则表示同源
在浏览器中<script>, <img>, <iframe>, <link>等标签都可以加载跨域资源,而不受同源限制,但浏览器会限制脚本中发起的跨域请求。比如,使用XMLHttpRequest对象和Fetch发起HTTP请求就必须遵循同源策略。
不允许跨域访问并非是浏览器限制了发起跨站请求,而是跨站请求可以正常发起,但是返回结果被浏览器拦截了。
常见的跨域解决方案:Script跨域, JSON跨域, CORS(跨域资源共享), Nginx代理
29, django模型常用属性
AutoField:
映射到数据库中是int类型,可以有自动增长的特性。一般不需要使用这个类型,如果不指定主键,那么模型会自动生成一个叫做ID的自动增长的主键,如果想要指定一个其他名字的并且具有自动增长的主键,使用Autofield 也是可以的。
BooleanField:
在模型层面接受的是TRUE/False。在数据库层面是tinyint类型。如果没有指定默认值,默认值是None。
CharField:
在数据库层面是varchar。在python层面就是普通的字符串。这个类型在使用的时候必须要指定最大长度,也即必须传递max_length这个关键字参数进去。
EmailFied:
类似CharField 。 在数据库底层也是一个varchar类型。最大长度是254个字符。如果没有指定max_length, 默认使用254个字符为最大长度。并不会限制字符串一定要满足邮箱格式。
FloatField:
浮点类型。映射到数据库就是数据库中的float类型。
IntegerField:
整形, 值的区间是 -2^31——2^31-1
TextField:
大量文本类型。映射到数据库中是longtext 类型
FileField:
用来存储上传的文件
30, django常见的响应方式
HTTPresponse:可以返回一段简单的字符串,也可以返回一个流数据
render: 通过转发的方式跳转到一个django模板页面redirect:通过 重定向的方式跳转到一个路由中
FileResponse:实现文件的下载,可以自动设置头信息
JsonResponse: 返回一个json格式的数据,一般配合异步请求使用
HTTP404:快速返回一个404 错误页面(如果没有配置,返回一个django自带的404效果页面)