Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

图解HTTP #1

Open
haoxinxin opened this issue May 24, 2017 · 0 comments
Open

图解HTTP #1

haoxinxin opened this issue May 24, 2017 · 0 comments
Labels

Comments

@haoxinxin
Copy link
Owner

haoxinxin commented May 24, 2017

第一章 WEB及网络基础

TCP/IP分层协议

  1. 应用层

    决定了向用户提供通信服务时进行的活动。FTP,DNS,HTTP都属于这层。

  2. 传输层

    提供处于网络连接中的两台计算机之间的数据传输。分为TCP和UDP两种。

  3. 网络层

    处理在网络上流动的数据包,数据包是网络传输的最小单位。

  4. 链路层

    处理连接网络的硬件部分。

与HTTP密切相关的协议

ARP协议:用以解析地址,根据通信方的IP地址就可以反查出MAC地址。
各种协议与HTTP的关系

RFC

有一些用来制定HTTP协议技术标准的文档,被称为RFC(Request for Comments,征求修正意见书),如果web服务器没有按照RFC的标准实现,那会导致无法通信。

第二章 简单的HTTP协议

通过请求和响应的交换达成通信

请求报文:

响应报文:

告知服务器意图的HTTP方法

  1. GET:获取资源

    请求已被URI识别的网络资源,指定的资源经服务器解析后返回响应内容。

  2. POST:传输实体主体

    用来传输实体的主体。

  3. PUT:传输文件

    用来传输文件,要求在请求报文的主体中包含文件内容,保存到请求URI指定的位置。但是鉴于HTTP/1.1的PUT方法自身不带验证机制,存在安全性问题,一般不使用该方法。

  4. HEAD: 获得报文首部

    和GET方法一样,只是不返回报文主体部分。用于确认URI的有效性及资源更新的日期时间等。

  5. DELETE:删除文件

    用来删除文件,和PUT相反。但也因不带验证机制,一般不使用。

  6. OPTIONS:询问支持的方法

    用来查询针对请求URI指定的资源支持的方法。返回服务器支持的方法。例如,响应:

    Allow: GET,POST,HEAD,OPTIONS

  7. TRACE:追踪路径

    让web服务器将之前的请求通信环回给客户端的方法。用来确认连接到目标服务器发生的一系列操作。但容易引发XST(跨站追踪)攻击,通常不用。

  8. CONNECT:要求用隧道协议连接代理

    要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议将通信内容加密后经网络隧道传输。

持久连接节省通信量

HTTP初始版本中,每进行一次HTTP通信就要断开一次TCP连接,但是当一个页面包含多个资源请求时,会造成多次无谓的TCP连接建立和断开,增加通信量的开销。

  1. 持久连接(HTTP keep-alive)

只要任意一端没有明确提出断开连接,则保持TCP连接状态。HTTP/1.1中,所有连接默认是持久连接。

  1. 管线化(pipelining)

不用等待响应即可直接发送下一个请求。

第三章 HTTP报文内的HTTP信息

用于HTTP协议交互的信息被称为HTTP报文。请求端和响应端的报文分别是请求报文和响应报文。HTTP报文大致分为报文首部和报文主体两块。

压缩传输的内容编码

常用的内容编码有:

  • gzip(GNU zip)
  • compress (UNIX 系统的标准压缩)
  • deflate (zlib)
  • identity (不进行编码)

分割发送的分块传输编码

传输大容量数据时,通过把数据分割成多块,能够让浏览器逐步显示页面。这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding)。

每一块都会用十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)”来标记。

第四章 返回结果的HTTP状态码

第五章 与HTTP协作的WEB服务器

HTTP通信时,除客户端和服务器以外,还有一些用于通信数据转发的应用程序,例如代理,网关和隧道。

代理

接收客户端发送的请求后直接转发给其他服务器。在HTTP通信过程中,可级联多台代理服务器。

使用代理服务器的理由:利用缓存技术减少网络带宽的流量,组织内部针对网站的访问控制,获取访问日志等。

网关

是转发其他服务器通信数据的服务器,接收从客户端发来的请求,对请求进行处理。网关可以向数据库发送查询语句,或者生成动态的内容。可以是资源网关,作为连接数据库内容的网关。有些网关也可以将HTTP流量转换为其他协议,这样HTTP客户端无需了解其他协议,就可以与其他应用程序进行交互。

隧道

隧道可按要求建立起一条鱼其他服务器的通信线路,届时使用SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。

隧道本身不会去解析HTTP请求,请求保持原样中专给之后的服务器。

保存资源的缓存

缓存是指代理服务器或客户端本地磁盘内保存的资源副本。

代理服务器缓存会在代理服务器上保存资源副本,有效时直接返回。

客户端的缓存,如果有效,就不必再向服务器请求相关资源,直接从本地磁盘读取。

第六章 HTTP首部

HTTP报文首部

  • 请求报文:由方法,URI,HTTP版本,HTTP首部字段等部分构成。
  • 响应报文:由HTTP版本,状态码,HTTP首部字段构成。

HTTP/1.1 首部字段




还有一些非HTTP/1.1 协议首部,使用也很频繁,例如:Cookie, Set-Cookie等。

HTTP/1.1 通用首部字段

  1. Cache-Control
    Cache-Control可用指令按请求和响应分类如下:


    * s-maxage 功能与max-age指令相同,不同点是s-maxage指令只适用于供多位用户使用的公共缓存服务器。另外,当使用s-maxage指令后,则直接忽略对Expires及max-age的处理。

  2. Connection
    * 控制不再转发给代理的首部字段

      在客户端发送请求和服务器返回响应内,可控制不再转发给代理的首部字段。
    * 管理持久连接
    
      Connection: Keep-Alive/close 持久连接或关闭持久连接
    
  3. Date 创建HTTP报文的日期和时间

  4. Trailer 会事先说明在报文主体后记录了哪些首部字段,该首部字段可应用在HTTP/1.1版本分块传输编码时。

  5. Warning 告知用户一些与缓存相关的问题的警告。

请求首部字段

  1. Accept 通知服务器,用户代理能处理的媒体类型及媒体类型的相对优先级。优先级使用q= 来标识(0~1)。试举几个媒体类型的例子:
    * 文本文件:text/html, text/plain, text/css, application/xhtml+xml ……
    * 图片文件:image/jpeg, image/gif,……
    * 视频文件:video/mpeg, video/quicktime ……
    * 应用程序使用的二进制文件:application/octet-stream, application/zip ……

  2. Accept-Charset 支持的字符集及字符集相对优先顺序。

  3. Accept-Encoding 告知服务器用户代理支持的内容编码及内容编码的优先级顺序。可以的值:gzip, compress, deflate, identity

  4. Accept-Language 告知服务器用户代理能够处理的自然语言集(中文或英文等)

  5. Authorization 告知服务器用户代理的认证信息(证书值)。想要通过服务器认证的用户代理会在接收到返回的401响应后,把首部字段Authorization加入请求中

  6. If-Match 形如If-*** 这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。

    If-Match会告知服务器匹配资源所用的实体标记(ETag)值。服务器会对比If-Match的字段值和资源的ETag值,仅当两者一致时,才会执行请求。反之,返回状态码412。
    
  7. If-Modified-Since 告知服务器若If-Modified-Since早于资源更新时间,则希望处理该请求,若在If-Modified-Since字段值的日期时间之后,如果请求的资源没有更新过,则返回304 Not Modified.

  8. If-Range 告知服务器若指定If-Range字段值(ETag值或时间)和请求资源的ETag值或时间一致时,则作为范围请求处理,反之,则返回全体资源。

  9. Range 对于只需获取部分资源的范围请求,告知服务器资源的指定范围。

  10. Referer 告知服务器请求的原始资源的URI。

响应首部字段

  1. Accept-Ranges 告知客户端 服务器是否能处理范围请求,可处理时指定为bytes, 不能则指定为none.
  2. ETag 告知客户端实体标识,是一种可将资源一字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的ETag值。
  3. Location 重定向至资源。
  4. Server 告知客户端当前服务器上安装的HTTP服务器应用程序的信息。

实体首部字段

包含在请求报文和响应报文中的实体部分所使用的首部

  1. Allow 告知客户端能够支持Request-URI指定资源的所有HTTP方法。例如 Allow:GET,HEAD。当服务器收到不支持的HTTP方法时,会以405 Method Not Allowed作为响应返回。
  2. Content-Encoding 告知客户端服务器对实体的主体部分选用的内容编码方式。
  3. Content-Language 实体主体使用的自然语言。
  4. Content-Length 实体主体部分的大小,单位字节。

为Cookie服务的首部字段


第七章 确保Web安全的HTTPS

HTTP的不足

* 通信使用明文,内容可能被窃听
* 不验证通信方的身份,因此有可能遭遇伪装
* 无法证明报文的完整性,有可能已遭篡改

加密处理

1. 通信的加密

	http通过和SSL(安全套接层)或TLS(安全层传输协议)的组合使用,加密http的通信。与SSL组合使用的HTTP被称为HTTPS。
2. 内容的加密

	对HTTP协议传输的内容本身加密,要求客户端和服务器同时具备加密和解密机制。

查明对手的证书

虽然通过HTTP协议无法确定通信方,但如果使用SSL则可以。SSL不仅提供加密处理,而且使用了一种被称为证书的手段,可用于确定方。证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。

防止篡改

常用的是使用MD5和SHA-1等散列值校验的方法,以及用来确认文件的数字签名方法。但是用这些方法也依然无法百分百保证确认结果正确,因为MD5本身被改写的话,用户是没有办法意识到的。所以需要和其他协议组合使用。

HTTP+加密+认证+完整性保护 = HTTPS

HTTPS并非是应用层的一种新协议,只是HTTP通信接口部分用SSL和TLS协议代替而已。通常HTTP直接和TCP通信,当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了。所谓HTTPS,就是身披SSL协议外壳的HTTP。

采用SSL后,HTTP就拥有了HTTPS的加密、证书和完整性保护功能。

相互交换秘钥的公开秘钥加密技术

* 共享秘钥加密

	加密和解密同用一个秘钥(对称秘钥加密)。
* 使用两把秘钥的公开秘钥加密

	使用一对非对称的秘钥,分别是私有秘钥和公开秘钥。私有秘钥不能让其他人知道,公开秘钥则可以随意发布。


* HTTPS采用混合加密机制

	在交换秘钥环节使用公开秘钥加密方式,之后的建立通信交换报文阶段则使用共享秘钥加密方式。

第八章 确认访问用户身份的认证

HTTP使用的认证方式

* BASIC认证(基本认证)


* DIGEST认证(摘要认证)

* SSL 客户端认证
* FormBase认证(基于表单认证)

	基于表单的认证方法并不是在HTTP协议中定义的。客户端会向服务器上的Web应用程序发送登录信息,按登录信息的验证结果认证。
	
	认证多半为基于表单认证。
	
	基于表单认证的标准规范尚未有定论,一般会使用Cookie来管理Session。

第九章 基于HTTP的功能追加协议

HTTP的瓶颈

使用浏览器进行双工通信的WebSocket

一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后的所有通信都依靠这个专用协议进行,可互相发送JSON,XML,HTML或图片等任意格式的数据。

由于是建立在HTTP基础上的协议,因此连接的发起方仍是客户端,而一旦确立WebSocket通信连接,服务器和客户端都可直接向对方发送报文。

为了实现WebSocket通信,在http连接建立后,需要完成一次握手的步骤,需要用到HTTP的Upgrade首部字段,告知服务器通信协议发生改变。服务器返回状态码101 Switching Protocls的响应。成功握手后通信不再使用HTTP数据帧,采用WebSocket独立的数据帧。

@haoxinxin haoxinxin added the http label Jun 16, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant