我又回来了,先来波推广,最硬的资源来自公众号:前端美食汇,欢迎你们关注公众号获取最新的技术。提示,文末有福利,最硬的文章会首先发布在公众号上喔html
前文没有描述到传输和协议直接的层级对应关系,大概补充下网络通讯中数据传输对应的协议,首先了解下OSI(开放式系统互联:Open System InterConnection)七层 模式,及其对应不一样层次的协议。前端
OSI体系结构 | TCP/IP相关协议结构 |
---|---|
应用层 | HTTP,Telnet,FTP等 |
表示层 | |
会话层 | |
传输层 | TCP,UDP |
网络层 | IP |
数据链路层 | |
物理层 |
了解到HTTP协议是创建在TCP链接基础之上的。HTTP 是一种容许浏览器向服务器获取资源的协议,是 Web 的基础,一般由浏览器发起请求,用来获取不一样类型的文件, 例如 HTML 文件、CSS 文件、JavaScript 文件、图片、视频等。此外,HTTP 也是浏览器使用最广的协议。java
咱们对HTTP不太了解的话都会存在这样的疑惑,为何再次访问同一站点会比第一次快,登陆过一次后的网站再次访问就处于登陆状态等,咱们 经过对HTTP请求过程的剖析来解开这些谜团。node
浏览器输入网址:http://time.geekbang.org/index.html,以后会完成什么步骤呢?web
首先,浏览器构建请求行信息,构建好后,浏览器准备发起网络请求。spring
GET /index.html HTTP1.1
在真正发起网络请求以前,浏览器会先在浏览器缓存中查询是否有要请求的文件。其中,浏览器缓存是一种在本地保存资源副本,以供下次请求时直接使用的技术。浏览器
当浏览器发现请求资源已经存在浏览器缓存中存有副本,则会拦截请求并返回该资源副本结束请求。若是查找缓存失败,则会进入网络请求。因此会有利于:缓存
缓解服务器端压力,提高性能springboot
对于网站来讲,缓存是实现快速资源加载的重要组成部分,减小了获取资源的时间。服务器
咱们经过开头预备知识和前文也大概了解到了HTTP和TCP的关系。浏览器使用 HTTP 协议做为应用层协议,用来封装请求的文本信息;并使用 TCP/IP 做传输层协议将它发到网络上,因此在 HTTP 工做开始以前,浏览器须要经过 TCP 与服务器创建链接。也就是说 HTTP 的内容是经过 TCP 的传输数据阶段来实现的。
TCP和HTTP的关系示意图:
据此,咱们能够知道创建HTTP网络请求就是,经过URL地址来解析获取IP和端口信息,创建服务器和TCP链接。咱们经过前文《TCP协议》 说到了数据包都是经过IP地址传输给接收方的。而咱们网站通常的地址都是域名,因此须要把域名和IP地址作映射关系,即解析IP地址的系统“域名系统(DNS)”解析出 IP地址,并获取对应端口号得到创建链接的前置条件。换句话说,即浏览器请求DNS返回域名对应的IP,而请求DNS时也会查询DNS数据缓存服务,判断是否域名已解析过, 若是解析过则查询直接使用,拿到IP后则判断URL是否指明端口号,没有则HTTP协议默认时80端口。
Chrome 有个机制,同一个域名同时最多只能创建 6 个 TCP 链接,若是在同一个域名下同时有 10 个请求发生,那么其中 4 个请求会进入排队等待状态,直至进行中的请求完成。固然,若是当前请求数量少于 6,会直接进入下一步,创建 TCP 链接。
队列等待结束后,TCP和服务器实现“三次握手”(前文TCP协议有描述),即客户端和服务器发送三个数据包以确认链接,实现浏览器和服务的链接。
一旦创建了 TCP 链接,浏览器就能够和服务器进行通讯了。而 HTTP 中的数据正是在这个通讯过程当中传输的。
HTTP请求数据格式:
首先浏览器会向服务器发送请求行,它包括了请求方法、请求 URI(Uniform Resource Identifier)和 HTTP 版本协议。
其中请求方式有GET,POST,PUT,Delete等,其中经常使用的POST会用于发送一些数据给服务器,好比登陆网站把用户信息发送给服务器,通常 这些数据会经过请求体发送。
在浏览器发送请求行命令以后,还要以请求头形式发送其余一些信息,把浏览器的一些基础信息告诉服务器。好比包含了浏览器所使用的操做系统、浏览器内核等信息,以及当前请求的域名信息、Cookie等。
curl -i https://time.geekbang.org/
经过curl工具(或network面板)咱们能够了解到服务器返回的数据格式:
首先服务器会返回响应行,包括协议版本和状态码。
若是出现错误,服务器会经过请求行的状态码来返回对应的处理结果,例如:
最经常使用的状态码是 200,表示处理成功;
404,表示没有找到页面
500,表示服务器错误
正如浏览器会随同请求发送请求头同样,服务器也会随同响应向浏览器发送响应头。响应头包含了服务器自身的一些信息, 好比服务器生成返回数据的时间、返回的数据类型(JSON、HTML、流媒体等类型),以及服务器要在客户端保存的 Cookie 等信息。
响应头以后,服务器会发送响应体数据,一般包含了HTML的实际内容。以上为服务器响应浏览器的过程。
一旦服务器向客户端返回了请求数据,它就要关闭 TCP 链接。不过若是浏览器或者服务器在其头信息中加入了:
Connection:Keep-Alive
则TCP 链接在发送后将仍然保持打开状态,这样浏览器就能够继续经过同一个 TCP 链接发送请求。保持 TCP 链接能够省去下次请求时须要创建链接的时间,提高资源加载速度。 若是一个页面内嵌的图片都来自同一web站点,则初始化一个持久链接则可复用减小TCP的链接。
重定向返回响应行和响应头:
状态 301 就是告诉浏览器,我须要重定向到另一个网址,而须要重定向的网址正是包含在响应头的 Location 字段中,接下来,浏览器获取 Location 字段中的地址,并使用该地址从新导航,这就是一个完整重定向的执行流程。
经过http请求的完整过程,咱们就知道,请求过程当中DNS缓缓和页面资源缓存会被浏览器缓存起来,以减小向服务器请求的资源,因此会再次请求站点时速度会快。
浏览器资源缓存处理过程:
从上图的第一次请求能够看出,当服务器返回 HTTP 响应头给浏览器时,浏览器是经过响应头中的 Cache-Control 字段来设置是否缓存该资源。一般,咱们还须要为这个资源设置一个缓存过时时长,而这个时长是经过 Cache-Control 中的 Max-age 参数来设置的。
所以在该缓存资源还未过时的状况下, 若是再次请求该资源,会直接返回缓存中的资源给浏览器。
若是缓存过时了,浏览器则会继续发起网络请求,而且在 HTTP 请求头中带上If-None-Match,服务器收到请求头后,会根据 If-None-Match 的值来判断请求的资源是否有更新。
若是没有更新,就返回 304 状态码,至关于服务器告诉浏览器,这个缓存能够继续使用。
若是资源有更新,服务器就直接返回最新资源给浏览器。
登陆网站,经过POST方式提交信息给服务器,服务器接收到浏览器提交的信息以后,查询验证信息正确则会生成表面用户身份的字符串写入响应头的Set-Cookie字段里返回浏览器。
浏览器解析响应头,若有Set-Cookie字段则保存在本地,当用户再次访问时,发起HTTP请求前浏览器会读取Cookie数据并写入请求头发送到服务器,服务器再次判断信息,若是 正确则展现用户登陆状态及用户信息。
最后总结出浏览器中的HTTP请求从发起到结束一共经历了八个阶段:构建请求、查找缓存、准备 IP 和端口、等待 TCP 队列、创建 TCP 链接、发起 HTTP 请求、服务器处理请求、服务器返回请求和断开链接。
详细HTTP请求流程:
HTTP缓存:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ
HTTP状态码:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
HTTP请求方式:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Methods
七层网络协议:http://www.javashuo.com/article/p-caehdntt-hh.html
关注公众号,后台回复“抖音”关键字获取抖音相关编辑及推广方式;回复“线上运营”获取入门运营三部曲;回复“springboot快速入门”,“TensorFlow人工智能实践”,“java基础”,“Nginx”,“node全栈实战”关键字获取相关内容。
关注公众号福利持续更新~