应用层协议
应用层协议
2019年7月29日
13:22
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 Resolver)负责域名解析的相关工作。任何一个应用程序(邮件,浏览器)都可以通过调用该模块来进行域名解析。
并不是每次域名解析都要完整的经历解析过程。DNS Resolver通常有DNS缓存(cache),用来记录最近使用和查询的域名/IP关系。在进行DNS查询之前,计算机会先查询cache中是否有相关记录。这样,重复使用的域名就不用总要经过整个递归查询过程。
反向DNS
上面的DNS查询均为正向DNS查询:已经知道域名,想要查询对应IP。而反向DNS(reverse DNS)是已经知道IP的前提下,想要查询域名。反向DNS也是采用分层查询方式,使用一个IP地址获取该域名的过程
HTTP交互过程
HTTP协议的通信是一次request-responce交流。客户端(guest)向服务器发出请求(request),服务器(server)回复(response)客户端。

通过上面一问一答的交互,就完成了资源请求与资源响应。HTTP协议规定了请求和回复需要遵循的格式。请求和回复需要满足下面的格式:
起始行 (start line)
头信息 (headers)
主体(entity body)
起始行只有一行。它包含了请求/回复最重要的信息。请求的起始行表示“想要什么”。回复的起始行表示”响应的简要信息”。
头信息可以有多行。每一行是一对键值对(key-value pair),比如:
Content-type: text/plain 它表示,包含有一个名为Content-type的参数,该参数的值为text/plain。头信息是对起始行的补充。请求的头信息对服务器有指导意义
主体部分包含了具体的资源。上图的请求中并没有主体,因为这是个GET请求 (请求是可以有主体内容的)。回复中包含的主体是一段文本文字(Hello World!)。
请求:
我们深入一些细节。先来看一下请求:
GET /index.html HTTP/1.1
Host: www.example.com
在起始行中,有三段信息:
- GET 方法。用于说明想要服务器执行的操作。
- /index.html 资源的路径。这里指向服务器上的index.html文件。
HTTP/1.1 协议的版本。HTTP第一个广泛使用的版本是1.0,当前版本为1.1。
GET方法可以用于传输一些不重要的数据。它是通过改写URL的方式实现的。GET的数据利用URL?变量名=变量值的方法传输。比如向http://127.0.0.1发送一个变量“q”,它的值为“a”。那么,实际的URL为http://127.0.0.1?q=a。服务器收到请求后,就可以知道”q”的值为”a”。
GET方法之外,最常用的是POST方法。它用于从客户端向服务器提交数据。使用POST方法时,URL不再被改写。数据位于http请求的主体。POST方法最用于提交HTML的form数据。服务器往往会对POST方法提交的数据进行一定的处理,比如存入服务器数据库。
样例请求中有一行头信息。该头信息的名字是Host。HTTP的请求必须有Host头信息,用于说明服务器的地址和端口。HTTP协议的默认端口是80,如果在HOST中没有说明端口,那么将默认采取该端口。
响应:
服务器在接收到请求之后,会根据程序,生成对应于该请求的回复,比如:
HTTP/1.1 200 OK
Content-type: text/plain
Content-length: 12
Hello World!
回复的起始行同样包含三段信息HTTP/1.1 协议版本
- 200 状态码(status code)。
- OK 状态描述
OK是对状态码200的文字描述,它只是为了便于人类的阅读。电脑只关心三位的状态码(status code),即这里的200。200表示一切OK,资源正常返回。状态码代表了服务器回应动作的类型。
其它常见的状态码还有:
302,重新定向(redirect): 我这里没有你想要的资源,但我知道另一个地方xxx有,你可以去那里找。
404,无法找到(not found): 我找不到你想要的资源,无能为力。 (重新定向时,客户端可以根据302的建议前往xxx寻找资源,也可以忽略该建议。)
Content-type说明了主体所包含的资源的类型。根据类型的不同,客户端可以启动不同的处理程序(比如显示图像文件,播放声音文件等等)。下面是一些常见的资源:
- text/plain 普通文本
- text/html HTML文本
- image/jpeg jpeg图片
image/gif gif图片
Content-length说明了主体部分的长度,以字节(byte)为单位。
无状态
根据早期的HTTP协议,每次request-reponse时,都要重新建立TCP连接。TCP连接每次都重新建立,所以服务器无法知道上次请求和本次请求是否来自于同一个客户端。因此,HTTP通信是无状态(stateless)的。服务器认为每次请求都是一个全新的请求,无论该请求是否来自同一地址。
DHCP协议:
DHCP协议用于动态的配置电脑的网络相关参数,如主机的IP地址,路由器出口地址、DNS域名服务器地址等。一台电脑只要接上网,就可以通过DHCP协议获得相关配置(例如IP地址等配置信息)
DHCP协议全称为“动态主机设置协议”(Dynamic Host Configuration Protocol)。通常来说,普通电脑中都内置有DHCP客户端模块。电脑接上网络后,DHCP客户端发现新连通的网络,会在该网络上找DHCP服务器。DHCP服务器将给电脑提供合理的网络配置,并把设置信息传回本机。所谓的DHCP服务器,其实就是一些运行有DHCP服务器端软件的特殊电脑。本机和DHCP服务器之间的通信,都是通过DHCP协议进行的。
地址分配
DHCP服务器的首要任务是分配IP地址。分配的IP地址要符合以下原则:地址合理,即对应该局域网的IP地址和子网掩码。
地址空闲,同一网络下没有其他设备使用该地址。
地址池
DHCP服务器上存有一个地址池,里面是可用的IP地址,当有一台主机接入该局域网时,DHCP服务器就会从地址池中取出一个IP地址分配给主机。此外,服务器还会说明IP地址的占用时间,也就是租期:
当然,主机使用网络的时间可能超过租期。如果主机在租期到时都没有联系DHCP服务器,那么DHCP服务器会收回IP地址,再分配给其他主机。可如果主机想继续使用IP地址,就要在中途申请延长租期。收到申请的DHCP服务器通常会答应主机的请求,允许它继续使用现有IP地址。
有了动态分配,DHCP服务器不但简化了网络配置过程,还可以有效利用IP地址资源。利用不断分配收回IP地址,实现地址的灵活分配使用,其利用率大大提高。
通信过程
DHCP协议的底层是UDP协议。使用UDP的广播,把UDP数据包发送到网络的广播地址,网络上的每个设备都能收到。因此,DHCP通信主要靠这种广播的形式进行。
DHCP通信分为四步:
- 客户机发广播,搜寻DHCP服务器(一个网段不一定只有一台DHCP服务器)。
- DHCP服务器发出Offer报文,提供一个可用的IP地址。
- 客户机携带该IP地址发出Request报文请求。
DHCP服务器回复ACK报文进行确认,并提供其他配置参数。

已使用 Microsoft OneNote 2013 创建。
