面试之认真死磕HTTP协议

声明:如下内容多参考整理于网络文章javascript

一.缘起

以前去面试时,面试官几乎没有问其余问题,整场面试下来,死磕协议的知识不放,因为本身在这方面准备并非很充分,回答的并非很好,因而回来结合面试的状况,查了不少的资料,认真地了解一下HTTP协议,若是写的很差的地方,留言指出。css

二.HTTP概述:

HTTP ( HyperText Transfer Protocal),全称为超文本传输协议。HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准。一般,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是80端口)的TCP链接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,好比"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。html

三.HTTP特色:

  • 支持客户端、服务端模式
  • 简单快速:客户向服务器请求服务时,只须要传送请求方法和路径。因为HTTP协议简单,使得通讯速度比较快
  • 灵活:HTTP容许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
  • 无链接:每次链接只处理一个请求,服务器处理完客户请求,收到用户的应答后,便断开链接,这种方式能够节省传输时间
  • 无状态:无状态是指协议对于事物处理没有记忆能力。不对请求和响应之间的通讯状态进行保存,缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,无状态协议解决办法: 一、经过、Cookie 二、经过Session会话保存

四.TCP/IP

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是指可以在多个不一样网络间实现信息传输的协议簇。TCP/IP协议不只仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是由于在TCP/IP协议中TCP协议和IP协议最具表明性,因此被称为TCP/IP协议。java

五.TCP/IP参考模型

应用层:负责处理特定的应用程序细节。简单网络管理SNMP协议,简单网络传输SMTP,域名解析DNS,文件下载FTP协议,远程协助,Telnet协议,超文本传输HTTP等等。web

传输层:主要为两台主机上的应用提供端到端的通讯。TCP协议和UDP协议面试

网络层:处理分组在网络中的活动,好比分组的选路。IP协议等算法

网络接口层:包括操做系统中的设备驱动程序、计算机中对应的网络接口卡数据库

六.HTTP与HTTPS的区别

概述:json

HTTP协议传输的数据都是未加密的,也就是明文的,能够用抓包工具直接抓下来而且可见,而HTTPS则是利用了网景公司设计的SSL(Secure Sockets Layer)协议对HTTP协议传输的数据进行加密,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通讯加密。抓包工具抓下来的是密文,大幅增长了中间人攻击的成本。简单来讲,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全浏览器

主要区别:

  • HTTP的URL由http://起始且默认使用端口80,而HTTPS的URL由https://起始且默认使用端口443
  • HTTP是超文本传输协议,信息是明文传输,HTTPS则是具备安全性的 SSL 加密传输协议
  • HTTP的链接很简单,是无状态的,HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全

七.HTTP1.0与HTTP2.0的区别

HTTP 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 文档内集合了全部的资源,不过与之相比,服务器推送还有一个很大的优点:能够缓存!也让在遵循同源的状况下,不一样页面之间能够共享缓存资源成为可能。

八.URL的组成

协议+主机名+路径+参数

九.HTTP请求

HTTP请求报文分为三个部分:请求行,请求头,请求体

1.请求行

请求行包括三个方面:请求方法、请求地址、协议版本

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:通常用于提交数据,参数不可见,传递参数数量无限制

注意:

  • 安全性讲,get和post都同样,没啥所谓的哪一个更安全

get请求参数在url地址上,直接暴露,post请求的参数放Request body部分,按F12也直接暴露了,因此没啥安全性可言

  • GET和POST有一个重大区别,简单的说:

GET产生一个TCP数据包;POST产生两个TCP数据包

缘由是:

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)

什么状况下使用POST请求:

没法使用缓存文件(更新服务器上的文件或数据库),GET能请求缓存,POST不能

向服务器发送大量数据(POST 没有数据量限制)

发送包含未知字符的用户输入时,POST 比 GET 更稳定也更可靠

2.请求头

请求头可用于传递一些附加信息,格式为:键: 值,注意,冒号后面有一个空格:

常见的请求 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-ModifiedIf-None-MatchIf-Modified-Since配合,用于缓存控制
Cache-Control 取值通常为no-cachemax-age=xx,xx为整数,表示资源缓存有效期(秒)

3.请求体

请求体(又叫请求正文)是 post 请求方式中的请求参数,以 key = value 形式进行存储,多个请求参数之间用&链接,若是请求当中请求体,那么在请求头当中的 Content-Length 属性记录的就是该请求体的长度

十.HTTP响应

HTTP响应报文分为三个部分:响应状态行,响应头,响应体

1.响应状态行

状态码 对应的信息
1XX 提示信息—表示请求已接收,继续处理
2XX 用于表示请求已被成功接收、理解、接收
3XX 用于表示资源(网页等)被永久转移到其它 URL,也就是所谓的重定向
4XX 客户端错误—请求有语法错误或者请求没法实现
5XX 服务器端错误—服务器未能实现合法的请求

常见状态码

2XX 成功

  • 200 OK,表示从客户端发来的请求在服务器端被正确处理
  • 204 No content,表示请求成功,但响应报文不含实体的主体部分
  • 206 Partial Content,进行范围请求

3XX 重定向

  • 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
  • 302 found,临时性重定向,表示资源临时被分配了新的 URL
  • 303 see other,表示资源存在着另外一个 URL,应使用 GET 方法丁香获取资源
  • 304 not modified,表示服务器容许访问资源,但因发生请求未知足条件的状况
  • 307 temporary redirect,临时重定向,和302含义相同

4XX 客户端错误

  • 400 bad request,请求报文存在语法错误
  • 401 unauthorized,表示发送的请求须要有经过 HTTP 认证的认证信息
  • 403 forbidden,表示对请求资源的访问被服务器拒绝
  • 404 not found,表示在服务器上没有找到请求的资源

5XX 服务器错误

  • 500 internal sever error,表示服务器端在执行请求时发生了错误
  • 503 service unavailable,代表服务器暂时处于超负载或正在停机维护,没法处理请求

2.响应头

响应头一样可用于传递一些附加信息

常见的响应 Header

名称 做用
Date 服务器的日期
Last-Modified 该资源最后被修改的时间
Transfer-Encoding 取值通常为 chunked,出如今 Content-Length 不能肯定的状况下,表示服务器不知道响应板体的数据大小,通常同时出现Content-Encoding响应头
Set-Cookie 设置 Cookie
Location 重定向到另外一个 URL,如输入浏览器就输入 baidu.com 回车,会自动跳转到[www.baidu.com] 就是经过这个响应头控制的
Server 后台服务器

3.响应体

响应体也就是网页的正文内容,通常在响应头中会用 Content-Length 来明确响应体的长度,便于浏览器接收,

对于大数据量的正文信息,也会使用 chunked 的编码方式。

十一.浏览器输入url按回车背后经历了哪些

一、首先,在浏览器地址栏中输入url,先解析url,检测url地址是否合法

二、浏览器先查看浏览器缓存-系统缓存-路由器缓存,若是缓存中有,会直接在屏幕中显示页面内容。若没有,则

跳到第三步操做。

浏览器缓存:浏览器会记录DNS一段时间,所以,只是第一个地方解析DNS请求;

操做系统缓存:若是在浏览器缓存中不包含这个记录,则会使系统调用操做系统,获取操做系统的记录(保存最近

的DNS查询缓存);

路由器缓存:若是上述两个步骤均不能成功获取DNS记录,继续搜索路由器缓存;

ISP缓存:若上述均失败,继续向ISP搜索。

三、在发送http请求前,须要域名解析(DNS解析),解析获取相应的IP地址。

四、浏览器向服务器发起tcp链接,与浏览器创建tcp三次握手。

五、握手成功后,浏览器向服务器发送http请求,请求数据包。

六、服务器处理收到的请求,将数据返回至浏览器

七、浏览器收到HTTP响应

八、浏览器解码响应,若是响应能够缓存,则存入缓存。

九、 浏览器发送请求获取嵌入在HTML中的资源(html,css,javascript,图片,音乐······),对于未知类型,会弹出对话框。

十、 浏览器发送异步请求。

十一、页面所有渲染结束。

相关文章
相关标签/搜索