上一节留下了一个问题,浏览器会不会直接访问到该地址?
虽然浏览器能够解析网址并生成HTTP消息,但是浏览器本身并不具备将消息发送到网络中的功能,这一步需要委托操作系统来完成。
在此之前,需要知道该把消息发到何处,需要一个地址,这个地址不是域名,而是IP地址,通过IP地址才可以找到所要发送的服务器的位置,从而将消息发送到服务器,所以在发送消息之前需要先根据域名去查询IP地址。(这里简单说明一下,发送者发出的消息首先会经过子网中的集线器,转发到举例发送者最近的路由器上,然后,路由器再根据消息的目的地判断下一个路由器的位置,将消息发送到下一个路由器,直到消息被发送到目的地)
如何根据域名去查询IP地址呢,当然是DNS啦。
DNS:Domian Naem System,域名服务系统。将服务器名称和IP地址进行关联
> 为什么不直接写ip,而要写服务器的名字呢?
由于ip很难记住
> 那为什么不全用服务器名称来确定通信对象呢?
ip的长度为32比特,也就是4字节,而域名需要几十甚至几百字节,增加了路由器的负担(而且由于域名长度不固定,处理起来更加复杂),所以让人使用名字,路由器使用ip
通过DNS查询IP地址的操作叫做域名解析,负责执行解析的操作叫做解析器,解析器实际上就是一段程序,它包含在操作系统的Socket库中,Socket库适用于调用网络功能的程序组件集合。
浏览器调用==解析器==,Socket库中的解析器开始运行,生成要发送给DNS服务器的查询消息,并将消息发送给DNS服务器(发送消息这个操作并不是由解析器自身完成的,需要委托给操作系统内部的协议栈来执行,协议栈是操作系统内部的网络控制软件,解析器与浏览器一样,本身不具备网络收发数据的功能),通过网卡将消息发送给DNS服务器,当DNS服务器收到查询消息后,根据消息中的查询内容进行查询(过程见后续),将IP地址写入响应消息并返回给客户端。消息经过协议栈被传递给解析器,然后解析器读取出消息取出IP地址,并将IP地址传递给浏览器
DNS服务器
基本工作 接收来自客户端的查询消息,根据消息的内容返回响应。
消息包含以下3种信息
- 域名
- Class
Class是用来识别网络的信息,当前除了互联网并没有其他的网络,所以Class的值永远是代表互联网的IN - 记录类型
表示域名对应何种类型的记录,对于不同的类型,服务器向客户端返回的信息也不同。
DNS服务器的基本工作就是根据需要查询的域名和记录类型查找相关的记录,并向客户端返回响应消息。
但是不可能所有的信息都放在一个DNS服务器上,所以DNS服务器进行分层
如域名 www.baidu.com www是最下级的,它的上级是baidu,在上级是com
将负责管理下级域的DNS服务器的IP地址注册到它的上级DNS服务器中,以此类推。
这样就可以通过上级DNS服务器查询出下级DNS服务器的IP地址,可以向下级DNS发送查询请求了。
协议栈
知道IP地址之后,这时候才开始真正的访问这个web服务器了,委托操作系统内部的协议栈向这个目标IP地址发送消息。
数据收发整体思路
1.服务器一方先创建套接字,然后等待客户端向该套接字连接管道
2.客户端创建一个套接字,从该套接字延伸出管道,连接到服务器端的套接字
3.双方套接字连接起来之后,可以开始通信了
4.数据发送完毕之后,连接的管道断开,管道连接时是由客户端发起的,断开可以任意一方发起
5.管道断开之后,套接字也会被删除,通信结束
网友评论