HTTP
-
HTTP请求格式
image.png
-
请求方法: 9种
GET:向指定的资源发出请求
POST:向指定资源提交数据进行处理请求(例如提交表单或上传文件)
HEAD:向服务器索要与GET请求相一致的相应,只不过相应体将不会被返回。用于测试超链接的有效性,是否可以访问、以及最近是否更新等信息。
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法
PUT:向指定资源位置上传最新内容
DELETE:请求服务器删除Request-URI所标识的资源
TRACE:回显服务器收到的请求,主要用于测试或诊断
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器
PATCH:用来将局部修改应用于某个资源。 - 请求头常用字段
Host:www.jianshu.com
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Host用于指定被请求资源的Internet主机和端口号,从HTTP URL中提取出来的。默认端口号80,若指定端口号也可以。
Connection:keep-alive和close两个值。keep-alive解决效率低,可使客户端到服务端的连接持续有效。
Accept:浏览器端可接收MIME类型。/表示浏览器可以处理所有类型。
Cache-Control:指定请求和响应遵循的缓存机制
Accept-Encoding:浏览器声明自己可接收的编码方法
User-Agent用于告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本。
If-Modified-Since:把浏览器端缓存页面的最后修改时间发送给服务器。
- HTTP回应报文
-
相应报文状态码
返回码由3位数字组成,第一个数字定义响应类别,且有五种可能取值
image.png
- 200:OK 表明客户端请求成功
- 204: No Content :请求已经成功处理,但是返回的响应报文不包含实体
的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。 - 301 Permanently Moved永久性转移,场景:域名跳转。搜索引擎在抓取新内容的同时也将旧网址替换为重定向后的网址
- 302 Temporarity Moved 暂时性转移,场景:未登陆的用户访问用户中心重定向到登陆页面,搜索引擎会抓取新的内容而保留旧的地址 会发生网络劫持现象
- 304 Not Modified :如果请求报文首部包含一些条件,例如:If-Modified-Since,If-None-Match,如果不满足条件,则服务器会返回 304 状态码。
- 400 Bad Request :请求报文中存在语法错误。不能被服务器所理解
- 401 Unauthorized :请求未经授权,这个请求必须和 WWW-Authenticate 报文域一起使用
- 403 Forbidden 服务器收到请求,但是拒绝提供服务
- 404 Not Found 请求资源不存在,比如输入了错误的 url
- 500 Internet Server Error 服务器发生了不可描述的错误
- 503 Server Unavailable 服务器当前不能处理客户端请求,一段时间后可能回复正常
HTTP版本之间的区别
- HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。
- HTTP/2.0 要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输。
- 不仅如此,HTTP/2.0 也使用 Huffman 编码对首部字段进行压缩。
- HTTP1.0和HTTP1.1的区别:
-
缓存处理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准。
HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。 -
带宽优化及网络连接的使用
HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。 -
错误通知的管理
在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。 -
Host头处理
在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。
但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。
HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。 -
长连接
HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
- HTTP1.1和HTTP2.0的区别
-
新的二进制格式(Binary Format)
HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。
基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
2) 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。
3) header压缩
如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送。
HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
4) 服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能
- 长连接与短连接
-
当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源。如果每进行一次 HTTP 通信就要新建一个 TCP 连接,那么开销会很大。
-
长连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信。
-
从 HTTP/1.1 开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用 Connection : close;
-
在 HTTP/1.1 之前默认是短连接的,如果需要使用长连接,则使用 Connection : Keep-Alive
HTTPS
- HTTPS的工作原理
- 客户端发起 HTTPS 请求
用户在浏览器里输入一个 https 网址,然后连接到 server 的 443 端口。 - 服务端的配置
采用 HTTPS 协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面(startssl 就是个不错的选择,有 1 年的免费服务)。
这套证书其实就是一对公钥和私钥,如果对公钥和私钥不太理解,可以想象成一把钥匙和一个锁头,只是全世界只有你一个人有这把钥匙,你可以把锁头给别人,别人可以用这个锁把重要的东西锁起来,然后发给你,因为只有你一个人有这把钥匙,所以只有你才能看到被这把锁锁起来的东西。
-
传送证书
这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。 -
客户端解析证书
这部分工作是有客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。
如果证书没有问题,那么就生成一个随机值,然后用证书对该随机值进行加密,就好像上面说的,把随机值用锁头锁起来,这样除非有钥匙,不然看不到被锁住的内容。 -
传送加密信息
这部分传送的是用证书加密后的随机值(随机数使用公钥进行加密(RSA加密),目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了(RSA加密)。
-
服务端解密信息
服务端用私钥解密后,得到了客户端传过来的随机值(私钥),然后把内容通过该值进行对称加密,所谓对称加密就是,将信息和私钥通过某种算法混合在一起,这样除非知道私钥,不然无法获取内容,而正好客户端和服务端都知道这个私钥,所以只要加密算法够彪悍,私钥够复杂,数据就够安全。 -
传输加密后的信息
这部分信息是服务段用私钥加密后的信息,可以在客户端被还原。
- 客户端解密信息
客户端用之前生成的私钥解密服务段传过来的信息,于是获取了解密后的内容,整个过程第三方即使监听到了数据,也束手无策。
- 加密方式
- 对称密钥加密
对称秘钥加密解密使用同一秘钥
优点: 运算速度快
缺点: 无法安全地将秘钥传输给通信方
常见: AES TEA - 非对称秘钥加密
非对称密钥加密,又称公开密钥加密(Public-Key Encryption),加密和解密使用不同的密钥。
也就是秘钥成对出现(根据公钥无法推知私钥,根据私钥无法推知公钥),加密解密使用不用秘钥(公钥加密需要私钥解密,私钥加密需要公钥解密) 公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。*
优点:安全*
缺点:运算速度慢*
常见的有:RSA ECC
- HTTPS 采用的加密方式
HTTPS 采用混合的加密机制
使用非对称密钥加密用于传输对称密钥来保证传输过程的安全性。
之后使用对称密钥加密进行通信来保证通信过程的效率。
HTTP和HTTPS区别
image.png- HTTPS 协议需要到数字证书认证机构(CA, Certificate Authority )申请证书,一般免费证书很少,需要交费
- HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 ssl 加密传输协议
- HTTP 和 HTTPS 使用完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443
- HTTP 的连接很简单,是无状态的;HTTPS 协议是由 ssl+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全
- 目前,HTTPS 的应用比 HTTP 少,是因为 HTTPS 比较耗性能,对于安全性没那么高要求的应用来说,用 HTTP 就已经够了
session和cookie的区别和联系
- cookie
cookie是浏览器的一种缓存机制,用于维持客户端与服务器之间的会话。cookie将会话保存在客户端
以常见的登陆案例讲解cookie的使用过程:
- 首先用户在客户端浏览器向服务器发起登陆请求
- 登陆成功后,服务端会把登陆的用户信息设置 cookie 中,返回给客户端浏览器
- 客户端浏览器接收到 cookie 请求后,会把 cookie 保存到本地(可能是内存,也可能是磁盘,看具体使用情况而定)
- 以后再次访问该 web 应用时,客户端浏览器就会把本地的 cookie 带上,这样服务端就能根据 cookie 获得用户信息了
- session
session是一种维持客户端与服务器端会话的机制,但是与cookie把会话信息保存在客户端本地不同,session把会话保留在浏览器端
同样以登陆案例讲解session的使用过程:
- 首先用户在客户端浏览器发起登陆请求
- 登陆成功后,服务端会把用户信息保存在服务端,并返回一个唯一的 session 标识给客户端浏览器。
- 客户端浏览器会把这个唯一的 session 标识保存在起来
- 以后再次访问 web 应用时,客户端浏览器会把这个唯一的 session 标识带上,这样服务端就能根据这个唯一标识找到用户信息。
- 区别
网友评论