我们之前也学过运输层为应用进程提供端到端的通信服务,但不同的网络应用的应用进程之间,还需要有不同的通信规则,因此在运输协议之上,还需要有应用层协议。
应用层协议应当定义:
1、应用进程交换的报文类型,如请求报文和响应报文
2、各种报文类型的语法,如报文中的各个字段及详细描述
3、字段的语义,即包含在字段中的信息的含义
4、进程何时、如何发送报文,以及对报文进行响应的规则
一、域名系统DNS——从域名解析出IP地址
(一)域名系统概述
1、什么是域名系统?
域名系统DNS是因特网使用的命名系统,用来把便于人们使用的机器名字转换为IP地址
2、我们都知道,用户与因特网上某个主机进行通信时,必须要知道对方的IP地址,但是用户很难记住这个32位二进制主机地址,即使是点分十进制也不容易记住,所以我们在应用层为了方便记忆我们一般使用的是主机名字,(
是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系.
)但机器非常容易处理定长IP地址。
举个栗子:这就相当于我们每个人都有自己的省份证号以唯一标识自己身份,但是我们一般使用的还是自己的名字,因为方便记忆,你总不会在介绍自己的时候说自己是610528.....吧?一样的道理
为什么机器在处理IP数据报时要是用IP地址还不直接使用域名呢?
因为IP地址的长度是固定的32位如多是(IPV6地址,那就是128位,也是定长的),而域名的长度并不是固定的,机器处理起来比较麻烦。
【注】IPV4与IPV6的区别:
IPV4地址长度是32,支持的物理地址是2^32-1个地址;
IPV6地址长度是128,支持的物理地址是2^128-1个地址;
IPV4怎么升级到IPV6?
目前有三种主流方案,分别是双栈计数、隧道计数、GRE隧道和手动隧道IPV6 over IPV4,对于普通用户我们完全不用担心,按时更新系统就可以了
3、域名系统DNS采用层次树状结构的命名方法
4、域名到IP地址的解析过程如下:(主机名--->IP地址)
(1)应用进程调用解析程序,成为DNS的一个客户
(2)待解析的域名放在DNS请求报文中
(3)以UDP用户数据报文方式发给本地域名服务器(使用UDP是为了减少开销)
(4)本地服务器在查找域名后,把对应IP地址放在回答报文中返回,应用进程获得目的主机的IP地址后即可进行通信
例子:计算机pepper要访问www.erok.org
具体过程解析:
(1)向DNS服务器查询IP地址
(2)由于kusa的DNS服务器并不知道www.erok.org的IP地址是什么,所以向根域名服务器请求进行查询
(3)由于根域名服务器知道 www.erok.org的IP地址,因此将地址返回
(4)向 erok.org的域名服务器查询www.erok.org的IP地址
(5)将查到的IP地址返回给客户端
(6)pepper开始与ww.erok.org进行通信
5、因特网的域名结构--->层次树状结构的命名方法
(1)就象全球邮政系统和电话系统一样,采用这种命名方法,任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即
域名;
(2)这里的
域是名字空间中一个可被管理的划分,域可划分为子域,子域骇客继续划分子域的子域,这样就行成了顶级域、二级域、三级域等等
(3)域名是分层结构,域名服务器也好死对应的层级结构
每个层的域名上都有自己的域名服务器,最顶层的是根域名服务器
每一级域名服务器都知道下级域名服务器的IP地址
为了容载,每一级至少设置两个或以上的域名服务器
二、HTTP协议--->超文本文件传输
1、URL统一资源定位符,俗称“网址”
(1)用来表示从因特网上得到的资源位置和访问这些资源的方法
(2)URL相当于一个文件名在网络范围的扩展,一般格式如下:
<协议>://<主机>:<端口>/<路径>
(3)我们经常使用的协议:http协议(超文本文件传输协议)和ftp(文件传输协议)
2、使用HTTP的URL
(1)一般格式:http://<主机>:<端口>/<路径>
(2)HTTP协议的默认端口号是80,通常可省略
3、HTTP的报文结构
HTTP是面向文本的,因此在报文中的每一个字段都是一些ASCII码串,因而各个字段的长度都是不确定的
(1)HTTP有两类报文:
- 请求报文——从客户向服务器发送请求报文
- 响应报文——从服务器到客户的回答
(2)
一个HTTP请求报文由开始行、首部行、空行和请求数据4个部分组成。
可以看出,这两种报文格式的区别就在于开始行不同,下面介绍这几个部分
- 开始行:用于区分是请求报文还是响应报文
- 首部行:用来说明浏览器、服务器或报文主体的一些信息,首行可以有很多行,但也可以不使用,在每一个首部行中都有首部字段名和它的值,每一行在结束的地方都要有“回车”和“换行”。
- 空行:首部行结束之后,用来将首部行和实体主体分开
- 实体主体:在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段
(3)下面来介绍HTTP请求报文中的方法:
请求报文的第一行“请求行”只有三个内容:方法、请求资源的URL和HTTP的版本
- 方法:通俗点讲就是对请求的对象进行的操作,实际上就是一些命令,下面介绍几种常用的方法
(4)响应报文中的状态码
每一个请求报文发出后,都能收到一个响应报文。响应报文的第一行就是状态行
状态行包括三项内容:HTTP的版本、状态码和解释状态码的简单短语
(5)HTTP常见Header
- Content-Type:数据类型(test/html等)
- Content-Length:Body的长度
- Host:客户端告知服务器,所请求的资源是在哪个主机的哪个端口上
- User-Agent:声明用户的操作系统和浏览器版本信息;
- referer:当前页面是从哪个页面跳转过来的
- lacation:搭配3xx状态码使用,告诉客户端下来要去哪里访问
- Cookie:用于在客户端存储少量信息。通常用于实现会话的功能
【经典面试题】当你在浏览器地址栏输入一个URL后回车,将会发生什么事情?
课本上P252页是这么讲的
假设你输入的URL是 http://www.tsinghua.edu.cn/chn/yxsz/index.htm
在HTTP/1.0更具体的说明用户点击鼠标后所发生的几个事情:
(1)浏览器分析链接指向页面的URL
(2)浏览器向DNS请求解析 www.tsinghua.edu.cn的IP地址
(3)域名系统DNS解析出清华大学服务器中的IP地址为166.111.4.100
(4)浏览器与服务器建立TCP连接(在服务器段IP地址为166.111.4.100,端口为80)
(5)浏览器发出取文件命令:GET/chn/yxsz/index.htm
(6)服务器 www.tsinghua.edu.cn给出响应,把文件index.htm发送给浏览器
(7)释放TCP连接
(8)浏览器显示“清华大学院系设置”文件index.htm中的所有文本
其实可以更详细点,我们尝试着走一遍~
(1)首先,你在浏览器中输入要访问的网址:例如:输入百度网址
(2)浏览器查找域名的IP地址
导航的第一步是通过访问的域名找到IP地址。DNS查找过程如下:
- 浏览器缓存——浏览器会缓存DNS记录一段时间。有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存各自固定的一个时间(2分钟到30分钟)
- 系统缓存——如果在浏览器缓存里没有找到需要的时间,浏览器会左一个系统调用(window里是gethostbyname),这样便可获得系统缓存中的记录
- 路由器缓存——接着,前面的查询请求发向路由器,他一般会有自己的DNS缓存
- ISP DNS缓存——接下来check的就是ISP缓存DNS的服务器,在这一般都能找到相应的缓存记录
- 递归搜索——你的ISP的DNS服务器从根域名服务器开始进行递归搜索,从.com顶级域名服务器到baidu的域名服务器。一般DNS服务器的缓存中会有.com域名服务器中的域名,所以到顶级域名服务器的匹配过程不是那么必要了
域名到IP地址的解析过程如下
- 用户主机上运行着DNS的客户端,就是我们的PC机或者手机客户端运行着DNS客户端了
- 浏览器将接收到的url中抽取出域名字段,就是访问的主机名,并将这个主机名传送给DNS应用的客户端
- DNS客户端向DNS服务器段发送一个查询报文,报文中包含着要访问的主机名字段
- 该DNS客户机最终会收到一份回答报文,其中包含该主机名的IP地址
- 一旦该浏览器收到来自DNS的IP地址,就可以向该IP地址定位的HTTP服务器发起TCP连接
(3)浏览器给web服务器发送一个HTTP请求
(4)百度服务器的永久性重定向响应
(5)浏览器跟踪重定向地址
(6)服务器“处理”请求
(7)服务器发回一个HTML响应
(8)浏览器开始显示HTML
(9)浏览器发送获取嵌入在HTML中的对象
(10)浏览器发送异步(AJAX)请求
具体参考 https://blog.csdn.net/wuhenliushui/article/details/20038819/