DNS与HTTP协议
本文所谈论的DNS和HTTP都属于应用层协议,是计算机网络中最常用的两个协议。
DNS(Domain Name System,域名系统)是互联网中用于将域名转换为对应 IP 地址的一种协议。
HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在计算机网络上进行通信的应用层协议。它是万维网(World Wide Web)的基础,也是互联网上最常用的协议之一。
本文将分别介绍DNS和HTTP协议的概念、工作原理、特性和安全性等内容。
# 一、DNS协议简述
DNS(Domain Name System,域名系统)是互联网中用于将域名转换为对应 IP 地址的一种协议。
在互联网上,每个设备(如计算机、服务器)都有一个唯一的 IP 地址来标识自己。然而,人们更容易记忆和使用域名来访问网站,而不是记住一长串数字的 IP 地址。这就是 DNS 协议的作用:将域名映射到对应的 IP 地址。
DNS 协议的工作原理阮一峰老师在 DNS 查询原理详解 (opens new window) 中已经讲的非常清楚。简单来说,步骤如下:
当我们输入一个网址(如google.com)在浏览器中,并按下Enter键,浏览器就会向DNS服务器发送一个请求,寻找对应的IP地址。
首先,查询请求会被发送到递归DNS服务器(例如1.1.1.1)。这是最常用的用户接口,可以自动完成整个DNS查询过程。
如果递归服务器没有缓存对应的信息,它会向根域名服务器发送请求。根域名服务器是DNS体系的顶层,全球共有13台。
根域名服务器会返回适当的顶级域名(TLD)服务器的地址。TLD服务器负责管理其下的一级域名,例如.com或.net。
递归服务器再向TLD服务器发送请求,TLD服务器将返回对应的权威域名服务器的地址。权威服务器负责维护具体的一级域名及其子域名的IP信息。
递归服务器再向权威服务器发送查询请求,并获取到请求的域名对应的IP地址。
最后,递归服务器将IP地址返回给用户的浏览器,浏览器则通过这个IP地址找到对应的服务器,展示相应的网页。
在这个过程中,为了提高效率,递归服务器会缓存查询的结果,如果之后有人再次查询同一IP地址,就可以直接从缓存中提取结果,而不用再进行一次完整的查询。
总体来看,DNS查询是一个树状结构的逐级查找过程,其过程可以被总结为:“根域名服务器 -> 顶级域名服务器 -> 权威域名服务器(一级域名)-> 最终查询结果”。
对于文章的一些补充:
DHCP分发IP的时候,也会分发路由器默认设置的DNS地址
在主机上,可以手动修改DNS地址。比如Linux中手动设置DNS的步骤是:1、编辑
/etc/resolv.conf
文件,写入内容如nameserver 8.8.8.8
;2、重启网络服务或重启计算机以使更改生效。可以使用以下命令重启网络服务:sudo systemctl restart networking
。DNS服务器的地址可以是多个,一般会配置两个,一个是主DNS,一个是备用DNS。如果主DNS无法解析,就会使用备用DNS。
如果本地或网关设置了DNS,那么这个就会是递归DNS服务器。如果没有设置,那么就会使用ISP提供的递归DNS服务器。
常见的递归DNS服务器有:Cloudflare的1.1.1.1,Google的8.8.8.8,中国联通的202.96.128.86等。
# 二、HTTP协议概述
# 1. 什么是HTTP协议
HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在计算机网络上进行通信的应用层协议。它是万维网(World Wide Web)的基础,也是互联网上最常用的协议之一。
HTTP协议的主要目标是实现客户端和服务器之间的通信。客户端可以是Web浏览器、移动应用或其他网络应用,而服务器则是存储和提供Web资源的计算机。
HTTP协议的工作原理如下:
客户端发送一个HTTP请求给服务器,请求可以是获取某个资源(如网页、图像、视频等),也可以是执行某个操作(如提交表单、发送数据等)。
服务器接收到请求后,根据请求的类型和路径,执行相应的操作,并生成一个HTTP响应。
服务器将HTTP响应发送回客户端,响应包含了请求的结果或所请求资源的相关信息。
客户端接收到HTTP响应后,根据响应的内容进行相应的处理,如渲染网页、显示图片、处理数据等。
HTTP协议使用了请求-响应模型,客户端发送请求并等待服务器的响应。请求和响应都是由一个起始行、多个头部字段和一个可选的消息体组成。
HTTP协议是无状态的,这意味着服务器在处理请求时不会保留与之前请求的状态相关的信息。为了解决这个问题,引入了Cookie和Session等机制来维护用户的状态。
此外,HTTP协议还定义了一些常用的请求方法(如GET、POST、PUT、DELETE等)和状态码(如200 OK、404 Not Found、500 Internal Server Error等),用于表示请求的操作和响应的状态。
总结起来,HTTP协议是一种用于在客户端和服务器之间传输数据的协议,它为Web应用和互联网通信提供了基础。通过HTTP,我们可以获取网页内容、上传文件、发送数据等,使得互联网上的各种应用得以实现。
# 2. HTTP协议的发展历程
HTTP协议的发展可以追溯到20世纪90年代初。以下是HTTP协议的主要发展历程:
HTTP/0.9: HTTP的早期版本是在1991年由蒂姆·伯纳斯-李(Tim Berners-Lee)创建的。这个版本非常简单,只支持获取HTML文档的功能,请求和响应都没有头部字段,只有一个命令行。
HTTP/1.0: 在1996年,HTTP/1.0被引入,它是第一个广泛使用的版本。HTTP/1.0引入了多个改进,包括请求方法的扩展(如POST、PUT、DELETE等)、状态码、头部字段和多部分响应等。此外,HTTP/1.0还支持持久连接,使得可以在单个TCP连接上发送多个请求和响应。
HTTP/1.1: 在1997年发布的HTTP/1.1是目前最广泛使用的HTTP版本。它引入了一些重要的改进,包括管道化(pipelining)机制、缓存控制、范围请求、分块传输编码等。HTTP/1.1还引入了Host头部字段,使得一台服务器可以托管多个域名。
HTTP/2: 在2015年,HTTP/2发布。HTTP/2使用二进制编码代替了HTTP/1.x中的文本协议,引入了流、多路复用、头部压缩、服务器推送等功能。这些改进使得HTTP/2更加高效,可以提供更快的加载速度和更好的性能。
HTTP/3: 在2019年,HTTP/3提案被提出,它基于QUIC(Quick UDP Internet Connections)协议。QUIC是一种基于UDP的传输协议,具有更低的延迟和更好的拥塞控制。HTTP/3的主要目标是提高性能和安全性,特别是在移动网络环境下。
需要注意的是,虽然HTTP/2和HTTP/3带来了重大的改进,但它们仍然保持了与之前版本的兼容性,因此现有的HTTP应用和基础设施可以逐步迁移到新的版本。
HTTP协议的不断演进和改进,为互联网的发展和应用提供了更好的基础。HTTP正在成为数据交换和通信的基石,促进了Web应用、移动应用、API开发和云计算等领域的发展。
# 3. HTTP协议的作用和重要性
HTTP协议在互联网中起着至关重要的作用,以下是HTTP协议的作用和重要性:
数据传输:HTTP协议定义了客户端和服务器之间传输数据的规范。它允许客户端发送请求来获取资源或执行操作,并通过服务器的响应返回请求的结果。HTTP协议支持各种数据格式,如HTML、JSON、XML等,使得互联网上的各种应用可以传输和处理不同类型的数据。
资源获取:HTTP协议是Web浏览器获取网页内容(如HTML、CSS、JavaScript、图像、视频等)的基础。通过HTTP请求,浏览器可以向服务器请求特定的资源,并将其显示在用户界面上。HTTP协议也支持缓存机制,使得客户端可以缓存已获取的资源,提高访问速度和减轻服务器负载。
客户端-服务器通信:HTTP协议是客户端和服务器之间进行通信的基础。客户端可以是任何网络应用,如Web浏览器、移动应用、API客户端等。服务器则是存储和提供资源的计算机。通过HTTP协议,客户端可以向服务器发送请求并接收响应,实现信息交换和数据传输。
API开发:HTTP协议广泛应用于API(Application Programming Interface)的开发和使用。通过HTTP协议,开发者可以设计和实现RESTful API,使得不同应用之间可以通过HTTP请求和响应进行数据交互。API可以提供访问数据、执行操作和集成不同应用的接口,促进了应用之间的互联互通。
云计算:HTTP协议在云计算中扮演着重要角色。云服务提供商使用HTTP协议来提供基础设施、平台和软件服务。开发者可以通过HTTP请求和响应来访问云服务,例如上传和下载文件、执行计算任务、存储和检索数据等。HTTP协议的可扩展性和灵活性使得云计算成为可能。
# 三、HTTP协议的工作原理
# 1. HTTP协议的请求响应模型
HTTP协议是基于请求-响应模型的,客户端发送请求,服务器返回响应。以下是HTTP协议的请求响应模型的基本流程:
客户端发送请求:
- 客户端通过建立TCP连接与服务器进行通信。默认情况下,HTTP使用端口80进行通信,或者使用HTTPS时使用端口443。
- 客户端构建一个HTTP请求,包括请求行、请求头部和请求体。
- 请求行包括请求方法(GET、POST、PUT、DELETE等)、请求的URI(Uniform Resource Identifier)和HTTP协议的版本号。
- 请求头部包含关于请求的额外信息,如Accept、Content-Type、Authorization等。
- 请求体包含请求的数据,例如在POST请求中发送的表单数据。
服务器处理请求:
- 服务器接收到客户端发送的请求。
- 服务器解析请求行、请求头部和请求体,以获取请求的具体信息。
- 服务器根据请求的URI和其他信息来确定如何处理请求,可能是返回请求的资源,执行某项操作,或者生成动态内容。
服务器发送响应:
- 服务器构建一个HTTP响应,包括响应行、响应头部和响应体。
- 响应行包含响应的HTTP协议版本号、状态码和状态消息。
- 响应头部包含关于响应的额外信息,如Content-Type、Content-Length、Cache-Control等。
- 响应体包含响应的数据,例如HTML文档、JSON数据等。
客户端接收响应:
- 客户端接收到服务器发送的响应。
- 客户端解析响应行、响应头部和响应体,以获取响应的具体信息。
- 客户端根据响应的状态码和其他信息来确定如何处理响应,可能是显示响应的内容,进行下一步的操作,或者处理错误情况。
需要注意的是,HTTP协议是无状态的,每个请求和响应都是独立的。服务器不会记住之前的请求和响应,每次请求都需要提供足够的信息来完成操作。为了实现状态保持和会话管理,可以使用Cookie、Session等机制来跟踪用户会话。
# 2. HTTP方法
HTTP协议定义了一组方法(也称为HTTP动词或HTTP谓词),用于指定客户端对服务器资源的操作类型。以下是常见的HTTP方法:
GET:用于获取指定资源的信息。GET方法应该是安全的和幂等的,即多次调用应该返回相同的结果,不会对服务器产生副作用。一般用于请求服务器返回某个URI的内容。
POST:用于向服务器提交数据,请求服务器处理提交的数据。POST方法通常用于创建新的资源、提交表单数据、上传文件等涉及数据修改的操作。
PUT:用于向服务器传输数据,请求服务器将请求的URI替换为请求中提供的数据。PUT方法通常用于更新资源,即用提供的数据替换指定URI的内容。
DELETE:用于请求服务器删除指定的资源。DELETE方法用于删除服务器上的资源,一般谨慎使用,以免误操作导致数据丢失。
HEAD:类似于GET方法,但服务器只返回响应头部,不返回响应体。HEAD方法通常用于检查资源的元数据,如获取资源的大小、最后修改时间等。
OPTIONS:用于请求服务器返回支持的HTTP方法和其他支持的功能。OPTIONS方法用于获取服务器对请求URI支持的方法列表,帮助客户端了解服务器的能力。
PATCH:用于对资源进行部分更新。PATCH方法类似于PUT方法,但是只对请求的资源进行部分更新,而不是替换整个资源。
还有一些不太常见的HTTP方法,如TRACE、CONNECT等,它们的使用相对较少。
需要注意的是,HTTP方法是对资源的操作类型进行语义化的描述,但实际上服务器是否支持该方法是由服务器决定的。服务器可以选择忽略不支持的方法,或者返回适当的错误状态码。
# 3. HTTP状态码
HTTP状态码用于表示服务器对请求的处理结果。每个状态码由三位数字组成,分为五个类别,如下所示:
1xx(Informational):表示请求已被接收,继续处理。
- 100(Continue):服务器已经收到请求的一部分,并且期望客户端继续发送剩余的请求。
2xx(Successful):表示请求已成功处理。
- 200(OK):请求已成功,返回相应的内容。
- 201(Created):请求已成功,并且服务器创建了新的资源。
- 204(No Content):请求已成功,但服务器没有返回任何内容。
3xx(Redirection):表示需要进一步操作以完成请求。
- 301(Moved Permanently):请求的资源已永久移动到新的URI。
- 302(Found):请求的资源临时移动到新的URI。
- 304(Not Modified):资源未修改,客户端可以使用缓存的版本。
4xx(Client Error):表示客户端发生错误。
- 400(Bad Request):请求无效,服务器无法理解。
- 401(Unauthorized):请求需要身份验证。
- 403(Forbidden):服务器拒绝请求访问资源。
- 404(Not Found):请求的资源不存在。
5xx(Server Error):表示服务器发生错误。
- 500(Internal Server Error):服务器遇到了不可预期的错误。
- 502(Bad Gateway):服务器作为网关或代理,从上游服务器收到无效响应。
- 503(Service Unavailable):服务器当前无法处理请求,通常是由于过载或维护。
HTTP状态码是在客户端和服务器之间进行通信时的重要指示,帮助客户端了解请求的处理结果。根据状态码,客户端可以采取适当的操作,如重试请求、显示错误信息、跳转到新的URI等。对于开发者来说,了解和正确处理不同的状态码可以提高代码的可靠性和用户体验。
# 4. HTTP头部信息
HTTP头部(Header)是HTTP请求和响应中的元数据信息,用于传递额外的属性和参数。HTTP头部以键值对的形式表示,每个键值对由冒号分隔,例如:
Content-Type: application/json
Authorization: Bearer xxxxxxxx
以下是常见的HTTP头部信息:
通用头部(General Headers):适用于请求和响应报文的通用头部,例如:
- Cache-Control:控制缓存的行为。
- Connection:指定连接的选项,如保持连接或关闭连接。
- Date:指定报文创建的日期和时间。
- Transfer-Encoding:指定报文的传输编码方式。
请求头部(Request Headers):用于描述客户端对服务器的请求,例如:
- Accept:指定客户端可以接受的内容类型。
- Content-Type:指定请求体的内容类型。
- User-Agent:指定客户端的用户代理信息。
响应头部(Response Headers):用于描述服务器对客户端的响应,例如:
- Content-Length:指定响应体的长度。
- Content-Type:指定响应体的内容类型。
- Server:指定服务器的软件信息。
实体头部(Entity Headers):用于描述请求或响应的实体(即请求体或响应体),例如:
- Content-Length:指定实体的长度。
- Content-Type:指定实体的内容类型。
- Last-Modified:指定实体的最后修改时间。
HTTP头部可以根据需求进行自定义,但建议遵循HTTP规范,并使用标准的头部字段和值。通过使用合适的头部信息,可以实现更灵活、安全和可靠的HTTP通信,例如指定正确的内容类型、控制缓存、进行身份验证等。在编写HTTP客户端或服务器代码时,正确处理和解析头部信息是非常重要的。
HTTP头部内容丰富,上面的介绍只是抛砖引玉,具体信息请参考 MDN--HTTP 标头(header) (opens new window) 。
# 四、HTTP协议的特性
HTTP协议具有以下几个重要的特性:
# 1. 无状态性
HTTP协议是一种无状态协议,即服务器不会保存客户端的任何状态信息。每个请求都是独立的,服务器仅根据请求进行处理并返回响应。这种无状态性使得服务器可以更加简单、可伸缩,而且客户端和服务器之间的关系不会被之前的请求所影响。
由于无状态性,服务器无法确定两个请求是否来自同一个客户端,也无法区分不同的用户。为了实现用户认证和保持会话状态,通常会使用一些机制,例如使用Cookie来存储会话信息。
# 2. 连接管理
# a. 非持久连接
在HTTP/1.0版本中,默认使用非持久连接。即每个请求/响应完成后,客户端和服务器都会关闭连接。这种方式每次请求都需要重新建立连接,会带来较大的开销。
当客户端发送请求时,在请求头中添加 Connection: close
标头,表示请求完成后关闭连接。服务器收到该标头后会在响应完成后关闭连接,即使服务器支持持久连接。
# b. 持久连接
为了减少连接建立的开销,HTTP/1.1版本引入了持久连接。使用持久连接,客户端和服务器在完成一次请求/响应后,保持连接的状态,可以继续发送下一个请求。这样可以减少连接建立和关闭的开销,提高性能。
当客户端发送请求时,在请求头中添加 Connection: keep-alive
标头,表示请求完成后保持连接。服务器收到该标头后会在响应完成后继续保持连接,以便后续的请求可以复用该连接。
对于HTTP/1.1版本,默认使用持久连接,即使客户端未明确指定 Connection
标头。在持久连接下,服务器会在响应头中添加 Connection: keep-alive
标头,以指示客户端继续保持连接。
# 3. HTTP/2.0带来的新特性
HTTP/2.0是HTTP协议的下一个主要版本,它引入了一些新特性和改进,旨在提高性能和效率。以下是HTTP/2.0的一些主要特性:
二进制分帧:HTTP/2.0使用二进制格式来分割请求和响应,称为帧(frame)。这种二进制格式更高效、更可靠,可以更好地在网络上传输和处理。
多路复用:HTTP/2.0允许在同一个连接上同时发送多个请求和响应,即多路复用。这消除了HTTP/1.1中的序列化问题,提高了并行性,减少了网络延迟。
头部压缩:HTTP/2.0使用HPACK算法对头部信息进行压缩,减少了请求和响应中的头部大小,从而降低了带宽消耗。
服务器推送:HTTP/2.0允许服务器在客户端请求之前主动推送资源。服务器可以根据客户端的请求模式和需求,提前将相关资源推送给客户端,减少了额外的往返时间。
流量控制:HTTP/2.0引入了流量控制机制,客户端和服务器可以通过流控制窗口来限制对方发送的数据量,避免了过载和阻塞。
优先级和依赖管理:HTTP/2.0允许请求和响应之间建立优先级和依赖关系,以确保重要资源的优先加载和渲染。
Server Push:HTTP/2.0支持服务器推送资源到客户端的功能。通过这个功能,服务器可以主动推送与客户端请求相关的资源,从而提高页面加载速度。
这些新特性使得HTTP/2.0在性能和效率方面相比HTTP/1.1有了显著的提升,尤其在高延迟和低带宽的网络环境中表现更好。然而,为了充分发挥HTTP/2.0的优势,服务器和客户端都需要支持HTTP/2.0协议。
# 五、HTTP安全
随着互联网的快速发展,保护用户数据和隐私变得越来越重要。为了提供更安全的通信方式,HTTP协议也不断发展和改进。
# 1. HTTPS
HTTPS(HTTP Secure)是在HTTP协议基础上添加了安全层的协议。它使用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议来对传输的数据进行加密,保证数据在传输过程中的机密性和完整性。
HTTPS的工作原理如下:
客户端发起HTTPS请求时,服务器会将自己的数字证书发送给客户端。
客户端收到数字证书后,会验证证书的合法性和有效性。
如果证书有效,客户端生成一个随机的对称密钥,并使用服务器的公钥加密该密钥,并发送给服务器。
服务器使用自己的私钥解密客户端发送的密钥,得到对称密钥。
客户端和服务器使用对称密钥进行加密和解密通信数据。
通过使用HTTPS,可以有效防止恶意用户窃听、篡改和伪装等安全威胁,保护用户的隐私和数据安全。
# 2. HTTP/2.0
HTTP/2.0是HTTP协议的下一代版本,它在性能和安全性方面进行了改进。HTTP/2.0采用了二进制传输,多路复用和服务器推送等新特性,提高了传输效率和响应速度。
HTTP/2.0要求使用TLS加密,强制使用HTTPS,增强了通信的安全性。
通过使用HTTP/2.0,可以提高网站的性能,减少页面加载时间,提升用户体验。
# 3. HTTP/3.0
HTTP/3.0是正在开发中的HTTP协议的下一代版本。与之前的版本不同,HTTP/3.0采用了基于UDP的QUIC协议作为传输层协议,而不是TCP。QUIC协议具有更低的延迟和更好的拥塞控制,可以提供更快的传输速度和更好的性能。
HTTP/3.0的主要特点如下:
基于UDP:HTTP/3.0使用QUIC协议作为传输层协议,相比TCP具有更低的延迟和更好的拥塞控制。
多路复用:HTTP/3.0支持多路复用,可以同时发送多个请求和接收多个响应。
0-RTT握手:HTTP/3.0支持0-RTT握手,可以在第一次连接时就发送数据,减少了握手的延迟。
错误恢复:HTTP/3.0具有更好的错误恢复机制,可以更快地恢复传输中的错误。
HTTP/3.0目前还在开发中,但已经得到了一些主流浏览器和网站的支持和测试。预计HTTP/3.0将进一步提升网络传输的性能和安全性。
如果仅从性能考虑,关于是否决定升级到HTTP/3.0,请参考 HTTP/3 与 HTTP/2 的性能对比 (opens new window)。
# 4. 内容安全策略及其他
内容安全策略(Content Security Policy,简称CSP)是一种安全机制,用于帮助减少和防止网站遭受跨站脚本攻击(XSS)、点击劫持和数据注入等攻击。
CSP通过在网页的HTTP头中添加一个特殊的标头来实现,该标头指示浏览器只执行特定来源的脚本、样式和其他资源。这样,即使攻击者成功注入恶意脚本,也无法被浏览器执行,从而有效减少了XSS攻击的成功率。
CSP允许网站管理员定义一系列策略指令,这些指令规定了浏览器可以加载哪些资源,从而限制了恶意代码的执行。一些常用的指令包括:
default-src
:定义默认的资源加载策略,如果某个资源没有单独指定加载策略,则使用默认策略。script-src
:定义可以执行的脚本来源。style-src
:定义可以加载的样式来源。img-src
:定义可以加载的图片来源。connect-src
:定义可以进行网络请求的来源。font-src
:定义可以加载的字体来源。frame-src
:定义可以加载的框架来源。object-src
:定义可以加载的对象来源。media-src
:定义可以加载的媒体资源来源。
除了以上指令,CSP还支持一些其他的指令和策略,如report-uri
指令用于指定报告违规行为的URL等。
通过使用CSP,网站管理员可以更好地控制网页的资源加载行为,提高网站的安全性。然而,使用CSP也需要谨慎处理,因为过于严格的策略可能会影响网站的正常功能。因此,在实施CSP时需要进行详细的测试和评估。
除了CSP之外,HTTP安全还包括了HSTS、X-Frame-Options等内容,详情请参考 MDN--Strict-Transport-Security (opens new window) 。
# 六、总结
DNS和HTTP是互联网中两个最常用的应用层协议,它们分别在域名解析和数据传输中起着关键的作用。
DNS协议是用于将域名映射到对应IP地址的系统,它的核心功能是使人们可以通过记忆的域名来访问网站,而不需要记住复杂的IP地址。DNS查询是一个树状结构的逐级查找过程。
HTTP协议是一种无状态的、基于请求-响应模型的协议,它支持多种请求方法和状态码,用于在客户端和服务器之间传输数据。随着互联网的发展,HTTP协议经历了多次改进和升级,如HTTP/1.1引入了持久连接,HTTP/2带来了二进制分帧、多路复用等特性,而HTTP/3更是基于UDP的QUIC协议,提供更快速的传输效率和更好的性能。
保护用户数据和隐私在互联网中越来越重要,因此HTTP协议也在安全性方面做出了努力,如HTTPS和HTTP/2要求使用TLS加密,从而保证数据在传输过程中的机密性和完整性。
了解和掌握DNS和HTTP协议,对于熟悉网络通信、开发网络应用、优化网络性能等方面都是非常有帮助的。
祝你变得更强!