HTTP概念
HTTP(HyperText Transfer Protocol)超文本传输协议,所有的WWW文件都必须遵守这个标准.是一个客户端和服务器端请求和应答的标准(TCP).设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法.现在HTTP的作用已不局限于HTML的传输,图片文件,查询结果等数据也是可以传输的。
HTTP是基于TCP/IP通信协议来传递数据的.
HTTP工作原理
HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求,服务器作出响应.
HTTP使用TCP而不是UDP的原因在于打开一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。
页面从输入url到页面加载显示完成发生了什么
- 当发送一个URL请求时,不管这个URL是Web页面的URL还是Web页面上每个资源的URL,浏览器都会开启一个线程来处理这个请求,同时在远程DNS服务器启动一个DNS查询。这能使浏览器获得请求对应的IP地址。
- 浏览器与远程Web服务器通过TCP三次握手协商来建立一个TCP/IP连接。该握手包括一个同步报文,一个同步-应答报文和一个应答报文,这三个报文在浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信,而后服务器应答并接受客户端的请求,最后由客户端发出该请求已经被接受的报文。
- 一旦TCP/IP连接建立,浏览器会通过该连接向远程服务器发送HTTP的请求。GET仅请求资源,POST会包含一个Body附带用户数据.远程服务器找到资源并使用HTTP响应返回该资源,值为200的HTTP响应状态表示一个正确的响应。
- 处理结束回馈报头,此处如果浏览器访问过,缓存上有对应资源,会与服务器最后修改事件对比,一致则返回304;浏览器开始下载 html 文档(响应报头,状态码200),同时使用缓存;
- 此时,Web服务器提供资源服务,客户端开始下载资源。请求返回后,便进入了我们关注的前端模块。简单来说,浏览器会解析HTML生成DOM Tree,其次会根据CSS生成CSS Rule Tree,而JavaScript又根据DOM API操作DOM.
客户端请求
客户端请求包括三部分:
第一部分叫Request line(请求行), 第二部分叫http header,第三部分是body。
(1)请求行:包括http请求的种类,请求资源的路径,http协议版本;
(2)http header:http头部信息;
(3)body:发送给服务器的query信息 当使用的是"GET" 方法的时候,body是为空的(GET只能读取服务器上的信息,post能写入)
- scheme:指定底层使用的协议(例如:http, https, ftp)
- host:HTTP服务器的IP地址或者域名
- port#:HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明.
- path:访问资源的路径
- Accept:我能接受这些类型的文件
- User-Agent:我使用的是何种操作系统上的哪个类型那个版本的浏览器
- Accept-Encoding:承认接受何种方式的压缩文件
- Cookie:发送存储在本机的cookies信息给服务器
示例URL:
http://www.mywebsite.com/sj/test;id=8079?name=sviergn&x=true#stuff
Schema: http
host: www.mywebsite.com
path: /sj/test
URL params: id=8079
Query String: name=sviergn&x=true
Anchor: stuff
服务端响应
服务端响应也分为三部分,第一部分叫request line, 第二部分叫request header,第三部分是body。
(1)request line:协议版本、状态码、message
(2)request header:request头信息
(3)body:返回的请求资源主体
- status:响应的状态码
- content-type:响应的内容
请注意:浏览器就是依靠Content-Type来判断响应的内容是网页还是图片,是视频还是音乐。浏览器并不靠URL来判断响应的内容,所以,即使URL是这样的,如:http://example.com/abc.jpg,它也不一定就是图片。
HTTP的特点
- 无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间 - 媒体独立
这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型 - 无状态
指的是协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
无状态也就是说在同一个连接中,两个成功执行的请求之间是没有关系的。也就是说上一秒出去一个A请求,下一秒出去一个B请求,那么B是完全感知不到A请求曾经存在过的,两个请求间毫无瓜葛。这就带来了一个问题,用户没办法在一个网站进行连续的交互,比如在一个电商网站里,用户把某个商品加入了购物车中,换了一个页面后再次添加商品,两次添加商品的请求没有联系,浏览器无法知道最终用户都选择了哪些商品。两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
维持状态信息
- cookie:cookie 是存储在浏览器的小段文本,会在浏览器每次向同一服务器再发起请求时被携带并发送到服务器上。我们可以把状态信息放在cookie里,带给服务器。
- session:session 是存储在服务器的用户数据。浏览器第一次向服务器发起请求时,服务器会为当前会话创建一个session,并且把对应的 session-id 写入 cookie 中,用来标识 session。此后,每次用户的请求都会携带一个包含了 session-id 的 cookie,服务器解析出了 session-id,便能定位到用户的用户信息。
HTTP的发展史
版本 | HTTP/0.9 | HTTP/1.0 | HTTP/1.1 | HTTP/2.0 |
---|---|---|---|---|
时间 | 1991 | 1996 | 1997 | 2015 |
痛点 | TCP连接不可复用;队头阻塞问题; | 队头阻塞依然存在; | ||
解决的问题 | 实现长连接;尝试用管道化解决队头阻塞问题; | 【改进性能】多路复用;服务器推送;首部压缩;并行通信... |
-
TCP连接不可复用 ——HTTP/1.0 每进行一次 HTTP 通信,都需要勤勤恳恳地“三步走”——TCP 连接、HTTP 通信、断开 TCP 连接。如果是两次HTTP通信就要消耗两次TCP连接的资源。随着互联网产业的发展,HTTP通信的量呈指数级上升,通信频率变得非常高,因此希望不同的HTTP通信之间不要徒增一次TCP连接的消耗。
一个 TCP 连接里可以进行多次 HTTP 通信的机制,就是HTTP1.1 做的最重头的优化——实现长连接。 -
队头阻塞问题—— HTTP/1.0中,请求与请求间是串行的。如果我发送了 A 请求,那么 A 请求的响应返回之前,你的 B 请求不管多么着急都出不去。如果 A 请求去了一年,那么 B 请求就得耗上一年,活活被堵死。这就是著名的“队头阻塞问题”。
HTTP/1.1 尝试用管线化来解决这个问题。HTTP/1.1 中的管线化是指,允许多个 HTTP 请求批量地提交给服务器。不过这样做仍然无法从根儿上解决队头阻塞——虽然发送动作可以并行,不过服务器依然需要根据请求顺序来回复浏览器的请求,也就是说响应仍是串行的。A 如果一年没有被响应,那么 B 也休想被响应。 - 多路复用:(进化版的长连接)在 HTTP 2.0 中,一次连接建立后,只要这个连接还在,那么客户端就可以在一个链接中批量发起多个请求。同时,请求与请求间完全不阻塞,A 请求的响应就算没回来,也不影响 B 请求收到自己的响应。请求与请求间做到了高度的独立,真正实现了并行请求。由此,彻底规避了队头阻塞问题。
- 服务器推送:允许服务器主动向客户端push资源;