阅读 3306

面试之认真死磕HTTP协议

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

一.缘起

之前去面试时,面试官几乎没有问其他问题,整场面试下来,死磕协议的知识不放,由于自己在这方面准备并不是很充分,回答的并不是很好,于是回来结合面试的情况,查了很多的资料,认真地了解一下HTTP协议,如果写的不好的地方,留言指出。

二.HTTP概述:

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

三.HTTP特点:

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

五.TCP/IP参考模型

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

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

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

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

六.HTTP与HTTPS的区别

概述:

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按回车背后经历了哪些

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

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

跳到第三步操作。

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

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

的DNS查询缓存);

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

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

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

4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。

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

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

7、浏览器收到HTTP响应

8、浏览器解码响应,如果响应可以缓存,则存入缓存。

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

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

11、页面全部渲染结束。

文章分类
前端
文章标签