之前我们讲运输层的时候已经讲了运输层可以给不同进程之间通信,但我们还需要应用层原因是,许多 应用需要多个进程之间相互配合完成,所以应用层进程用来约束这些配合!
每个应用层协议用来解决一个问题
应用层的许多协议都是基于客户服务器方式 客户是请求方,服务器是服务提供方
最重要内容
1 域名系统DNS——从域名解析出IP地址
2 万维网和HTTP协议,以及万维网的两种不同的信息搜索引擎
3 电子邮件的传输过程,SMTP协议和POP3协议,IMAP协议使用的场合
4 动态主机配置协议DHCP的特点
5 网络管理的三个组成部分
6 系统调用和应用编程接口的基本概念
7 P2P文件系统
1 域名系统DNS
1.1 域名vsIP?
为什么给人们用域名?方便记忆,如baidu.com就比一串的IP好记
为什么给机器用IP?IP长度固定,方便机器处理
初期的时候,由于主机个数比较少,所以一台机器的hosts文件列出所有的域名和IP的对应关系,需要转换时查表即可。
目前计算机网络理论上也可以把所有的域名和IP的对应关系放到一个服务器中,但是问题是
1 地球上计算机过多,该服务器负荷太大
2 如果这台服务器出现问题,会导致整体的网络的瘫痪
所以提出树状结构的命名方法,并采用分布式的域名系统DNS(分布式就是分散的意思)这样即便某一台计算机出了问题,也不会导致整体出现问题
1.2 域名结构
域名一般由标号组成,标号间通过.分割
顶级域名,二级域名,三级域名……
顶级域名一般有
- 国家顶级域名 如cn表示中国,us表示美国,uk表示英国等等
- 通用顶级域名 如com表示公司企业,org表示非盈利组织
- 基础结构域名 arpa 用于反向域名解析
更高级的域名负责管理下属的域名
比如我国中国cn顶级域名下划分了41个二级域名(分为类别域名7个和行政区域名34个)
1.3 域名到IP的解析过程
先来了解域名服务器,即存放域名和IP对应的服务器
域名服务器
一个服务器所负责管辖的范围叫做区
各单位根据具体情况来划分自己管辖范围的区,但在一个区中的所有节点必须是联通的,每一个区设置相应的权限域名服务器用来保存该区中所有的主机的域名到IP地址的映射
域名服务器类型
根域名服务器
最重要的域名服务器,所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址,不管是哪一个本地域名服务器,在无法解析的时候,就首先求助于根域名服务器
在因特网上有13个不同IP地址的根域名服务器,从a到m
顶级域名服务器(TLD服务器)
这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS查询请求时,就给出相应的回答
权限域名服务器
负责一个区的域名服务器,当一个权限域名服务器还不能给出最后的查询回答时,就会告诉发出查询请求的DNS客户,下一步应当找哪一个权限域名服务器
本地域名服务器
每一个因特网服务器提供者ISP,或一个大学,都可以拥有一个本地域名服务器
为了提高域名服务器的可靠性,一般把数据复制到几个域名服务器来保存
域名解析这个过程是在多个域名服务器上的多个域名服务程序共同完成的
大概过程如下
某一个应用程序请求某域名的IP –》 生成DNS请求报文,发送给本地的域名服务器 –》如果本地可以查到的话,则返回回答报文,查不到的话就向其他域名服务器请求直到找到为止
解析过程
主机向本地域名服务器查询采用递归查询
本地服务器向根域名服务器查询采用迭代查询
名字的高速缓存,存放最近用到的
记录集合
mx记录
ns记录
ptr记录
2 文件传送协议
2.1 FTP 文件传输协议
FTP是使用最广的文件传输协议
FTP提供交互式的访问,允许客户指明文件的类型和格式,并允许文件具有存取权限
匿名访问通过anonymous实现
文件的传送并非很简单,原因是不同计算机厂商研制出的文件系统多达数百种,差别很大。主要体现在
1 计算机存储数据的格式不同
2 文件目录结构和文件命名规定不同
3 存取功能的命令不同
4 访问控制方法不同
所以我们的FTP核心就是要减少或消除在不同操作系统下处理文件的不兼容性
FTP使用客户服务器方式
FTP使用两个TCP连接,一个用于控制(21端口),一个用于数据传送(20端口),因而需要两个端口号,所以数据连接和控制连接不会乱
使用两个端口的另外好处是
1 使协议更加简单和实现
2 在传输文件时还可以利用控制连接
2.2 NFS 协议
NFS允许应用进程打开一个远地文件,并能在该文件的某一个特定位置开始读写数据
NFS可以使用户只复制一个大文件中的很小的片段
端口2049
2.3 简单文件传送协议 TFTP
特点
1 很小易于实现
2 由于很小所以TFTP只支持文件传输而不支持交互, TFTP没有一个庞大的命令集合
3 每次传输的数据有512字节,组成一个文件块,对块进行编号,从1开始,支持ASCLL码或二进制传送,可对文件进行读或写,使用很简单的首部
工作
1 很像停止等待协议,每发送完一个文件块就等待对方确认,收不到确认就重复发送PDU
2 TFTP端口号是69
三种协议比较
协议 | 特点 |
---|---|
FTP | 交互式,存取权限,建立副本 |
NFS | 交互式,存取权限,无副本 |
FTFP | 没有交互式,不进行身份验证 |
远程终端协议TRLNET
3 万维网WWW
万维网是一个分布式的超媒体系统,它是超文本系统的扩充
万维网将大量的信息分布在整个互联网
要核心解决几个问题
1 怎样标志分别分布在整个互联网的万维网文档——用URL
2 用什么样的协议实现万维网上的各种连接——用HTTP
3 怎样使得不同作者创作不同风格的万维网文档,都能在互联网上各种主机显示 使用HTML
4 怎么样使得用户能够方便找到需要的资源——用搜索工具
接下来分别探讨下面的问题
3.1 统一资源定位符URL
统一资源定位符是用来表示互联网资源的位置和获得的方法
一般组成如下
1 | 协议:// 主机名:端口/路径 |
协议就是通过何种方式获得该万维网文档
主机名就是存放文档主机的域名
其中端口往往被省略,因为对于特定协议,有些端口都是默认的,比如HTTP协议默认端口号为80
所以往往是如下的形式
1 | 协议://主机名/路径 |
很多时候都把前面的协议省去了,只保留了主机名
比如 baidu.com
完整应该是 http://baidu.com
3.2 超文本传送协议HTTP
定义了浏览器怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传输给浏览器
HTTP协议是无连接,无记忆状态的协议
无连接即不会提前建立连接
无状态协议,这意味着每个HTTP请求都是独立的,服务器不会在多次请求之间保留任何关于客户端的状态信息。每个HTTP请求都被视为一个独立的交互,服务器不会记住之前的请求或会话信息。
3.2.1 HTTP工作流程
如下
1 每个万维网网点都有一个服务器进程,它不断监听TCP端口80,以便发现是否有浏览器向它发送链接建立请求
2 监听到后,建立连接,浏览器向万维网服务器发出请求,服务器返回请求页面做相应。完成任务后,TCP就被释放了
对于早期的HTTP协议 HTTP/1.0,请求一个万维网文档耗费时间是文档传输时间加上两倍往返时间RTT(一个RTT用于建立TCP连接,另一个RTT用于请求和接收万维网文档)
这是它的一个缺点
因而HTTP/1.1 很好解决了这个问题,它使用了持续连接的方法,就是说万维网服务器在相应之后的一段时间依然保持这个连接
后来又提出升级版本 HTTP/2,将服务器的相应也变成了并行的,同时可以复用TCP连接的请求,
为了加快请求相应速度,往往会用到代理服务器,即将最近的一些请求和相应放到本地磁盘中
3.2.2 HTTP报文结构
HTTP两类报文
1 请求报文——从客户到服务器发送请求报文
2 相应报文——从服务器到客户的回答
HTTP请求报文由客户端发送给服务器,用于请求特定资源或执行特定操作。它通常包括以下部分:
请求行(Request Line): 包含了HTTP方法、请求的URI和HTTP协议版本。例如:
1
GET /index.html HTTP/1.1
以下是一些常见的HTTP请求方法:
- GET:用于请求服务器发送指定资源的内容。GET请求通常用于获取数据,不应该对服务器端数据产生影响。GET请求的参数通常附在URL的查询字符串中。
- POST:用于向服务器提交数据,通常用于创建新资源。POST请求将数据包含在请求体中,而不是URL中。
- PUT:用于请求服务器更新或替换指定的资源,通常用于更新已存在的资源。PUT请求将数据包含在请求体中,并且通常会覆盖原始资源。
- DELETE:用于请求服务器删除指定的资源。DELETE请求用于删除服务器上的资源。
- PATCH:用于对资源进行部分更新。与PUT不同,PATCH只更新资源的一部分,而不是整个资源。
- HEAD:类似于GET请求,但服务器只返回响应头部信息,而不返回实际内容。通常用于获取资源的元数据或检查资源是否存在。
- OPTIONS:用于获取服务器支持的HTTP方法和资源的信息。客户端可以使用OPTIONS请求来了解服务器允许哪些方法和资源访问。
- TRACE:用于测试与服务器之间的连接,客户端发送一个TRACE请求,服务器返回请求的内容,以便客户端可以查看请求在传输过程中是否被修改。
- CONNECT:通常用于创建与服务器的网络连接,通常用于代理服务器。
请求头部(Request Headers): 包含了一系列的键值对,用于传递关于请求的信息,如User-Agent、Host、Accept等。例如:
1
2
3Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html空行(Blank Line): 请求行和请求头之间有一个空行,用于分隔请求头部和请求体。
请求体(Request Body): 可选的部分,通常用于POST请求等情况,包含了要发送给服务器的数据。
- HTTP响应报文结构:
HTTP响应报文由服务器发送给客户端,用于回复客户端的请求。它通常包括以下部分:
状态行(Status Line): 包含了HTTP协议版本、状态码和状态描述。例如:
1
HTTP/1.1 200 OK
- HTTP状态码根据其首位数字分为五大类,每个类别都表示了不同的意义。这五大类是:
- 1xx(Informational,信息性状态码):这些状态码表示请求已被接收,正在处理或者需要进一步的操作。这些状态码通常不会在实际应用中经常见到,而更多用于HTTP协议的通信过程中。
- 2xx(Successful,成功状态码):这些状态码表示请求已成功被服务器接受、理解并处理。最常见的是200 OK,表示成功处理了请求。
- 3xx(Redirection,重定向状态码):这些状态码表示客户端需要采取额外的操作来完成请求。通常用于重定向到其他URL以获取请求的资源。
- 4xx(Client Error,客户端错误状态码):这些状态码表示客户端发送的请求有错误,无法被服务器理解或处理。最常见的是404 Not Found,表示请求的资源不存在。
- 5xx(Server Error,服务器错误状态码):这些状态码表示服务器在处理请求时发生了错误。最常见的是500 Internal Server Error,表示服务器内部发生了错误。
- HTTP状态码根据其首位数字分为五大类,每个类别都表示了不同的意义。这五大类是:
响应头部(Response Headers): 类似于请求头部,包含了一系列的键值对,用于传递关于响应的信息,如Server、Content-Type、Content-Length等。例如:
1
2
3Server: Apache
Content-Type: text/html
Content-Length: 1234空行(Blank Line): 状态行和响应头之间有一个空行,用于分隔响应头部和响应体。
响应体(Response Body): 包含了服务器返回的实际数据,例如HTML页面、JSON数据等。
3.2.3 HTTP服务器存放用户信息
之前讲到HTTP是无状态的,即不会保留客户端信息,但有些时候,服务器需要记住用户的信息,比如一个顾客要购买多件物品放入购物车,以便集中结账
这时候需要用到Cookie
工作流程如下:
创建Cookie: 服务器在HTTP响应中通过
Set-Cookie
头部字段创建Cookie,并将其发送到客户端浏览器。Cookie包含一个键值对,通常是一个名称和一个值,以及一些其他属性,如过期时间、域名、路径等。1
2Set-Cookie: username=johndoe; expires=Sat, 31 Dec 2023 23:59:59 GMT; path=/; domain=example.com; secure; HttpOnly
在上面的示例中,服务器创建了一个名为
username
的Cookie,它的值是johndoe
,并设置了过期时间、路径、域名等属性。存储Cookie: 一旦浏览器接收到Cookie,它会将Cookie存储在本地的Cookie存储中。这个存储通常是浏览器的内存或磁盘中的一个文件。
发送Cookie: 当浏览器向同一服务器发出后续HTTP请求时,它会将与该服务器相关的Cookie附加到请求的
Cookie
头部字段中。这使得服务器能够识别用户并访问之前存储的信息。服务器读取Cookie: 服务器在收到HTTP请求时,会检查请求的
Cookie
头部字段以获取相关的Cookie信息。这允许服务器识别用户,并根据需要执行特定的操作,如验证用户身份、提供个性化内容等。更新Cookie: 服务器可以在HTTP响应中更新或修改Cookie的内容,以便在客户端的下一次请求中反映这些更改。例如,服务器可以更新Cookie的过期时间或值。
3.3 超文本标记语言HTML
他不是协议,只是一种语言
HTML的基本概述:
- 标记语言: HTML是一种标记语言,它使用一系列的标签(标记)来描述文档的结构和内容。标签通常由尖括号
< >
包围,如<html>
、<head>
、<body>
等。 - 超文本: HTML的全名是”Hypertext Markup Language”,其中的”Hypertext”表示超文本。HTML允许文档中的内容之间建立超链接,用户可以通过点击链接来导航到其他页面或资源。
- 结构: HTML文档通常由多个部分组成,包括
<!DOCTYPE>
声明、<html>
元素、<head>
元素(包含文档的元数据信息)、<title>
元素(指定页面标题)、<body>
元素(包含页面的主要内容)等。 - 元素和属性: HTML由各种不同类型的元素组成,每个元素有其特定的含义和用途。元素可以包含其他元素,形成嵌套结构。元素通常具有属性,用于提供有关元素的额外信息。例如,
<a>
元素用于创建超链接,它可以包含href
属性,指定链接的目标URL。 - 文本内容: HTML用于定义文本内容,包括标题、段落、列表、表格、图像等。通过HTML标签,可以将文本格式化、分段、组织和呈现。
- 样式和布局: HTML通过标签定义文档的结构和内容,但通常需要使用CSS(Cascading Style Sheets)来定义页面的样式和布局。CSS允许开发人员控制文本和元素的外观,包括颜色、字体、大小、间距等。
- 交互性: HTML也可以与JavaScript一起使用,以实现页面的交互性和动态行为。JavaScript可以通过DOM(Document Object Model)访问和操作HTML元素,使用户能够与页面交互。
3.4 搜索工具
搜索引擎是一种用于查找和检索互联网上的信息的计算机程序或工具。它们允许用户输入关键词或查询,并返回与这些关键词相关的网页、文档、图片、视频和其他多媒体内容的搜索结果列表。搜索引擎在互联网上广泛使用,是人们获取信息、解决问题和进行研究的重要工具。