声明:如下内容多参考整理于网络文章javascript
以前去面试时,面试官几乎没有问其余问题,整场面试下来,死磕协议的知识不放,因为本身在这方面准备并非很充分,回答的并非很好,因而回来结合面试的状况,查了不少的资料,认真地了解一下HTTP协议,若是写的很差的地方,留言指出。css
HTTP ( HyperText Transfer Protocal
),全称为超文本传输协议。HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准。一般,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP链接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,好比"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。html
TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指可以在多个不一样网络间实现信息传输的协议簇。TCP/IP协议不只仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是由于在TCP/IP协议中TCP协议和IP协议最具表明性,因此被称为TCP/IP协议。java
应用层:负责处理特定的应用程序细节。简单网络管理SNMP协议,简单网络传输SMTP,域名解析DNS,文件下载FTP协议,远程协助,Telnet协议,超文本传输HTTP等等。web
传输层:主要为两台主机上的应用提供端到端的通讯。TCP协议和UDP协议面试
网络层:处理分组在网络中的活动,好比分组的选路。IP协议等算法
网络接口层:包括操做系统中的设备驱动程序、计算机中对应的网络接口卡数据库
概述:json
HTTP协议传输的数据都是未加密的,也就是明文的,能够用抓包工具直接抓下来而且可见,而HTTPS则是利用了网景公司设计的SSL(Secure Sockets Layer)协议对HTTP协议传输的数据进行加密,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通讯加密。抓包工具抓下来的是密文,大幅增长了中间人攻击的成本。简单来讲,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全浏览器
主要区别:
http://
起始且默认使用端口80,而HTTPS的URL由https://
起始且默认使用端口443HTTP 2.0 的出现,相比于 HTTP 1.x ,大幅度的提高了 web 性能
1.多路复用
多路复用容许经过单一的HTTP2.0链接同时发起多重的请求-响应消息,而在HTTP1.0中,浏览器客户端在同一时间,针对同一域名的请求有必定数量的限制,超出限制数目的请求会被阻塞HTTP2.0 能够很容易的去实现多流并行而不用依赖创建多个 TCP 链接,HTTP2.0 把 HTTP 协议通讯的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 链接上双向交换消息。
2.二进制分帧
HTTP2.0在应用层(HTTP2.0)和传输层(TCP/UDP)之间增长一个二进制分帧层,在二进制分帧层中,HTTP2.0会将全部的信息分割为更小的消息和帧,并采用二进制格式编码
HTTP2.0 通讯都在一个链接上完成,这个链接能够承载任意数量的双向数据流。
在过去, HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 链接会随着时间进行自我「调谐」,起初会限制链接的最大速度,若是数据成功传输,会随着时间的推移提升传输的速度。这种调谐则被称为TCP 慢启动。因为这种缘由,让本来就具备突发性和短时性的 HTTP 链接变的十分低效。HTTP/2 经过让全部数据流共用同一个链接,能够更有效地使用 TCP 链接,让高带宽也能真正的服务于HTTP 的性能提高。
3.首部压缩
HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生, SPDY 使用的是通用DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。
4.服务端推送
服务端推送是一种在客户端请求以前发送数据的机制。在 HTTP/2 中,服务器能够对客户端的一个请求发送多个响应。服务端推送让 HTTP1.x 时代使用内嵌资源的优化手段变得没有意义;若是一个请求是由你的主页发起的,服务器极可能会响应主页内容、logo 以及样式表,由于它知道客户端会用到这些东西。这至关于在一个 HTML 文档内集合了全部的资源,不过与之相比,服务器推送还有一个很大的优点:能够缓存!也让在遵循同源的状况下,不一样页面之间能够共享缓存资源成为可能。
协议+主机名+路径+参数
HTTP请求报文分为三个部分:请求行,请求头,请求体
请求行包括三个方面:请求方法、请求地址、协议版本
HTTP/1.1 协议中共定义了八种方法(也叫“动做”)来以不一样的方式操做指定的资源
方法名 | 功能 |
---|---|
GET | 向指定的资源发出“显示”请求,使用 GET 方法应该只用在读取数据上,而不该该用于产生“反作用”的操做中 |
POST | 指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求文本中。这个请求可能会建立新的资源或者修改现有资源,或二者皆有。 |
PUT | 向指定资源位置上传其最新内容 |
DELETE | 请求服务器删除 Request-URI 所标识的资源 |
OPTIONS | 使服务器传回该资源所支持的全部HTTP请求方法。用* 来代替资源名称,向 Web 服务器发送 OPTIONS 请求,能够测试服务器功能是否正常运做 |
HEAD | 与 GET 方法同样,都是向服务器发出指定资源的请求,只不过服务器将不传回资源的本文部分,它的好处在于,使用这个方法能够在没必要传输所有内容的状况下,就能够获取其中关于该资源的信息 (原信息或称元数据) |
TRACE | 显示服务器收到的请求,主要用于测试或诊断 |
CONNECT | HTTP/1.1 中预留给可以将链接改成通道方式的代理服务器。一般用于 SSL 加密服务器的连接(经由非加密的 HTTP 代理服务器) |
下面介绍经常使用方法GET与POST的区别:
注意:
get请求参数在url地址上,直接暴露,post请求的参数放Request body部分,按F12也直接暴露了,因此没啥安全性可言
GET产生一个TCP数据包;POST产生两个TCP数据包
缘由是:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)
什么状况下使用POST请求:
没法使用缓存文件(更新服务器上的文件或数据库),GET能请求缓存,POST不能
向服务器发送大量数据(POST 没有数据量限制)
发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠
请求头可用于传递一些附加信息,格式为:键: 值
,注意,冒号后面有一个空格:
常见的请求 Header
名称 | 做用 |
---|---|
Authorization | 用于设置身份认证信息 |
User-Agent | 用户标识,如:OS 和浏览器的类型和版本 |
If-Modified-Since | 值为上一次服务器返回的Last-Modified 值,用于肯定某个资源是否被更改过,没有更改过就从缓存中读取 |
If-None-Match | 值为上一次服务器返回的 ETag 值,通常会和If-Modified-Since |
Cookie | 已有的Cookie |
Referer | 标识请求引用自哪一个地址,好比你从页面 A 跳转到页面 B 时,值为页面 A 的地址 |
Host | 请求的主机和端口号 |
请求和响应常见通用的 Header
名称 | 做用 |
---|---|
Content-Type | 请求体/响应体的类型,如:text/plain、application/json |
Accept | 说明接收的类型,能够多个值,用, (英文逗号)分开 |
Content-length | 请求体/响应体的长度,单位字节 |
Content-Encoding | 请求体/响应体的编码格式,如 gzip、deflate |
Accept-Encoding | 告知对方我方接受的 Content-Encoding |
ETag | 给当前资源的标识,和Last-Modified 、If-None-Match 、If-Modified-Since 配合,用于缓存控制 |
Cache-Control | 取值通常为no-cache 、max-age=xx ,xx为整数,表示资源缓存有效期(秒) |
请求体(又叫请求正文)是 post 请求方式中的请求参数,以 key = value 形式进行存储,多个请求参数之间用&链接,若是请求当中请求体,那么在请求头当中的 Content-Length 属性记录的就是该请求体的长度
HTTP响应报文分为三个部分:响应状态行,响应头,响应体
状态码 | 对应的信息 |
---|---|
1XX | 提示信息—表示请求已接收,继续处理 |
2XX | 用于表示请求已被成功接收、理解、接收 |
3XX | 用于表示资源(网页等)被永久转移到其它 URL,也就是所谓的重定向 |
4XX | 客户端错误—请求有语法错误或者请求没法实现 |
5XX | 服务器端错误—服务器未能实现合法的请求 |
常见状态码
2XX 成功
3XX 重定向
4XX 客户端错误
5XX 服务器错误
响应头一样可用于传递一些附加信息
常见的响应 Header
名称 | 做用 |
---|---|
Date | 服务器的日期 |
Last-Modified | 该资源最后被修改的时间 |
Transfer-Encoding | 取值通常为 chunked,出如今 Content-Length 不能肯定的状况下,表示服务器不知道响应板体的数据大小,通常同时出现Content-Encoding 响应头 |
Set-Cookie | 设置 Cookie |
Location | 重定向到另外一个 URL,如输入浏览器就输入 baidu.com 回车,会自动跳转到[www.baidu.com] 就是经过这个响应头控制的 |
Server | 后台服务器 |
响应体也就是网页的正文内容,通常在响应头中会用 Content-Length 来明确响应体的长度,便于浏览器接收,
对于大数据量的正文信息,也会使用 chunked 的编码方式。
一、首先,在浏览器地址栏中输入url,先解析url,检测url地址是否合法
二、浏览器先查看浏览器缓存-系统缓存-路由器缓存,若是缓存中有,会直接在屏幕中显示页面内容。若没有,则
跳到第三步操做。
浏览器缓存:浏览器会记录DNS一段时间,所以,只是第一个地方解析DNS请求;
操做系统缓存:若是在浏览器缓存中不包含这个记录,则会使系统调用操做系统,获取操做系统的记录(保存最近
的DNS查询缓存);
路由器缓存:若是上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存;
ISP缓存:若上述均失败,继续向ISP搜索。
三、在发送http请求前,须要域名解析(DNS解析),解析获取相应的IP地址。
四、浏览器向服务器发起tcp链接,与浏览器创建tcp三次握手。
五、握手成功后,浏览器向服务器发送http请求,请求数据包。
六、服务器处理收到的请求,将数据返回至浏览器
七、浏览器收到HTTP响应
八、浏览器解码响应,若是响应能够缓存,则存入缓存。
九、 浏览器发送请求获取嵌入在HTML中的资源(html,css,javascript,图片,音乐······),对于未知类型,会弹出对话框。
十、 浏览器发送异步请求。
十一、页面所有渲染结束。