hxf0 2019-06-29
终于来到了最上层,也是我们接触最多的一层 -- 应用层。
每个应用层协议都是为了解决某一类应用问题,而问题的解决又往往是通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的。应用层的具体内容就是规定应用进程在通信时所遵循的协议。
应用层的许多协议都是基于客户服务器方式。客户是服务请求方,服务器是服务提供方。
域名系统 DNS (Domain Name System)是互联网中一种面向主机及各项互联网服务的层次结构去中心化的命名系统。一般来说,它用于将难记的IP地址转化为好记的“地址栏”中我们看到的地址。
名字到IP地址的解析是由若干个域名服务器程序完成的。
一个域名服务器所负责管辖的(或有权限的)范围叫做“区” (zone)。一个区中的所有节点必须是能够连通的。
每个区设置相应的权限域名服务器,用来保存该区中的所有主机的域名到 IP 地址的映射。
每一个“域”中至少有一个(可以有多个)权限域名服务器,即每个“域”中可以有多个“区”。
上图说明了域名解析的一般过程,这其中要经过四种域名服务器:
①用户机通过迭代查询(Recursive Query)将请求发送给本地域名服务器;
②本地域名服务器向根域名服务器发起递归查询(Iterative Query),根域名服务器将下一步应当找的顶级域名服务器的 IP 地址告诉本地域名服务器;
③本地域名服务器继续向顶级域名服务器发起询问,得到下一步应当找的域名服务器IP地址。(有时这一步也会得到最终结果)
④本地域名服务器向下一个服务器发起询问,得到了最终结果,并返回给用户。
为了提高域名服务器的可靠性,DNS域名服务器会把数据复制到几个域名服务器来保存。其中的一个是主域名服务器(master server),其他的是辅助域名服务器(slave server)。
当主域名服务器出故障时,辅助域名服务器可以保证 DNS 的查询工作不会中断。
文件传送协议 FTP (File Transfer Protocol) 是互联网上使用得最广泛的文件传送协议。它提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限。
文件传送协议FTP只提供文件传送的一些基本的服务,它使用TCP可靠的运输服务。
FTP的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。
FTP在客户与服务器之间建立两个连接:“控制连接”和“数据连接”。
控制连接在整个会话期间一直保持打开,FTP 客户发出的传送请求通过控制连接发送给服务器端的控制进程,但控制连接不用来传送文件。
实际用于传输文件的是“数据连接”。服务器端的控制进程在接收到 FTP 客户发送来的文件传输请求后就创建“数据传送进程”和“数据连接”,用来连接客户端和服务器端的数据传送进程。
相对应的,服务器端和客户端都使用两个不同的端口号:
TFTP (Trivial File Transfer Protocol) 是一个很小且易于实现的文件传送协议,使用客户服务器方式且使用 UDP 数据报。(由于UDP不提供可靠传输,故TFTP需要有自己的差错改正措施)
TFTP协议中,发送方每发送完一个文件块后就等待对方的确认,确认中指明所确认的块编号。这一点很像停止等待协议。
TFTP的特点:
TELNET 是一个简单的远程终端协议,也是互联网的正式标准。
用户用 TELNET 就可在其所在地通过 TCP 连接注册(即登录)到远地的另一个主机上(使用主机名或 IP 地址)。
TELNET 能将用户的击键传到远地主机,同时也能将远地主机的输出通过 TCP 连接返回到用户屏幕。这种服务是透明的,因为用户感觉到好像键盘和显示器是直接连在远地主机上。
TELNET 也使用客户 - 服务器方式。在本地系统运行 TELNET 客户进程,而在远地主机则运行 TELNET 服务器进程。
TELNET工作过程
①TELNET客户端将用户的击键和命令转化成NVT(Network Virtual Terminal characters)格式,交送给本地的TCP/IP栈;
②NVT格式的文本在互联网中传递;
③TELNET服务器端将NVT文本转化成其操作系统所需的格式,并将其交给“伪终端”,使得这些命令像是从服务器端本地发出的。
对于万维网,我们绝对不陌生。“网上冲浪”多年,这片海还能不清楚吗?
不过对于这些我们或许已经很“熟悉”的概念,我们还需要以更专业的角度去再次认识。
万维网,简而言之,就是一个大规模的、联机式的信息储藏所。
万维网中的文件和其他网络资源都由统一资源定位符(URL)标志,并通过超链接(hypertext link)互相连接,是一种分布式超媒体 (hypermedia) 系统。
万维网以客户 - 服务器方式工作。
客户程序就是我们浏览网页使用的浏览器。
服务器程序则在万维网服务器(万维网文档所驻留的计算机)中运行。
客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所要的万维网文档。我们在主窗口上看到的万维网文档即为页面 (page)。
统一资源定位符(URL)是对可以从互联网上得到的资源的位置和访问方法的一种简洁表示。
一般浏览器都会在地址栏中显示当前页面的URL地址。
URL的语法:
URI = scheme:[//userinfo@]host[:port]path[?query][#fragment] URL = 协议类型:[//[访问资源需要的凭证信息@]服务器地址[:端口号]][/资源层级UNIX文件路径]文件名[?查询][#片段ID]
我们以下面这个URL为例来分析
https://www.youtube.com:443/results?search_query=bts
① https 是协议;
② www.youtube.com 是服务器地址;
③ :443 是服务器上的网络端口号(因为协议是HTTPS,所以使用端口443,而不是HTTP协议使用的80端口。这部分一般可以省略。)
④ /result 是路径
⑤ ?search_query=bts 是询问
这个URL地址所访问的页面一目了然:在youtube网站中搜索“bts”的相关内容。
现在大部分的浏览器为了方便用户,都会帮忙将URL补全,所以你只需要在地址栏中键入segmentfault.com,浏览器就会自动将URL补全成 https://segmentfault.com
HTTP是面向事务的(transaction-oriented)应用层(客户 - 服务器)协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。
HTTP协议本身是无连接的,不过它使用面向连接的 TCP 向上提供的服务。
上图说明了我们使用浏览器浏览一个网页时万维网的一般过程。
下面用一个例子具体的说明一下“在浏览器上点击一个URL”后具体发生了什么:
用户点击https://www.baidu.com/index.html
① 浏览器分析超链接指向页面的URL;
② 浏览器向 DNS 请求解析 www.baidu.com (host)的IP地址;
③ 域名解析系统DNS解析出百度服务器的IP地址;
④ 浏览器与服务器建立TCP连接;
⑤ 浏览器发出取文件指令 GET index.html;
⑥ 服务器发出响应,把文件index.html发给浏览器;
⑦ TCP连接释放
⑧ 浏览器显示百度首页文件index.html中的所有文本。
HTTP的报文分为两类:
由于HTTP是面向正文的(text-oriented),因此在报文中的每一个字段都是一些 ASCII 码串,因而每个字段的长度都是不确定的。
请求报文由以下部分组成
请求行格式:
方法(method) URL 版本 (换行)
比如:
GET /index.html HTTP/1.1
“方法”是面向对象技术中使用的专门名词。所谓“方法”就是对所请求的对象进行的操作,因此这些方法实际上也就是一些命令。
方法(method) | 含义 |
---|---|
GET | 请求读取由URL所标志的信息 |
HEAD | 请求读取由URL所标志的信息的首部 |
POST | 给服务器添加信息(例如,注释) |
PUT | 在指明的URI下存储一个文档 |
DELETE | 删除指明的资源 |
TRACE | 用来进行环回测试的请求报文 |
OPTIONS | 请求一些选项的信息 |
CONNECT | 用于代理服务器 |
响应报文由以下部分组成
状态行格式:
版本 状态码 短语 (换行)
比如:
HTTP/1.1 200 OK
状态码都是三位数字:
- 1xx 表示通知信息的,如请求收到了或正在进行处理。
- 2xx 表示成功,如接受或知道了。
- 3xx 表示重定向,表示要完成请求还必须采取进一步的行动。
- 4xx 表示客户的差错,如请求中有错误的语法或不能完成。
- 5xx 表示服务器的差错,如服务器失效无法完成请求。
HTML语言,我认为与其说它是一种“编程”语言,更像是一种“设计”语言。
某种程度上,可以说和markdown的性质也是相似的。
HTML定义了许多用于排版的命令(即标签)。将这些标签嵌入到万维网的页面中,就构成了所谓的 HTML 文档。
HTML 文档是一种可以用任何文本编辑器创建的ASCII码文件。
当HTML文档以 .html 或 .htm 为后缀时,浏览器可以此文档的各种标签进行解释。
<HTML> <HEAD> <TITLE>这里是这个网页标题</TITLE> </HEAD> <BODY> <H1>正文的标题</H1> <P>这是第一个段落。</P> <P>这是第二个段落。</P> </BODY> </HTML>
是不是很简单。
关于HTML语言的教程,网上一找一大把,这里就不多赘述了。
亲手做出一个网页的成就感还是不小的!