在我以前的文章中,咱们介绍了一些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>
元组标识。创建两个端点之间的链接是一个多步骤的过程,涉及到以下:浏览器
服务器负责始终使用正确的标头和响应进行响应。缓存
在HTTP / 1.0中,全部链接在单个事务以后都被关闭。所以,若是客户端想要从同一台服务器请求三个独立的映像,则它会与远程主机创建三个单独的链接。从上图能够看出,这可能会引入大量的网络延迟,从而产生一个次优的用户体验。安全
为了减小链接创建的延迟,HTTP / 1.1引入了持久链接,长时间的链接保持打开,直到客户端关闭它们。HTTP / 1.1中的持久链接是默认链接,而且单个事务链接须要客户端设置Connection: close
请求头。这将通知服务器在发送响应后关闭链接。服务器
除了持续链接以外,浏览器/客户端也采用一种称为并行链接的技术来最大限度地减小网络延迟。并行链接的古老概念涉及建立一个链接池(一般以六个链接为限)。若是客户端须要从网站下载6个资产,客户端将进行六个并行链接来下载这些资产,从而致使更快的周转时间。对于串行链接来讲,这是一个巨大的改进,客户端只有在完成先前资产的下载后才下载资产。cookie
并行链接与持续链接相结合,是今天解决网络延迟最小化以及在客户端上创造平滑体验的答案。有关HTTP链接的深刻处理,请参阅HTTP规范的“ 链接”部分。网络
服务器主要监听传入链接,并在收到请求时处理它们。业务涉及:session
Connection: close
发现请求标头,请关闭链接固然,这并非详尽的操做列表。大多数应用程序/网站须要知道谁发出请求以建立更多的自定义响应。这是识别和认证的领域。
HTTP是经过TCP的应用层协议,它是经过IP。
几乎必须知道谁链接到服务器来跟踪应用程序或站点的使用状况以及用户的通常交互模式。识别的前提是为了提供个性化的体验来定制响应; 固然,服务器必须知道用户是谁才能提供该功能。
服务器能够经过几种不一样的方式来收集这些信息,大多数网站都使用这些方法的混合:
From
,Referer
,User-Agent
-咱们在看到这些标题1部分。Cookie容许服务器经过Set-Cookie
响应头附加任意信息以用于外发响应。一个cookie设置有一个或多个name = value对,以分号(;)分隔,如同Set-Cookie: session-id=12345ABC; username=nettuts
。
服务器也能够限制cookie来具体的domain
和path
,它可使他们执着与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-Authenticate
与Authorization
头部相同的握手技术,但Digest使用更安全的散列函数来加密用户名和密码(一般使用MD5或KD摘要功能)。虽然Digest认证应该比Basic更安全,但因为其简单性,网站一般使用基本认证。为了减轻安全问题,Basic Auth与SSL结合使用。
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网络基础设施的基础。因为大多数操做都是经过网络进行的,因此缓存有助于节省时间,成本和带宽,并提供改进的网络体验。
缓存在网络基础架构中的几个地方使用,从浏览器到源服务器。取决于它所在的位置,缓存能够分为:
无论高速缓存位于何处,维护缓存的过程很是类似:
固然,服务器负责始终使用正确的标头和响应进行响应。若是一个文档没有改变,服务器应该用一个304 Not Modified
。若是缓存的副本已过时,它应该生成一个新的响应,更新的响应头并返回200 OK
。若是资源被删除,它应该回来404 Not Found
。这些响应有助于调整缓存,并确保过期的内容不会被保留。
并行链接与持续链接相结合,是今天解决网络延迟最小化的答案。
如今咱们已经了解了缓存如何工做,如今是查看启用缓存基础架构的请求和响应头。保持内容清新和更新是缓存的主要职责之一。为了保持缓存的副本与服务器一致,HTTP提供了一些简单的机制,即文档过时和服务器从新验证。
HTTP容许源服务器使用和响应头链接每一个文档的到期日期。这有助于客户端和其余缓存服务器知道文档有效和新鲜的时间。只要文档的年龄在到期日期以内,缓存便可提供副本。一旦文档过时,缓存必须与服务器检查较新的副本,并相应地更新其本地副本。Cache-Control
Expires
Expires
是一个旧的HTTP / 1.0响应头,将该值指定为绝对日期。这只有当服务器时钟与客户端同步时才有用,这是一个可怕的假设。与Cache-Control: max-age=<s>
HTTP / 1.1中引入的较新的头文件相比,此标题不太有用。在这里,max-age
是从建立响应时间开始的相对年龄(以秒为单位)。所以,若是文档在一天后过时,则过时标题应为Cache-Control: max-age=86400
。
一旦缓存文档过时,缓存必须从新验证服务器,以检查文档是否已更改。这被称为服务器从新验证,而且用做文档陈旧的查询机制。只是由于缓存的副本已过时并不意味着服务器实际上具备较新的内容。从新验证只是确保缓存保持新鲜的方法。因为到期时间(如之前的服务器响应中所指定),缓存不须要与服务器检查每个请求,从而节省带宽,缩短网络流量。
文档到期和服务器从新验证的组合是很是有效的机制,它容许分布式系统维护有效期的副本。
若是知道内容频繁更改,则能够减小到期时间 - 容许系统更频繁地从新同步。
从新验证步骤能够经过两种请求标头来实现:If-Modified-Since
和If-None-Match
。前者用于基于日期的验证,然后者使用实体标签(ETag),即内容的散列。这些标头使用从先前服务器响应获取的日期或ETag值。在状况下If-Modified-Since
,使用Last-Modified
响应头; 由于If-None-Match
它是ETag
响应头。
文档的有效期应由生成文档的服务器定义。若是是报纸网站,首页应该在一天以后过时(有时甚至每一个小时!)。HTTP提供Cache-Control
和Expires
响应标头来设置文档的到期时间。如前所述,Expires
是基于绝对日期,而不是用于控制缓存的可靠解决方案。
该Cache-Control
标题是更为有用,有几个不一样的价值观来约束客户应如何缓存响应:
另外,若是服务器没有发送任何Cache-Control
标题,客户端能够自由使用本身的启发式到期算法来肯定新鲜度。
可访问性不只限于服务器。也能够从客户端指定。这容许客户对它愿意接受的内容施加约束。这能够经过相同的Cache-Control
标题,尽管有几个不一样的值:
HTTP缓存其实是一个很是有趣的话题,而且有一些很是复杂的算法来管理缓存的内容。要深刻了解此主题,请参阅HTTP规范的缓存部分