how networks work first note(2)
2019-02-13 本文已影响0人
Rechard_Jones
思维导图
整体内容向DNS服务器查询Web服务器的IP地址
- IP的基本知识
由一些小的子网,通过路由器连接起来组成一个大的网络。
这里的子网可以理解为用集线器连接起来的几台计算机
tips:一些家用路由器已经内置了集线器功能,因此大家可以理解为这种路由器内部同时包含路由器和集线器两种设备
- IP地址的表示
a:IP地址主体的表示方法
10.11.12.13
b:采用与IP地址主体相同的格式表示子网掩码的方法
10.11.12.13/255.255.255.0
c:采用网络号比特数来表示子网掩码的方法
10.11.12.13/24
d:表示子网的地址
10.11.12.0/24
主机号部分的比特全部为0,这个地址表示的不是单独一台计算机,而是代表整个子网
e:表示子网内广播的地址
10.11.12.255/24
- Socket库提供查询IP地址的功能
向DNS(Domain Name System)服务器发出查询,也就是向DNS服务器发送查询消息,并接收服务器返回的响应消息
相当于DNS客户端的部分称为DNS解析器,包含在操作系统的Socket库中
Soket库是用于调用网络功能的程序组件集合
- 通过解析器向DNS服务器发出查询
在编写浏览器等应用程序的时候,只要写上解析器的程序名称"gethostbyname"以及Web服务器的
域名"www.lab.glasscom.com"
<内存地址>=gethostbyname("www.lab.glasscom.com");
调用解析器后,解析器会向DNS服务器发送查询消息,然后DNS服务器会返回响应消息
响应消息中包含查询到的IP地址,解析器会取出IP地址,并将其写入浏览器指定的内存地址中
浏览器在向Web服务器发送消息时,只要从该内存地址取出IP地址,并将它与HTTP请求消息
一起交给操作系统就可以了
根据域名查询IP地址时,浏览器会使用Socket库中的解析器
- 解析器的内部原理
http消息是用文本编写的,但DNS消息是使用二进制数据编写的
发送消息(请告诉我该网址的IP地址)这个操作并不是由解析器自身来执行,而是
要委托给操作系统内部协议栈来执行(图中画的是UDP 不确定),这是因为解析器本身不具备使用网路
收发数据的功能
Web服务器已经在DNS服务器上注册---->IP地址会被写入响应消息并返回给客户端
--->经过协议栈被传递给解析器--->解析器读取出消息取出IP地址--->IP地址给应用程序
向DNS服务器发送消息时,我们当然也需要知道DNS服务器的IP地址。只不过这个IP地址是作为TCP/IP
的一个设置项目事先设置好,不需要再去查询了
全世界DNS服务器的大接力
- DNS服务器的基本工作
来自客户端的查询消息包含3种信息
(a)域名
服务器、邮件服务器(邮件地址中@后面的部分)的名称
(b)Class
IN,已经没啥用了
(c)记录类型
表示域名对应何种类型的记录。
当类型为A时,表示域名对应的是IP地址
当类型为MX时,表示域名对应的是邮件服务器
DNS服务器会从域名与IP地址的对照表中查询相应的记录,并返回IP地址
- 域名的层次机构
- 寻找相应的DNS服务器并获取IP地址
客户端首先会访问最近的一台DNS服务器--->将来自客户端的查询消息转发给根域DNS服务器的信息
--->根据域名结构返回所管理的com域中的DNS服务器的IP地址--->返回下一级域名
--->查询到DNS并返回给客户端
- 通过缓存加快DNS服务器的响应
在真实的互联网中,一台DNS服务器可以管理多个域的信息,上级域和下级域可能共享同一台DNS
服务器
其实并不需要从最上级的根域开始查找,因为DNS服务器有一个缓存功能
查询可以从缓存的位置开始向下进行
tips:信息被缓存后,原本的注册信息可能会发生改变,这时缓存中的信息就有可能是不正确的
DNS服务器中保存的信息都设置有一个有效期,超过有效期后,数据会从缓存中删除
委托协议栈发送消息
- 数据收发操作概要
向操作系统内部的协议栈发出委托时,需要按照指定的顺序来调用Socket库中的程序组件
收发数据操作需要建立管道,管道出入口即套接字
收发数据4个阶段:
(1)创建套接字(创建套接字阶段)
(2)将管道连接到服务器端的套接字上(连接阶段)
(3)收发数据(通信阶段)
(4)断开管道并删除套接字(断开阶段)
- 创建套接字阶段
客户端创建套接字的操作非常简单,只要调用Socket库中的socket程序组件就可以了
应用程序是通过"描述符"来识别套接字的
- 连接阶段:把管道接上去
委托协议栈将客户端创建的套接字与服务器那边的套接字连接起来
通过调用Socket库中的名为connect的程序组件来完成这一操作,需要指定三个参数(描述符 服务器IP地址 端口号)
tips:
描述符:应用程序用来识别套接字的机制
IP地址和端口号:客户端和服务器之间用来识别对方套接字的机制
- 通信阶段:传递消息
应用程序在内存中准备好要发送的数据--->根据网址生成的HTTP请求消息就是要发送的数据
--->调用Socket库中的write组件(需指定描述符和发送数据)--->协议栈将数据发送到服务器上
接收消息:通过Socket库中的read程序组件委托协议栈完成的(指定存放消息的内存地址)
- 断开阶段:收发数据结束
Web使用HTTP协议规定,当Web服务器发送完响应消息后,应该主动执行断开操作