《网络是怎样连接的》第一部分

一. 路线图

img

其实浏览器和Web服务器的工作方式就是浏览器发送请求给Web,然后Web给浏览器响应消息,这就需要一种机制,将数据(0/1比特流)正确的搬运到指定的目的地的机制。

这种机制是需要操作系统中的网络控制软件配合的,还有交换机和路由器等合作,将数据分成一个又一个的分着发送出去。

网络是由搬运数字的机制加上浏览器和Web服务器的网络应用程序组成的。

1.路线图

  • 第一章、Web浏览器

    • 请求长什么样子、机制是怎样帮助我们发送数据的
  • 第二章、协议栈、网卡

    • 主要介绍搬运机制,协议栈会将浏览器接收到的消息打包,然后添加目的地址等信息,而且会进行差错控制,另外协议栈会将包交给网卡,网卡会将包转换为电信号发送到网络
  • 第三章、集线器、交换机、路由器

    • 会根据接入互联网形式的不同而不同,网卡发送的包会经过交换机等设备,到达用来接入互联网的路由器,路由器的后面就是互联网,网络运营商会负责将包送到目的地
  • 第四章、接入网、网络运营商

    • 数据从路由器进入互联网,互联网入口叫做接入网,包会经过多个互联网路由器传递到Web服务器
  • 第五章、防火墙、缓存服务器

    • 数据到达Web服务器后,会遇到防火墙对包的检查,另外网页的数据可能会保存到缓存服务器,如果查询这些内容可以不去Web服务器查找
  • 第六章、Web服务器

    • 数据到达Web服务器以后,数据会被解包并还原,这也是由操作系统的协议栈完成的,Web服务器程序分析请求消息的含义,并按照其中的指示将数据装入响应消息中发回给客户端

2.关键词

img

二.浏览器生成消息——探索浏览器内部

1.生成HTTP请求消息

(1)网址

在浏览器输入URL就表示了使用浏览器->Web服务器的第一步,URL有很多种:http:,ftp:,file:,mailto:…

img

(2)解析URL

URL的格式如下:

img

(3)省略文件名的情况

省略文件名的情况:

  1. http://www.xxx.com/dir/:这样没有文件名的URL,表示设置了默认的文件名,一般是index.html或default.html
  2. http://www.xxx.com/:这样也表示访问一个目录,由于省略了文件名,表示访问默认的文件,如index.html和default.html
  3. http://www.xxx.com:这样也表示事先设置的默认文件,如index.html和default.html
  4. http://www.xxx.com/whatisthis:如果whatisthis在Web服务器上,则表示whatisthis文件,如果没有这个文件,则当成目录名处理
(4)HTTP的基本思路

浏览器的第一步是对URL的解析,解析完之后我们就能知道要访问的目标是哪里,浏览器会使用HTTP协议来访问Web服务器,HTTP协议定义了客户端和服务器之间交互的消息内容和步骤,客户端发送请求,包括对什么进行怎样的操作

对数据进行怎样操作包括以下方法:GET,POST,HEAD,PUT,DELETE,TRACE,CONNECT等…

(5)生成HTTP请求消息

URL解析后,浏览器就确定了Web服务器和文件名,然后根据这些信息生成HTTP请求,HTTP请求的格式如下:

img

  • 第一行表示这个URL是从哪个HTTP版本开始写的
  • 第二行是消息头,添加了一些额外的详细信息,规定了很多内容:日期、客户端支持的数据类型、语言、压缩格式、客户端和服务器的软件名称和版本等
  • 消息头结束后,要添加一个没有内容的空行后,再添加要发送的数据,这个部分称为消息体,只是如果使用GET方法,我们就能判断Web服务器要怎么操作,消息体不需要写数据
(6)发送请求后会收到响应

这样请求消息发送出去后,Web服务器会返回响应消息,响应的消息也如上图可见,响应的消息第一行是状态码和响应短语,状态码告诉程序是否成功,响应短语告知执行的结果

如果访问的内容中有多个资源,需要发送多次请求

img

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

(1)IP地址

生成HTTP消息,浏览器是没有能力将它发送到网络中的,是需要操作系统帮助发送给网络,在这之前,我们要查询目标服务器域名对应的IP地址

子网就是用集线器连接起来的几台计算机,子网再通过路由器连接成一个大的网络,网络中所有的设备都会被分配一个地址,包括一个网络号和一个主机号,而这个**网络号+主机号=IP地址**,通过IP地址,我们可以知道访问对象的位置,从而将消息发送到服务器,消息向经过子网的集线器,转发到距离发送者最近的路由器上,接下来,路由器会根据消息的目的地判断下一个路由器的位置,然后将消息传递到下个路由器,以此类推将消息传送到目的地

img

实际的IP地址使一个32比特的数字,按照8个比特为一组分为四组,我们一般采用十进制表示后用圆点隔开,不过网络号和主机号连起来一共是32比特,具体结构是不固定的

image-20231112181951181

需要使用子网掩码来确定,子网掩码网络号用都是1表示,主机号都用0表示,这样就能确定网络号和主机号的边界,另外主机号都是0表示整个子网,主机号全为1表示向子网上所有设备发送包,也就是广播

image-20231112183150718

(2)域名和IP地址并用的理由

给Web服务器传递地址,如果使用名称长度是不可确定的,使用IP地址,可以锁定就是32位,但是人类很难记住一系列数字,所以让人使用域名,让机器使用IP

(3)Socket库提供查询IP地址的功能

查询IP地址,需要询问DNS服务器对应域名的IP,我们的电脑上都存在着DNS解析器,通过DNS查询IP地址的操作叫做域名解析,解析器是一段程序,包含在Socket库中,Socket库包含很多程序组件,它可以让其他的应用程序调用操作系统的网络功能,解析器就是其中的一个组件

(4)通过解析器向DNS服务器发送查询

使用如下程序,通过gethostbyname可以获取对应域名的内存地址,将这个值存入某个内存地址中:

<应用程序名>(<参数>)
{
	<内存地址> = gethostbyname("域名");
}
(5)解析器内部原理

image-20231112185538894

  • 生成发给DNS服务器的查询消息
  • 向DNS服务器发送查询消息
  • 接收DNS服务器返回的响应消息
  • 将结果存到内存地址,返回到浏览器应用程序

如果要访问的Web服务器在DNS服务器萨汗国注册了,那么IP地址会被存到内存中并返回给客户端,另外给DNS服务器发消息也需要DNS服务器的IP,这是事先设置好的

image-20231112191240107

3.全世界DNS服务器大接力

(1)DNS服务器的基本工作

客户发送查询消息给DNS服务器,然后获取响应消息,来自客户端的查询消息应该包括以下3种信息:

  1. 域名:服务器、邮件服务器(邮件地址中@后面的的部分)的名称
  2. Class:内容就是IN
  3. 记录类型:表示域名对应何种类型的记录,比如当类型为A时,表示域名对应的IP,当类型为MX时,表示域名对应的是邮件服务器…

image-20231112192339216

比如要查询www.lab.glasscom.com…,客户端会向DNS服务器发送如下内容:

(a)域名=www.lab.glasscom.com

(b)Class=IN

(c)记录类型=A

(2)域名层次

一般直接在最近的DNS中查到IP是很少的,所以要跨DNS中查找,这就需要熟悉域名系统,比如www.lab.glasscom.com,表示com公司的glasscom部门的lab科的www,所以如果一次找不到所需IP时,需要按照下图查找:

image-20231112193040971

查不到就去根DNS服务器查找,然后逐步的向下查找直到找到所需的IP地址

image-20231112193152918

(3)通过缓存加快DNS服务器的响应

主要就是之前查找过的域名,会被添加到缓存中,如果下次再找,就从缓存中查找

4.委托协议栈发送消息

(1)数据收发操作概览

有了HTTP,有了IP就可以委托操作系统内部的协议栈向目标IP发送消息了,发送消息当然也需要使用Socket库的组件,不过DNS查IP需要一个程序组件,发送消息需要调用多个程序组件了。

使用Socket库来收发数据操作如图:

image-20231112194816127

首先在收发数据之前需要创建管道,建立管道的关键在于管道两边的出入口,也叫做套接字

整体流程:

  1. 创建套接字,一般由服务器端创建套接字,然后等待客户端向该套接字连接管道,当服务器进入等待状态时,客户端就可以连接管道了,当然也可以客户端创建套接字,使用Socket中的socket程序组件,套接字创建完成后,协议栈会返回一个描述符,应用程序会把收到的描述符放在内存中,描述符是用来识别不同的套接字,类似号码牌
  2. 委托协议栈将客户端创建的套接字连接到服务器端的套接字上,使用Socket中的connect程序组件,需要指定描述符、服务器IP和端口号这三个参数,描述符就从内存中获取,IP通过DNS服务器获取,端口号则是默认的,只要事先规定好端口号,就可以连接到相应的服务器程序的套接字,客户端在创建套接字的时候,协议栈会为这个套接字随便分配一个端口号,接下来当协议栈执行连接操作时,会将这个随便分配的端口号通知给服务器
  3. 通信阶段,收发数据,使用Socket库委托协议栈来完成这个操作,使用到Socket的write程序组件,这样消息就会发送给服务器,服务器解析后会返回消息,接收消息使用Socket库中的read程序组件委托协议栈来完成,调用read时需要指定用于存放接收到的响应消息的内存地址,这个内存地址叫做接收缓冲区
  4. 断开连接并删除套接字,浏览器接收到数据后,收发数据就结束了,接下来调用Socket中的close程序组件进入断开阶段,最终连接在套接字之间的管道会被断开,套接字会被删除,Web服务器发送网响应消息后,应该主动执行断开操作,所以Web服务器首先调用close来断开,客户端收到通知后也进入断开阶段,当浏览器调用read来接收数据时,read会通知浏览器收发数据操作已经结束,连接已经断开,然后浏览器调用close方法

这四个操作都是由操作系统中的协议栈来执行的,浏览器不负责做连接管道、放入数据的工作,操作系统的操作都由Socket库的程序组件来执行

image-20231112204032138

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值