一. 什么是HTTP
HTTP协议工作在应用层,端口号是80。HTTP协议被用于网络中两台计算机间的通信,相比于TCP/IP这些底层协议,HTTP协议更像是高层标记型语言,浏览器根据从服务器得到的HTTP响应体中分别得到报文头,响应头和信息体(HTML正文等),之后将HTML文件解析并呈现在浏览器上。同样,我们在浏览器地址栏输入网址之后,浏览器相当于用户代理帮助我们组织好报文头,请求头和信息体(可选),之后通过网络发送到服务器,,服务器根据请求的内容准备数据。
HTTP1.0 和 HTTP1.1都是文本标记型的header,而在HTTP2.0中,会修改为二进制的header。
二. HTTP的通信过程
在HTTP1.0中,一个http请求的通信过程分为以下四步:
- 客户端通过三次握手和服务端建立连接
- 客户端向服务端发送一个请求
- 服务端向客户端发送一个回应
- 客户端接收消息,解析呈现,断开链接。
我们可以看出,在这个通信过程中,每有一个请求都要创建一个http连接,请求完成就断开,有效的通信包这个过程中占比是很小的。现代前端页面动辄一个页面几十个对象要下载,这样要建立、断开几十次连接,显然效率比较低。
于是HTTP1.1支持了持久连接,即在一个TCP连接中复用多个请求。这样可以保持连接建立而发送多个多请求,提高了TCP连接利用的效率。但是即便如此在效率上仍有值得提高的地方,就是这种连接可能是停等式ARQ模型的,也即上一个request的response回来之后,才能发送下一个request,这样对于N个请求而言,可能需要N*RTT的时间才能完成所有请求,这样效率相对也是比较低的。
HTTP1.1的长连接模型,最常提及的也就是Pipeline,即可以一口气发送N个request,然后等几个response陆续发回来。也就是所谓的滑窗ARQ模型(话说我通网好像也就记得这点东西了),理想情况下只有一个RTT的开销……当然这是理想情况。
三. HTTP的报文结构
结构很简单,就是报文头+请求头(header)+payload,每行结尾都是CRLF,即"\r\n",header和payload之间用一个空行隔开。
1. 报文头
reuest的:
METHOD URI VERSION
example:
GET /index.html HTTP1.1
response的:
VERSION STATUS_CODE INFORMATION
example:
HTTP1.1 200 OK
2. header
header都是key:value
形式的键值对,表示某些选项,选项极多……丧心病狂。下面介绍一几个(我觉得)常用的。
Host:指定请求资源的主机和端口号。端口号默认80。
Connection:值为keep-alive和close。keep-alive使客户端到服务器的连接持续有效,不需要每次重连,此功能为HTTP/1.1预设功能。
Accept:浏览器可接收的MIME类型。假设为text/html表示接收服务器回发的数据类型为text/html,如果服务器无法返回这种类型,返回406错误。
Cache-control:缓存控制,Public内容可以被任何缓存所缓存,Private内容只能被缓存到私有缓存,non-cache指所有内容都不会被缓存。
Cookie:将存储在本地的Cookie值发送给服务器,实现无状态的HTTP协议的会话跟踪。
Content-Length:请求消息正文长度。
Content-Type:请求消息正文类型。
User-Agent: 客户端信息。
X-Forward-For: 记录从客户端到服务端的代理路径
3. payload
想要啥随便写不谢。
四. HTTP的那些方法
方法名 | 描述 | 是否幂等 |
---|---|---|
GET | 用于请求服务器信息 | 是 |
POST | 用于向制定资源提交处理请求,增删改查都有可能 | 否 |
PUT | 替换服务器的指定内容 | 是 |
DELETE | 删除服务器的指定内容 | 是 |
TRACE | 回显服务器收到的请求 | - |
HEAD | 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头 | - |
CONNECT | 用于建立连接 | - |
OPTION | 查看服务器性能 | - |
PS:什么是幂等:多次重复同一请求,无论多少次效果都是相同的,即为幂等。
五. HTTP的状态码
这个是按首个数字分类的,1XX是信息,2XX一般是成功,3XX是重定向,4XX是客户端错误,5XX是服务端错误。
常用的状态码列一下:
100: 继续。
200:成功。
301:内容已经移动。
400:请求不能被服务器理解。
403:无权访问该文件。
404:不能找到请求文件。
500:服务器内部错误。
501:服务器不支持请求的方法。
505:服务器不支持请求的版本。
六. HTTPS
就是在HTTP协议上套了一层TLS协议用于加密,现在被认为是有效的安全通信机制。
忽然发现憋不出啥来了……就先这样吧。
主要就是有CA认证,非对称加密的公钥放在公网上用于握手,然后用非对称加密传输对称加密的秘钥,通信过程用对称加密保证安全性。
对了,他用443端口。
七. HTTP的一些安全问题
其实搞前端的应该才会被经常问这些,常问的就两个,CSRF和XSS。
1. CSRF
CSRF实际上是利用了服务端对已经登录用户的信任,比如说你登录了知乎,然后知乎有个API叫/postarticle?title=xxxxxx之类的可用来发文章,然后我就在网页上插个看不到的<button>
标签,范围全屏,src属性挂上<button><a href="zhihu.com/postarticle?title=xxxxxx"></a></button>
,这样你一进去,点个鼠标,它就自动给你发了一篇文(guang)章(gao),神奇吧?当然只是举个栗子……而且好久不写html了,这个标签写法对不对我不知道,小朋友不要随便模仿。
防范方法:验证token,在自己的网页上挂个看不到的token,要post的时候带上这个token,服务端去验证它是不是对的,有没有他,就保证了受到信任的源才能用这个API。
2. XSS
XSS就是注入攻击,就是用户利用你的漏洞,你让他传文章的地方他给你插个<script>
标签进去,然后你也不过滤,发布出来还带着这个脚本发布了,别人一访问,就触发这段脚本,后来的事情大家都知道了。
防范方法:过滤用户输入,永远不信任用户输入。
八. cookie 和 session
- cookie:客户端缓存。浏览器侧保存信息,每次请求的时候带在header里发给服务器来同步状态。
- session:服务端保存用户的状态。一般就是有一个session id,服务端这边拿着做映射,那用户端怎么同步呢?当然是在cookies里面放着这个session id辣。
九. HTTP 2.0
作者:腾讯云技术社区
链接:https://www.zhihu.com/question/34074946/answer/157909115
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一、多路复用的单一长连接
1.单一长连接
在HTTP/2中,客户端向某个域名的服务器请求页面的过程中,只会创建一条TCP连接,即使这页面可能包含上百个资源。 单一的连接应该是HTTP2的主要优势,单一的连接能减少TCP握手带来的时延 。HTTP2中用一条单一的长连接,避免了创建多个TCP连接带来的网络开销,提高了吞吐量。
2.多路复用
HTTP2虽然只有一条TCP连接,但是在逻辑上分成了很多stream。
HTTP2把要传输的信息分割成一个个二进制帧,首部信息会被封装到HEADER Frame,相应的request body就放到DATA Frame,一个帧你可以看成路上的一辆车,只要给这些车编号,让1号车都走1号门出,2号车都走2号门出,就把不同的http请求或者响应区分开来了。但是,这里要求同一个请求或者响应的帧必须是有有序的,要保证FIFO的,但是不同的请求或者响应帧可以互相穿插。这就是HTTP2的多路复用,是不是充分利用了网络带宽,是不是提高了并发度?
二、头部压缩和二进制格式
http1.x一直都是plain text,对此我只能想到一个优点,便于阅读和debug。但是,现在很多都走https,SSL也把plain text变成了二进制,那这个优点也没了。
于是HTTP2搞了个HPACK压缩来压缩头部,减少报文大小(调试这样的协议将需要curl这样的工具,要进一步地分析网络数据流需要类似Wireshark的http2解析器)。
三、服务端推动Sever Push
这个功能通常被称作“缓存推送”。主要的思想是:当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端。
这个功能帮助客户端将Z放进缓存以备将来之需。