# HTTP相关整理笔记

256 阅读14分钟

HTTP协议hyper text transfer protocol(超文本传输协议)的缩写,用于玩委婉服务器传输超文本到本地浏览器的传达协议;基于TCP/IP通信协议来传递数据;属于应用层的面向对象洗衣,由于其简捷快速的方式,适用于分布式超媒体信息系统。

处理流程

  1. 输入网址并回车
  2. 解析域名
  3. 浏览器发送HTTP请求
  4. 服务器处理请求
  5. 服务器返回HTML响应
  6. 浏览器处理HTML页面
  7. 继续请求其它资源

特点:

简单快速、灵活、 无连接(限制每次链接至处理一个请求,服务器处理完客户的请求,并受到客户的应答后,即断开连接,节省传输时间)、 无状态(缺少状态意味着如果后续处理需要前面的信息,则它必须重传) 支持B_S(Browser_Server,浏览器_服务器模式)及C_S(Client_Server,客户机_服务器模式)

URL

http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name 从上面的URL可以看出,一个完整的URL包括以下几部分: 1.协议部分:该URL的协议部分为“http:”,这代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP等等本例中使用的是HTTP协议。在"HTTP"后面的“”为分隔符

2.域名部分:该URL的域名部分为“www.aspxfans.com”。一个URL中,也可以使用IP地址作为域名使用

3.端口部分:跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口

4.虚拟目录部分:从域名后的第一个“”开始到最后一个“”为止,是虚拟目录部分。虚拟目录也不是一个URL必须的部分。本例中的虚拟目录是“news

5.文件名部分:从域名后的最后一个“”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“”开始到”为止,是文件部分,如果没有“?”和“,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名

6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分

7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

URL/URN

URL是Internet上用来描述信息资源的字符串,主要用在各种www客户程序和服务器程序上 URN是以一种抽象的,高层次概念定义统一资源表示,而URL和RUN则是具体的资源表示的方式。URL和URN都是一种URI,笼统地说,每个URL都是RUI,但不一定每个RUI都是URL,这是因为URI还包括一个子类,即统一资源名称(URN)

TCP/IP协议栈

1、应用层 为用户提供所需要的各种服务,如:HTTP、FTP、DNS、SMTP等 2、传输层 为应用层实体提供端到端的通信功能,保证数据包的顺序传送及数据的完整性。该层定义了两个主要的协议: 传输控制协议(TCP)和用户数据报协议(UDP)

TCP/IP协议栈中位置

HTTP协议通常承载于TCP协议智商,有时也承载于TLS或SSL协议层智商,这时候,就成了HTTPS,如图:(默认HTTP的端口号为80,HTTPS的端口号为443)

HTTP的工作过程

一次HTTP操作称为一个食物,其工作过程可分为四步

  1. 客户机与服务器简历连接,只要单机某个超级链接,HTTP就开始工作
  2. 连接后,客户机发送一个请求给服务器,格式:统一资源标识符(URL)、协议版本号,后面是MIME信息包括请求修饰符、客户信息和可能的内容
  3. 服务器接到请求后,基于相应的响应信息,其格式为一个状态行,包括信息的协议版本号、成功/错误代码、MIME信息包括服务器信息、实体信息和可能内容
  4. 客户端接收到服务器返回的信息,通过浏览器展示到用户的显示屏,客户机遇服务器断开连接

请求与响应

HTTP请求组成: 请求行、消息报头、请求正文 HTTP响应组成:状态行、消息报头、响应正文 请求行组成:以一个方法符号开头,后面跟着请求的URI和协议的版本 状态行组成:服务器HTTP协议的版本,服务器发回的响应状态代码和状态代码的文本描述

请求方法

GET: 请求获取request-URI所表示的资源 POST: 在request-URI所标识的资源后附加新的数据 HEAD: 请求获取由request-URI所标识的资源的响应消息报头 PUT: 请求服务器存储一个资源,并用Request-URI作为其标识 DELETE: 请求服务器删除Request-URI所标识的资源 TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断 CONNECT: 保留将来使用 OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求

状态码

状态代码有三位数字组成,第一个数字定义了响应的类别 1. 1xx:指示信息——表示请求已接受,继续处理 2. 2xx:成功——表示请求已经被成功处理、理解、接受 3. 3xx:重定向——要完成请求必须进行更进一步的操作 4. 4xx:客户端错误——请求有语法错误或请求无法实现 5. 5xx:服务器端错误——服务器未能实现合法的请求

常用的请求报头

  • Accept请求报头域用于指定客户端接受那些类型的信息。eg:Accept: image_gif,Accept:text_htmlAccept-Charset请求宝图域用于指定客户端接受的字符集。Accept-Encoding:Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码
  • Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言
  • Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证
  • Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL 中提取出来,发送请求时,该报头域是必需的。
  • User-Agent 请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器

HTTP的基本优化

影响一个HTTP网络请求的因素主要有两个:宽带和延迟

  • 宽带:如果我们还停留在拨号上网的阶段,宽带可能会成为一个比较严重影响请求的问题,但是现在网络基础建设研究使得宽带得到极大提升,我们不再担心宽带会影响网速了
  • 延迟
  1. 浏览器阻塞:浏览器对于同一个域名,同时只能有6个链接(根据浏览器内核不同可能会有所差异),超过浏览器最大链接数炼制,后续请求就会阻塞
  2. DNS查询:浏览器需要知道目标服务器的IP才能建立链接。将域名解析为IP的这个系统就是DNS。这个通常会利用DNS缓存结果来达到减少这个事件的目的
  3. 建立链接:HTTP是基于TCP协议的,浏览最快也要在第三次握手时才能捎带HTTP请求报文,达到真正的简历连接,但这些连接无法服用会导致每次请求都经历三次握手和慢启动。三次握手在高延迟的场景下影响焦味明显,慢启动则对文件类大请求影响较大

HTTP1.0和HTTP1.1的一些区别

HTTP1.0最早在网页中使用是在1996年,在一些焦味简单的页面和网络请求,而HTTP1.1则在1999年开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当时使用最为广泛的HTTP协议。 主要区别体现在:

  • 缓存处理 HTTP1.0主要使用header里的if-modified-since,expires来做缓存判断的标准,HTTP1.1则引入了更多缓存控制策略例如entity tag、if-UNmodified-since、if-match、if-none-match等更多可供选择的缓存头来控制缓存策略
  • 宽带优化记网络连接的使用 HTTP1.0中,存在一些浪费宽带的现象,例如客户端只需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。 HTTP1.1则在请求头引用了range头域,它允许值请求资源的某个部分,即返回206,这样就方便了开发者自由选择以便于充分利用宽带和连接
  • 错误通知的管理 HTTP1.1新增了24个错误状态响应码,如409表示请求的资源与资源的当前状态发生冲突;410表示服务器上的讴歌资源被永久性的删除
  • host头处理 HTTP1.0认为每台服务器都绑定一个唯一的IP地址。因此,请求消息中的URL并没有传递主机名。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个IP地址。 HTTP1.1的请求消息和响应消息都应支持host头域,且请求消息中如果没有host头域会报告一个错误
  • 长连接 HTTP1.1支持长连接和请求的流水线处理,在一个停车票链接上可以传送多个HTTP请求和响应,减少了简历和关闭链接小号和延迟,在HTTP1.1中默认开启connection:keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点 区别用一张图来体现:

HTTP1.0和1.1现存的一些问题

  1. HTTP1.x在传输数据时,每次都需要重新简历连接,无疑增加了大量的延迟时间,特别是在移动端更为突出
  2. HTTP1.x在传输数据时,所有传输的内容都是明文,客户端和服务器都无法验证对方的身份,这在一定程度上无法保证数据的安全性
  3. header里携带的内容过大,在一定程度上增加了传输的成本,并且每次请求header基本不怎么变化,尤其在移动端增加用户流量
  4. 虽然支持了keep-alive,来弥补多次创建连接产生的延迟,但keep-alive使用多了同样会给服务端带来大量的性能压力,并且对于单个文件被不断请求的服务(例如图片存放网站),keep-alive可能会机打的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间

HTTPS应声而出

为了解决以上问题,网景在1994年创建了HTTPS,并应用网景导航者浏览器中。最初,HTTPS是与SSL一起使用的,在SSL逐渐演变到TLS时(其实两个是一个东西,只是名字不同而已),最最新的HTTPS也由2000年5月公布的RFC 2818 正式确定下来。简单来说,HTTPS就是安全版HTTP,并且由于当今时代对安全性要求更高,Chrome和Firefox都搭理支持网站使用HTTPS,苹果也在iOS 10 系统中强制APP使用HTTPS来传输数据,由此可见HTTPS势在必行

HTTPS和HTTP的一些区别

  1. HTTPS协议需要CA申请证书,一般免费证书很少,需要交费
  2. HTTP协议运行在TCP智商,所有传输的内容都是铭文,HTTPS运行在SSL\TLS运行在TCP智商,所有传输的内容都经过加密
  3. HTTP和HTTPS使用的完全不同的连接方式,用过的端口也不一样,前者80,后者443
  4. HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题

HTTPS改造

全站由HTTP ->HTTPS 需要注意一下:

  • 安装CA证书,一般的证书都要收费
  1. Let's Encrypt,免费,快捷,支持多域名(不是通配符),三条命令即时签署+导出证书。缺点是暂时只有三个月有效期,到期需续签。
  2. Comodo PositiveSSL,收费,但是比较稳定。
  • 购买证书之后,在证书提供的网站上配置自己的域名,将证书下载下来之后,配置自己的web服务器,同时进行代码改造
  • HTTPS降低用户访问速度。SSL握手,HTTPS对速度会有一定程度的降低,但是只要经过合理优化部署,HTTPS对速度的影响完全可以接。SPDY了解下
  • 相对于HTTPS降低访问速度,更需要关心的是服务端的CPU压力,HTTPS中大量的秘钥算法计算,会消耗大量的CPU资源,只有足够的优化,HTTPS的机器成本才不会明显增加 淘宝改造HTTPS了解下

SPDY

2012年Google提出SPDY的方案,大家猜开始正面看待和解决老板HTTP协议本身的问题,SPDY可以说是综合了HTTPS和HTTP两者,有点一体的传输协议,主要解决一下:

  1. 降低延迟 针对HTTP高延迟的问题,SPDY采用多路复用,多路复用通过多个请求stream共享一个TCP连接方式,解决了HOL blocking 的问题,降低了延迟同时提高了宽带的利用率
  2. 请求优先级 多路复用带来一个新问题,在链接共享的基础之上有可能会导致关键请求阻塞。SPDY允许给每个request设置优先级,这样的重要请求就会有限得到响应。比如浏览器加载首页,首页的HTML内容应该有限展示,之后才是各种静态资源文件,脚本文件等加载。
  3. header压缩 选择合适的压缩算法可以减小包的大小和数量
  4. 基于HTTPS的加密协议传输 大大提高了传输数据的可靠性
  5. 服务端推送 采用了SPDY的网页,例如网站有一个style.css请求,在客户收到style.css数据时,服务端回将style.js的文件推送给客户端,当客户端再次尝试获取style.js时,就可以直接从缓存中获取到,不用再发请求

HTTP2.0

HTTP2.0可以说是SPDY的升级版(其实原本也是基于SPDY设计的),但是,HTTP2.0跟SPDY扔有不同的地方:

  1. HTTP2.0支持明文HTTP传输,而SPDY强制使用HTTPS
  2. HTTP2.0消息头的压缩算法采用HPACK,而非是SPDY采用的 DEFLATE

HTTP2.0的新特性

  • 新的二进制格式
  • HTTP1.x的解析是基于文本。基于文本协议的格式解析存在坦然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮
  • 多路复用,即连接共享 每一个request都是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的id 将request再归属到各自不同的服务端请求里面

  • header压缩 HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,即避免了重复header的传输,又减少了需要传输大小
  • 服务端推送 同SPDY一样,HTTP2.0也具有server push 功能

HTTP2.0的升级改造

对于HTTPS的升级改,HTTP2.0或许稍微简单一些

  1. 前文说HTTP2.0其实可以支持非HTTPS的,但现在主流浏览器像Chrome,Firefox表示还是只支持基于TLS部署的HTTP2.0协议,所有要想升级到HTTP2.0还是先升级HTTPS为好
  2. 当网站升级HTTPS之后,那么升级HTTPS2.0就简单很很多,如果你使用Nginx,只要在配置文件中启动相应的协议就可以了 NGINX配置HTTP2.0官方指南
  3. HTTP2.0完全兼容HTTP1.x,对于不支持HTTP2.0的浏览器,Nginx会向下兼容