计算机网络:应用层
应用层:协议原理
如何创建一个新的网络应用?
- 编程:
- 应用在不同的端系统上运行:网络应用只在用户的设备或服务器上执行。
- 通过网络基础设施提供的服务,应用进程之间进行通信。例如,Web服务器软件与浏览器进行交互,传递网页数据。
- 网络核心没有应用层软件:
- 网络核心只负责数据传输:它不执行任何应用层软件,也不处理应用层功能。
- 网络应用只存在于端系统:所有应用功能和逻辑都在端系统中实现,不需要对网络核心进行改动。
- 快速的开发和部署:由于网络核心无需处理应用层逻辑,网络应用的开发和部署过程更为高效。
网络应用的体系结构
可能的应用架构:
- 客户-服务器模式 (C/S: Client/Server)
- 对等模式 (P2P: Peer-to-Peer)
- 混合模式:客户-服务器和对等体系结构的组合
C/S模式
服务器:
- 一直运行
- 固定的IP地址和周知的端口号(约定)
- 扩展性: 服务器场
- 数据中心进行扩展
- 扩展性差
客户端:
- 主动与服务器通信
- 与互联网有间接性的连接
- 可能是动态IP地址
- 不直接与其他客户端通信
问题:
- 传统的单一服务器架构可能存在扩展性限制。当负载增加时,单一服务器可能无法应对大量请求(达到一定阈值,性能断崖式下降)。
- 可靠性差:一台服务器负责大量客户端,一旦宕机,大量请求无法响应。
- 注意与P2P模式对比:随着用户规模增加,请求服务的节点增加,但是提供服务的节点也在增加,所以很容易扩容。
P2P
对等体(P2P)体系结构:
- 几乎没有一直运行的服务器:对等体体系结构中,节点通常不依赖于持续运行的中央服务器。
- 任意端系统之间可以进行通信:所有节点可以直接互相通信,无需中央控制。
- 每一个节点既是客户端又是服务器:每个节点同时承担请求和提供服务的功能。
- 自扩展性:新的Peer节点可以带来新的服务能力,并且也会引入新的服务请求。
- 参与的主机可能连接且可以改变IP地址:节点的IP地址可能会变化,网络连接情况也可能会变化。
- 难以管理:由于节点的动态性和分布性,对等体网络难以集中管理。
- 例子:Gnutella, 迅雷
混合模式(C/S+P2P)
Napster
-
文件搜索:集中
- 主机在中心服务器上注册其资源(主机的IP)。
- 主机向中心服务器查询资源位置。
-
文件传输:P2P
- 任意Peer节点之间进行文件传输。
即时通信
-
在线检测:集中
- 当用户上线时,向中心服务器注册其IP地址。
- 用户与中心服务器联系,以找到其在线好友的位置。
-
两个用户之间聊天:P2P
进程通信
-
进程:主机上运行的应用程序
- 在同一主机内,使用操作系统定义的进程间通信机制进行通信。
- 在不同主机上,通过交换报文(Message)来进行通信。
- 使用OS提供的通信服务。
- 按照应用协议交换报文。
- 依赖传输层提供的服务进行通信。
-
客户端进程:
- 负责发起通信请求。
-
服务器进程:
- 等待连接的进程。
-
注意:
-
P2P架构的应用也使用客户端进程和服务器进程之分。
在某个会话上,有请求和响应之分,因此也有客户端进程和服务器进程之分。当然,跨会话来说,一个进程可能是客户端进程,也可能是服务器进程。
-
分布式进程通信需要解决的问题
-
问题1:进程标识和寻址问题(服务用户)
应用进程需要标识自己(唯一的),而且需要具备寻址的作用。
-
措施:对进程进行编址
进程标识:为了接收报文,进程必须有一个标识,即服务接入点(SAP)。发送报文也需要标识,以便正确地发送到目标进程。
- 主机标识:每台主机都有一个唯一的32位IP地址。
- 协议:所采用的传输层协议
- 进程标识:仅有IP地址无法标识单个进程,因为在端系统上可能有许多应用进程在同时运行。为了区分不同进程,需要使用TCP/UDP的端口号(Port Numbers)。
传输层协议:
- TCP或UDP:进程间的通信依赖于传输层协议,如TCP(传输控制协议)或UDP(用户数据报协议)。
- 端口号:通过端口号来进一步区分在同一主机上的不同进程。端口号帮助将数据正确地路由到目标进程。
- 一些知名端口号的例子:
- HTTP: TCP 80
- Mail: TCP 25
- FTP: TCP 21
进程标识的组合:一个进程通过IP地址和端口号的组合来标识,这样可以唯一地指定端系统上的一个进程。
- 端节点(end point):本质上,两个主机之间的通信由两个端节点组成,每个端节点由主机的IP地址和端口号标识。
-
-
问题2:传输层-应用层提供服务的方式(服务)
应用层的下层提供的服务是什么形式?具体来说,就是socket和对应api。
-
位置:层间界面的服务接入点(SAP,例如 TCP/IP 的 socket)
-
形式:应用程序接口(API,例如 TCP/IP 的 socket API)
-
措施:传输层提供的服务-需要穿过层间的信息
层间接口必须携带的信息
-
要传输的报文(对本层来说:SDU)
-
谁传的:对方的应用进程的标识(IP+TCP/UDP PORT)
-
传给谁:对方的应用进程的标识(同上)
-
层间接口:用于通信的层间接口通常需要明确的标识,以确保数据的正确传输。接口定义了如何通过网络协议传递信息。
传输层实体(TCP或UDP实体)
-
根据这些信息进行报文段的封装
-
源端口号,目标端口号,数据等
-
将IP地址往下交给IP实体,用于封装IP数据报(源IP、目标IP)
Socket API 传输报文信息:
-
如果每次通过Socket API传输报文时都附加额外的信息,可能会导致操作复杂、容易出错,并且不便于管理。
-
Socket 标识通信:
-
使用一个代号来标识通信的双向或单向连接,称为socket。
-
类似于操作系统打开文件时返回的句柄,socket也可以被视为对通信端点的标识符。
-
TCP Socket:
-
连接建立:在TCP服务中,两个进程之间的通信需要在开始之前建立连接。进程间通信会持续一段时间,通信关系稳定。
-
连接标识:可以使用一个唯一标识符(一个整数)来表示两个通信实体之间的连接。之后使用这个整数就表示了这样一个socket。
-
传输信息:通过层间接口传输的信息较少,简化了数据传输过程。
-
TCP Socket 细节:
-
IP 地址和端口:TCP socket使用源IP地址、目标IP地址、源端口号和目标端口号来标识通信的端点。(四元组)
TCP 之上的套接字(Socket):
- 4元组标识:对于使用面向连接服务(TCP)的应用而言,套接字是四元组的一个具有本地意义的标识。
- 会话标识:这个4元组唯一指定了一个会话,即两个进程之间的通信关系。
- 通信使用:通过这个4元组,应用程序可以与远程应用进程进行通信,而不需要在每次发送报文时都指定这4元组。
- 简化管理:使用这种标识方式使得通信管理更加简便和高效。
-
-
-
问题3:如何使用传输层提供的服务,实现应用进程之间的报文交换(服务用户使用)
收到报文时应该做出什么动作?因此要定义协议、编程实现。
- 定义应用层协议:报文格式、解释、时序等
- 编写程序,使用操作系统提供的 API,调用网络基础设施提供的通信服务传输报文,实现应用时序等
- 措施:
Web-and-HTTP
web是应用,HTTP是支持应用的协议
术语
-
Web页:由多个对象组成。
- 对象可以是HTML文件、JPEG图像、Java小程序、声音剪辑文件等。
-
基本HTML文件:包含对若干对象的引用(链接)。
-
URL(统一资源定位符):通过URL引用每个对象。
- 访问协议、用户名、口令、端口等信息。
-
URL格式:
1
protocol://user:password@www.someschool.edu/someDept/pic.gif:port
-
协议名、用户名、口令、主机名、路径、端口。
协议名:如http
用户名和口令:如果没有,说明是匿名访问
port:协议有默认端口,一般不需要提供
-
HTTP概况
-
HTTP:超文本传输协议
-
Web的应用层协议。
-
客户/服务器模式:
- 客户端:浏览器,负责请求、接收和显示Web对象。
- 服务器:Web服务器,负责响应请求并发送对象。
-
-
HTTP版本:
- HTTP 1.0:定义于RFC 1945。
- HTTP 1.1:定义于RFC 2068。
-
使用TCP
-
客户发起与服务器的TCP连接(建立套接字),使用端口号80。
服务器端总是有一个waiting socket
-
服务器接受客户的TCP连接。
-
浏览器(HTTP客户端)与Web服务器(HTTP服务器)交换HTTP报文(应用层协议报文)。
-
TCP连接关闭。
-
-
HTTP是无状态的
-
服务器不维护关于客户端的任何信息
因为维护状态的协议比较复杂,必须维护历史信息,如果C/S死机,可能导致两者的状态信息不一致,且无状态能支持更多客户端。
-
-
HTTP连接
非持久HTTP
- 每个TCP连接最多只传送一个对象。
- 下载多个对象需要建立多个TCP连接。
- HTTP/1.0使用非持久连接。
持久HTTP
-
相同客户端、服务器之间的后续请求和响应报文通过相同的连接进行传送。
-
多个对象可以在一个TCP连接上传输。
-
HTTP/1.1使用非持久连接。
-
流水/非流水方式
流水方式的持久HTTP:
- 客户端必须在收到前一个响应后才能发出新的请求。
- 每个引用对象都需要一个RTT。
流水方式的持久HTTP:
-
HTTP/1.1的默认模式。
-
客户端遇到引用对象时立即发出请求。
发出一个对象请求,在对象还没收到时,就发下一个对象的请求。
-
所有引用的小对象可能只需一个RTT。
-
请求报文
HTTP报文的两种类型:
- 请求报文和响应报文。
HTTP请求报文:
-
请求报文为ASCII格式(人类可读)。
-
请求行:包含HTTP方法(如GET、POST、HEAD)。
-
示例:
GET /somedir/page.html HTTP/1.1
GET:请求文件(head + body),也可以通过URL字段进行上载
POST:上载文件
HEAD:搜索引擎、爬虫等用,请求HTML对象的头部
DELETE:删除URL字段指定的文件
-
-
首部行(每一行是key-value):
Host: www.someschool.edu
User-agent: Mozilla/4.0
用户代理程序Connection: close
对象回来之后关闭连接Accept-language: fr
-
Entity Body:如果是
POST
则需要这部分 -
换行回车符:表示报文的结束(一个额外的换行回车符标志结束)。
-
响应报文
-
状态行
协议版本、状态码(如404)、相应状态信息
200:ok
301:moved permanently
400:bad request
404:not found
505:version not supported
-
首部行
-
实体
-
响应时间模型
往返时间 (RTT,round-trip time)
- RTT是指一个小分组从客户端到服务器并返回客户端的时间(忽略传输时间,因为是小分组)。
响应时间
非持久HTTP的情况,客户端请求一个对象需要的时间。
-
一个RTT用于发起TCP连接。
-
一个RTT用于发送HTTP请求并等待响应。
-
加上文件传输时间
总共为:2 RTT + 传输时间。
用户-服务器状态:Cookies
大多数主要门户网站使用Cookies的组成部分:
- 在HTTP响应报文中包含一个Cookie的首部行。
- 在HTTP请求报文中包含一个Cookie的首部行。
- 在用户端系统中保留一个Cookie文件,由用户的浏览器管理。
- 在Web站点有一个后端数据库,存储与该Cookie关联的信息。
例子:
- Susan总是用同一台PC使用Internet Explorer上网。
- 她第一次访问了一个使用Cookie的电子商务网站。
- 当最初的HTTP请求到达服务器时,Web站点生成一个唯一的ID,并作为索引在其后端数据库中创建一个项。
Web缓存(代理服务器)
目标:不访问原始服务器,就满足用户的请求。
-
原理
-
用户设置浏览器:通过缓存访问Web。
-
浏览器将所有的HTTP请求发给缓存。
-
如果请求的对象在缓存中,缓存直接返回该对象。
-
如果对象不在缓存中,缓存向原始服务器请求该对象,再将其返回给客户端。
-
-
优点
- 缓存可以降低客户端的请求响应时间。
- 可以大幅减少一个机构内部网络与Internet接入链路上的流量。
- 互联网大量采用缓存技术:即使是较弱的ICP(互联网内容提供商)也能够有效提供内容。
-
其他
-
缓存既是客户端又是服务器
在某项资源没有而需要向原始服务器请求时,它是客户端。
-
通常由ISP安装(大学、公司、居民区ISP)
-
条件GET方法
解决代理服务器和原始服务器中文件一致性的问题。
- 目标:如果缓存器中的对象仍然是最新的,就不需要发送该对象。
- 代理服务器:在HTTP请求中指定缓存副本的过期时间,使用首部行
If-modified-since: <date>
。 - 原始服务器
- 如果对象没有修改,则在响应报文中不包含对象,返回状态码
HTTP/1.0 304 Not Modified
。 - 如果对象修改过,则返回
HTTP/1.0 200 OK <data>
。
- 如果对象没有修改,则在响应报文中不包含对象,返回状态码
FTP
概述
-
文件传输:用于向远程主机上传输文件或从远程主机接收文件。
-
客户/服务器模式:
- 客户端:发起文件传输的应用程序。
- 服务器:远程主机,负责接收或发送文件。
-
协议:FTP(文件传输协议),依据 RFC 959 标准。
-
FTP 服务器:使用的默认端口号为 21。
原理
-
FTP 客户端与 FTP 服务器:
- 通过端口 21 建立联系,使用 TCP 作为传输协议。
-
控制连接:
-
客户端通过控制连接获取身份确认。
告知对方自己的用户名和对应口令
-
通过控制连接发送命令以浏览目录和文件。
-
带外(out of band)传送方式。
-
-
数据连接:
-
当服务器收到文件传输命令时,会打开一个到客户端的数据连接。
与控制连接分离
-
文件传输完成后,服务器关闭数据连接。
-
服务器可以打开第二个 TCP 数据连接,用于传输另一个文件。
-
-
用户状态信息:
-
FTP 服务器维护用户的状态信息,包括当前路径、用户账户以及与连接对应的其他信息。
与TCP无状态的连接进行区分
-
命令与响应
-
控制连接上以 ASCII 文本方式传送的命令:
USER username
:发送用户名以进行身份验证。PASS password
:发送密码以进行身份验证。LIST
:请求服务器返回当前目录的文件列表。RETR filename
:从服务器的当前目录检索文件(获取文件gets
)。STOR filename
:向服务器的当前目录存放文件(上传文件puts
)。
-
状态码和状态信息(与 HTTP 类似):
331 Username OK, password required
:用户名有效,需要密码。125 Data connection already open; transfer starting
:数据连接已经打开,传输开始。425 Can't open data connection
:无法打开数据连接。452 Too many errors waiting for file
:等待文件时出现过多错误。
组成部分
-
用户代理
- 又名“邮件阅读器”,负责用户与邮件系统之间的交互。
- 功能包括撰写、编辑和发送邮件。
- 常见的用户代理有 Outlook、Foxmail 等。
- 输出和输入的邮件通常保存在服务器上。
-
邮件服务器
-
邮件存储与管理
- 管理用户的邮件箱,确保所有邮件安全存储。
- 维护发送和接收邮件的队列,确保邮件的顺利传递。
-
邮件发送
- 通过 SMTP 协议发送邮件,确保邮件从发送方到接收方的可靠传输。
- 将发送的邮件存储在输出报文队列中,等待发送。
-
客户端与服务器的关系
-
客户端:发送方的邮件程序,负责撰写和发送邮件。
-
服务器:接收方的邮件服务器,负责接收并存储邮件,最终将其转发给接收者的邮件客户端。
把发给某个用户的邮件放到该用户对应的邮箱中,该用户的代理在到时从邮箱中拉取邮件。
-
-
-
简单邮件传输协议 (SMTP)
- 用于在邮件服务器之间传输邮件的协议。
- 确保邮件从发件人到收件人的可靠发送。
协议包括发送的协议(SMTP)和拉取的协议(POP3、IMAP、HTTP),HTTP既可以发又可以收。
SMTP 传输过程概述
-
使用 TCP 传输
- 在客户和服务器之间通过 TCP 协议传送报文,使用端口号 25。
-
直接传输
- 邮件直接从发送方服务器传输到接收方服务器。
-
传输的三个阶段
- 握手:建立连接,客户端与服务器之间确认连接状态。
- 传输报文:发送方服务器发送邮件内容,包括发件人、收件人及邮件正文。
- 关闭:完成邮件传输后,双方关闭连接。
-
命令与响应交互
- 命令:使用 ASCII 文本格式进行命令发送,例如发送邮件的命令。
- 响应:服务器返回状态码和状态信息,指示操作的结果。
-
报文格式
- 所有传输的报文必须使用 7 位 ASCII 码格式。
SMTP 特性
-
持久连接
- SMTP 使用持久连接,允许在同一连接上发送多个邮件,而无需为每封邮件建立新连接。
-
报文编码
- SMTP 要求报文的首部和主体均为 7 位 ASCII 编码。
-
报文结束
- SMTP 服务器使用 CRLF(回车换行)标识报文的尾部,表示报文的结束。
-
与 HTTP 的比较
- HTTP:
- 使用拉取(pull)模型。
- 每个对象都封装在各自的响应报文中。
- SMTP:
- 使用推送(push)模型。
- 所有命令和响应均为 ASCII 形式,包括状态码。
- 多个邮件对象可以包含在一个报文中。
- HTTP:
-
报文格式
首部行:包含字段如
To:
、From:
、Subject:
,用于描述邮件的基本信息。这些字段与 SMTP 命令不同。主体:邮件的实际内容,只能是 ASCII 字符串,确保在传输过程中的兼容性与可读性。
-
报文扩展:MIME(多媒体邮件扩展)
-
定义
- MIME(Multipurpose Internet Mail Extensions)是用于扩展电子邮件功能的标准,支持多种媒体类型的邮件内容。
-
RFC 2045 和 RFC 2056
- MIME 的相关标准定义在 RFC 2045 和 RFC 2056 中。
-
报文结构
-
首部行示例:
1
2
3
4
5
6From: aliced@crepes.fr
To: bob@hamburger.edu
Subject: Picture of yummy crepe.
MIME-Version: 1.0
Content-Type: image/jpeg
Content-Transfer-Encoding: base64 -
内容部分:
- Content-Type: 指定数据的媒体类型(如
image/jpeg
)。 - Content-Transfer-Encoding: 指定编码方式(如
base64
),用于对多媒体数据进行编码。 - 编码后的数据:多媒体数据经过 base64 编码的字符串。
- Content-Type: 指定数据的媒体类型(如
-
-
功能
- 通过 MIME,电子邮件能够包含图像、音频、视频等多种媒体格式,使得邮件内容更加丰富和多样。
-
邮件访问协议
-
SMTP(简单邮件传输协议)
- 负责将电子邮件从发送方的邮件服务器传送到接收方的邮件服务器。
-
邮件访问协议
- 用于从邮件服务器访问和管理存储的邮件。
-
POP(邮局访问协议)
-
定义:POP(Post Office Protocol),用于从邮件服务器下载邮件到本地客户端。
-
标准:RFC 1939。
-
特点:
- 用户身份确认:通过代理与邮件客户端进行身份验证。
- 通常下载邮件后,从服务器上删除邮件。
-
细节
用户身份确认阶段
- 客户端命令:
- USER:用于指定用户名。
- 示例:
USER username
- 示例:
- PASS:用于输入用户的密码。
- 示例:
PASS password
- 示例:
- 服务器响应:
- 成功响应:
+OK
表示身份确认成功。 - 错误响应:
-ERR
表示身份确认失败或有错误。
事务处理阶段
- 客户端命令:
- LIST:请求获取邮件列表,显示邮件编号及相关信息。
- 示例:
LIST
- 示例:
- RETR:根据邮件编号拉取指定邮件内容。
- 示例:
RETR message_number
- 示例:
- DELE:删除指定的邮件。
- 示例:
DELE message_number
- 示例:
- QUIT:关闭连接
模式与特性
-
“下载并删除”模式:
-
在这种模式下,邮件被下载到客户端后,服务器上的邮件会被删除。
-
例如,如果Bob使用这种模式,他无法在其他客户端上阅读已下载的邮件,因为邮件已被删除。
-
“下载并保留”模式:
-
在这种模式下,邮件被下载到客户端,但服务器上的邮件保留一份拷贝。
-
这使得用户可以在不同的客户端上访问同一封邮件。
-
无状态特性(本地管理文件夹):
-
POP3 在会话中是无状态的,意味着每次会话之间没有保存的上下文信息。每次连接都是独立的。比如不允许用户在邮箱中建立目录并跳转。
-
-
IMAP(互联网邮件访问协议)
-
定义:IMAP(Internet Mail Access Protocol),允许用户在服务器上管理邮件。
-
标准:RFC 1730。
-
特点:
- 支持在服务器上存储和处理邮件,用户可以在多个设备上同步邮件。
- 提供更多功能,如邮件文件夹管理、标记邮件等。
-
细节
-
文件夹管理:
-
IMAP 服务器将每个邮件与特定的文件夹关联,允许用户通过文件夹来组织邮件。
-
部分邮件读取:
-
IMAP 允许用户读取邮件的特定部分,而不是下载整封邮件,提高了灵活性和效率。
-
状态保持:
-
IMAP 在会话过程中保持用户状态,这意味着用户的操作(如已读、未读、删除等)可以在服务器上进行管理。(远程管理文件夹)
-
用户操作:
-
IMAP 允许用户在多个设备上同步邮件状态,包括查看邮件、管理文件夹等。
-
会话中的命令:
-
用户可以使用命令管理邮件,如:
- LOGIN:用于用户身份验证。
- SELECT:选择某个文件夹以进行操作。
- FETCH:获取邮件的具体内容。
-
-
-
HTTP与网页邮件
- 通过 HTTP 协议访问邮件,如 Hotmail 和 Yahoo Mail,允许用户在网页上查看和管理邮件,而不需要专门的邮件客户端。