熟悉的陌生人 - HTTP

前言

HTTP协议是跟我们打交道最多的网络协议了,但是你熟悉的人你未必了解,俗称灯下黑。本文讲述怎么理解HTTP的角色定位,教你看懂报文信息。本文会从以下四个维度来了解HTTP协议。

  • HTTP的前世今生
  • 网络中的HTTP
  • HTTP报文详解
  • HTTP安全

1.HTTP的前世今生

HTTP/0.9
1990年,HTTP标准还没完全建立起来之前的版本,可以理解为正式版之前的版本。
HTTP/1.0
1996年,HTTP的正式版本,也是初期版本。
HTTP/1.1
1997年,应该是目前应用最广泛的版本,毕竟到现在2016年近20年没大的变动,不能说优秀但胜在稳定。
HTTP/2.0
还没大规模推,性能更快更强是肯定的,还针对移动端做了优化,我最喜欢WebSocket,全双工通信标准,客户端服务端互发嗨的不行。

2.网络中的HTTP

2.1先建大局观

先了解HTTP在整个网络通讯过程中的位置或者说所扮演的角色,有利于我们理解他的功能,屁股决定脑袋嘛,是吧?

《熟悉的陌生人 - HTTP》

简单的把一次通信的过程分为三个阶段:客户端发出,线路中传输,服务端响应。而互联网中的设备要完成通信必须基于双方都能识别的规则,如通信的语音,格式,硬件和操作系统等等,这些规则的集合统称为TCP/IP 协议族。 大家基于同一套规则,才能好好玩耍。

2.2客户端发出

客户端先通过一个URL发起一个请求。

URL(Uniform Resource Locator,统一资源定位符)是URI(统一资源标识符)的子集,URI可以标识网络中的任意资源,有了URI才能在海量的网络资源中找到我们需要的那部分。

可以看到请求先过DNS服务,请求到了URL中的域名对应的IP地址。

DNS(Domain Name System, 域名系统),因为IP地址的记忆实在是反人类,而域名机器识别不了,所以有了DNS将二者自由转换。

拿到完整的信息后,HTTP协议把请求请求包装成HTTP请求的报文。我们知道协议分层有OSI的7层模型,还有TCP/IP的4层模型。

《熟悉的陌生人 - HTTP》

依照上图我们可以看到,HTTP在交互的过程中传输层使用的TCP协议,网络层使用的是IP协议,将信息层层加首部分包后发送出去。

2.3线路中传输

信息在线路中传输的过程中,路由器不断的转发来转发去,那么是怎么找到目标服务器的?你会说不是有IP地址吗,是的,但是IP 间的通信要依赖 MAC 地址。这时会用到 ARP 协议(Address Resolution Protocol)。ARP 是一种用以解析地址的协议,根据通信方的 IP 地址就,可以反查出对应的 MAC 地址。除了路由器外,信息要到达目标服务器地址可能还要经过代理服务器,网关等设备,篇幅有限不细说,想听留言。

2.4服务端响应

《熟悉的陌生人 - HTTP》

服务端收到包后,经过和客户端分包的反向过程,还原原来的报文信息。

3.HTTP报文详解

3.1报文结构

先回答报文到底是什么?

用于HTTP协议交互的信息被称为HTTP报文。

报文结构如下图。重要的是报文首部和报文的主体部分,中间的部分主要是要来分割首部和主体的。

《熟悉的陌生人 - HTTP》

请求的报文和响应的报文有些区别。

《熟悉的陌生人 - HTTP》

请求行 VS 状态行

请求行包含用于请求的方法,请求 URI 和 HTTP 版本。
状态行包含表明响应结果的状态码,原因短语和 HTTP 版本

状态行有我们熟悉的200,404,500等状态码。

3.2报文详解

详细介绍下比较常用的HTTP首部信息的含义。

Cache-Control

操作缓存的指令。主要有以下几种用法

Cache-Control: no-cache

表示客户端不接受缓存的响应,必须请求最新的资源。

Cache-Control: no-store

表示客户端不能缓存请求或者响应的任意一部分。

Cache-Control: max-age=604800(单位 :秒)

max-age 数值代表资源保存为缓存的最长时间。当指定 max-age 值为0或者缓存超过最大时间,那么缓存服务器通常需要将请求转发给 源服务器。

Connection

由于HTTP1.1后,客户端和服务端建立连接后可以多次通信,连接的是否中断可以依靠以下指令控制。

Connection: close

表示想断开当前连接。

Connection: Keep-Alive

表示想保持当前连接。

Date

表明创建HTTP报文的日期和时间。

Upgrade

用于检测 HTTP 协议及其他协议是否可使用更高 的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。比如我偏爱的webSocket

Upgrade: websocket

Via

为了追踪客户端与服务器之间的请求和响应报 文的传输路径。之前说过,一个请求的过程除了经过路由器外,还可能经过代理,网关等设备,这些设备的路径将被记录。

Warning

一些警告信息。

Accept

用户代理能够处理的媒体类型和优先级。

Accept: text/html,image/jpeg
客户端可以处理的媒体类型,包括文本和jpeg格式的图片

Accept-Charset

用户代理支持的字符集 及字符集的相对优先顺序。

Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

权重 q 值来表示相对优先级。

Accept-Encoding

用户代理支持的内容编 码及内容编码的优先级顺序。

Accept-Encoding: gzip, deflate,compress

Accept-Language

用户代理能够处理的自 然语言集(指中文或英文等)及优先级。

Accept-Language: zh-cn

Authorization

用户代理的认证信息。

Host

请求的资源所处的互联网主机名和 端口号。

Range

Range: bytes=5001-10000
请求获取从第 5001 字节至第 10000 字节的资源。

Referer

请求的URI是哪个页面发起的。

Referer: www.xxx.com/index.html

User-Agent

创建请求的浏览器和用户代理名称等信息。

Age

源服务器在多久前创建了响应。字段值的单位为秒。

Age: 600

Expires

资源失效的日期。

Last-Modified

明资源最终修改的时间。

Allow

支持 Request-URI 指定资源的 所有 HTTP 方法。

Allow: GET, HEAD

就是熟悉的GET,POST一类的东东。

Content-Type

实体主体内对象的媒体类型。

Content-Type: text/html; charset=UTF-8

Content-Encoding

服务器对实体的主体部分选用的内容编码方式。

Content-Encoding: gzip

Content-Language

实体主体使用的自然语 言(指中文或英文等语言)

Content-Length

Content-Length 表明了实体主体部分的大小(单位是字节)

Content-Length: 15000

当我们获取下载进度信息时,常常使用使用这个信息。

Set-Cookie

和cookie相关的信息。

《熟悉的陌生人 - HTTP》

和安全相关的2个属性

《熟悉的陌生人 - HTTP》

Cookie

如果想HTTP状态管理时,请求的首部加入

Cookie: status=enable

HTTP是无状态的,其状态管理要依赖于Cookie。

3.3报文分析

以下从天猫中请求图片的报文信息。
请求报文头

:authority:img.alicdn.com
:method:GET
:path:/tps/i2/TB1xgT8LVXXXXaZXFXX8ueZHFXX-180-72.png
:scheme:https
accept:image/webp,image/*,*/*;q=0.8
accept-encoding:gzip, deflate, sdch
accept-language:zh-CN,zh;q=0.8
cache-control:max-age=0
if-modified-since:Tue, 15 Mar 2016 11:51:20 GMT
referer:https://www.tmall.com/?ali_trackid=2:mm_26632322_6858406_23810104:1469694734_252_1633093166
user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36

响应报文头

access-control-allow-origin:*
age:535988
cache-control:max-age=31536000
content-type:image/png
date:Fri, 22 Jul 2016 03:39:36 GMT
eagleid:deba31c914696947642232836e
expires:Sat, 22 Jul 2017 03:39:36 GMT
last-modified:Tue, 15 Mar 2016 11:51:20 GMT
server:Tengine
status:304
timing-allow-origin:*
via:cache3.l2cn8[0,200-0,H], cache15.l2cn8[0,0], cache1.cn74[0,304-0,H], cache1.cn74[0,0]
x-cache:HIT TCP_IMS_HIT dirn:2:604845409

各位童鞋按照上一小节的姿势自行分析吧。

3.4状态码

《熟悉的陌生人 - HTTP》

有时候服务端的童鞋会自己定义一些自己的状态码,完全不遵守HTTP一些固定的套路,用400表示请求成功真让人淡淡的忧伤。

4.HTTP安全

HTTP在通信过程中存在以下安全隐患

  1. 明文传输,信息泄露
  2. 通信身份无认证
  3. 信息完整性无法保证,可能被伪造或者篡改

HTTPS是目前业界比较认可的解决方案,在HTTP和传输层中间加个SSL(Secure Socket Layer) 。SSL可以搞定身份验证,完整性保护,加密。

后记

对HTTP有了更深入的了解,把熟悉的陌生人变成亲人。有用帮忙戳喜欢,有问题欢迎留言讨论。

感谢

《图解HTTP》

    原文作者:HTTP
    原文地址: https://juejin.im/entry/579ac9bf0a2b580058f04642
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞