计算机网络Day6-应用层协议

前言

这一篇文章主要讲述的是应用层协议的几个协议 —— DNS 、 HTTP 和 DHCP


DNS协议

域名(domain name)是IP地址的代号。域名通常是由字符构成的。对于人类来说,字符构成的域名,比如www.yahoo.com,要比纯粹数字构成的IP地址(106.10.170.118)容易记忆。域名解析系统(DNS, domain name system)就负责将域名翻译为对应的IP地址。在DNS的帮助下,我们可以在浏览器的地址栏输入域名,而不是IP地址。

另一方面,处于维护和运营的原因,一些网站可能会变更IP地址。这些网站可以更改DNS中的对应关系,从而保持域名不变,而IP地址更新。由于大部分用户记录的都是域名,这样就可以降低IP变更带来的影响。



DNS服务器

域名和IP地址的对应关系存储在DNS服务器(DNS server)中。所谓的DNS服务器,是指在网络中进行域名解析的一些服务器(计算机)。这些服务器都有自己的IP地址,并使用DNS协议(DNS protocol)进行通信。DNS协议主要基于UDP,是应用层协议

DNS服务器构成一个分级(hierarchical)的树状体系。一次DNS查询就是从树的顶端节点出发,最终找到相应末端记录的过程。



域名解析顺序:

中间节点根据域名的构成,将DNS查询引导向下一级的服务器。比如说一个域名cs.berkeley.edu,DNS解析会将域名分割为cs, berkeley, edu,然后按照相反的顺序查询(edu, berkeley, cs)。出口DNS首先根据edu,将查询指向下一层的edu节点。然后edu节点根据berkeley,将查询指向下一层的berkeley节点。这台berkeley服务器上存储有cs.berkeley.edu的IP地址。所以,中间节点不断重新定向,并将我们引导到正确的记录。

在整个DNS查询过程中,无论是重新定向还是最终取得对应关系,都是用户计算机和DNS服务器使用DNS协议通信。用户计算机根据DNS服务器的反馈,依次与下一层的DNS服务器建立通信。用户计算机经过递归查询,最终和末端节点通信,并获得IP地址。



DNS缓存

用户计算机的操作系统中的域名解析模块(DNS Resolver)负责域名解析的相关工作。任何一个应用程序(邮件,浏览器)都可以通过调用该模块来进行域名解析。

并不是每次域名解析都要完整的经历解析过程。DNS Resolver通常有DNS缓存(cache),用来记录最近使用和查询的域名/IP关系。在进行DNS查询之前,计算机会先查询cache中是否有相关记录。这样,重复使用的域名就不用总要经过整个递归查询过程。



HTTP协议:

我们在TCP流通信中说明了,TCP协议实现了数据流的传输。然而,在实践中发现,人们往往习惯以文件为单位传输资源,比如文本文件,图像文件,超文本文档(hypertext document)。超文本文档中包含有超链接,指向其他的资源。

HTTP协议是应用层协议,它随着万维网发展起来。其本质目的是,如何在万维网的网络环境下,更好的使用TCP协议(尽管HTTP协议也可以用UDP协议作为底层,但绝大部分都是基于TCP协议),以实现超文本文件的传输。

也就是说,HTTP实现数据的传输。



HTTP交互过程

HTTP交互是典型的C/S架构。

HTTP协议的通信是一次request-responce交流。客户端(guest)向服务器发出请求(request),服务器(server)回复(response)客户端。

客户机服务器交互过程

通过上图一问一答式的交互,就完成了资源请求与资源响应。HTTP协议规定了请求和回复需要遵循的格式。请求和回复需要满足下面的格式:

1
2
3
4
5
起始行(start line)

头信息(headers)

主体(entity body)
  • 请求的起始行表示“想要什么”。回复的起始行表示”响应的简要信息”。

  • 头信息可以有多行。每一行是一对键值对(key-value pair)

  • 主体部分包含了具体的资源,这是个GET请求 (请求是可以有主体内容的,但前期是POST请求)。回复中包含的主体是一段文本文字(Hello World!)。


请求报文:

我们深入一些细节。先来看一下请求报文的详细情况:

1
2
GET /index.html HTTP/1.1    # 起始行
Host:www.example.com # 头信息
  1. 起始行 : GET /index.html HTTP/1.1
  • 声明是GET方法
  1. 头信息 :Host:www.example.com

该头信息的名字是Host。HTTP的请求必须有Host头信息,用于说明服务器的地址和端口。HTTP协议的默认端口是80,如果在HOST中没有说明端口,那么将默认采取该端口。



响应报文:

服务器在接收到请求之后,会根据程序,生成对应于该请求的回复,比如:

1
2
3
HTTP/1.1 200 OK            # 起始行
Content-type: text/plain # 头部字段标识
Hello World! # 响应内容

一、起始行:

  • HTTP/1.1 协议版本
  • 200 状态码(status code)。
  • OK 状态描述

OK是对状态码200的文字描述,电脑只关心三位的状态码(status code),200 表示访问正常

二、头部字段标识:Content-type:说明了主体所包含的资源的类型。

三、响应内容:服务器响应的内容主要信息都存放于此。如果请求一个网页,它的响应体就是网页的HTML代码,或者是Json格式的数据;请求一张图片,它的响应体就是图片的二进制数据。



HTTP无状态

根据早期的HTTP协议,每次request-reponse时,都要重新建立TCP连接。TCP连接每次都重新建立,所以服务器无法知道上次请求和本次请求是否来自于同一个客户端。因此,HTTP通信是无状态(stateless)的。服务器认为每次请求都是一个全新的请求,无论该请求是否来自同一地址。

详细的 HTTP 协议介绍 可以阅读 我之前的爬虫文章:


DHCP协议:

DHCP协议用于动态的配置电脑的网络相关参数,如主机的IP地址,路由器出口地址、DNS域名服务器地址等。一台电脑只要接上网,就可以通过DHCP协议获得相关配置(例如IP地址等配置信息)

DHCP协议全称为“动态主机设置协议”(Dynamic Host Configuration Protocol)。

通常来说,普通电脑中都内置有DHCP客户端模块。电脑接上网络后,DHCP客户端发现新连通的网络,会在该网络上找DHCP服务器。DHCP服务器将给电脑提供合理的网络配置,并把设置信息传回本机。本机和DHCP服务器之间的通信,都是通过DHCP协议进行的。



地址分配

DHCP服务器的首要任务是分配IP地址。分配的IP地址要符合以下原则:

  • 地址合理,即对应该局域网的IP地址和子网掩码。

  • 地址空闲,同一网络下没有其他设备使用该地址。


地址池

DHCP服务器上存有一个地址池,里面是可用的IP地址,当有一台主机接入该局域网时,DHCP服务器就会从地址池中取出一个IP地址分配给主机。此外,服务器还会说明IP地址的占用时间,也就是“租期”

当然,主机使用网络的时间可能超过租期。如果主机在租期到时都没有联系DHCP服务器,那么DHCP服务器会收回IP地址,再分配给其他主机。可如果主机想继续使用IP地址,就要在中途申请延长租期。收到申请的DHCP服务器通常会答应主机的请求,允许它继续使用现有IP地址。


DHCP通信过程

DHCP协议的底层是UDP协议。使用UDP的广播,把UDP数据包发送到网络的广播地址,网络上的每个设备都能收到。因此,DHCP通信主要靠这种广播的形式进行。


DHCP通信分为四步:

  1. 客户机发广播,搜寻DHCP服务器(一个网段不一定只有一台DHCP服务器)。
  2. DHCP服务器发出Offer报文,提供一个可用的IP地址。
  3. 客户机携带该IP地址发出Request报文请求。
  4. DHCP服务器回复ACK报文进行确认,并提供其他配置参数。



应用层通信

应用层通信可以理解为两种情景:

①C/S架构(又称客户端/服务端)

有一个总打开的主机称为服务器,他服务于来自多方的客户端,服务器有个最大的特征,就是IP大多数情况下是固定的,客户机通过域名、IP进行访问服务(具有C/S架构特别典型的例子就是FTP、Telnet)

我们上面讨论的协议都是基于这个架构。


②P2P架构(又称客户机/客户机)

这种通信不必通过专门的服务器,应用程序在间断连接的主机之间使用直接通信,该体系称为对等方到对等方的(典型的P2P架构的例子是文件共享)。


软件都是在应用层协议工作,多数应用程序是由通信进程对组成,每对中的两个进程互发报文。两个进程之间通过套接字(传输层和应用层的接口)的软件接口向网络发送报文和网络接收报文。


PS:更多对socket的了解可以移步我之前写的网络编程系列:网络编程Day2-socket原理