应用层:直接为用户的应用程序提供服务
传输层:为两台主机中进程之间的通信提供服务
网络层:为网络上不同主机间提供分组的传输服务
数据链路层:传输有地址的帧及错误检测
GIL:全局解释器锁,只允许一个线程来控制python解释器,适用于I/O密集型多线程程序,因为在等待I/O时锁可以在多线程间共享,对于cpu密集型,不仅会使多线程变成单线程,执行时间也会变长(因为获取和释放锁的开销)
HTTP(超文本传输协议):用于web浏览器和网站服务器之间传递信息,以明文方式发送内容,不提供任何数据加密方式,如果攻击者解取web浏览器和网站服务器之间的传输报文,就可以读取其中的信息,所以不适合传输敏感信息
HTTPS(安全套接字超文本传输协议):为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。(作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性)
区别:
- http传输的信息是明文传输,不安全;https则是具有安全性的ssl加密传输协议。
- http的连接很简单,是无连接,无状态的;
无连接是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态是指没记忆,后面需要前面的信息就要重传。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
https工作原理:
1、客户端发起HTTPS请求
浏览器里面输入一个HTTPS网址,然后连接到服务端的443端口上。注意这个过程中客户端会发送一个密文族给服务端,密文族是浏览器所支持的加密算法的清单。
2、服务端配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。
这套证书其实就是一对公钥和私钥,可以这么理解,公钥就是一把锁头,私钥就是这把锁的钥匙,锁头可以给别人对某个东西进行加锁,但是加锁完毕之后,只有持有这把锁的钥匙才可以解锁看到加锁的内容。
3、传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构、过期时间等等。
4、客户端解析证书
这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,如颁发机构、过期时间等等,如果发现异常则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密。
注意一下上面提到的"发现异常"。证书中会包含数字签名,该数字签名是加密过的,是用颁发机构的私钥对本证书的公钥、名称及其他信息做hash散列加密而生成的。客户端浏览器会首先找到该证书的根证书颁发机构,如果有,则用该根证书的公钥解密服务器下发的证书,如果不能正常解密,则就是"发现异常",说明该证书是伪造的。
5、传送加密信息
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,然后客户端和服务端的通信就可以通过这个随机值来进行加密和解密了。
6、服务端解密信息
服务端用私钥解密后,得到了客户端传过来的随机值,至此一个非对称加密的过程结束,看到TLS利用非对称加密实现了身份认证和密钥协商。然后把内容通过该值进行对称加密。
7、传输加密后的信息
这部分是服务端用随机值加密后的信息,可以在客户端被还原。
8、客户端解密信息
客户端用之前生成的随机值解密服务端传送过来的信息,于是获取了解密后的内容,至此一个对称加密的过程结束,看到对称加密是用于对服务器待传送给客户端的数据进行加密用的。整个过程即使第三方监听了数据,也束手无策。
如何由HTTP变为HTTPS?
我们在浏览器中输入http://www.baidu.com/会自动跳转至https://www.baidu.com/,看下是怎么做到的,截三张图就明白了:
看到302就很明显了,response里面的Location表示后一个要请求的页面,因此百度使用的方法是对http://www.baidu.com/这个地址做了一次的重定向,这应该是最简单、最容易想到的方法,实现也方便,做一个过滤器就好了。
有些网站不是重定向
GET:请求指定的页面信息,完成并返回到实体主体,着重点是从服务器上获取资源,通过url传参给服务器,传输的数据小,受url长度限制,效率较高,不安全,因为url是可见的,只支持ascll字符,只能进行url编码;浏览器会把http的header和data一并发送出去,一共产生一个包
POST:向服务端提交数据,数据被包含在请求体中,可能会导致新资源建立和已有资源的修改,传输的数据大,支持标准字符集,多种编码方式;先发header,服务器响应100,再发data,所以一共产生两个包
PUT:请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。
POST:请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。
装饰器:本身是一个python函数,它可以其他函数在不做如何修改下增加额外功能,返回值是一个函数对象,总结:为已经存在的函数或对象添加额外的功能。
带参数的装饰器:比如我们写好一个装饰器,但是现在控制装饰器有时候生效有时候不生效,可以给装饰器传一个参数用来控制
类装饰器:函数的参数从__call__中传,装的参数从__init__中传
yield:如果一个函数中有Yield,说明这个函数已经是一个生成器了,调用函数并没有执行,next( )可以让这个生成器继续执行,遇到Yield就停住,next()传进去的都是None,send可以传参,返回值都是下一个Yield的参数;yield from + 可迭代对象 把可迭代对象里的元素一个个yield出来。
304状态码:客户端在发送一个http请求时,把浏览器端缓存页面的最后一次修改时间一起发到服务器去,如果请求中包含if modified since,服务器判断这个时间与服务器上实际文件的最后修改时间进行比较,如果一样,返回304,不返回文件内容,客户端收到后直接把本地缓存文件显示到浏览器中;如果不一样,返回200和新的文件内容,客户端收到后,会丢弃旧文件,把新文件缓存起来并显示到浏览器中。
403状态码:服务器理解本词请求但是拒绝执行:产生错误的主要原因:(1)ip被加入黑名单(2)一段时间内过多的访问该网站,被防火墙拒绝访问了(3)文件没有执行权限(4)不允许写或创建文件的目录中执行了写或创建文件操作(5)以http方式访问需要SSL连接的网址(6)输入密码错误(7)DNS解析错误,手动更改DNS服务器地址(8)连接用户过多(9)服务器繁忙,同一ip地址发送请求过多遭到服务器智能屏蔽
协程:执行函数A时,可以随时中断取执行函数B,可以自由切换,但并不时函数调用,看似像多线程,实际只有一个线程。执行效率高,没有线程切换的开销,也不需要多线程的锁机制。
生成器:一边循环一边计算的机制,假设我们现在有10万个数据,用列表一次存起来太大,会占用很大的存储空间,如果我们仅需访问前10个,那后面大多数空间都浪费了,这个问题生成器就可以解决了。
闭包:就是一个外部函数里面定义了一个内部函数,返回内部函数的引用。内部修改外部变量的值方法:(1)用 nonlocal关键字(2)把闭包变量变成可变类型数据进行修改,比如列表。