http详解

2. HTTP版本之概念篇

HTTP(超文本传输协议),是互联网上应用最为广泛的一种网络协议,定义了浏览器怎样向服务器请求文档,以及服务器怎样把文档传送给浏览器。HTTP基于TCP/IP协议的应用层协议,它不涉及数据包传输,主要规定了客户端和服务器之间的通信格式,默认使用80端口。

HTTP/0.9版本篇


要点

客户端向服务器请求网页,服务器只能回应HTML格式的字符串,不能回应别的格式。

只有GET方式

服务器发送完毕。就关闭TCP连接

缺点

每个TCP连接只能发送一个请求;发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接

TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢

网页加载的外部资源越多,性能就越差

只有一种请求方式

HTTP/1.0版本篇

要点

任何格式的内容都可以发送。互联网不仅可以传输文字,还可以传输图像,视频,二进制文件。(由于发送的数据可以是任何格式,因此可以把数据压缩后再发送。CONTENT-ENCODING字段说明数据压缩的方法

压缩的方式有(可以并列多个,用逗号隔开):CONTENT-ENCODING:GZIPCONTENT-ENCODING:COMPRESSCONTENT-ENCODING:DEATE

除了GET命令,还引入POST命令和HEAD命令,丰富了浏览器与服务器的互动手段。

HTTP请求和回应格式发生改变,除了数据部分,每次通信都包括头部分,用来描述数据,

新增的功能还包括:状态码(STATUS CODE),多字符集支持,多部分发送(MULTI-PART TYPE),权限(ANTHORIZATION),缓存(CACHE),内容编码(CONTENT ENCODING)等

HTTP/1.0请求的例子:

GET/HTTP/1.0 USER-AGENT:MOZILLA/5.0(MACINTOSH;INTEL MAC OS X 10_10_5 ) ACCEPT:*/*第一行为请求命令,必须在尾部添加协议版本(HTTP/1.0)

后面为多行头信息,描述客户端情况

HTTP/1.0回应的例子:

HTTP/1.0 200 OK              /*协议版本+状态码+状态描述*/CONTENT-TYPE: TEXT/PLAIN  CONTENT-LENGTH: 137582EXPIRES: THU, 05 DEC 1997 16:00:00 GMTLAST-MODIFIED: WED, 5 AUGUST 1996 15:55:28 GMTSERVER: APACHE 0.84

<HTML>

  <BODY>HELLO WORLD</BODY>

</HTML>

CONTENT-TYPE:字符编码,HTTP 1.0规定 头部必须是ASCII码,后面可以是任何格式,

因此,服务器回应时,CONTENT-TYPE的作用是:告诉客户端,数据是什么格式

缺点

非持续连接:每个TCP连接只能发送一个请求,每请求一个文档就需要两倍的RTT往返时间开销(一个RTT用于连接TCP连接,另一个用于请求和接收文档)。


如图所示:当HTTP协议首先要与服务器建立TCP连接,这就需要三次握手。当三次握手的前两部分完成后(即经过一个RTT时间后),万维网客户就把HTTP请求报文作为第三次握手的第三个报文的数据发送给万维网服务器,服务器收到HTTP报文后,就把所请求的文档作为响应报文返回给客户。

发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。

TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢。(为了解决这个问题:有些浏览器在请求时,用了一个非标准的CONNECTION字段。即CONNECTION:KEEP-ALIVE请求服务器不要关闭TCP连接,以便其他请求复用,服务器同样回复这个字段;以实现TCP的复用,直到客户端或服务器主动关闭连接,但,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决办法。

网页加载的外部资源越多,性能就越差。

5. HTTP/1.1版本篇

要点

引入了持久连接(PERSISITENT CONNECTION),即TCP连接默认不关闭,可以被多个请求复用,不用声明(简单的说:就是服务器在发送响应后仍热在一段时间内保持这条连接,使同一个用户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文)。CONNECTION:KEEP-ALIVE客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。不过,规范的做法是,客户端在最后一个请求时明确要求服务器关闭TCP连接。CONNECTION:CLOSE

目前,对于同一个域名,大多数浏览器允许同时建立6个持久连接。

引入了管道机制,即在同一个TCP连接里面,客户端可以同时发送多个请求。(提高HTTP协议的效率);举例说明:客户端需要请求两个资源,HTTP1.0是在同一个TCP连接里面,先发送A请求,然后等待服务器做出回应,收到后再发送B请求;管道机制是允许浏览器同时发生A请求和B请求,但是服务器还是按照顺序,先回应A请求,完成后再回应B请求

一个TCP连接可以传送多个回应,势必要有机制,区分数据包是属于哪一个回应的。这就是CONTENT-LENGTH字段的作用,声明本次回应的数据长度。

CONTENT-LENGTH:3495告诉浏览器本次回应的长度是3495个字节,后面的字节就属于下一个回应

分块传输编码;HTTP1.1采用分块传输编码;使用CONTENT-LENGTH字段的前提是服务器发送回应之前,必须知道回应数据的长度。但对于一些耗时的动态操作来说,这意味着,服务器要等所有操作完成,才能发送数据,显然效率不高,更好的处理方式是:服务器每产生一块数据,就发送一块,采用“流模式(STREAM)”取代“缓存模式(BUFFER)”.因此1.1版规定可以不使用CONTENT-LENGTH字段,而使用“分块传输编码”,只要请求或回应的头信息有TRANSFER-ENCODING字段,就表明回应的数据将由数量未定的数据块组成。TRANSFER-ENCODING:CHUNKED 每个非空的数据块之前,会有16进制的数值,表示这个块的长度,最后是一个大小为0的块,就表示本次回应的数据发送完。

Eg:

HTTP/1.1 200 OKCONTENT-TYPE: TEXT/PLAINTRANSFER-ENCODING: CHUNKED

25

THIS IS THE DATA IN THE FIRST CHUNK

1CAND THIS IS THE SECOND ONE

3

CON

8

SEQUENCE

0

** 新增功能**:PUT,PATCH,HEAD,OPTIONS,DELECT. 客户端的头信息增加HOST字段,用来指定服务器的域名。 HOST:WWW.EXAMPLE.COM 有了HOST字段,就可以将请求发往同一台服务器的不同的网站,为虚拟主机的新起打下了基础。

缺点

虽然复用TCP连接,但是在同一个TCP连接里面,所有的数据通信都是按照次序进行的。服务器只有处理完一个回应,才能进行下一个回应。(解决办法:A. 减少HTTP请求数;B:同时多开持久连接)

6. HTTP/2版本篇

要点

采用二进制协议:HTTP/1.1的头信息是文本(ASCII编码),数据体可以是文本(解析非常麻烦),也可以是二进制。而HTTP/2则是一个彻底的二进制协议,头信息和数据体都是二进制,通称为“帧”(FRAME):头信息帧和数据帧。二进制协议的一个好处是:可以定义额外的帧,解析方便。

多路复用(双向,实时的通信):HTTP/2复用TCP连接,在一个连接里,客户端和服务端都可以同时发送多个请求或回应,而不用按照顺序一一对应,这样就避免“队头阻塞”。举例来说:在一个TCP连接里面,服务器同时收到A请求和B请求,先回应A请求,结果发现处理过程非常耗时,于是就发送A请求已经处理好的部分,接着回应B请求,完成后,才发送B请求剩下的部分。

数据流:HTTP/2的数据流是不按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。因此必须要对数据包标记,指出它属于哪个回应。HTTP/2将每一个请求或回应的所有数据包,称为一个数据流。每个数据流都有一个独一无二的编号。数据包发送时,都必须标记数据流ID,用于区分它属于哪一个数据流,另外规定:客户端发出的数据流,ID一律为奇数,服务器发出的,ID为偶数。数据流发送一半时,客户端和服务器都可以发送信号,取消这个数据流。即HTTP/2可以取消某一个请求,同时保证TCP连接还开着,可以被其他请求使用。客户端还可以指定数据流的优先级,优先级越高,服务器就越早回应。

头信息压缩:HTTP2以前的版本协议不带有状态,每次请求都必须附上所有的信息。所以,请求的很多字段都是重复的,比如COOKIE和USER AGENT,一模一样的内容,每次请求都必须附带,这很浪费很多宽带,也影响速度。HTTP/2优化了这一点。引入了头信息压缩机制。一方面:头信息使用GZIP或COMPRESS压缩后再发送,另一方面,客户端和服务端同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段,只发送索引号,提高速度。

服务器推送:HTTP/2允许服务器未经请求,主动向客户端发送资源-->服务器推送。eg:客户端请求一个网页,这个网页里面包含静态资源。正常情况下,客户端必须收到网页后,解析HTML源码,发现有静态资源,再发送静态资源请求;其实,服务器可以预期到客户端请求网页后,很可能再请求静态资源,所以主动把这些静态资源随网页一起发给客户端。

缺点

请求太多时也需要排队

7. HTTPS版本篇

要点

HTTPS 是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL

HTTPS协议的主要作用是:建立一个信息安全通道,来确保数组的传输,确保网站的真实性

HTTPS的SSL加密是在传输层实现的

工作原理

客户使用HTTPS URL访问服务器,则要求WEB 服务器建立SSL链接。

WEB服务器接收到客户端的请求之后,会将网站的证书(证书中包含了公钥),返回或者说传输给客户端。

客户端和WEB服务器端开始协商SSL链接的安全等级,也就是加密等级。

客户端浏览器通过双方协商一致的安全等级,建立会话密钥,然后通过网站的公钥来加密会话密钥,并传送给网站。

WEB服务器通过自己的私钥解密出会话密钥。

WEB服务器通过会话密钥加密与客户端之间的通信。

优点

使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器

HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。

HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。

缺点

HTTPS握手阶段比较费时,会使页面加载时间延长50%,增加10%~20%的耗电。

HTTPS缓存不如HTTP高效,会增加数据开销。

SSL证书也需要钱,功能越强大的证书费用越高。

SSL证书需要绑定IP,不能再同一个IP上绑定多个域名,IPV4资源支持不了这种消耗。

HTTP和HTTPS的区别

HTTPS协议需要证书,费用较高。

HTTP是超文本传输协议,传输的数据都是未加密的即明文传输,HTTPS则是具有安全性的SSL加密传输协议。

使用不同的链接方式,端口也不同,一般而言,HTTP协议的端口为80,HTTPS的端口为443

HTTP协议是无连接,无状态的;(无连接:虽然HTTP使用了TCP连接,但通信的双方在交换HTTP报文之前不需要建立HTTP连接;无状态:是指服务端对于客户端每次发送的请求都认为它是一个新的请求,上一次会话和下一次会话没有联系);HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

HTTPS提升访问速度(可以对于,请求资源所需时间更少,访问速度更快,相比HTTP1.0)

HTTPS允许多路复用:多路复用允许同时通过单一的HTTP/2连接发送多重请求-响应信息。改善了:在HTTP1.1中,浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制(连接数量),超过限制会被阻塞。

二进制分帧:HTTP2.0会将所有的传输信息分割为更小的信息或者帧,并对他们进行二进制编码

HTTP2首部压缩;服务器端推送(相对于HTTP1.0)

7. SSL/TLS协议介绍

互联网的通信安全是建立在SSL/TLS协议之上。不使用SSL/TLS的HTTP协议,就是不加密的通信;会带来三大风险:

(1)窃听风险:第三方可以获取通信内容;

(2)篡改风险:第三方可以修改通信内容。

(3)冒失风险:第三方可以冒充他人身份参与通信。

SSL/TLS就是为了解决这三大风险而设计的,希望达到:

(1)所有信息都是加密传播,第三方无法窃听

(2)具有校验机制,一旦被篡改,通信双方立即发现。

(3)配备身份证书,防止身份被冒充。

SSL/TLS协议的基本思路

采用公钥加密法,即客户端先向服务端索要公钥,然后用公钥加密信息,客户端收到密文后,用自己的私钥解密。

如何保证公钥不被篡改?

解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。

公钥加密计算量太大,如何减少耗用的时间?

解决方法:每一次对话(SESSION),客户端和服务器端都生成一个"对话密钥"(SESSION KEY),用它来加密信息。由于"对话密钥"是对称加密,所以运算速度非常快,而服务器公钥只用于加密"对话密钥"本身,这样就减少了加密运算的消耗时间。

SSL/TLS协议的基本过程:

(1) 客户端向服务器端索要并验证公钥。

(2) 双方协商生成"对话密钥"。

(3) 双方采用"对话密钥"进行加密通信。 上面过程的前两步,又称为"握手阶段"(HANDSHAKE)。 开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手;HTTP耗时 = TCP握手;HTTPS耗时 = TCP握手 + SSL握手 所以,HTTPS肯定比HTTP耗时,这就叫SSL延迟

8.** 参考文章**

http://www.ruanyifeng.com/blog/2012/05/internet_protocol_suite_part_i.html

http://www.ruanyifeng.com/blog/2016/08/http.html

https://github.com/forthealllight/blog/issues/19

https://github.com/YanceyOfficial/interview/blob/master/HTTP/%5BHTTP%20%E7%B3%BB%E5%88%97%5D%20%E7%AC%AC%202%20%E7%AF%87%20%E2%80%94%E2%80%94%20HTTP%20%E5%8D%8F%E8%AE%AE%E9%82%A3%E4%BA%9B%E4%BA%8B.md

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 爬虫又称网络爬虫,所以在讲解爬虫之前,我们有必要了解一下什么是网络?网络是由若干节点和连接这些节点的链路构成,然后...
    猪哥66阅读 389评论 0 0
  • 作者:涤生_Woo链接:https://www.jianshu.com/p/6e9e4156ece3 本篇文章篇幅...
    Fi的学习笔记阅读 1,656评论 0 4
  • HTTP属于老话题了,在项目中我们经常需要往服务端发POST或者GET请求,但是对于HTTP的了解不应只局限于此。...
    Www刘阅读 1,130评论 6 7
  • 看过很多次http相关知识了,但没做过什么总结,这里就仔细总结下吧。 tip下,我是根据《图解http》总结的,这...
    pengweinan阅读 326评论 0 0
  • IPV4和IPV6的区别 - 小蚂蚁zoe - 博客园 1.IPv6 把 IP 地址由 32 位增加到 128 位...
    一代骄马阅读 400评论 0 1