Application Layer

创建网络应用程序 => 网络应用程序在端系统(网络边缘)运行,网络核心设备并不运行用户的应用.
接下来介绍应用程序的体系结构
网络应用程序体系结构
客户机 / 服务器体系结构
服务器
- 总是开机
- 固定的、可以周知的IP地址
客户机
- 和服务器通信
- 间歇性链接
- 动态IP地址
- 不直接和其他客户机通信
P2P
- 不存在总是开机的服务器
- 任何端系统之间可以直接通信
C / S & P2P混合结构
进程通信
进行通信的不是程序而是进程. 在同一台主机上也存在进程间通信(由操作系统定义);不同主机上的进程之间通过报文(message)进行
客户进程
服务器进程
在P2P架构中,一个进程可能即是客户机也是服务器
套接字(Sockets):进程通过它的套接字发送 / 接受报文
API:1)选择运输层协议;2)设定运输层参数
进程寻址
进程如何识别另外一个通信的进程
- 进程的标识符 identifier
- 主机上全球唯一的32位IP地址
- 主机的端口号,比如HTTP -> 80
Socket = IP Address + Port
应用层协议
交换报文的类型
- 报文格式
- 报文语义
- 进程发送和接受报文的规则
公开协议和专有协议
可供应用程序使用的运输服务
应用层 => 运输层
常见网络应用的传输服务需求
可靠、吞吐量、定时、安全性
应用层协议:
TCP:
- 面向连接的
- 可靠传递
- 流量控制:发送方不淹没接收方
- 拥塞控制:当网络过载的时候已知发送方
- 不提供:实时性和最小带宽的保证
UDP:
- 发送和接受进程之间不可靠的数据传递
- 不提供:上面那些都不提供
有可能导致报文乱序
Web 和 HTTP
Web的应用层协议是超文本传输协议(HTTP)
Web页面由对象组成,对象包括HTML文件等
每一个对象可以通过一个URL进行寻址:主机名 + 路径名
HTTP
Web浏览器实现了HTTP的客户机短
Web服务器存储对象,由URL寻址
支撑HTTP的运输层协议是TCP
1 | graph TD |
Web与HTTP
HTTP
非持续链接和持续链接
- 非持续链接:每个请求 / 响应对经过单独的TCP连接发送
- 持续链接: 所有请求 / 相应对经过相同的TCP连接发送
目前常见的HTTP默认是持续链接. 非持续连接中,HTTP文件发送一个报文之后会立即关闭连接,这可能导致时间的损耗. 我们考虑传输过程中消耗的时间:
响应时间
我们首先考虑一个对象的传输(say, 最开始的html文件). 如下图,总响应时间 = 2*RTT + 文件传输时间. 其中RTT(Round-Trip Time).
![[Pasted image 20250305100038.png | 800]]
非持久连接
持续链接
非持续链接为每一个请求对象建立维护全新的连接
服务器在发送出响应之后保持连接的打开状态,随后发送的报文都可以在这一个打开链接上进行发送.
- 不带流水线:前一个响应接受之后,Client才可以发出新的请求. (相比于非持久连接,这种方式还是省去了很多建立连接的RTT时间)
- 带流水线:Client只要遇到一个被引用对象,就可以立刻发送请求,在最好情况下,所有的引用对象只需要一个RTT就可以获得
HTTP的报文
请求报文(Request)
- 请求行
- 首部行
- 附加回车换行符表示报文结束
![[Pasted image 20250305101446.png | 800]]
请求行
- 方法字段: 例如:GET, POST, HEAD, PUT, DELETE
- URL字段
- HTTP协议版本字段
首部行
- Host
- User-agent
- Connection: 例如close表示非持久连接
- Accept-language
空行
(实体主体)
如果使用POST, PUT,需要向Server传递其他内容,就会放在这个部分.
Note
虽然我们在这里说可以将POST的内容(比如查找的关键字)放在实体对象里面,但是实际操作中,我们也可以使用GET方法,利用扩展的URL发送表单生成的请求报文
响应报文(Response)
- 状态行
- 首部行
- 实体
状态行
- 协议版本
- 状态码
- 响应状态信息
Note
一些常见的状态码
- 200 OK
请求成功,信息包含在返回的响应报文中。 - 301 Moved Permanently
请求的对象已经被永久转移了,新的URL定义在响应报文的. Location:首部行中指定。客户机软件自动用新的URL获取该对象。 - 400 Bad Request
一个通用差错代码,指示该请求不能被服务器理解。 - 404 Not Found
被请求的文档不在服务器上。 - 505 HTTP Version Not Supported
服务器不支持请求报文使用的HTTP协议版本
首部行
- Connection: 例如close表示非持续链接,服务器在响应之后已经关闭了TCP连接
- Date
- ……
Cookie
四个组成部分
- HTTP响应报文中有一个cookie首部行
- HTTP请求报文中有一个cookie首部行
- 用户端系统中保留一个cookie文件,由浏览器管理
- Web站点的后端数据库存储用户的cookie
cookie可以保持用户状态:
![[Pasted image 20250305102713.png | 800]]
HTTP协议本身是一个无状态的协议,cookie在发送方 / 接受方之间的多次交互维持状态,在无状态的HTTP上建立了一个用户对话层
Note
第三方cookie? 看书
Web缓存器(代理服务器)
为了加速访问(?),可以使用Web服务器
Web缓存器(代理服务器)(Cache): 能够代表初始Web服务器来满足HTTP请求的网络实体
用户设置将HTTP请求指向Cache,如果cache有对应对象,直接返回;如果没有,像初始服务器请求,并把得到的对象进行返回.
为什么cache是重要的?这里有一个例子,没有太看懂
缓存哪些文档?请求率 / 更新率 >> 1
条件GET
cache在发送GET请求的时候指明当前缓存的对象拷贝的日期,如果cache存储的拷贝是最新的,server就发不含具体对象的响应:304 Not Modified
HTTP/2与HTTP/3
HTTP/2
目的:降低多对象HTTP请求延迟
HTTP1.1的缺陷
因为服务器按序响应GET请求. 大对象之后的小对象可能等待很长时间(head-of-line blocking 线路前部阻塞)
HTTP/2在服务器端给客户发送对象的过程中增加了灵活性:
- 按照用户指定的对象优先级,传输被请求的对象
- 推送未被请求的对象给客户(服务器推)
- 将对象可以拆分为帧,缓解HOL阻塞==?==
HTTP/3
?
FTP
FTP:文件传输协议,在本地和远程站点之间传递文件
ftp serve: 控制连接端口21,数据连接端口20
FTP client通过21端口连接FTP server,TCP作为传输协议.
带外传输
HTTP是带内传输:请求、响应在一个连接中进行
明文传输用户名和密码
电子邮件
三个组成部分:
- 用户代理
- 邮件服务器
- 简单邮件传输协议:SMTP
用户代理
用户代理完成:阅读、回复、转发、保存和撰写功能.
发送出去和接收到的报文都存储在服务器上
邮件服务器
SMTP协议在邮件服务器之间发送邮件报文的协议
简单邮件传输协议
采用TCP端口25把邮件报文从客户端传递到服务器端.
- 握手
- 报文传送
- 关闭连接
发送用户 -(SMTP)-> 发送方服务器 -(SMTP)-> 接收方服务器 --> 接收用户
SMTP与HTTP比较:
HTTP:pull SMTP:pus
HTTP使用ASCII命令 / 响应交互表示状态码
SMTP使用ASCII命令 / 响应交互表示状态码报文中非ASCII字符或者二进制数据按照7bitASCII码进行编码
收文件使用的不是SMTP,接下来会讲
尝试SMTP交互命令
sniffer
邮件报文格式和MIME(Multiperpose Internet Mail Extension)
首部行包含环境信息
邮件访问协议:
POP3 没有文件目录结构
IMAP 因特网邮件访问协议
HTTP
POP3协议
-
特许阶段:
Client命令:user, pass
Server响应: -
处理阶段 Client
list
retr
dele(只是打了个标签)
quit -
更新阶段
POP3服务器删除标记为删除的报文
POP3是无状态的
IMAP协议
所有邮件报文放置在服务器
允许用户在文件目录中组织整理邮件报文
IMAP是一个有状态的协议:可以浏览文件目录名,在目录名和报文序号之间建立映射
允许只获得邮件报文首部
基于HTTP的邮件访问
域名系统DNS
Domain Name System: 因特网的目录服务
- 具有分层体系结构的许多名字服务器构成的分布式数据库
- DNS是一个应用层协议,它提供的服务可以被同层的协议使用
DNS服务:主机名到IP地址的翻译.
主机别名
邮件服务器别名
负载分配:互为备份的一组Web服务器,为一个规范名字设置一组IP地址
DNS的分布式、层次化
根DNS服务器
顶级域(TLD)DNS服务器
权威DNS服务器
本地DNS服务器
root server -> com DNS服务器
com server -> amazon DNS服务器
amazon server -> www.amazon.com
根DNS服务器
顶级域DNS服务器
权威DNS服务器
本地DNS服务器
不属于层次体系 起代理的作用
DNS名字解析
迭代查询
递归、迭代
![[Pasted image 20250305120625.png | 800]]
I don’t know this name, but ask this server.
递归查询
![[Pasted image 20250305120805.png | 800]]
现实中不使用
记录的缓存与更新
TTL
缓存的数据项可能会过期
IETF: RFC 2136
DNS 记录
资源记录格式:(Name, Value, Type, TTL)
- Type A
Name, Value: 主机名+IP地址
- Type NS
Name是域
Value为该域权威DNS服务器的主机名
- Type CNAME
Name是规范名称的别名
Value是规范名字
- Type MX
Name是别名
Value是别名为name的邮件服务器的规范主机名
DNS协议和报文
问询报文
回答报文
格式相同
???j
把记录添加到DNS
DNS与安全.性
安全性
- DNS中间人攻击:截获主机请求,范围伪造的回答
- DNS毒害攻击:
- 蛮力攻击DDos:
P2P应用
之前介绍的应用都是C-S架构
Example
从一个服务器向
![[Pasted image 20250312100249.png]]
在这个过程中,服务器和客户端的接入链路往往是瓶颈. 考虑下面的情况:
Client-Server机构下的文件分发时间
其中
为什么下载没有N
P2P架构下的文件分发时间
此时,服务器至少必须上传一份拷贝,每个客户机必须下载一个,总体上下载
注意此时,随着
BitTorrent
- 最稀缺优先
- 对换算法: -> 处理搭免费车. 随机性??
集中式目录
集中式目录所以 + P2P文件分发
Napster
问题:
- 单点故障
- 性能瓶颈和基础设施费用
查询洪泛
Gnutella协议
没雨中央服务器
覆盖网络
查询过程:
- 查询报文经过现存的TCP连接发送
- 主机转发查询报文
- 当查询报文命中,按照反向路径发回
-> 有限范围的洪泛: TTL
Gnutella中对等方的加入
层次覆盖:单点 -> 群组领袖;群组领袖之间相互连接
Skype的P2P因特网电话
NAT: 网络地址转换 -> 对外只有一个IP,对内不同设备有不同IP. 对外隐藏了网络结构. NAT组织外部节点启动到内部单点的呼叫,但是允许内部节点呼叫外部的单点.
如果在Skype中,两个端系统都在NAT后? => 利用两者的超级节点进行中继
视频流和内容分发网
分布式、应用层协议和基础设施
DASH(Dynamic Adaptive Streaming over HTTP)
- server: 将视频切车工多视频段数据块;每个块按照不同比特率存储和编码;搞事文件:每个版本提供一个URL和编码
- client: 定期测量接受带宽;请求告示文件,一次选择一个块(根据带宽选择最大比特率)
intelligence at client:
- 何时请求块
- 请求何种比特率
- 去何处请求
内容分发网:将流式内容分发给大量同时请求用户(e.g. 高清直播)
在分布式站点存储视频的副本(CDN):
- 深入:将CDN服务器集群部署到ISP的接入网中
- 邀请做客:在少量关键位置建造大集群,邀请ISP做客
Socket Programming
Socket API
![[Pasted image 20250312111627.png]]