浏览器输入: www.baidu.com 就会出现百度的搜索页面。
发生了什么?
HTTP 协议
- 超文本传输协议(Hyper Text Transfer Protocol, HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端浏览器.
- HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.
Web 和 HTTP
- Web 是一种基于超文本和HTTP的、全球性的、动态交互的、跨平台的分布式图形信息系统
- 建立在Internet上的一种网络服务,为浏览者在Internet上查找和浏览信息提供了图形化的、易于访问的直观界面,其中的文档及超级连接将Internet上的信息节点组织成为一个互为关联的网状结构.
透过TCP/IP看HTTP
- HTTP协议是构建在TCP/IP协议之上的,是TCP/IP协议的一个子集
TCP/IP协议其实是一系列与互联网相关联协议的协议集合起来的总称
TCP/IP协议族分层
TCP/IP协议族是由一个四层协议组成的系统,分别为:应用层、传输层、网络层、和数据链路层。
应用层
一般是编写的应用程序,决定了向用户提供的应用服务。应用层可以通过系统调用与传输层进行通信。如:FTP、DNS、HTTP等。
传输层
传输层通过系统调用向应用层提供处于网络连接中的两台计算机之间的数据传输功能。在传输层有两个性质不一样的协议:TCP和UDP。
网络层
网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位。该层规定了通过怎样的路径(传输路线)到达对方计算机,并把数据包传输给对方。
数据链路层
数据链路层用来处理连接网络的硬件部分,包括控制操作系统、硬件设备驱动、NIC(Network Interface Card,网络适配器)以及光纤灯物理可见部分。硬件上的范畴均在链路层的作用范围之内.
数据包封装过程
HTTP数据传输过程
发送端发送数据时,数据会从上层传输到下层,且每经过一层都会被打上该层的头部信息。而接收端接收数据时,数据会从下层传输到上层,传输前把下层的头部信息删除
传输层三次握手
- 第一次握手: 客户端发送带有SYN标志的连接请求报文段,然后进入SYN_SEND状态,等待服务端的确认。
- 第二次握手:服务端接收到客户端的SYN报文段后,需要发送ACK信息对这个SYN报文段进行确认。同时,还要发送自己的SYN请求信息。服务端会将上述的信息放到一个报文段(SYN+ACK报文段)中,一并发送给客户端,此时服务端将会进入到SYN_RECV的状态。
- 第三次握手:客户端接收到服务端的SYN+ACK报文段后,会向服务端发送ACN确认报文段,这个报文段发送完毕之后,客户端和服务端都进入ESTABLISHED状态,完成TCP三次握手.
DNS域名解析协议
通常为们访问一个网站,使用的书主机名或者域名来进行访问的。因为相对于IP地址(一组纯数字),域名更容易让人记住。但TCP/IP协议使用的是IP地址进行访问,所以必须有个机制或者服务把域名转换为IP地址。DNS服务就是用来解决这个问题的,它提供域名到IP地址之间的解析服务.
DNS协议则是用来将域名转换为IP地址(也可以将IP地址转换为相应的域名地址)。
我们都知道,TCP/IP中使用的是IP地址和端口号来确定网络上某一台主机上的某一个程序,不免有人有疑问,为什么不用域名来直接进行通信呢?
- 因为IP地址是固定长度的,IPv4是32位,IPv6是128位,而域名是变长的,不便于计算机处理。
- IP地址对于用户来说不方便记忆,但域名便于用户使用,例如www.baidu.com 这是百度的域名.
总结一点就是IP地址是面向主机的,而域名则是面向用户的。
hosts文件
域名和IP的对应关系保存在一个叫hosts文件中。最初,通过互联网信息中心来管理这个文件,如果有一个新的计算机想接入网络,或者某个计算IP变更都需要到信息中心申请变更hosts文件。其他计算机也需要定期更新,才能上网。 但是这样太麻烦了,就出现了DNS系统。
DNS系统
- 一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系
- 如果新计算机接入网络,将这个信息注册到数据库中
- 用户输入域名的时候,会自动查询DNS服务器,由DNS服务器检索数据库,得到对应的IP地址
我们可以通过命令查看自己的hosts文件:
在域名解析的过程中仍然会优先查找hosts文件的内容。
DNS域名的层次分级
域名系统必须要保持唯一性。
为了达到唯一性的目的,因特网在命名的时候采用了层次结构的命名方法:
- 每一个域名(本文只讨论英文域名)都是一个标号序列(labels),用字母(A-Z,a-z,大小写等价)、数字(0-9)和连接符(-)组成
- 标号序列总长度不能超过255个字符,它由点号分割成一个个的标号(label)
- 每个标号应该在63个字符之内,每个标号都可以看成一个层次的域名。
- 级别最低的域名写在左边,级别最高的域名写在右边。
域名服务主要是基于UDP实现的,服务器的端口号为53。
关于域名的层次结构,如下图所示:
eg :我们熟悉的,www.baidu.com
- com: 一级域名. 表示这是一个企业域名。同级的还有 “net”(网络提供商), “org”(⾮非盈利组织) 等。
- baidu: 二级域名,指公司名。
- www: 只是一种习惯用法。
域名服务器
如果采用上述的树状结构,每一个节点都采用一个域名服务器,这样会使得域名服务器的数量太多,使域名服务器系统的运行效率降低。所以在DNS
中,采用划分区的方法来解决。
一个服务器所负责管辖(或有权限)的范围叫做区zone
。各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。每一个区设置相应的权限域名服务器,用来保存该区中的所有主机到域名IP地址的映射。总之,DNS
服务器的管辖范围不是以“域”为单位,而是以“区”为单位。区是DNS
服务器实际管辖的范围。区<=
域。
一般是有着:本地域名服务器 ->
权限域名服务器 ->
顶级域名服务器 ->
根域名服务器(从小到大)
分类 | 作用 |
根域名服务器 | 最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助 |
顶级域名服务器 | 负责管理在该顶级域名服务器下注册的二级域名 |
权限域名服务器 | 负责一个区的域名解析工作 |
本地域名服务器 | 当一个主机发出DNS查询请求时,这个查询请求首先发给本地域名服务器 |
域名解析过程
先看两个概念:
- 递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以 DNS 客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机
- 迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询。
具体的流程可描述如下:
- 主机
10.74.36.90
先向本地域名服务器10.74.1.11
进行递归查询
- 本地域名服务器采用迭代查询,向一个根域名服务器进行查询
- 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器
dns.me
的IP
地址
- 本地域名服务器向顶级域名服务器
dns.me
进行查询
- 顶级域名服务器
me
告诉本地域名服务器,下一步查询权限服务器dns.jocent.me
的IP
地址
- 本地域名服务器向权限服务器 ```dns.jocent.me`进行查询
- 权限服务器
dns.jocent.me
告诉本地域名服务器所查询的主机的IP
地址
- 本地域名服务器最后把查询结果告诉
10.74.36.90
。
一般 DNS 缓存放浏览器还是放系统
计算机中 DNS 记录在本地也有两种缓存方式:浏览器缓存和操作系统(OS)缓存。在浏览器中访问的时候,会优先访问浏览器缓存,如果未命中则访问 OS 缓存,最后再访问递归 DNS 服务器,然后递归 DNS 服务器会递归式的查找域名记录,然后返回结果。
回溯HTTP事务处理过程
当客户端访问Web站点时,首先会通过DNS服务查询到域名的IP地址。然后浏览器生成HTTP请求,并通过TCP/IP协议发送给Web服务器。Web服务器接收到请求后会根据请求生成响应内容,并通过TCP/IP协议返回给客户端.