DNS(Domain Name System,域名系统)是互联网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
通过DNS,用户可以方便地通过域名找到对应的IP地址,从而访问目标网站或服务。DNS的工作原理基于一个分布式的数据库系统,其中包含大量的域名和IP地址的映射记录。当用户输入一个域名时,DNS系统会在其数据库中查找对应的IP地址,并将结果返回给用户。这样,用户就可以通过域名来访问互联网资源,而无需知道具体的IP地址。
DNS系统由多个DNS服务器组成,它们之间通过层次化的结构进行协作。这些服务器负责解析域名,并将其转换为相应的IP地址。当用户发起域名解析请求时,本地DNS服务器会首先尝试解析域名。如果本地DNS服务器无法解析该域名,则会向根DNS服务器或其他上级DNS服务器发起递归查询,以获取正确的IP地址。
DNS不仅提供了域名到IP地址的解析功能,还支持反向解析,即将IP地址解析为域名。此外,DNS还支持各种记录类型,如A记录(将域名解析为IPv4地址)、AAAA记录(将域名解析为IPv6地址)、CNAME记录(将域名解析为另一个域名)等,以满足不同的网络需求。

**(1)会话标识(2字节):**是DNS报文的ID标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答报文是哪个请求的响应。
(2)标志(2字节):

QR:查询/响应标志,0表示查询报文;1表示响应报文。 Opcode:0表示标准查询,1表示反向查询;2表示服务器状态请求。 AA:表示授权回答(autboritstive answer)。 TC:表示可截断的(trupcsted)。 RD:表示期望递归。 RA:表示可用递归,随后3bit必须为0。 Rcode:返回码,表示返回码,0表示没有差错,3表示名字差错,2表示服务器错误(Server Failure)。
**(3)Questions(问题数)**字段占2个字节,表示在DNS请求中待解析的城名数目,一般是1,也即 0x0001。
**(4)Answer RRs(国答资源记录数)**字段占2个字节,在DNS应答报文中,表示 DNS 回答的资源记录数目。在DNS请求报文中,Answer RRs的值为0。
**(5)Authority RRS(授权资源记录数)**字段占2个字节,在DNS的应答报文中,表示投权服务器的记录个数。在DNS请求报文中,Authority RRs的值为0。
**(6)Additional RRs(附加资源记录数)**字段占2个字节,在DNS应答报文中,表示附件信息记录的个数。在DNS请求报文中,Additional RRs的值为0。
正文包括 Queries(查询问题区域)、Answers(回答区域)、Authoritative nameservers(授权区域)和 Additional records(附加区域)。
Queries 区域存放DNS客户端询问的问题,报文格式如图:

| 1 | A | 由域名获得IPv4地址 |
|---|---|---|
| 2 | NS | 查询域名服务器 |
| 5 | CHANE | 查询规范名称 |
| 6 | SOA | 开始授权 |
| 11 | WKS | 熟知服务 |
| 12 | PTR | 把IP地址转换成域名 |
| 13 | HINFO | 主机信息 |
| 15 | MX | 邮件交换 |
| 28 | AAAA | 由域名获得IPv6地址 |
| 252 | AXFR | 传送整个区的请求 |
| 255 | ANY | 对所有记录的请求 |
包含所查询的DNS域名的资源记录,资源记录格式如图:

包含权威服务器的记录,如提供该域名解析服务的服务器的主机名。
包含其他信息记录,如 Authoritative nameservers(授权区域)中服务器的 IP 地址。
展开代码http://www.zhihu.com

随便查看一个请求报文

进去之后,我们可以看到DNS的端口:53,表示我们提出请求,要做出回应的是DNS服务器。下面是,我对于DNS请求报文的一些分析。(有什么分析的不对,欢迎大家指出)

在上图,我们可以看出Transaction ID:0x4d95。所以下面的分析的响应报文就是这个请求报文相对应的响应报文。
根据Transaction ID:0x4d95,找到对应的响应报文

这次的源端口变成了53,这是因为这是响应报文,由DNS服务器发出的响应。而目的端口就是我们自己。


*注:有些字段我并没有分析,如果你需要分析某些字段,可以往前翻一翻,详细的字段内容、介绍都在前面有所介绍。*
HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种应用层协议,用于分布式、协作式和超媒体信息系统。它是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。
作为应用层的协议,HTTP协议遵循客户一服务器模式,使用HTTP协议通信过程如下图:

利用 HTTP 协议交互的过程是非常简单的,Web浏览器发送请求,Web服务器给出应答,Web浏览器再发出请求,Web服务器再给出应答……Web服务器不去记忆哪一个客户曾经访问过它,也不去记忆某个客户曾经访问过哪一个文件。当同一个客户连续向Web服务器发出两个相同的请求时,Web服务器会认为这是两个单独的请求。所以,HTTP 协议是一个无状态的协议。
HTTP协议支持非持久连接和持久连接。HTTP1.1默认使用持久连接。
(1)非持久连接 在非持久连接下,访问过程如下图:

在非持久连接的方式中,一个连接只传送一个文件,文件传送完毕,连接就会关闭。当浏览器解析 index.html发现需要图片文件 1.jpg时,因为前一个连接已经关闭,浏览器需要和服务器再次建立连接,传送 1.jpg 文件。 (2)持久连接 在持久连接方式下,访问过程如下图:

在持久连接中,使用一个连接可以传送多个文件,因此省去了反复创建、关闭连接的过程,提高了协议的效率。
Web浏览器和Web服务器通过交换HTTP报文来实现HTTP协议。
有两种HTTP报文:请求报文和应答报文。请求报文是浏览器发给服务器的,指明所需文档的名字和位置。应答报文是服务器发给浏览器的,里面包含服务器的应答和浏览器所需的文档。这两种报文的控制信息都是以文本的形式发送的,非常易于阅读和理解。

第一行是请求行,方法字段指明要进行的操作,URL字段给出要操作文档的URL地址,版本号字段用来告诉服务器浏览器所支持的HTTP协议版本。方法字段的值有五种。分别是:
请求行后面就是首部行,每个首部行都有其特定的意思,告诉服务器一些特殊的信息。
| Accept | 表示浏览器接受的文档类型 |
|---|---|
| Accept-Language | 表示浏览器优先接受的语言类型 |
| Accept-Encoding | 表示浏览器能够理解的编码方式 |
| User-Agent | 告诉服务器浏览器的类型 |
| Host | 表示所访问的主机 |
| Connection | 告诉服务器在对浏览器做了应答后,是否保持和浏览器的连接 |

HTTP应答报文(Response Message)是服务器在接收到客户端的HTTP请求后,返回给客户端的响应数据。HTTP应答报文主要由状态行(Status Line)、响应头部(Headers)和响应体(Body)三个部分组成。
第一行就是状态行,状态行包含了HTTP协议版本、状态码以及状态描述,格式如下:
展开代码<HTTP-version> <status-code> <reason-phrase>
<HTTP-version>:HTTP协议的版本,如HTTP/1.1。<status-code>:一个三位数的状态码,表示请求的处理结果。<reason-phrase>:状态码对应的文本描述。常见的状态码包括:
200 OK:请求成功。404 Not Found:请求的资源未找到。500 Internal Server Error:服务器内部错误。状态行后面是若干个首部行,用来存放告诉浏览器的其它一些信息。
展开代码<header-name>: <header-value>
常见的响应头部包括:
Content-Type:指定返回数据的类型,如text/html、application/json等。Content-Length:返回数据的长度(以字节为单位)。Date:响应创建的日期和时间。Server:服务器的名称或类型。Cache-Control:缓存控制指令,如no-cache、max-age等。响应体是可选的,它包含了服务器返回给客户端的数据。响应体的格式和内容取决于Content-Type头部字段的值。例如,如果Content-Type是text/html,那么响应体就是HTML文档;如果Content-Type是application/json,那么响应体就是JSON格式的数据。
一个完整的HTTP响应报文,可能如下:
展开代码HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Length: 1234 Date: Mon, 27 Jul 2023 12:34:56 GMT Server: Apache/2.4.52 (Unix) Cache-Control: no-cache, no-store, must-revalidate <!DOCTYPE html> <html> <head> <title>Example Page</title> </head> <body> <h1>Welcome to the Example Page!</h1> <p>This is an example response body.</p> </body> </html>
展开代码http://www.baidu.com

这里的操作与DNS报文的过程大致相同,就不过多描述了。


注:我这里只是一个简单的访问百度网站的一个HTTP报文,并没有涉及过多的内容。
*其实,这篇博客本来就是想记录实验抓包的记录和分析的成果,后来想了想,还是把DNS和HTTP的特点、报文格式也写了进来,算是记录。May the Force be with you!别太放肆,没什么用。*
本文作者:zzz
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!