域名系统DNS是互联网使用的命名系统,用来把便于人们使用的机器名字转换为IP地址。
当某一个应用进程需要把主机名解析为IP地址时,该应用进程就调用解析程序并成为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发给本地域名服务器(使用UDP是为了减少开销)本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用进程获得目的主机的IP地址后即可进行通信。
若本地域名服务器不能回答该请求,则此域名服务器就暂时成为DNS中的另一个客户,并向其他域名服务器发出查询请求。
“域”是名字空间中一个可被管理的划分。域还可以划分为子域,而子域还可继续划分为子域的子域,这样就形成了顶级域、二级域、三级域,等等。
mail. | cctv. | com |
---|---|---|
三级域名 | 二级域名 | 顶级域名 |
一个服务器所负责管辖的范围叫做区。各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。每一个区设置相应的权限域名服务器,用来保存该区中的所有主机的域名到IP地址的映射。总之,DNS服务器的管辖范围不是以“域”为单位,而是以“区”为单位,区是“域”的子集。
根域名服务器:根域名服务器是最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。根域名服务器是最重要的域名服务器,因为不管是哪一个本地域名服务器,若要对互联网上任何一个域名进行解析,只要自己无法解析,就首先要求助于根域名服务器。
顶级域名服务器:这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当找的域名服务器的IP地址)
权限域名服务器:这就是前面已经讲过的负责一个区的域名服务器。当一个权限域名服务器还不能给出最后的查询回答时,就会告诉发出查询请求的DNS客户,下一步应当找哪一个权限域名服务器。
本地域名服务器:本地域名服务器并不属于域名服务器层次结构,但它对域名系统非常重要。当一台主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。
为了提高域名服务器的可靠性,DNS域名服务器都把数据复制到几个域名服务器来保存,其中的一个是主域名服务器,其他的是辅助域名服务器,当主域名服务器出故障时,辅助域名服务器可以保证DNS的查询工作不会中断。主域名服务器定期把数据复制到辅助域名服务器中,而更改数据只能在主域名服务器中进行。这样就保证了数据的一致性。
如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他根域名服务器继续发出查询请求报文,即替该主机继续查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询。当然,本地域名服务器也可以采用递归查询,这取决于最初的查询请求报文的设置是要求使用哪一种查询方式。
HTTP协议的初始版本中,每进行一次HTTP通信就要断开一次TCP连接。
为解决上述TCP连接的问题,HTTP/1.1和一部分的HTTP/1.0想出了持久连接的方法。持久连接的特点是,只要任意一端没明确提出断开连接,则保持TCP连接状态。
持久连接使得多数请求以管线化方式发送成为可能。从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存 Cookie当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入Cookie值后发送出去。
服务器端发现客户端发送过来的 Cookie后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的HTTP报文叫做请求报文,响应端(服务器端)的叫做响应报文。hTTP报文本身是由多行数据构成的字符串文本。
HTTP报文大致可分为报文首部和报文主体两块。两者由最初出现的空行来划分。通常,并不一定要有报文主体。
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。
状态码 | 功能 | 描述 |
---|---|---|
200 | ok | 正常处理 |
204 | NO Content | 连接成功,但不返回资源(无需更新) |
206 | Partial Content | 返回范围请求 |
状态码 | 功能 | 描述 |
---|---|---|
301 | Moved Permanently | 永久性重定向,请求的资源已被分配了新的URI |
302 | Found | 临时性重定向,希望用户本次能使用新的URI访问 |
303 | See Other | 请求资源存在着另一个URI,应使用GET方法获取 |
304 | Not Modified | 发送附带条件的请求时,未满足条件的情况 |
307 | Temporary Redirect | 临时重定向。该状态码与302有相同含义 |
状态码 | 功能 | 描述 |
---|---|---|
400 | Bad Request | 请求报文中存在语法错误 |
401 | Unauthorized | 请求需要有通过httP认证的认证信息;之前已进行过请求,表示认证失败 |
403 | Forbidden | 请求资源的访问被服务器拒绝了 |
404 | Not Found | 服务器上无法找到请求的资源。 |
状态码 | 功能 | 描述 |
---|---|---|
500 | Internal Server Error | 服务器端在执行请求时发生了错误 |
503 | Service Unavailable | 服务器暂时处于超负载或正在进行停机维护 |
多个域名可以同时部署在同一个服务器上(相同的IP地址),使用DNS服务解析域名后,两者的访问IP地址会相同。
在相同的IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的Web网站,因此在发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI
代理是一种有转发功能的应用程序。代理服务器的基本行为就是接收客户端发送的请求后转发给其他服务器。代理不改变请求URI,会直接发送给前方持有资源的目标服务器。
在HTTP通信过程中,可级联多台代理服务器。请求和响应的转发会经过数台类似锁链一样连接起来的代理服务器。
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。
网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提供非HTTP协议服务。利用网关能提高通信的安全性,因为可以在客户端与网关之间的通信线路上加密以确保连接的安全。比如,网关可以连接数据库,使用SQL语句查询数据。
隧道是在相隔甚远的客户端和服务器两者之间进行中转,隧道按要求建立起一余与其他服器的通信线路,时使用SSL等加密手段进行通信。隧道的目的是确保客户端能与服务器进行安全的通信。
隧道本身不会去解析HTTP请求。也就是说,请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。
一种方式就是将通信加密。HTTP协议中没有加密机制,但可以通
过和SSL或TLS的组合使用,加密HTTP的通信内容。与SSL组合使用的HTTP被称为HTTPS
还有一种将参与通信的内容本身加密的方式。由于HTTP协议中没有加密机制,那么就对HTTP协议传输的内容本身加密。即把HTTP报文里所含的内容进行加密处理。在这种情况下,客户端需要对HTTP报文进行加密处理后再发送请求。
SSL不仅提供加密处理,而且还使用了一种被称为证书的手段,证书由值得信任的第三方机构颁发,用以证明服务器和客户端是实际存在的。
没有任何办法确认,发出的请求/响应和接收到的请求/响应是前后相同的。
请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击
常用确定报文完整性的方法是MD5和SHA-1等散列值校验的方法,以及用来确认文件的数字签名方法。
HTTPS并非是应用层的一种新协议。只是HTTP通信接口部分用SSL和TLS协议代替而已。
加密和解密同用一个密钥的方式称为共享密钥加密,也被叫做对称密钥加密。
发送密钥就有被窃听的风险,但不发送,对方就不能解密。再说,密钥若能够安全发送,那数据也应该能安全送达。
公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,另一把叫做公开密钥。顾名思义,私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得
使用公开密钥加密方式,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听而盗走。
HTTPS采用共享密钥加密和公开密钥加密两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密处理速度要慢。
所以应充分利用两者各自的优势,将多种方法组合起来用于通信。在交换密钥环节使用公开密钥加密方式,之后的建立通信交换报文阶段则使用共享密钥加密方式。