说明:(a)请求行的焦点是“方法”,选择的方法是根据当时浏览器的工作状态来判断的。例如
我们的场景是在地址栏输入一个URL,显示一个网页,所以这里应该使用GET方法。GET方法也用于点击超链接的场景。如果是表单,在 HTML 源码中,会在表单的属性中指定使用哪种方法发送请求,可以是 GET 或 POST(图 1.6)
它被写为 /<目录名>/…/<文件名>
第二行开头叫做“消息头”,消息头的规范定义了很多项,比如日期、客户端支持的数据类型、语言、压缩格式、软件名称和版本客户端和服务器,数据有效期和最后更新时间等。这些都在表中可用。
最后是“消息体”。注意:在使用GET方法的情况下,Web服务器只需要通过方法和URI就可以确定需要执行什么操作,所以消息体中不需要填写任何数据。使用POST方式时,表单中填写的信息需要写在消息体中。
发送请求后收到响应
与请求消息的区别在于第一行。
第一行的内容是状态码和响应短语,用来表示请求的执行结果是成功还是错误。状态代码和响应短语的含义相同,但它们的用途不同。状态码是一个数字,主要用于通知程序执行结果(表1.3);相反,响应短语是用于通知人们执行结果的一段文本。
注意:一个请求消息中只能写入一个URI。如果您需要获取多个文件,则必须为每个文件发送单独的请求。
解析器与DNS服务器的交互IP地址介绍为了将生成的消息发送到网络,需要委托给操作系统。并且前提是提供其通讯伙伴的IP地址。了解了TCP/IP协议之后(一些小的子网通过路由器连接起来组成一个大网络。这里的子网可以理解为通过集线器连接的几台计算机,我们把它看成一个单元,称为子网。连接后子网通过路由器,形成一个网络),网络中的所有设备都会被分配一个地址——相当于现实中道路上的“XX房间”。“”对应的编号分配给整个子网,而“Room”对应的编号分配给子网中的计算机,这是网络中的地址。“编号”对应的编号称为网络编号,“房间”对应的编号称为主机编号,这个地址的整体称为IP地址。TCP/IP中消息IP的发送:发送方发送的消息首先经过子网中的集线器(数据以数据包的形式在这里传输),然后转发到距离发送方最近的路由器(图1.8① )。接下来,路由器会根据报文的目的地确定下一台路由器的位置,然后将报文发送到下一台路由器,即再次通过子网中的集线器将报文转发到下一台路由器(图 1.8 ②)。重复前面的过程,最后将消息传递到目的地。“编号”对应的编号称为网络编号,“房间”对应的编号称为主机编号,这个地址的整体称为IP地址。TCP/IP中消息IP的发送:发送方发送的消息首先经过子网中的集线器(数据以数据包的形式在这里传输),然后转发到距离发送方最近的路由器(图1.8① )。接下来,路由器会根据报文的目的地确定下一台路由器的位置,然后将报文发送到下一台路由器,即再次通过子网中的集线器将报文转发到下一台路由器(图 1.8 ②)。重复前面的过程,最后将消息传递到目的地。“编号”对应的编号称为网络编号,“房间”对应的编号称为主机编号,这个地址的整体称为IP地址。TCP/IP中消息IP的发送:发送方发送的消息首先经过子网中的集线器(数据以数据包的形式在这里传输),然后转发到距离发送方最近的路由器(图1.8① )。接下来,路由器会根据报文的目的地确定下一台路由器的位置,然后将报文发送到下一台路由器,即再次通过子网中的集线器将报文转发到下一台路由器(图 1.8 ②)。重复前面的过程,最后将消息传递到目的地。称为网络号,与“房间”对应的编号称为主机号,这个地址的整体称为IP地址。TCP/IP中消息IP的发送:发送方发送的消息首先经过子网中的集线器(数据以数据包的形式在这里传输),然后转发到距离发送方最近的路由器(图1.8① )。接下来,路由器会根据报文的目的地确定下一台路由器的位置,然后将报文发送到下一台路由器,即再次通过子网中的集线器将报文转发到下一台路由器(图 1.8 ②)。重复前面的过程,最后将消息传递到目的地。称为网络号,与“房间”对应的编号称为主机号,这个地址的整体称为IP地址。TCP/IP中消息IP的发送:发送方发送的消息首先经过子网中的集线器(数据以数据包的形式在这里传输),然后转发到距离发送方最近的路由器(图1.8① )。接下来,路由器会根据报文的目的地确定下一台路由器的位置,然后将报文发送到下一台路由器,即再次通过子网中的集线器将报文转发到下一台路由器(图 1.8 ②)。重复前面的过程,最后将消息传递到目的地。并且这个地址的全部被称为IP地址。TCP/IP中消息IP的发送:发送方发送的消息首先经过子网中的集线器(数据以数据包的形式在这里传输),然后转发到距离发送方最近的路由器(图1.8① )。接下来,路由器会根据报文的目的地确定下一台路由器的位置,然后将报文发送到下一台路由器,即再次通过子网中的集线器将报文转发到下一台路由器(图 1.8 ②)。重复前面的过程,最后将消息传递到目的地。并且这个地址的全部被称为IP地址。TCP/IP中消息IP的发送:发送方发送的消息首先经过子网中的集线器(数据以数据包的形式在这里传输),然后转发到距离发送方最近的路由器(图1.8① )。接下来,路由器会根据报文的目的地确定下一台路由器的位置,然后将报文发送到下一台路由器,即再次通过子网中的集线器将报文转发到下一台路由器(图 1.8 ②)。重复前面的过程,最后将消息传递到目的地。并将其转发到距离发送者最近的路由器(图 1.8 ①)。接下来,路由器会根据报文的目的地确定下一台路由器的位置,然后将报文发送到下一台路由器,即再次通过子网中的集线器将报文转发到下一台路由器(图 1.8 ②)。重复前面的过程,最后将消息传递到目的地。并将其转发到距离发送者最近的路由器(图 1.8 ①)。接下来,路由器会根据报文的目的地确定下一台路由器的位置,然后将报文发送到下一台路由器,即再次通过子网中的集线器将报文转发到下一台路由器(图 1.8 ②)。重复前面的过程,最后将消息传递到目的地。
实际IP地址说明:即一串32位数字,按8位(1字节)分为4组,用十进制表示,然后用点分隔。这是我们经常看到的IP地址格式。在IP地址规则中,网络号和主机号用一共32位连接在一起,但这两个部分的具体结构并不固定。组成网络时,用户可以自行决定他们之间的分配关系
,所以我们需要额外的附加信息来表示 IP 地址的内部结构。这里的附加信息是“子网掩码”,它是一串与IP地址长度相同的32位数字,左半边为1,右半边为0。子网掩码为1的部分代表网络号,子网掩码为0的部分代表主机号。与IP地址一样,子网掩码用每8位的点分组,写在IP地址的右边,就是图1.9(b)中的方法。这种写法太长了。我们也可以用十进制表示1部分的位数,写在IP地址的右边,如图1.9(c)所示。这两种方法只是拼写不同,和意思是完全一样的。注意:当主机号部分的位全为0或全为1时,代表两种特殊含义。主机号部分中的所有 0 代表整个子网,而不是子网中的设备(图 1.9(d))。此外,主机号部分中的所有 1 表示向子网上的所有设备发送数据包,即广播(图 1.9(e))。
IP地址的主机号全为0:表示整个子网全为1:表示向子网内的所有设备发送数据包,即“广播”
域名和IP地址一起使用的原因
从上面我们知道,TCP/IP网络是通过IP地址来确定通信对象的。现在我们使用的方案是让人们使用名称,让路由器使用IP地址。为了弥合两者之间的差距,需要有一种机制,可以按名称查找 IP 地址,或按名称查找 IP 地址,以便在不牺牲人和机器的情况下完美解决问题。这种机制就是DNS。
Name ,域名服务系统。将服务器名称与 IP 地址关联是 DNS 最常见的用途,但 DNS 不限于此,它还可以将电子邮件地址与电子邮件服务器关联,并为各种信息关联相应的名称。
该库提供了查询 IP 地址的功能
库是用于调用网络功能的程序组件的集合。
查询IP地址的方法很简单,只要问最近的DNS服务器“IP地址是什么”,DNS服务器就会回答“这个服务器的IP地址是xxx.xxx.xxx.xxx”。这一步很简单,那么浏览器如何查询DNS服务器呢?
因此,在使用DBS进行DNS时,就是向DNS服务器发送查询报文,并接收服务器返回的响应报文。所以,我们的电脑上肯定有对应的DNS客户端,我们称之为DNS解析器。- 通过DNS查询IP地址称为域名解析。解析器是包含在操作系统库中的程序。
库是所有应用程序都需要使用的公共程序组件的集合。库的好处:首先,使用现成的组件构建应用程序可以节省编程工作量;其次,多个程序可以使用相同的组件来标准化程序。还有很多其他的好处,因此使用库进行软件开发的想法变得非常流行。图书馆的种类和数量也非常多。库也是包含允许其他应用程序调用操作系统的网络功能的程序组件的库,解析器是该库中的程序组件之一。该库包含许多用于发送和接收数据的程序组件。
发出询问
通过解析器向 DNS 服务器进行查询。至于解析器的使用 – 直接在库中调用它。
运行程序,将IP地址写入浏览器指定的内存地址。浏览器向Web服务器发送消息(从内存地址中取出IP地址与HTTP请求消息一起交给操作系统) 解析器
也就是调用解析器时,解析器内部的工作图:
程序的控制流被转移到解析器。一般来说,应用程序编写的操作内容是按照从上到下的顺序执行的。当到达需要调用解析器的部分时,将执行相应的程序行。工作本身将暂停(图 1.12 ①)。然后,库中的解析器开始运行(图1.12②),完成应用程序委托的操作。像这样,因为调用了其他程序,原来运行的程序进入挂起状态,被调用的程序开始运行,这就是“控制流转移”
解析器生成DNS服务器已经发生的查询消息的过程类似于浏览器生成HTTP请求消息发送给Web服务器的过程。将其发送到 DNS 服务器(图 1.12 ③)。发送消息的操作不是由解析器自己进行的,而是委托给操作系统内部的协议栈(操作系统内部的网络控制软件,也称为“协议驱动程序”、“TCP/IP驱动程序”等) 。) 去表演。. 因为和浏览器一样,解析器本身不具备使用网络发送和接收数据的功能。但是,消息的形式有所不同:HTTP 消息是用文本编写的,而 DNS 消息是用二进制数据编写的。
解析器调用协议栈后,控制流会再次转移,协议栈会执行发送报文的操作,然后通过网卡将报文发送到DNS服务器(图1.12④⑤)。
DNS服务器收到后,根据查询内容进行查询。DNS服务器的基本工作 DNS服务器
简而言之:接收来自客户端的查询消息,并根据消息内容返回响应。查询消息包括三种信息:
(a) 域名
服务器的名称和邮件服务器的名称(电子邮件地址中@后面的部分) (b) Class 在最初设计 DNS 方案时,也考虑了 DNS 在 以外的其他网络中的应用,Class 是用于识别网络的信息。但是现在除了互联网没有其他网络,所以Class的值永远是代表互联网的IN(c)记录类型,表示域名对应的是什么类型的记录。例如,当type为A时,表示域名对应一个IP地址;当类型为 MX 时,表示该域名对应一个邮件服务器。对于不同的记录类型,服务器返回给客户端的信息也会有所不同。插图:
记录类型说明: A类型:只要在DNS服务器上注册为A记录,就可以作为Web服务器的域名。MX 类型:邮件,查询邮件服务器 PTR 类型:根据 IP 地址反向查找域名 CNAME 类型:查询域名相关别名 NS 类型:查询 DNS 服务器 IP 地址 SOA 类型:查询 DNS 服务器上的域名属性信息,IP 地址为存储在 A 记录中,而邮件服务器存储在 MX 记录中。
综上所述,DNS服务器的基本工作就是根据要查询的域名和记录类型查找相关记录,并返回响应消息给客户端。
DNS服务器会从域名和IP地址的对照表中查找对应的记录,并返回IP地址。
域名解释
DNS服务器中的所有信息都是按照域名分级存储的。(层次结构可以更好的管理大量信息) 详细说明: 1、DNS域名以句点分隔,越靠右,等级越高。2. 层次结构的一部分称为域。3. 该层次结构中的信息在DNS服务器中注册,每个域被视为一个整体。4、DNS服务器与域的关系并非都是一一对应的。可以说是一对多(即一台DNS服务器中有多个域的信息),但永远不可能是多对一的(因为域不能分开。 5.因此,DNS服务器也有层级关系,某一层的域存储在对应层的DNS服务器中。
找到对应的DNS服务器,获取IP地址
关键是:如何找出哪个DNS服务器管理着对应的要访问的Web服务器的信息。找到一种方法:
首先,负责管理下级域的DNS服务器的IP地址在其上级DNS服务器上注册,然后上级DNS服务器的IP地址在上级DNS服务器上注册,以此类推。
注:1、在顶级域(如com、cn)之上还有一个一级域,称为根域。(但一般可以省略。如果要明确指出根域,可以在域名末尾加句号) 2、将根域的DNS服务器信息保存在互联网所有DNS服务器中。(这样,任何 DNS 服务器都可以找到并访问根域 DNS 服务器。)
全球只有 13 个 IP 地址分配给根域 DNS 服务器,而且这些地址几乎没有变化,因此在所有 DNS 服务器中保留这些地址并不难。其实根域DNS服务器的相关信息已经包含在DNS服务器程序的配置文件中,所以只要安装了DNS服务器程序,就会自动配置这些信息。
图表 – 找到目标 DNS 服务器
通过缓存加速 DNS 服务器响应
在真实的互联网中,为了节省效率,一台服务器可以管理多个域的信息。上图中的上域和下域有可能共用同一个DNS服务器。
因为DNS服务器有缓存功能,它可以记住之前查询过的域名。1、如果要查询的域名及相关信息已经在缓存中,则可以直接返回响应,从缓存位置向下进行下一次查询。与每次从根域查找查询相比web服务器,缓存可以减少查询所需的时间。2、当要查询的域名不存在时,“不存在”的响应结果也会被缓存。这样,下次查询到不存在的域名时,也能快速响应。3、缓存:是指将使用过的数据存储在离数据使用地更近的高速存储设备中,以提高后续访问速度的技术。这项技术有很多应用,
委托协议栈发送消息(数字信息)、数据、发送和接收数字信息、向DNS服务器查询IP地址的过程适用于任何网络应用。库中的多个程序组件图需要按照指定的顺序调用:
因此,数据通道可以比作管道: (1) 建立管道:理论上,关键是两端的数据入口和出口——套接字,然后将套接字连接起来形成管道。现实中,服务端创建一个,等待客户端连接形成管道,客户端也创建一个,然后扩展管道,最后连接到服务端的。(2)管道在操作结束时断开,可以由客户端或服务器发起,断开后删除。(3)整个阶段由操作系统的协议栈完成创建(创建阶段),将管道连接到服务器端的(连接阶段),发送和接收数据(通信阶段),
创建套接字
1.即调用库中的程序组件。2. 当有多个插座时,应用程序通过“描述符”来识别插座,类似于车牌。
连接管
应用程序通过调用库中命名的程序组件来完成此操作。这里的重点是调用时需要指定、服务器IP地址和端口号三个参数。三个参数:
第一个参数,描述符,-。是创建套接字时协议栈返回的描述符。-。协议栈会被告知应用程序指定的描述符,然后协议栈会根据这个描述符确定使用哪个连接到服务器端的,并执行连接操作。-。在调用库中的程序组件时,应用程序指定的参数会通过库的程序组件传递给协议栈,协议栈会实际执行相应的操作。第二个参数是服务器IP地址,-。我们要访问的服务器的IP地址是通过查询DNS服务器得到的。第三个参数是端口号-。如果连接操作的对象是特定的套接字,则必须标识特定的套接字。-。端口号就是这样一种方式。当同时指定 IP 地址和端口号时,可以清楚地识别特定计算机上的特定套接字。服务器上使用的端口号是根据应用程序的类型预先确定的,仅此而已。例如,web 是 80 端口,email 是 25 端口。
传递消息
使用写入程序组件通过库委托堆栈发送消息。接收消息由库中的读取程序组件委托的协议栈完成。
1.写
应用程序需要在内存中准备好要发送的数据。从用户输入的 URL 生成的 HTTP 请求消息。调用write时,指定描述符并发送数据(图1.18③),协议栈将数据发送给服务器。由于连接的通信对象的相关信息已经保存在中,只要通过描述符指定,就可以识别通信对象并向其发送数据。将数据通过网络发送到我们要访问的服务器。服务端进行接收操作,解析接收到的数据内容并进行相应的操作,向客户端返回响应消息。
read 调用 read 时,需要指定用于存储接收到的响应消息的内存地址。这个内存地址称为接收缓冲区。当服务器返回响应消息时,read 负责将接收到的响应消息存储在接收缓冲区中。注意:由于接收缓冲区是位于应用程序内部的内存空间,所以当消息存储在接收缓冲区中时,就相当于已经交给了应用程序。
断开管道
即调用库的关闭程序组件进入断开阶段(图1.18④)。套接字之间连接的管道被断开,并且套接字本身被删除。
断线过程:Web使用的HTTP协议规定,Web服务器发送响应消息后,要主动进行断线操作,所以Web服务器会先调用close进行断线。断开连接操作传递给客户端后,客户端的套接字也进入断开连接阶段。接下来,当浏览器调用read执行接收数据的操作时,read会通知浏览器发送和接收数据的操作已经结束,连接已经断开。浏览器收到通知后,也会调用close进入断线阶段。