第二章 应用层
课程链接
教材:《计算机网络-自顶向下方法(第7版)》,机械工业出版社,2016
课件:https://pan.baidu.com/s/1EElOrkkY4WQqgeKHuGm-bg 密码:1958。
文章目录
2.1应用层协议原理
网络应用的体系结构:
- 客户-服务器模式(C/S:client/server)
- 服务器:一直运行;固定的IP地址和周知的端口号;扩展性差
- 客户端:主动与服务器通信;与互联网有间歇性的连接;动态IP;不直接与其它客户端通信
- 对等模式(P2P:Peer To Peer)
- 没有一直运行的服务器;
- 任意端系统之间可以进行通信;
- 每一个节点既是客户端又是服务器、可拓展性好;
- 参与的主机间歇性连接且可以改变IP 地址,难以管理;
- 混合体:客户-服务器和对等体系结构
分布式进程通信需要解决的问题:
- 进程标示和寻址问题:
- 传输层-应用层提供服务是如何:
- 位置:层间界面的SAP (TCP/IP :socket)
- 形式:应用程序接口API (TCP/IP :socket API)
- 如何使用传输层提供的服务,实现应用进程之间的报文交换,实现应用:
- 定义应用层协议:报文格式,解释,时序
- 编制程序,使用OS提供的API,调用网络基础设施提
供通信服务传报文
(1)对进程进行编址
进程为了接收报文,必须有一个标识即:SAP(发送也需要标示)[IP+传输层协议(TCP/IP)+端口号]
(2)传输层提供的服务-需要穿过层间的信息
- 层间接口必须要携带的信息:
- 要传输的报文(对于本层来说:SDU)
- 谁传的:对方的应用进程的标示:IP+TCP(UDP) 端口
- 传给谁:对方的应用进程的标示:对方的IP+TCP(UDP)口
- 传输层实体(tcp或者udp实体)根据这些信息进行TCP报文段(UDP数据报)的封装
(3)传输层提供的服务-层间信息的代表(如果Socket API 每次传输报文,都携带如此多的信息,太繁琐易错,不便于管理)
- TCP socket:可以用一个整数表示两个应用实体之间的通信关系,本地标示;4元组:(源IP,源port,目标IP,目标port)
- UDP socket: 2元组:IP,port (源端指定)
应用层协议
定义了:运行在不同端系统上的应用进程如何相互交换报文。
应用协议仅仅是应用的一个组成部分。
公开协议:
- 由RFC文档定义
- 允许互操作
- 如HTTP, SMTP
专用(私有)协议:
- 协议不公开
- 如:Skype
如何描述传输层的服务?
- 数据丢失率
- 吞吐
- 延迟
- 安全性
2.2 Web and HTTP
2.2.1 web
网络应用的体系结构:
- Web页:由一些对象组成。对象可以是HTML文件、JPEG图像、Java小程序、声音剪辑文件等
- Web页含有一个基本的HTML文件,该基本HTML文件又包含若干对象的引用(链接)
- 通过URL对每个对象进行引用
- 访问协议,用户名,口令字,端口等;
- URL格式
2.2.2 HTTP
HTTP: 超文本传输协议
- Web的应用层协议
- 客户/服务器模式
- 客户: 请求、接收和显示Web对象的浏览器
- 服务器: 对请求进行响应,发送对象的Web服务器
使用TCP:客户发起一个与服务器的TCP连接 (建立套接字) ,端口号为 80
HTTP是无状态的:服务器并不维护关于客户的任何信息
HTTP连接
-
非持久HTTP
-
最多只有一个对象在TCP连接上发送
-
下载多个对象需要多个TCP连接
-
HTTP/1.0使用非持
久连接 -
持久HTTP
-
多个对象可以在一个(在客户端和服务器之间的)TCP连接上传输
-
HTTP/1.1 默认使用持久连接
-
持久HTTP还分为非流水方式和流水方式
- 非流水方式:客户端只能在收到前一个响应后才能发出新的请求;每个引用对象花费一个RTT
- 流水方式:客户端遇到一个引用对象就立即产生一个请求;HTTP/1.1的默认模式
HTTP请求报文
两种类型的HTTP报文:请求、响应
方法类型:
- HTTP/1.0
- GET
- POST
- HEAD
- HTTP/1.1
- GET, POST, HEAD
- PUT
- DELET
2.2.3 用户-服务器状态:cookie
4个组成部分:
- 在HTTP响应报文中有一个cookie的首部行
- 在HTTP请求报文含有一个cookie的首部行
- 在用户端系统中保留有一个cookie文件,由用户的浏览器管理
- 在Web站点有一个后端数据库
ookies能带来什么:
- 用户验证
- 购物车
- 推荐
- 用户状态 (Web e-mail)
2.2.4 web缓存 (代理服务器)
目标:不访问原始服务器,就满足客户的请求
- 用户设置浏览器: 通过缓存访问Web
- 浏览器将所有的HTTP请求发给缓存
- 在缓存中的对象:缓存直接返回对象
- 如对象不在缓存,缓存请求原始服务器,然后再将对象返回给客户端
2.3 FTP:文件传输协议
特点:
- 向远程主机上传输文件或从远程主机接收文件
- 客户/服务器模式
- 客户端:发起传输的一方
- 服务器:远程主机
- ftp: RFC 959
- ftp服务器:端口号为21
控制连接
- FTP客户端与FTP服务器通过端口21联系,并使用TCP为传输协议
- 客户端通过控制连接获得身份确认
- 客户端通过控制连接发送命令浏览远程目录
- 收到一个文件传输命令时,服务器打开一个到客户端的数据连接
- 一个文件传输完成后,服务器关闭连接
FTP服务器维护用户的状态信息:
当前路径、用户帐户与控制连接对应,有状态
2.4 EMail:电子邮件
3个主要组成部分:
- 用户代理
- 又名 “邮件阅读器; 撰写、编辑和阅读邮件
- 邮件服务器
- 输出报文队列保持待发送邮件报文
- 邮件服务器之间的SMTP协议:发送email报文
- 简单邮件传输协议:SMTP
- 使用TCP在客户端和服务器之间传送报文,端口号为25
- 命令/响应交互:命令:ASCII文本 / 响应:状态码和状态信息
- 报文必须为7位ASCII码
SMTP:总结
- SMTP使用持久连接
- SMTP要求报文(首部和主体)为7位ASCII编码
- SMTP服务器使用CRLF.CRLF决定报文的尾部
与HTTP比较:
- 二者都是ASCII形式的命令/响应交互、状态码
- HTTP:拉(pull)
- SMTP:推(push)
- HTTP:每个对象封装在各自的响应报文中
- SMTP:多个对象包含在一个报文中、
邮件报文格式
邮件访问协议
- POP:邮局访问协议(Post Office Protocol)[RFC 1939]
- 用户身份确认 (代理<–>服务器) 并下载
- IMAP:Internet邮件访问协议(Internet Mail AccessProtocol)[RFC 1730]
- 更多特性 (更复杂)
- 在服务器上处理存储的报文
- HTTP:Hotmail , Yahoo! Mail等
- 方便
POP与IMAP
POP3
- “下载并保留”:不同客户机上为报文的拷贝
- POP3在会话中是无状态的
IMAP
- IMAP服务器将每个报文与一个文件夹联系起来
- 允许用户用目录来组织报文
- 允许用户读取报文组件
- IMAP在会话过程中保留
- 用户状态: 目录名、报文ID与目录名之间映射
问题:
- 问题1:如何命名设备
- 用有意义的字符串:好记,便于人类用使用
- 解决一个平面命名的重名问题:层次化命名
- 问题2:如何完成名字到IP地址的转换
- 分布式的数据库维护和响应名字查询
- 问题3:如何维护:增加或者删除一个域,需
要在域名系统中做哪些工作
2.5 DNS
DNS的主要思路
- 分层的、基于域的命名机制
- 若干分布式的数据库完成名字到IP地址的转换
- 运行在UDP之上端口号为53的应用服务
- 核心的Internet功能,但以应用层协议实现
- 在网络边缘处理复杂性
DNS主要目的:
- 实现主机名-IP地址的转换(name/IP translate)
- 其它目的
- 主机别名到规范名字的转换:Host aliasing
- 邮件服务器别名到邮件服务器的正规名字的转换:Mail server aliasing
- 负载均衡:Load Distributio
DNS域名结构
- 一个层面命名设备会有很多重名
- NDS采用层次树状结构的 命名方法
- Internet 根被划为几百个顶级域(top lever domains)
- 通用的(generic)
.com; .edu ; .gov ; .int ; .mil ; .net ; .org
.firm ; .hsop ; .web ; .arts ; .rec ; - 国家的(countries)
.cn ; .us ; .nl ; .jp
- 通用的(generic)
- 每个(子)域下面可划分为若干子域(subdomains)
- 树叶是主机
DNS名字空间
- 域名(Domain Name)
- 从本域往上,直到树根
- 域的域名:可以用于表示一个域
- 主机的域名:一个域上的一个主机
- 域名的管理
- 一个域管理其下的子域
- 创建一个新的域,必须征得它所属域的同意
- 域遵从组织界限,而不是物理网络
- 域的划分是逻辑的,而不是物理的
问题2:解析问题-名字服务器
- 区域的划分有区域管理者自己决定
- 将DNS名字空间划分为互不相交的区域,每个区域都是树的一部分
- 名字服务器:
- 每个区域都有一个名字服务器:维护着它所管辖区域的权威信息(authoritative record)
- 名字服务器允许被放置在区域之外,以保障可靠性
顶级域(TLD)服务器:负责顶级域名(如com, org, net,edu和gov)和所有国家级的顶级域名(如cn, uk, fr, ca,jp )
资源记录(resource records)
- 作用:维护 域名-IP地址(其它)的映射关系
- 位置:Name Server的分布式数据库中
- RR格式: (domain_name, ttl, type,class,Value)
- Domain_name: 域名
- Ttl: time to live : 生存时间(权威,缓冲记录)
- Class 类别 :对于Internet,值为IN
- Value 值:可以是数字,域名或ASCII串
- Type 类别:资源记录的类型—见下页
DNS大致工作过程
- 应用调用 解析器(resolver)
- 解析器作为客户 向Name Server发出查询报文(封装在UDP段中)
- Name Server返回响应报文(name/ip
提高性能:缓存
- 一旦名字服务器学到了一个映射,就将该映射
缓存起来 - 根服务器通常都在本地服务器中缓存着
维护
增删改查
攻击DNS
2.6 P2P应用
2.6.1 纯P2P架构
- 没有(或极少)一直运行的服务器
- 任意端系统都可以直接通信
- 利用peer的服务能力
- Peer节点间歇上网,每次IP地址都有可能变化
文件分发时间:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UKSbtXtT-1678090382698)(null)]
2.6.2 P2P文件分发: BitTorren
- Peer加入torrent
- 当peer下载时,该peer可以同时向其他节点提供上载服
- Peer可能会变换用于交换块的peer节
- 扰动churn: peer节点可能会上线或者下线
- 一旦一个peer拥有整个文件,它会(自私的)离开或者保留(利他主义)在torrent
BitTorrent: 请求,发送文件
请求块:
- 在任何给定时间,不同peer节点拥有一个文件块的子集
- 周期性的,Alice节点向邻居询问他们拥有哪些块的信息
- Alice向peer节点请求它希望的块,稀缺的
发送块:一报还一报tit-for-tat
- Alice向4个peer发送块,这些块向它自己提供最大带宽的服务
- 其他peer被Alice阻塞 (将不会从Alice处获得服务)
- 每10秒重新评估一次:前4位
- 每个30秒:随机选择其他peer节点,向这个节点发送块
- “优化疏通” 这个节点
- 新选择的节点可以加入这个top
2.6.3 P2P文件共享
集中式目录
文件分发是P2P,文件搜索是C/S。
存在问题:
- 单点故障
- 性能瓶颈
- 侵犯版权
查询洪泛:Gnutell协议
-
全分布式
- 没有中心服务器
-
开放文件共享协议
-
许多Gnutella客户端实现了Gnutella协议
- 类似HTTP有许多的浏览器
-
等方X必须首先发现某些已经在覆盖网络中的其他对等方:使用可用对等方列表
- 自己维持一张对等方列表(经常开机的对等方的IP)联系维持列表的Gnutella站点
-
X接着试图与该列表上的对等方建立TCP连接,直到与某个对等方Y建立连接
-
X向Y发送一个Ping报文,Y转发该Ping报文
-
所有收到Ping报文的对等方以Pong报文响应
- IP地址、共享文件的数量及总字节数
-
收到许多Pong报文,然后它能建立其他TCP连接
层次覆盖
KaZaA:查询
- 每个文件有一个散列标识码和一个描述符
- 客户端向其组长发送关键字查询
- 组长用匹配进行响应:
- 对每个匹配:元数据、散列标识码和IP地址
- 如果组长将查询转发给其他组长,其他组长也以匹配进行响应
- 客户端选择要下载的文件
- 向拥有文件的对等方发送一个带散列标识码的HTTP请求
分布式散列表
2.7 CDN
多媒体流化服务:DASH(Dynamic, Adaptive Streaming over HTTP)
服务器:
- 将视频文件分割成多个块
- 每个块独立存储,编码于不同码率(8-10种)
- 告示文件(manifest file): 提供不同块的URL
客户端:
- 先获取告示文件
- 周期性地测量服务器到客户端的带宽
- 查询告示文件,在一个时刻请求一个块,HTTP头部指定字节范围
- 如果带宽足够,选择最大码率的视频块
- 会话中的不同时刻,可以切换请求不同的编码块 (取决于当时的可用带宽)
CDN:Content distribution netw
通过CDN,全网部署缓存节点,存储服务内容,就近为用户提供服务,提高用户体验
- enter deep: 将CDN服务器深入到许多接入网
- 更接近用户,数量多,离用户近,管理困难
- Akamai, 1700个位置
- bring home: 部署在少数(10个左右)关键位置,如将服务器簇安装于POP附近(离若干1st ISP POP较近)
- 采用租用线路将服务器簇连接起来
- Limeligh
2.8 TCP 套接字编程
Socket编程
应用进程使用传输层提供的服务才能够交换报文,实现应用协议,实现应用。
TCP/IP:应用进程使用Socket API访问传输服务
地点:界面上的SAP(Socket) 方式:Socket API
目标: 学习如何构建能借助sockets进行通信的C/S应用程序
socket: 分布式应用进程之间的门,传输层协议提供的端到端
服务接口
2种传输层服务的socket类型:
- TCP: 可靠的、字节流的服务
- UDP: 不可靠(数据UDP数据报)服务
TCP套接字编程
套接字:应用进程与端到端传输协议(TCP或UDP)之间
的门户
TCP服务:从一个进程向另一个进程可靠地传输字节流
## 2.9 UDP 套接字编程