HTTP:每一个Web开发人员必须知道的协议 - 第2部分

 

在我以前的文章中,咱们介绍了一些HTTP的基础知识,例如URL方案,状态代码和请求/响应头。以此做为咱们的基础,咱们将介绍HTTP的更好的方面,如链接处理,身份验证和HTTP缓存。这些主题至关普遍,但咱们将介绍最重要的位。html

 

必须在客户端和服务器之间创建链接,才能相互通讯,而HTTP使用可靠的TCP传输协议进行链接。默认状况下,Web流量使用TCP端口80. TCP流被分解为IP数据包,并确保这些数据包始终以正确的顺序到达。HTTP是经过TCP的应用层协议,它是经过IP。web

HTTPS是HTTP的安全版本,在称为TLS或SSL(传输层安全或安全套接字层)的HTTP和TCP之间插入一个附加层。HTTPS默认经过端口443进行通讯,本文稍后将会看到HTTPS。算法

 

HTTP链接被识别<source-IP, source-port><destination-IP, destination-port>在客户端上,HTTP应用程序由<IP, port>元组标识创建两个端点之间的链接是一个多步骤的过程,涉及到以下:浏览器

 

  • 经过DNS从主机名解析IP地址
  • 创建与服务器的链接
  • 发送请求
  • 等待回应
  • 关闭链接

服务器负责始终使用正确的标头和响应进行响应。缓存

 

在HTTP / 1.0中,全部链接在单个事务以后都被关闭。所以,若是客户端想要从同一台服务器请求三个独立的映像,则它会与远程主机创建三个单独的链接。从上图能够看出,这可能会引入大量的网络延迟,从而产生一个次优的用户体验。安全

为了减小链接创建的延迟,HTTP / 1.1引入了持久链接,长时间的链接保持打开,直到客户端关闭它们。HTTP / 1.1中的持久链接是默认链接,而且单个事务链接须要客户端设置Connection: close请求头。这将通知服务器在发送响应后关闭链接。服务器

除了持续链接以外,浏览器/客户端也采用一种称为并行链接的技术来最大限度地减小网络延迟。并行链接的古老概念涉及建立一个链接池(一般以六个链接为限)。若是客户端须要从网站下载6个资产,客户端将进行六个并行链接来下载这些资产,从而致使更快的周转时间。对于串行链接来讲,这是一个巨大的改进,客户端只有在完成先前资产的下载后才下载资产。cookie

并行链接与持续链接相结合,是今天解决网络延迟最小化以及在客户端上创造平滑体验的答案。有关HTTP链接的深刻处理,请参阅HTTP规范的“ 链接”部分网络

服务器主要监听传入链接,并在收到请求时处理它们。业务涉及:session

  • 创建一个套接字开始侦听端口80(或其余端口)
  • 接收请求并解析消息
  • 处理响应
  • 设置响应头
  • 将响应发送给客户端
  • 若是Connection: close发现请求标头,请关闭链接

固然,这并非详尽的操做列表。大多数应用程序/网站须要知道谁发出请求以建立更多的自定义响应。这是识别认证的领域

HTTP是经过TCP的应用层协议,它是经过IP。

几乎必须知道谁链接到服务器来跟踪应用程序或站点的使用状况以及用户的通常交互模式。识别的前提是为了提供个性化的体验来定制响应; 固然,服务器必须知道用户是谁才能提供该功能。

服务器能够经过几种不一样的方式来收集这些信息,大多数网站都使用这些方法的混合:

  • 请求头FromRefererUser-Agent-咱们在看到这些标题1部分
  • Client-IP - 客户端的IP地址
  • 胖网址 - 经过修改URL并重定向到每一个点击上的不一样URL来存储当前用户的状态; 每一个点击基本上累积状态。
  • 饼干 - 最流行和非侵入性的方法。

Cookie容许服务器经过Set-Cookie响应头附加任意信息以用于外发响应。一个cookie设置有一个或多个name = value对,以分号(;分隔,如同Set-Cookie: session-id=12345ABC; username=nettuts

服务器也能够限制cookie来具体的domainpath,它可使他们执着与expires价值。Cookie是由浏览器向服务器提出的每一个请求自动发送,并在浏览器确保了只有domain-和path特异性饼干请求中发送。请求头Cookie: name=value [; name2=value2]用于将这些Cookie发送到服务器。

识别用户的最佳方式是要求他们注册并登陆,但实现此功能须要开发人员以及用户的一些努力。

OAuth这样的技术简化了这种类型的功能,但它仍然须要用户赞成才能正常工做。认证在这里扮演着重要的角色,它多是识别和验证用户的惟一方法。

HTTP确实支持称为基自己份验证的基本形式的身份验证,以及更安全的摘要身份验证

在基自己份验证中,服务器最初使用WWW-Authenticate响应头和401 Unauthorized状态码拒绝客户端的请求看到此标题后,浏览器会显示登陆对话框,提示输入用户名和密码。该信息以Authentication请求头中的base-64编码格式发送。若是凭据有效,服务器如今能够验证请求并容许访问。某些服务器也可能发送Authentication-Info包含其余身份验证详细信息标头。

 

 

基本认证的推论是代理认证代替Web服务器,中间代理请求受权挑战。代理发送Proxy-Authenticate带有407 Unauthorized状态码标头做为回报,客户端应该经过Proxy-Authorization请求头发送凭据

Digest认证与Basic相似,并使用WWW-AuthenticateAuthorization头部相同的握手技术,但Digest使用更安全的散列函数来加密用户名和密码(一般使用MD5或KD摘要功能)。虽然Digest认证应该比Basic更安全,但因为其简单性,网站一般使用基本认证。为了减轻安全问题,Basic Auth与SSL结合使用。

HTTPS地址栏

HTTPS协议在网络上提供安全链接。知道您使用HTTPS的最简单的方法是检查浏览器的地址栏。HTTPs的安全组件涉及在HTTP和TCP之间插入一层加密/解密。这是安全套接字层(SSL)或改进的传输层安全(TLS)。

SSL使用强大的加密形式,使用RSA和公钥加密。因为安全交易在网络上很是重要,因此基于标准的公钥基础设施(PKI)的推出已经进行了好久。

现有的客户机/服务器不须要改变他们处理消息的方式,由于大部分的辛勤工做都发生在SSL层。所以,您可使用基自己份验证开发Web应用程序,并经过切换到https://协议自动获取SSL的优势可是,要使Web应用程序经过HTTPS工做,您须要在服务器上部署一个正常的数字证书。

就像您须要身份证以显示您的身份同样,Web服务器须要一个数字证书来识别本身。证书(或“证书”)由证书颁发机构(CA)颁发,并在网络上保证您的身份。CA是PKI的守护者。最多见的证书形式是X.509 v3标准,其中包含如下信息:

  • 证书颁发者
  • 用于证书的算法
  • 建立此证书的主题名称或组织
  • 该主题的公钥信息
  • 认证机构签名,使用指定的签名算法

当客户端经过HTTPS发出请求时,它首先尝试在服务器上找到证书。若是找到证书,它将尝试根据其已知的CA列表进行验证。若是它不是列出的CA之一,它可能会向用户显示一个对话框,警告网站的证书。

一旦证书被验证,SSL握手是完整的,安全的传输是有效的。

广泛赞成,作一样的工做两次是浪费的。这是HTTP缓存概念的指导原则,HTTP缓存是HTTP网络基础设施的基础。因为大多数操做都是经过网络进行的,因此缓存有助于节省时间,成本和带宽,并提供改进的网络体验。

缓存在网络基础架构中的几个地方使用,从浏览器到源服务器。取决于它所在的位置,缓存能够分为:

  • 私人:在浏览器中,缓存用户名,密码,URL,浏览历史记录和网页内容。它们一般小并且对用户具体。
  • 公共:部署为服务器和客户端之间的缓存代理。这些更大,由于它们服务于多个用户。一般的作法是在客户端和源服务器之间保留多个缓存代理。这有助于为常常访问的内容提供服务,同时仍然容许不常常须要的内容访问服务器。

 

 

无论高速缓存位于何处,维护缓存的过程很是类似:

  • 接收请求消息。
  • 解析 URL和标题。
  • 查找本地副本; 不然,在本地获取和存储
  • 进行新鲜度检查以肯定缓存中内容的年龄; 仅在必要时才提出刷新内容的请求。
  • 从缓存的主体和更新的标头建立响应
  • 将响应发送回客户端。
  • (可选)记录事务。

固然,服务器负责始终使用正确的标头和响应进行响应。若是一个文档没有改变,服务器应该用一个304 Not Modified若是缓存的副本已过时,它应该生成一个新的响应,更新的响应头并返回200 OK若是资源被删除,它应该回来404 Not Found这些响应有助于调整缓存,并确保过期的内容不会被保留。

并行链接与持续链接相结合,是今天解决网络延迟最小化的答案。

如今咱们已经了解了缓存如何工做,如今是查看启用缓存基础架构的请求和响应头。保持内容清新和更新是缓存的主要职责之一。为了保持缓存的副本与服务器一致,HTTP提供了一些简单的机制,即文档过时服务器从新验证

HTTP容许源服务器使用响应头链接每一个文档到期日期这有助于客户端和其余缓存服务器知道文档有效和新鲜的时间。只要文档年龄在到期日期以内,缓存便可提供副本一旦文档过时,缓存必须与服务器检查较新的副本,并相应地更新其本地副本。Cache-ControlExpires

Expires是一个旧的HTTP / 1.0响应头,将该值指定为绝对日期。这只有当服务器时钟与客户端同步时才有用,这是一个可怕的假设。Cache-Control: max-age=<s>HTTP / 1.1中引入的较新的头文件相比,此标题不太有用在这里,max-age是从建立响应时间开始的相对年龄(以秒为单位)。所以,若是文档在一天后过时,则过时标题应为Cache-Control: max-age=86400

一旦缓存文档过时,缓存必须从新验证服务器,以检查文档是否已更改。这被称为服务器从新验证,而且用做文档陈旧的查询机制只是由于缓存的副本已过时并不意味着服务器实际上具备较新的内容。从新验证只是确保缓存保持新鲜的方法。因为到期时间(如之前的服务器响应中所指定),缓存不须要与服务器检查每个请求,从而节省带宽,缩短网络流量。

文档到期和服务器从新验证的组合是很是有效的机制,它容许分布式系统维护有效期的副本。

若是知道内容频繁更改,则能够减小到期时间 - 容许系统更频繁地从新同步。

从新验证步骤能够经过两种请求标头来实现:If-Modified-SinceIf-None-Match前者用于基于日期的验证,然后者使用实体标签(ETag),即内容的散列。这些标头使用从先前服务器响应获取的日期或ETag值。在状况下If-Modified-Since,使用Last-Modified响应头; 由于If-None-Match它是ETag响应头。

文档的有效期应由生成文档的服务器定义。若是是报纸网站,首页应该在一天以后过时(有时甚至每一个小时!)。HTTP提供Cache-ControlExpires响应标头来设置文档的到期时间。如前所述,Expires是基于绝对日期,而不是用于控制缓存的可靠解决方案。

Cache-Control标题是更为有用,有几个不一样的价值观来约束客户应如何缓存响应:

  • 缓存控制:无缓存:容许客户端存储文档; 可是,它必须在每一个请求上从新验证服务器。有一个称为Pragma:no-cache的HTTP / 1.0兼容性头,其工做方式相同。
  • 缓存控制:无存储:这是一个更强大的指令,客户端根本不存储文档。
  • 缓存控制:必须从新验证:这将告诉客户端绕过其新鲜度计算,并始终使服务器从新生效。若是服务器不可用,则不容许提供缓存的响应。
  • 缓存控制:max-age:设置从响应生成时起的相对过时时间(以秒为单位)。

另外,若是服务器没有发送任何Cache-Control标题,客户端能够自由使用本身的启发式到期算法来肯定新鲜度。

可访问性不只限于服务器。也能够从客户端指定。这容许客户对它愿意接受的内容施加约束。这能够经过相同的Cache-Control标题,尽管有几个不一样的值:

  • 缓存控制:min-fresh = <s>:文档必须至少为ss秒以上。
  • 缓存控制:MAX-陈旧缓存控制:MAX-陈旧= <S> 该文档不能从缓存中提供,若是它已通过时了长于<S>秒。
  • 缓存控制:max-age = <s>:缓存不能返回缓存长于<s>的文档
  • Cache-Control:无缓存Pragma:no-cache:除非已被从新验证,客户端将不会接受缓存的资源。

HTTP缓存其实是一个很是有趣的话题,而且有一些很是复杂的算法来管理缓存的内容。要深刻了解此主题,请参阅HTTP规范缓存部分

相关文章
相关标签/搜索