admin 管理员组文章数量: 887021
文章目录
- 《网络是怎样连接的》 笔记 概述+第一章
- 本书引导概述
- 探索之旅
- 第一章 Web浏览器
- 第二章 协议栈,网卡
- 第三章 集线器,交换机,路由器
- 第四章 接入网,网络运营商
- 第五章 防火墙,缓存服务器
- 第六章 Web服务器
- 第一章 浏览器生成消息
- 1.1 生成HTTP请求消息
- 网址(URL)
- 省略文件名的情况
- HTTP协议
- 第一步 浏览器解析URL
- 第二步 生成HTTP请求消息
- 第三步 发送请求后会收到响应
- 1.2 向**DNS**服务器查询**Web**服务器的**IP**地址
- IP地址的基本知识
- 域名与IP地址并用的理由
- **Socket**库提供查询**IP**地址的功能
- 通过解析器向**DNS**服务器发出查询
- 解析器内部原理
- 1.3 全世界DNS服务器的最大接力
- DNS服务器的基本工作
- 域名的层次结构
- 寻找相应的DNS服务器并获取IP地址
- 通过缓存加快DNS服务器的响应
- 1.4 委托协议栈发送消息
- 数据收发操作概述
- 创建套接字阶段
- 连接阶段:把管道接上去
- 通信阶段:传递信息
- 断开阶段:收发数据结束
《网络是怎样连接的》 笔记 概述+第一章
本书引导概述
探索之旅
浏览器访问Web服务器
这个过程包含了浏览器和Web服务器之间的一系列交互,如下:
(1)浏览器:“请给我****的数据。”
(2)Web服务器:“好的,这就是你要的数据。”
以上交互完成后,浏览器会将从Web服务器拿来的数据显示在屏幕上,虽然显示网页这个过程非常复杂,但是浏览器和Web服务器之间通过网络进行的交互却很简单。
概括如下:
(1)浏览器向web服务器发送请求。
(2)web服务器根据请求向浏览器发送响应。
综上:
因此,从这个层面上,也就是浏览器和web服务器等网络应用程序进行交互的层面上来看,其工作方式应该还是比较容易理解的。这个层面上的交互和人类之间的对话非常相似,从这一点来说也更加容易理解。
应用程序交互的实现
- 要实现应用程序之间的交互,我们需要一个能够在浏览器和web服务器之间传递请求和响应的机制。网络是由很多计算机等设备相互连接组成的,因此在通信的过程中需要确定正确的通信对象,并将请求和响应发送给它们。请求和响应在传递的过程中可能会丢失或损坏,因此这些情况也必须要考虑到。所以说,我们需要一种机制,无论遇到任何情况都能够将请求和响应准确无误地发送给对方。由于请求和响应都是由0和1组成的数字信息,所以可以说,我们需要的是一种能够将数字信息搬运到指定目的地的机制。(请求和响应的本质都是电信号和光信号,这些信号可能会因受到杂音等的干扰而损坏)
- 这种机制是由操作系统中的网络控制软件,以及交换机、路由器等设备分工合作来实现的,它的基本思路是将数字信息分割成一个一个的小块,然后装入一些被称为“包”( Packet)的容器中来运送。“包”这个词大家可能在用手机的时候经常会碰到,但在这里类似于邮政和快递中的概念。大家可以这样理解:包相当于信件或者包裹,而交换机和路由器则相当于邮局或快递公司的分拣处理区。==包的头部存有目的地等控制信息,通过许多交换机和路由器的接力,就可以根据控制信息对这些包进行分拣,然后将它们一步一步地搬运到目的地。==无论是家庭和公司里的局域网,还是外面的互联网,它们只是在规模上有所不同,基本的机制都是相同的。
第一章 Web浏览器
当我们输入下面这样的网址 时,浏览器就会按照一定的规则去分析这个网址的含义,然后根据其含义 生成请求消息.
http://www.lab.glasscom/sample1.html
在上面这个例子中,浏览器生成的请求消息表示“请给我samplel. html这一文件中储存的网页数据”,接着浏览器会将请求消息发送给Web 服务器。
当然,浏览器并不会亲自负责数据的传送。传送消息是搬运数字信息的机制负责的工作,因此浏览器会委托它将数据发送出去。具体来说,就是委托操作系统中的网络控制软件(协议栈)将消息发送给服务器。
第二章 协议栈,网卡
- OS中网络控制软件叫作协议栈
- 网卡:负责以太网或无线网络通信的硬件
步骤:
-
协议栈会将从浏览器接收到的信息打包,加上目的地址等控制信息,就像把信装进信封,然后在信封上写上收信人的地址,协议栈还具有一定的纠错功能。
-
接下来,协议栈会将包交给网卡。然后,网卡会将包转换为电信号并通过网线发送出去。这样一来,包就进入到网络之中了。
包—>协议栈—>网卡—>网线(包转换为电信号)—>网络
第三章 集线器,交换机,路由器
-
客户端计算机可以通过家庭或公司的局域网接入互联网,也可以单独直接接入互联网。
-
实例讲解:
- 假设客户端计算机是连接到家庭或公司的局域网中,然后通过ADSL和光纤到户(FTTH )等宽带线路接入互联网
- 接下来网卡发送的包经过交换机,到达路由器(接入互联网)。
注:
- ADSL:是一种异步传输模式(ATM),指使用电话线上网,需要专用的猫,上网时高低屏分离,上网电话两不误
第四章 接入网,网络运营商
-
接入网:
- 数据从用来接入互联网的路由器出发,进入了互联网的内部,
- 互联网的入口线路称为接入网 ,电话线、ISDN、 ADSL、有线电视、光线、专线等多种通信线路来接入互联网,这些通信线路统称为接入网。
- 接入到网络运营商的接入网设备被称为接入点。
-
接入点:
-
接入点的实体是一台专为运营商设计的路由器,我们可以把它理解为离你家最近的邮局。
-
从各个邮筒中收集来的信件会在邮局进行分拣,然后被送往全国甚至全世界
-
互联网也是一样,网络包(信件)首先通过接入网(邮筒)被发送到接入点(邮局),然后再从这里被发送到全国甚至全世界
数据—>接入网—>接入点(路由器)—>互联网?
-
接入点的后面就是互联网的骨干部分了。
-
-
骨干网:
- 在骨干网中存在很多运营商和大量的路由器,这些路由器相互连接,组成一张巨大的网,而我们的网络包就在其中经过若干路由器的接力.最终被发送到目标Web服务器上。
-
路由器:
运营商和家用的路由器存在规模差异和连接差异。-
规模差异:
- 运营商使用的路由器是一种可以连接几十根网线的高速大型路由器
- 在互联网的骨干部分(骨干网),存在着大量的这种路由器,它们之间以复杂的形式连接起来
- 网络包就在这些路由器之间穿行。
-
连接差异:
- 路由器连接方式上也存在差异,家庭和公司局域网中一般采用以太网线进行连接,而互联网中除 了以太网线连接之外,还会使用比较古老的电话技术和最新的光通信技术来传送网络包 。
-
第五章 防火墙,缓存服务器
防火墙:
- 通过骨干网之后,网络包最终到达了 Web服务器所在的局域网中接着,它会遇到防火墙
- 防火墙会对进入的包进行检查,防火墙就像成门口的保安,他会检查所有进入的包,看看有没有危险的包混在里面检查完之后
缓存服务器:
- 网络包接下来可能还会遇到缓存服务器网页数据中有部分是可以重复利用的,这些可以重复利用的数据就被保存在缓存服务器中如果要访问的网页数据正好在缓存服务器中能够找到,那么就可以不用劳烦Web服务器(此时还没到Web服务器),直接从缓存服务器读出数据。
- 此外,在大型网站中,可能还会配备将消息分布到多台Web服务器上的负载均衡器,还有可能会使用通过分布在整个互联网中的缓存服务器来分发内容的服务,经过这些机制之后,网络包才会到达Web服务器。
第六章 Web服务器
- 当网络包到达Web服务器后,数据会被
解包
并还原为原始的请求消息,然后交给Web服务器程序。和客户端一样,这个操作也是由操作系统中的协议栈(网络控制软件)来完成的接下来 Web服务器程序分析请求消息的含义,并按照其中的指示将数据装入响应消息中,然后发回给客户端响应消息回到客户端的,过程和之前我们介绍的过程正好相反. - 当响应到达客户端之后,浏览器会从中读取出网页的数据并在屏幕上显示出来,访问Web服务器的一系列操作就全部完成了,我们的探索之旅也到达了终点,
第一章 浏览器生成消息
热身问答
下列说法是正确的(V)还是错误的(X ) ?
-
http://www.nikkeibp.co.jp/ 中的 www 代表 World Wide Web 协 议(对通信操作规则所作的定义) (错误)
答:http://www.nikkeibp.co.jp/ 中的 www 只是 Web 服务器上的一种命名。而且,World Wide Web也不是一个协议的名字, 而是Web的提出者最早开发的浏览器兼HTML编辑器的名字。
-
个人也可以申请注册互联网中的域名 (正确)
**答:**如果是 “” “” “” “.jp”(除 “co.jp” “ne.jp” 等“xx.jp”格式的域名外)'等没有对注册对象范围进行限制 的域名,任何个人都可以申请注册。此外,也有一种“.name” 域名是专门为个人申请者准备的。
-
应用程序并不是自己去控制网络,而是委托操作系统来控制网络。
1.1 生成HTTP请求消息
网址(URL)
- 通常我们所见的是以http://开头的那一串东西,但是除了 “http:”,网址还可以以其他一些文字开头,例如*“ftp:” ”file:” “mailto:”*等
- 有各种各样的URL,是因为尽管我们通常是使用浏览器来访问 Web服务器的,但实际上浏览器并不只有这一个功能(访问Web服务器),它也可以用来在 FTP服务器上下载和上传文件,同时也具备电子邮件客户端的功能。可以说,浏览器是一个具备多种客户端功能的综合性客户端软件,因此它需要URL来判断应该使用其中哪种功能来访问相应的数据,比如访问Web服务器时用*“http:”;而访问FTP 服务器时用“ftp:”*。
- 根据访问目标的不同, URL的写法也会不同。
- 在访问Web服务器和FTP服务器时,
URL
中会包含服务器的域名,和要访问的文件的路径名 - 发邮件,
URL
则包含收件人的邮件地址此外,根据需要,URL中还会包含用户名、密码、 服务器端口号等信息。如下图所示:
- 在访问Web服务器和FTP服务器时,
例如:自己写的html就可以通过file来访问
- URL有各种不同的写法,但它们有一个共同点,那就是URL开头的文字。即“http:” “ftp:” Fie:” “mailto:”这部分文字都表示浏览器应当使用的访问方法 比如当访问Web服务器时应该使用HTTP协议,而访问FTP服务器时则应该使用FTP协议 因此,我们可以把这部分理解为访问时使用的协议类型,尽管后面部分的写法各不相同,但开头部分的内容决定了后面部分的写法,因此并不会造成混乱。
省略文件名的情况
http://www. lab.glasscojTi.coin/dirl/filel. html 是一个以“http:”开头的典型URL,但有时候我们也会见到一些不太一样的URL,例如下面这个URL是以"/"来结尾的。
-
http://www.lab.glasscom/dir/
我们可以这样理解,以/结尾代表/dir/后面本来应该有的文件名被省略了,根据URL的规则,文件名可以像前面这样省略。
不过,没有文件名,服务器怎么知道要访问哪个文件呢?其实,我们会在服务器上事先设置好文件名省略时要访问的默认文件名。这个设置根据服务器不同而不同,大多数情况下是index.html或者default.html之类的文件名因此,像前面这样省略文件名时,服务器就会访问*/dir/index.html* 或者 /dir/default.html。例如:下图中存放的是个索引
-
http://www.lab.glasscom/
这个URL也是以“/”结尾的,也就是说它表示访问一个名叫**"/"的目录**,而且,由于省略了文件名,所以结果就是访问*/index.html*或者 /default.htm这样的文件了。
目录表示目录层级中最顶层的“根目录”,在c盘中输入c:/会回到根目录。
- http://www.lab.glasscom
这次连结尾的“/”都省略了 像这样连目录名都省略时,这种写法也是允许的当没有路径名时,就代表访问根目录下事先设置的默认文件,也就是*/index, html或者/default.htm*这些文件。
- http://www.lab.glasscom/whatisthis
此时不知whatisthis是目录名还是文件名,这种情况会按照下面的惯例进行处理:
如果 Web服务器上存在名为whatisthis的文件,则将whatisthis作为文件名来处理;
如果存在名为whatisthis的目录,则将whatisthis作为目录名来处理。
HTTP协议
请求消息
- HTTP协议定义了客户端和服务器之间交互的消息内容和步骤、其基本思路非常简单首先,客户端会向服务器发送请求消息(上图)。请求消息中包含的内容是“对什么”和“进行怎样的操作”两个部分。其中相 当于“对什么”的部分称为URI。一般来说,URl的内容是一个存放网页数据的文件名或者是一个CGI程序的文件名,例如“/dirl/filel.html” “dirl/programl.cgi”等。不过,URI不仅限于此,也可以直接使用“http:” 开头的URL来作为URI。换句话说就是,这里可以写各种访问目标,而这些访问目标统称为URI。
- 相当于接下来“进行怎样的操作”的部分称为方法。方法表示需要让 Web服务器完成怎样的工作,其中典型的例子包括读取URI表示的数据、 将客户端输入的数据发送给URI表示的程序等。
- 下图列举了主要的方法, 通过这张表大家应该能够理解通过方法可以执行怎样的操作。
- HTTP消息中还有一些用来表示附加信息的头字段。客户端向Web服务器发送数据时,会先发送头字段,然后再发送数据不过,头字段属于可有可无的附加信息。
响应消息
- 收到请求消息之后,Web服务器会对其中的内容进行解析,通过URI 和方法来判断“对什么”“进行怎样的操作”,并根据这些要求来完成自己的工作,然后将结果存放在响应消息中。
- 在响应消息的开头有一个状态码, 它用来表示操作的执行结果是成功还是发生了错误。当我们访问Web服务器时,遇到找不到的文件就会显示出404 Not Found的错误信息,其实这就是状态码状态码后面就是头字段和网页数据,响应消息会被发送回客户端,客户端收到之后,浏览器会从消息中读出所需的数据并显示在屏幕上,到这里,HTTP的整个工作就完成了
运用实例
-
get方法:
一般当我们访问Web服务器获取网页数据时,使用的就是GET方法。所谓一般的访问过程大概就是这样的:首先,在请求消息中写上GET方法 然后在URI中写上存放网页数据的文件名,“dirl/filel.html”,这就表示我 们需要获取/dirl/filel.html文件中的数据,当Web服务器收到消息后,会 打开/dirl/filel.html文件并读取出里面的数据,然后将读出的数据存放到响应消息中,并返回给客户端:最后,客户端浏览器会收到这些数据并显示在屏幕上。
-
post方法:
我们在表单中填写数据并将其发送给Web服务器时就会使用这个方法当我们在网上商城填写收货地址和姓名,或者是在网上填写问卷时,都会遇到带有输入框的网页,而这些可以输入信息的部分就是表单,使用POST方法时,URI会指向Web服务器中运行的一个应用程序(用于处理购物订单数据或者问卷教据的程序)的文件名,典型的例子包括“index.cgi” “index, php”等 然后,在请求消息中,除了方法和UR1之外,还要加上传递给 应用程序和脚本的数据,这里的数据也就是用户在输入框里填写的信息。 当服务器收到消息后,Web服务器会将请求消息中的数据发送给URI指定 的应用程序’ 最后,Web服务器从应用程序接收输出的结果,会将它存放到响应消息中并返回给客户端。
综上:用户在浏览器购物软件输入框中填数据点击发送
—>1.URI指向服务器中写好的购物程序 2.请求信息还有输入框中填入的内容
—>服务器接受信息将输入框中数据给购物程序
—>Web服务器从购物程序拿到输出结果存入响应消息发回
第一步 浏览器解析URL
浏览器要做的第一步要作就是对URL进行解析,从而生成发送给Web 服务器的请求消息。
解析过程:(以访问Web服务器的情况为例来进行讲解)
- 根据HTTP的规格,URL包含图(a)中的这几种 元素。当对URL 进行解析时,首先需要按照图(a)的格式将其中的各个元素拆分出来。
- 例如图(b)中的URL会拆分成图©的样子 然后,通过拆分出来 的这些元素,我们就能够明白URL代表的含义,例如,我们来看拆分结果图©,其中包含Web服务器名称www.lab.glasscom,以及文件的路 径/dirl/filel.htmh。因此我们就能够明白,图(b)中的URL表示要访 问www.Iab.glasscom这个Web服务器上路径名为/dirl/fllel.html的文件,也就是位于/dirl/目录下的filel.html这个文件。
第二步 生成HTTP请求消息
第一行 请求行
- 对URL进行解析之后,浏览器确定了 Web服务器和文件名,接下来就是根据这些信息来生成HTTP请求消息(向web服务器发送请求消息) 实际上,HTTP消息在格式上是有严格规定的,因此浏览器会按照规定的格式来生成请求消息,如下图:
- 首先需要选择方法,关键在于浏览器的工作状态.这次探索之旅是从在浏览器顶部的地址栏中输入网址开始的,但浏览器并非只有在这一种场景下会向Web服务器发送请求消息 比如:点击网页中的超级链接二或者在表单中填写信息后点击“提交”按钮,这些场景都会触发浏览器的工作,而选用哪种方法也是根据场景来确定的。
- 我们的场景是在地址栏中输入网址并显示网页,因此这里应该使用GET 方法「.点击超级链接的场景中也是使用GET方法 如果是表单,在HTML 源代码中会在表单的属性中指定使用哪种方法来发送请求,可能是GET也 可能是POST
- 写好方法之后,加一个空格,然后写URI。URI部分的格式如下,一般是文件和程序的路径名:
/<目录名>/•••/<文件名 >,前面已经讲过,路径名一般来说已经包含在URL中了,因此只要从URL中提取出来原封不动地写上去就好了。 - 第一行的末尾需要写上HTTP的版本号,这是为了表示该消息是基于哪个版本的HTTP规格编写的。到此为止,第一行就结束了。
第二行 消息头
- 尽管通过第一行我们就可以大致理解请求的内容,但有些情况下还需要一些额外的详细信息,而消息头的功能就是用来存放这些信息。消息头的规格中定义了很多项目,如日期、客户端支持的 数据类型、语言、压缩格式、客户端和服务器的软件名称和版本、数据有效期和最后更新时间等 这些项目表示的都是非常细节的信息,因此要想准确理解这些信息的意思,就需要对HTTP协议有非常深入的了解。
如下图(还有很多):
消息体
- 写完消息头之后,还需要添加一个完全没有内容的空行,然后写上需发送的数据,这一部分称为消息体,也就是消息的主体.不过,在使用GET方法的情况下,仅凭方法和UR], Web服务器就能够判断需要进行怎样的操作,因此消息体中不需要填写任何数据,消息体结束之后,整个消息也就结束了。
- 当使用POST方法时,需要将表单中填写的信息写在消息体中到此为止,请求消息的生成操作就全部完成了
第三步 发送请求后会收到响应
响应消息
- 响应消息的格式以及基本思路和请求消息是相同的,差别只在第一行,在响应消息中,第一行的内容为状态码和响应短语,用来表示请求的执行结果是成功还是出错
- 状态码和响应短语表示的内容一致,但它们的用途不同,状态码是一个数字,它主要用来向程序告知执行的结果;相对地,响应短语则是一段文字,用来向人们告知执行的结果.
即:状态码面向程序,响应短语面向程序员
获得信息
-
返回响应消息之后,浏览器会将数据提取出来并显示在屏幕上,我们就能够看到网页的样子了 如果网页的内容只有文字,那么到这里就全部处理完毕了
-
如果网页中还包括图片等资源,在网页中的相应位置嵌入表示图片文件的标签(<img src="image 1 .jpg">)的控制信息,浏览器会在显示文字时搜索相应的标签,当遇到图片会为其留出空间然后再次访问Web服务器发送请求信息获取图片显示在预留空间
即:先把文字显示在屏幕,为图片预留出空间,再向Web服务器请求获取图片。(例如:平时有时候网不好会先把文字显示处来,图片为一片空白)
-
每条请求消息只能写一个URI,所以每次只能获取一个文件,若一个网页有3张照片,那么需向Web服务器发送4次请求(一次文字三次图片)。
-
下图展示了请求响应完整过程:
先获取文字
再获取图片
1.2 向DNS服务器查询Web服务器的IP地址
- 浏览器能够解析网址并生成HTTP消息,但它本身并不具备将消息发送到网络中的功能,因此这一功能需要委托操作系统来实现,但是我们还需要查询网址中服务器域名的IP地址,在委托操作系统发送消息时,必须要提供的不 是通信对象的域名,而是它的IP地址,因此在生成HTTP消息1.1之后,下 一个步骤就是根据域名查询IP地址。
- 即:浏览器解析网址获得http信息但是是由OS发送,而OS发送需要IP地址,因此需要根据域名查询IP地址
IP地址的基本知识
- TCP/IP的结构如图:
用集线器以连接起来的几台计算机我们将它看作一个单位,称为子网
TCP/IP是由一些小的子网,通过路由器连接起来组成一个大的网,将子网通过路由器连接起来,就形成了一个网络。
-
在网络中,所有的设备都会被分配一个地址(iP地址)这个地址就相当于现实 中某条路上的“xx号x x室”。其中“号”对应的号码是分配给整个子网的(网络号),而“室”对应的号码是分配给子网中的计算机的(主机号),这就是网络中的地址。“号”对应的号码称为网络号,“室”对应的号码称为主机号。
xx号x x室
号—>分配给子网—>网络号
室—>分配给子网中计算机—>主机号(子网划分) -
IP地址:是一串32比特的数字,按照8比特一组分为4组,再将每一组转换为十进制用圆点隔开
IP地址=网络号+主机号,网络号和主机号总共32bit,但不确定网络号和主机号各占多少位。因此,引入掩码。
-
子网掩码
子网掩码为1的部分表示网络号,子网掩码为0的部分表示主机号。
- ip地址表示方法(图)
域名与IP地址并用的理由
- IP地址和域名都可以确定通信对象,但是IP地址不好记忆,为了人们易于使用出现了域名(服务器名字),而ip地址32位的表示方法对减少了路由器的负担所以对于机器需要ip地址。
- IP地址面向机器 域名面向人
Socket库提供查询IP地址的功能
- 查询IP地址的方法非常简单,只要询问最近的DNS服务器“www. lab.glasscom的IP地址是什么”就可以了,DNS服务器会回答说"该 服务器的1P地址为xxx.xxx.xxx.xxx”,但是如何发出查询是个问题
- 向DNS服务器发出查询:是向DNS服务器发送查询消息,并接收DNS服务器返回的响应消息。
因此,我们的计算机上 一定有相应的DNS客户端,而相当于DNS客户端的部分称为DNS解析器。为什么加解析器?通过DNS查询IP地址的操作称为域名解析所以叫解析器。
DNS解析器(DNS客户端):通过DNS查询IP地址(发送接收方式)。 - 解析器实际上是一段程序,它包含在操作系统的Socket库中
- 库就是一堆通用程序组件的集合,其他的应用程序都需要使用其中的组件,使用现有的组件搭建应用程序节省成本。
- 多个程序使用相同的组件可以实现程序的标准化。
- Socket库也是一种库,其中包含的程序组件可以让其他的应用程序调用操作系统的网络功能而解析器就是这个库中的其中一种程序组件(应用程序可以通过其使用OS网络功能)。
通过解析器向DNS服务器发出查询
- 解析器的用法非常简单,Socket库中的程序都是标准组件,只要从应用程序中进行调用就可以了’具体来说,在编写浏览器等应用程序的时候只要像图这样写上解析器的程序名gethostbyname以及Web服务器 的域名“www.lab.glasscom”就可以了,这样就完成了对解析器的调用。
即:在编写浏览器等应用程序的时候写上解析器的程序名,就完成了对解析器的调用
-
调用解析器后,解析器会向DNS服务器发送查询消息,然后DNS服务器会返回响应消息,响应消息中包含查询到的IP地址,解析器会取出IP地址,并将其写入浏览器指定的内存地址中。接下来,浏览器在向Web服务器发送消息时.只要从该内存地址取出IP地址,并将它与HTTP请求消息一起交给操作系统就可以了
综上:解析器向DNS服务发送查询信息
—>DNS服务器返回响应信息(包含IP地址)
—>解析器取出IP地址写入浏览器指定内存地址
—>浏览器向Web发送消息
—>内存地址取出的IP地址和http请求信息给OS
—>由OS发送
解析器内部原理
控制流程转移
由于调用了其他程序.原本运行的程序进入暂停状态,而被调用的程序开始运行,这就是“控制流程转移”。类似挂起
解析器获取ip原理详解:
-
发送:
1.控制流程由浏览器—>解析器
2.解析器生成要发送给DNS服务器的查询消息(与浏览器生成要发送给Web服务器的HTTP请求消息的过程类似)。
3.发送消息这个操作并不是由解析器自身来执行,而是要委托给操作系统内部的协议栈来执行.这是因为和浏览器一样解析器本身也不具备使用网络收发数据的功能。
4.控制流程会再次转移协议栈会执行发送消息的操作,然后通过网卡将消息发送给DNS服务器。
浏览器—>调用解析器—>委托给OS协议栈—>发送信息 -
返回:
1.ip地址写入响应消息
2.通过协议栈传回解析器
3.解析器读取出消息取出IP地址,并将IP地址传递给应用程序,实际上,解析器会将取出的IP地址写入应用程序指定的内存地址中。 -
注意:
向DNS服务器发送消息时,我们当然也需要知道DNS服务器的IP地址,只不过这个IP地址是作为TCP/IP的一个设置项目事先设置好的,不需要再去查询了,不同的操作系统中TCP/IP的设置方法也有差异。
1.3 全世界DNS服务器的最大接力
DNS服务器的基本工作
DNS服务器的基木工作就是接收来自客户端的查询消息,然后根据消息的内容返回响应。
客户端的查询消息需包含3种信息
-
域名:服务器,邮件服务器的名称
-
Class:DNS还应用于互联网以外的其他网络应用,但是现在除了互联网并没有其他的网络了,因此Class的值永远是代表互联网IN。
-
记录类型:表示域名对应何种类型的记录。
例如:
当类型为A时,表小域名对应的是IP地址;
当类型为MX时,表示域名对应的是邮件服务器。对于不同的记录类型,服务器向客户端返回的信息(响应数据即IP地址)也会不同
DNS响应过程图
以上图为材料,举例要查询www.lab.giasscom这个域名对应的IP地址,
- 客户端会向DNS服务器发送包含以下信息的查询消息
- 域名=www.lab.glasscom
- Class = IN
- 记录类型=A
- 从已有的记录(上图表)中找域名、Class和记录类型全部匹配的记录
- 第一行记录与查询消息中的3个项目完全一致:于是,DNS服务器会将记录中的 192.0.2.226这个值返回给客户端
综上所述:DNS服务器会从域名与IP地址的对照表中查找相应的记录,并返回IP地址。
域名的层次结构
问题
如果是在像公司内部网络这样Web和邮件服务器数量有限的环境中,所有的信息都可以保存在一台DNS服务器中。然而,互联网中存在着不计其数的服务器,将这些服务器的信息全部保存在一台DNS服务器中是不可能的,因此一定会出现在DNS服务器中找不到要查询的信息的情况。
答案
将信息分布保存在多台DNS服务器中, 这些DNS服务器相互接力配合,从而查找出要查询的信息。
层次结构与域
- DNS服务器中的所有信息都是按照域名以分层次的结构来保存的,层次结构这个词听起来可能有点不容易懂,其实就类似于公司中的事业集团、部门、科室,这样的结构层次结构能够帮助我们更好地管理大量的信息。
- DNS中的域名都是用句点来分隔的,比如www.lab.glasscom这 里的句点代表了不同层次之间的界限
- 越靠右的位置表示其层级越高,比如www.lab.glasscom这个域名如果按照公司里的组织结构来说,大概就是com代表事业集团,glasscom代表部门,lab代表科室。
- 相当于一个层级的部分称为域因此,com域的下一层是glasscom域,再下一层是lab域,再下面才是www这个名字
- 将域名分层级变为不同域存储在DNS服务器中,因此通过DNS服务器的接力可获得完整域名
DNS与域
-
一个域的信息是作为一个整体存放在DNS服务器中的,不能将一个域拆开来存放在多台DNS服务器中
-
DNS服务器和域之间的关系也并不总是一对一的,一台DNS服务器中也可以存放多个域的信息
-
例子:
题目:假设有一个公司的域example.co.jp,则相应的有了一台DNS服务器,但是现在需要为每一个事业集团配备一台DNS服务器分别管理自己的信息。
答:已知不能将一个域拆开来存放在多台DNS服务器中,所以不能将公司域拆开放在两个事业集团域中。因此引入下级域的概念,我们可以在公司域下创建两个下级域,将其分配给两个事业集团
**现实案例:**比如www.nikkeibp.co.jp这个域 名,最上层的jp代表分配给日本这个国家的域;下一层的co是日本国内进行分类的域代表公司整体;再下层的nikkeibp就是分配给个体公司的域; 最下层的www就是服务器的名称。
寻找相应的DNS服务器并获取IP地址
互联网中有数万台DNS服务器,肯定不能一台一台挨个去找,找到DNS服务器中存放的信息的关键在于如何找到我们要访问的Web服务器的信息归哪一台DNS服务器管。
DNS的IP地址套娃存储与查找
-
将负责管理下级域的DNS服务器的IP地址注册到它们的上级DNS服务器中,然后上级DNS服务器的IP地址再注册到更上一级的DNS服务器中。
即:将下级DNS的IP地址注册到上级的DNS服务器中例如:负责管理lab.glasscom这个域的DNS服务器的IP地址需要注册到glasscom域的DNS服务器中,而glasscom域的DNS服务器的IP地址又需要注册到com域的DNS服务器中。
-
我们就可以通过上级DNS服务器查询出下级DNS服务器的IP地址,也就可以向下级DNS服务器发送查询请求了。
-
在前面的讲解中,似乎com、jp这些域(称为顶级域)就是最顶层了, 它们各自负责保存下级DNS服务器的信息,但实际上并非如此在互联网 中,com和jp的上面还有一级域,称为根域。www.lab.glasscom.这样在域名的最后再加上一个句点,而这个最后的句点就代表根域。因此我们可以从根域开始查找。
-
除此之外还需要完成另一项工作,那就是将根域的DNS服务器信息保存在互联网中所有的DNS服务器中使得任何DNS服务器就都可以找到并访问根域DNS服务器了。
-
客户端只要能够找到任意一台DNS服务器,就可以通过它找到根域DNS服务器,然后再一路顺藤摸瓜 找到位于下层的某台目标DNS服务器。
即:客户端可通过任意DNS服务器找到根域服务器,再通过根域服务器逐层找到目标DNS服务器并通过对照表获得IP地址
-
分配给根域DNS服务器 的IP地址在全世界仅有13个而且这些地址几乎不发生变化,因此将这些地址保存在所有的DNS服务器中也并不是一件难事。实际上,根域DNS服务器的相关信息已经包含在DNS服务器程序的配置文件中了,因此只要安装DNS服务器程序,根域DNS的IP地址也就被自动配置好了。
DNS查询IP流程图
查询www.lab.glasscom的IP
-
1.客户端首先会访问最近的DNS服务器(也就是客户端的TCP/IP设置中填写的DNS服务器地址)由于最近的DNS服务器中没有存放www.lab.glasscom这一域名对应的信息,因此我们需要将来自客户端的查询消息转发给根域DNS服务器。(每个DNS都有根服务器的信息)
-
2.根服务器中也没有www.lab.glasscom这个域名,但根据域名结构可以判断这个域名属于com域,因此DNS根服务器会返回com域的DNS服务器的IP地址给最近的DNS服务器(客户端开始访问的DNS服务器)。
-
3.最近的DNS服务器去com域同上获得glasscom域的IP地址
-
4.最近的DNS服务器去com域同上获得lab域的IP地址
-
5和6.最近的DNS服务器去lab域发送查询信息,获得www.lab.glasscom的IP地址。
-
7.客户端知道Web服务器地址对其进行访问
通过缓存加快DNS服务器的响应
现实中DNS查询
- 上图展示的是基本原理与真实互联网中的工作方式还是有一些区别的.在真实的互联网中一台DNS服务器可以管理多个域的信息,每个域都有一台自己的DNS服务器只是为了方便教学。
- 现实中上级域和下级域有可能共享同一台DNS服务器在这种情况下,访问上级DNS服务器时就可以向下跳过一级DNS服务器,直接返回再下一级DNS服务器的相关信息,不用每层都返回下一层DNS的IP地址。
缓存功能
- 此外,有时候并不需要从最上级的根域开始查找,因为DNS服务器有一 个缓存功能,可以记住之前查询过的域名如果要查询的域名和相关信息已经在缓存中,那么就可以直接返回响应,接下来的查询可以从缓存的位置开始向下进行相比每次都从根域找起来说,缓存可以减少查询所需的时间
- 当要查询的域名不存在时,“不存在”这一响应结果也会被缓存。这样,当下次查询这个不存在的域名时,也可以快速响应。
- 这个缓存机制中有一点需要注意,那就是信息被缓存后,原本的注册信息可能会发生改变,这时缓存中的信息就有可能是不正确的因此,DNS务器中保存的信息都设置有一个有效期,当缓存中的信息超过有效期后,数据就会从缓存中删除而且,在对查询进行响应时,DNS服务器也会告知客户端这一响应的结果是来自缓存中还是来自负责管理该域名的DNS服务器。
1.4 委托协议栈发送消息
数据收发操作概述
- 知道IP后就可以委托操作系统内部的协议栈向这个目标ip地址,也就是我们要访问的Web服务器发送消息了
- 要发送给Web服务器的HTTP消息是一种数字信息(digital data),因此也可以说是委托协议栈来发送数字信息,收发数字信息这一操作不仅限于浏览器,对于各种使用网络的应用程序来说都是共通的因此,这一操作的过程也不仅适用于 Web,而是适用于任何网络应用程序
- 和向DNS服务器查询IP地址的操作一样,这里也需要使用Socket库中的程序组件不过,查询IP地址只需要调用一个程序组件(解析器)就可以了,而这里需要按照指定的顺序调用多个程序组件。
- 向操作系统内部的协议栈发出委托时,需要按照指定的顺序来调用Socket库中的程序组件。
Socket收发数据过程图
-
把数据通道想象成一条管道,将数据从一端送入管道,数据就会到达管道的另一端然后被取出。数据可以从任何一端被送入管道、数据的流动是双向的,不过,这并不是说现实中真的有这么一条管道,只是为了帮助大家理解数据收发操作的全貌,
-
图中管道并不是一开始就有的,是需要建立的。建立管道的关键在于管道两端的数据出入口,这些出入口称为套接字,即:建立管道的关键在于套接字
-
管道建立过程:
我们需要先创建套接字,然后再将套接字连接起来形成管道
- 服务端先创建套接字,然后等待客户端向套接字连接管道
ServerSocket serversocket=new ServerSocket (8888); //通过ServerSocket建立连接然后获得连接后的socket对象 System.out.println(serversocket.getInetAddress().getHostAddress()+"等待连接"); Socket clientsocket=serversocket.accept();//客户端创建套接字后才能接收
- 客户端也先创建套接字对象
Socket socket=new Socket("127.0.0.1",8888);
- 从客户端套接字延伸出管道,最后管道连接到服务器端的套接字上当双方的套接字连接起来之后,通信准备就完成了。此时将数据送入套接字就可以收发数据了。
收发数据4个阶段:
(1) 创建套接字(创建套接字阶段)
(2) 将管道连接到服务器端的套接字上(连接阶段)
(3) 收发数据(通信阶段)
(4) 断开管道并删除套接字(断开阶段)
注意:
前面这4个操作都是由操作系统中的协议栈来执行的,浏览器等应用程序并不会自己去做连接管道、放入数据这些操作,而是委托协议栈来代劳。
创建套接字阶段
应用程序是通过“描述符"这一类似号码牌的东西来识别套接字的。
应用程序委托收发数据过程
- 创建套接字,调用Socket库中的socket程序组件,如上图序号1
- 控制流程转向socket内部执行创建套接字操作,完成后控制流程返回应用程序
- 套接字创建完成后,协议栈会返回一个描述符,应用程序会将收到的描述符存放在内存中。描述符是用来识别不同的套接字的。
例子:
我们现在只关注了浏览器访问Web服务器的过程,但实际上计算机中会同时进行多个数据的通信操作,比如可以打开两个浏览器窗口,同时访问两台Web服务器这时,有两个数据收发操作在同时进行,也就需要创建两个不同的套接字
- 这个例子说明,同一台计算机上可能同时存在多个套接字,在这样的情况下,我们就需要一种方法来识别出某个特定的套接字,这种方法就是描述符。
- 当创建套接字后.我们就可以使用这个套接字来执行收发数据的操作了这时,只要我们出示描述符, 协议栈就能够判断出我们希望用哪一个套接字(选择哪一个通道)来连接或者收发数据了
连接阶段:把管道接上去
-
协议栈将客户端创建的套接字与服务器那边的套接字连接起来 应用程序通过调用Socket库中的名为connect的程序组件来完成这一操作(上图序号2)
-
当调用connect时,需要指定描述符、 服务器IP地址和端口号这3个参数
-
描述符:就是在创建套接字的时候由协议栈返回的那个描述符。connect会将应用程序指定的描述符告知协议栈,然后协议栈根据这个描述符来判断到底使用哪一个套接字去和服务器端的套接字进行连接并执行连接的操作(选择哪个客户端与服务器连接比如有两个浏览器)。
-
服务器IP地址:就是通过DNS服务器查询得到的我们要访问的服务器的IP地址
在DNS服务器的部分已经讲过,在进行数据收发操作时,双方必须知道对方的IP地址并告知协议栈,这个参数就是 那个IP地址了。
-
端口号: 找到IP只是找到某个电脑,但是每个计算机上的应用程序则需要端口号来确定。
当同时指定ip地址和端口号时,就可以明确识别出某台具体的 计算机上的某个具体的套接字
-
-
描述符:应用程序用来识别套接字的机制,不经过网络连接所以无法识别对方套接字。
IP地址和端口号:客户端和服务器之间用来识别对方套接字(管道出入口)的机制
通信阶段:传递信息
当套接字连接起来之后,剩下的事情就简单了,只要将数据送入套接字,数据就会被发送到对方的套接字中。当然,应用程序无法直接控制套接字,因此还是要通过Socket库委托协议栈来完成这个操作,使用write和read两个程序组件(下图3和31)
- 发送:应用程序需要在内存中准备好要发送的数据根据用户输入的网址生成的HTTP请求消息就是我们要发送的数据。
接下来,当调用write 时,需要指定描述符和发送数据(上图3),然后协议栈就会将数据发送到服务器,由于套接字中已经保存了已连接的通信对象的相关信息(IP地址,端口号)、所以只要通过描述符指定套接字,就可以识别出通信对象(对方发的套接字),并向其发送数据。 接着,发送数据会通过网络到达我们要访问的服务器。 - 接收:解析收到的数据内容并执行相应的操作,向客户端返回响应消息,当消息返回后,需要执行的是接收消息的操作。接收消息的操是通过Socket库中的read程序组件委托协议栈来完成的(上图31)。调用 read时需要指定用于存放接收到的响应消息的内存地址,这一内存地址称为接收缓冲区于是,当服务器返回响应消息时,read就会负责将接收到的响应消息存放到接收缓冲区中、由于接收缓冲区是一块位于应用程序内部的内存空间,因此当消息被存放到接收缓冲区中时,就相当于已经转交给了应用程序。
断开阶段:收发数据结束
当浏览器收到数据之后,收发数据的过程就结束了接下来,我们需要调用Socket库的close程序组件进入断开阶段(上图4)最终,连接在套接字之间的管道会被断开,套接字本身也会被删除
断开的过程如下
- Web使用的HTTP协议规定,当Web服务器发送完响应消息之后,应该主动执行断开操作因此Web服务器会首先调用 close来断开连接。
- 断开操作传达到客户端之后,客户端的套接字也会进入断开阶段接下来,当浏览器调用read执行接收数据操作时,read会告知浏览器收发数据操作已结束,连接已经断开,浏览器得知后,也会调用 close进入断开阶段。
改进:
这就是HTTP的工作过程,HTTP协议将HTML文档和图片都作为单独的对象来处理,每获取一次数据,就要执行一次连接、发送请求消息、 接收响应消息、断开的过程,因此,如果一个网页中包含很多张图片,就必须重复进行很多次连接、收发数据、断开的操作,对于同一台服务牌来 说,重复连接和断开显然是效率很低的,因此后来人们又设计出了能够在 一次连接中收发多个请求和响应的方法。在HTTP版本1.1中就可以使用这种方法,在这种情况下,当所有数据都请求完成后,浏览器会主动触发断开连接的操作。
版权声明:本文标题:《网络是怎讲连接的》学习笔记 第一章 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1729000027h1305259.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论