您现在的位置是:首页 >技术交流 >《网络是怎样连接的》(一)网站首页技术交流

《网络是怎样连接的》(一)

NEFU-XingKong 2024-08-23 00:01:02
简介《网络是怎样连接的》(一)

第一章web浏览器

简介

首先输入网址URL,浏览器进行解析,将我们需要哪些数据告诉服务器。浏览器向服务器发送消息,必须告诉操作系统的接收方的IP地址,所以浏览器先查出web服务器的IP地址,向DNS服务器查询域名对应的IP地址。查到地址后,就可以把消息委托给操作系统发给服务器了。而委托给操作系统有非常详细的规则。

生成 HTTP 请求消息

网址:URL,除了有http:,还有ftp:,file:,mailto:。据访问目标的不同,URL 的写法也会不同。在访问 Web 服务器和 FTP 服务器时,URL 中会包含服务器的域名和要访问的文件的路径名等,发邮件的 URL 则包含收件人的邮件地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zNGZNzWu-1685972112656)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605110632732.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pmfbMVvW-1685972112657)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605111019718.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FN89sYrv-1685972112658)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605111218582.png)]

输入URL后,浏览器开始解析,http包含这几种元素,先把每个元素拆分出来,如图包含 Web 服务器名称 www.lab.glasscom.com,以及文件的路径名 /dir1/file1.html。表示要访问 www.lab.glasscom.com 这 个 Web 服 务 器 上 路 径 名 为 /dir/file1.html 的 文件。

协议:通信操作的规则定义称为协议(protocol)

当URL省略要访问的文件名时,默认访问index.html或者default.html。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dweIkCDF-1685972112658)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605111700211.png)]

客户端对服务器发送请求消息包含的内容是“对什么”和“进行怎样的操作”两个部分。对什么的目标叫做URI,例如“/dir1/file1.html”,“/dir1/program1.cgi”等。也可以直接使用“http:”开头的 URL来作为 URI。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-79vmuaoF-1685972112658)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605112001537.png)]

服务器完成工作后会返回一个状态码。HTTP的整个工作完成。

get和post方法是向服务器读取和发送消息。

PUT和DELETE方法修改或删除服务器上的文件。

HTTP消息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mE4xy1zn-1685972112658)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605112700534.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2jmFEtMT-1685972112659)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605112903736.png)]

请求消息的第一行称为请求行,包含方法。写好方法之后,加一个空格,然后写 URI.末尾需要写上 HTTP 的版本号.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rFxThqkm-1685972112659)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605113115857.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AbIVFwDm-1685972112659)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605113152610.png)]

第二行开始为消息头。消息头的规格中定义了很多项目,如日期、客户端支持的
数据类型、语言、压缩格式、客户端和服务器的软件名称和版本、数据有效期和最后更新时间等.消息头中的内容
随着浏览器类型、版本号、设置等的不同而不同,大多数情况下消息头的长度为几行到十几行不等。

再添加一个空行,写上需要发送的数据,这一部分为消息体,get方法消息体不需要写任何东西。使用 POST 方法将表单中填写的信息写在消息体中。请求消息的生成操作全部完成。

每条请求消息中只能写 1 个 URI每次只能获取 1 个文件,如果需要获取多个文件须对每个文件单独发送 1 条请求。比如 1 个网页中包含 3 张图片,那么获取网页加上获取图片,一共需要向 Web 服务器发送 4 条请求。请求消息示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EksvVOac-1685972112659)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605120000753.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KCtScNKe-1685972112660)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605120040388.png)]

向 DNS 服务器查询 Web 服务器的 IP 地址

生成消息后,要发给服务器,此时就要去DNS服务器查询该域名对应的IP地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4FKg7K2Q-1685972112660)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605120239668.png)]

局域网都是基于 TCP/IP 的思路来设计的。TCP/IP 的结构如图 1.8 所示。小的子网通过路由器组成网络。每个子网对应一个号,这个号再这个网络中唯一,子网会给其中的每个计算机再分配一个号,再该子网中唯一。有了IP地址,我们就可以知道目标是哪个网络中的哪个子网中的哪个计算机或者服务器。

发送者发送消息时,消息首先经过该子网中的集线器转发到最近的路由器,这个路由器会把消息再转发给下一个路由器。

实际IP地址时32比特的数字,按照8比特(bit)(1字节)为一组分为4组,子网掩码为1的部分表示网络号,为0的部分表示主机号。主机号部分全部为 0 代表整个子网,主机号部分全部为 1 代表向子网上所有设备发送包,即广播。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vUEziqzs-1685972112660)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605121303369.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ajeyZr8-1685972112660)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605121432012.png)]

TCP/IP 网络通过 IP 地址来确定通信对象,就和打电话一样。要知道某个人的电话号码,不能只知道名字。此时DNS服务器就派上用场了。既然我们的浏览器可以向DNS查询IP地址,就说明我们的计算机上一定有相应的 DNS 客户端。成为DNS解析器,实际上为一段程序,包含在操作系统中的Scoket库中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yxbWvi0Z-1685972112661)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605130418740.png)]

全世界DNS服务器的大接力

DNS接受客户端的消息再返回响应。

查询消息包含3种信息。

a.域名

服务器、邮件服务器的名称

b.Class

Class用来识别网络信息的,已经淘汰

c.记录类型

表示域名对应何种类型的记录。例如,当类型为 A 时,表示域名对应的是 IP 地址;当类型为 MX 时,表示域名对应的是邮件服务器。

如果要查询 www.lab.glasscom.com 这个域名对应的 IP 地址,客户端会向 DNS 服务器发送包含以下信息的查询消息。

(a)域名 = www.lab.glasscom.com
(b)Class = IN
(c)记录类型 = A

DNS就会从服务器中查找符合条件的IP地址返回。

域名的层次结构

全球有很多域名信息,不可能保存在一台DNS服务器。

信息按照层次结构分布在不同的DNS服务器,例如www.lab.glasscom.com 这个域名如果按照公司
里的组织结构来说,大概就是“com 事业集团 glasscom 部 lab 科的 www”这样。com 域的下一层是glasscom 域,再下一层是 lab 域,再下面才是 www 这个名字。其中,一个域存放在一个DNS服务器里,当然,一个DNS服务器不可能只存放一个域的信息。

我们在域的下面创建下级域,然后再将他分配给各个事业集团。比如,假设公司的域
为 example.co.jp, 我 们 可 以 在 这 个 域 的 下 面 创 建 两 个 子 域, 即sub1.example.co.jp 和 sub2.example.co.jp,然后就可以将这两个下级域分配给不同的事业集团来使用。

互联网中的域也是一样,通过创建下级的域来分配给不同的国家、公司和组织使用。比如 www.nikkeibp.co.jp 这个域名,最上层的 jp 代表分配给日本这个国家的域;下一层的 co 是日本国内进行分类的域,代表公司;再下层的nikkeibp 就是分配给某个公司的域;最下层的 www 就是服务器的名称。

在DNS服务器找到所需信息,关键就是我们查找的web服务器归哪一个DNS服务器管。

我们把管理下级域的 DNS 服务器的 IP 地址注
册到它们上级 DNS 服务器中,然后上级 DNS 服务器的 IP 地址再注册到更上一级的 DNS 服务器中,以此类推。

负责管理 lab.glasscom.com 这个域的 DNS 服务器的 IP 地址需要注册到 glasscom.com 域的 DNS服务器中,而 glasscom.com 域的 DNS 服务器的 IP 地址又需要注册到 com域的 DNS 服务器中。这样,我们就可以通过上级 DNS 服务器查询出下级DNS 服务器的 IP 地址,也就可以向下级 DNS 服务器发送查询请求了。其实com,jp不是顶级域,他们上面还有根域用.表示,常省略不写

过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OC0dvRXU-1685972112661)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605165404509.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VKsjrhUg-1685972112661)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605170642894.png)]

首先访问最近的一台DNS服务器,假设要查询 www.lab.glasscom.com.图 1.16(①).最近一台没有这个服务器信息,就会转发给根域服务器,根域收到了,也没有,但是根域知道这个是属于com域服务器管的,就会让他去com域找,但是com域也没有,但是com域知道是glasscom域服务器管的,就会去glasscom域服务器查找。然后glasscom域服务器就会去www域服务器查找,找到了,返回。

好比去找一个人的信息,去人事管理局查找,他告诉你是哪个区的,再去区里找,区里再告诉你是哪个街道的,街道的再告诉你是哪个公司的,就找到了。但是实际上一个DNS服务器管理多个域名,中上级域和下级域有可能共享同一
台 DNS 服务器。

DNS 服务器有一个缓存 功能,可以记住之前查询过的域名。

并且,当要查询的域名不存在时,“不存在”这一响应结果也会被缓存。这样,当下次查询这个不存在的域名时,也可以快速响应。

委托协议栈发送消息

找到IP地址后,就可以委托协议栈向目标发送HTTP消息了,HTTP消息实际是一种数字信息,收发数字信息这一操作,不只局限于浏览器,各种网络应用程序都适合这一套操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TijvVdOU-1685972112662)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605172130757.png)]

使用 Socket 库来收发数据的操作过程如图 1.17 所示。好比接收方发送方之间有一个管道。首先要建立这一条管道,管道出入口称为套接字.

(1)创建套接字(创建套接字阶段)
(2)将管道连接到服务器端的套接字上(连接阶段)
(3)收发数据(通信阶段)
(4)断开管道并删除套接字(断开阶段)

操作都是由协议栈通过调用Socket库中的组件来执行。

创建套接字

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ImNnEAP6-1685972112662)(C:UsersLenovoAppDataRoamingTypora ypora-user-imagesimage-20230605195407380.png)]

客户端调用 Socket 库中的 socket 程序组件创建套接字,套接字创建完成后,协议栈会返回一个描述符,应用程序会将收到的描述符存放在内存中。用于识别不同的套接字。

然后委托协议栈就需要将客户端创建的套接字与服务器那边的套接字连接起来。调用Socket的connect。需要指定描述符、服务器 IP 地址和端口号这 3 个参数(网络编程已说)。

传递消息调用write需要指定描述符和发送数据(图 1.18 ③),然后协议栈就会将数据发送
到服务器。由于套接字中已经保存了已连接的通信对象的相关信息,所以只要通过描述符指定套接字,就可以识别出通信对象。

收消息的操作是通过 Socket 库中的 read 程序组件委托协议栈来完成的(图 1.18 ③’)。调用read 时需要指定用于存放接收到的响应消息的内存地址,这一内存地址称为接收缓冲区。

接下来,我们需
要调用 Socket 库的 close 程序组件进入断开阶段(图 1.18 ④)。最终,连接在套接字之间的管道会被断开,套接字本身也会被删除。

HTTP 协议规定,Web 服务器发送完响应消息之后,应该主动执行断开操作,因此 Web 服务器会首先调用close 来断开连接。然后再是客户端。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。