应用层
应用层
2.1 网络应用的体系结构
- 客户机/服务器结构(C/S)
- 点对点结构(P2P)
- 混合结构(Hybrid)
2.2 网络应用进程通信
- 进程:主机上运行的程序
- 客户机进程:发起通信的进程
- 服务器进程:等待通信请求的进程
- 进程之间的通信
- 同一主机
- 由操作系统提供
- 不同主机
- 报文交换
- 同一主机
- 套接字(Socket):应用程序和网络之间的API(同一主机内应用层和传输层之间的接口)
- 进程寻址
- 进程的标识符:IP地址+端口号 (为主机上每个需要通信的进程分配一个端口号)
2.3 传输服务
可供应用程序使用的传输服务
- 可靠数据传输
- 某些网络应用能够容忍一定的数据丢失:网络电话
- 某些网络应用要求100%可靠的数据传输:文件传输、telnet
- 吞吐量
- 带宽敏感的应用:具有吞吐量要求的应用程序(网络视频)
- 弹性应用
- 定时(时间/延迟)
- 有些应用只有在延迟足够低时才“有效”
- 网络电话/网络游戏
- 安全性
Internet提供的传输服务
- TCP服务
- 面向连接
- 客户机和服务器进程间需建立连接(TCP连接–全双工)
- 可靠的数据传送
- 流量控制:发送方发送速度不会过快,不会超过接收方的处理能力
- 拥塞控制:当网络负载过重时能够限制发送方的发送速度
- 不提供时间/延迟保障
- 不提供最小带宽保障
- 面向连接
- UDP服务
- 无连接
- 不可靠的数据传输
- 注:无论是TCP还是UDP都没有提供任何加密机制,所以出现SSL
- SSL(安全套接字层)
- SSL不是与TCP和UDP在相同层次上的第三种因特网运输协议,而是一种对TCP的加强,是在应用层上实现的。
- SSL(安全套接字层)
2.4 Web应用
World Wide Web(万维网),简称Web
- 网页(Web Page)包含多个对象(object)
- 对象:HTML文件、Jpeg图片、视频文件、动态脚本等
- 基本HTML文件:包含对其他对象引用的链接
- 对象的寻址
- URL(统一资源定位器)
HTTP(超文本传输协议)
- HTTP使用TCP传输服务
- HTTP为无状态协议:不维护任何有关客户端过去所发送请求的信息
- 使用80号端口
HTTP连接类型
- 非持续连接
- 发送响应后,服务器断开TCP连接
- 每个TCP连接最多允许传输一个对象
- HTTP1.0版本
- 持续连接
- 发送响应后,服务器保持TCP连接的打开
- 每个TCP连接允许传输多个对象
- HTTP1.1版本
- 比较
- RTT(往返时间):一个短分组从客户到服务器然后再返回客户所花费的时间
- 非持续连接:每个对象需要2个RTT(其中TCP握手需要1个RTT)
- 持续连接:每个被引用的对象耗时1个RTT
- 无流水
- 客户端只有收到前一个响应后才发送新的请求
- 有流水
- 客户端只要遇到一个引用对象就尽快发出请求
- 无流水
HTTP报文格式
均由ASCII文本书写
请求报文
- 请求行
- 方法字段
- URL字段
- HTTP版本
方法字段 | 解释 |
---|---|
GET | 请求一个对象;或者表单填写,输入信息通过URL字段上传 |
POST | 表单填写—实体体为表单字段的输入值 |
HEAD | 让服务器不要返回请求对象 |
PUT | 允许将消息体的文件上传到URL字段所指定的路径 |
DELETE | 删除URL字段所指定的文件 |
- 首部行
字段名 | 解释 |
---|---|
Host | 对象所在的主机 |
Connection | 值若为close,则指让服务器响应完后,关闭该条连接 |
User-agent | 浏览器类型 |
Accept-language | 语言版本(若不存在,则发送默认版本) |
- 实体体
- 使用GET方法,实体体为空;
- 使用POST方法,才使用实体体
1
2
3
4
5
6
7
8
GET / HTTP/1.1
Host: www.hit.edu.cn
Connection: Keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
响应报文
- 状态行
- 协议版本字段
- 状态码、相应状态信息
状态行 | 相应状态信息 | 说明 |
---|---|---|
200 | OK | 请求成功,信息在响应报文中 |
301 | Moved Permanently | 请求对象已被永久转移,新的URL定义在响应报文的Location |
400 | Bad Request | 请求不能被服务器理解 |
404 | Not Found | 请求的文档不在服务器上 |
418 | I’m a teapot | 服务器拒绝冲泡咖啡 |
505 | HTTP Version Not Supported | 服务器不支持请求报文使用的HTTP协议版本 |
- 首部行
字段名 | 解释 |
---|---|
Connection | 值若为close,则指让服务器响应完后,关闭该条连接 |
Date | 发送报文时间 |
Server | 服务器类型 |
Last-Modified | 对象创建或修改的最后时间 |
Content-Length | 对象字节数 |
Contetn-Type | 对象类型 |
- 实体体
- 请求的对象本身
1
2
3
4
5
6
7
8
9
HTTP/1.1 200 OK
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Server:
Date: Sat, 04 Nov 2023 04:54:57 GMT
Accept-Ranges: bytes
Vary: Accept-Encoding
X-Frame-Option: ALLOW-FROM http://homepage.hit.edu.cn/
Cookie
- 某些网站为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据(通常经过加密)
- Cookie的组件
- HTTP响应报文的cookie首部行
- HTTP请求报文的cookie首部行
- 保存在客户端主机上的cookie文件,由浏览器管理
- Web服务器端的后台数据库 ^ed8d34
Web缓存(Web Cache)
Web缓存器,也叫代理服务器
- 浏览器先向代理服务器发送HTTP请求
- 若请求对象在代理服务器中,则由代理服务器直接返回对象
- 否则,代理服务器向原始服务器发送HTTP请求,获取对象,然后返回给客户端并保存该对象
- 一般由ISP架设
- 条件GET方法
- 目标:查看代理服务器的对象是否为最新版本
- 构成:
- 请求报文使用GET方法;
- 请求报文中包含一个“If-Modified_Since:”首部行(该字段值为“Last-Modified:”的值)
- 服务器:
- 若版本为最新,则响应报文不包含对象(HTTP/1.1 304 Not Modified)
2.5 Email应用
构成
- 用户代理
- 邮件服务器
- 邮箱:存储发给该用户的Email
- 报文队列:存储等待发送的Email
- 简单邮件传输协议(SMTP)
- 邮件服务器之间传递消息所使用的协议
- 使用TCP可靠数据传输服务
- 使用25号端口
- 每台服务器既运行SMTP的客户端,也运行SMTP的服务器端
SMTP协议
- 邮件报文的体部分只能包含7位ASCII码
- 使用持续连接
- 协议交互过程(参考课本)
- 与HTTP的对比
键 | 键值 |
---|---|
相同点 | 都使用持续连接 命令和状态码都是ASCII码 |
不同点 | HTTP为拉协议;SMTP为推协议 HTTP把每个对象封装在独立的响应报文中;SMTP把多个对象放在一个报文中 |
邮件报文格式
- 首部行
- From、To、Subject……
- 对于多媒体邮件(即包括图片视频的文件),采用MIME进行拓展
- 报文体
- ASCII码表示
邮件访问协议
- 从服务器到用户代理,无法使用SMTP协议(因为其为推协议),所以需要使用其他协议
- POP3(第三版的邮局协议)
- 非常简单,功能有限
- 无状态
- 三个阶段
- 特许:用户代理发送用户名和口令以鉴别用户
- user<user name>、pass<password>
- 事务处理:用户代理取回报文,还能进行相应操作
- list、retr(用编号获取消息)、dele、quit
- 更新:quit命令之后,结束该POP3会话
- 特许:用户代理发送用户名和口令以鉴别用户
- IMAP(因特网邮件访问协议)
- 允许用户利用文件夹组织email(在服务器中),增删查改都可以实现
- 允许用户代理获取某些报文(在低带宽连接时比较有效)
- IMAP服务器维护了IMAP会话的用户状态信息
- HTTP
- 用户代理为浏览器
2.6 DNS应用(域名系统)
- 一个由分层的DNS服务器实现的分布式数据库
- 应用层协议:完成名字的解析(一个使主机能够查询到分布式数据库的应用层协议)
- Internet核心功能
- 运行在UDP之上
- 53号端口
DNS提供的服务
- 域名与IP地址的转换
- 主机别名
- 邮件服务器别名
- 负载分配
工作原理
- 分布式、层次数据库(由上到下)
层次 说明 根DNS服务器 本地域名解析服务器无法解析域名时,访问根域名服务器(目前我国没有) 顶级域名服务器(TLD) 通用顶级域(gTLD):com、org、net、edu、gov…
国家顶级域(ccTLD):cn、uk、fr…权威DNS服务器 组织的域名解析服务器 - 本地DNS服务器
- 不严格属于层次体系
- 每个ISP有一个本地域名服务器
- 当主机进行DNS查询时,查询被发送到本地域名服务器,作为代理
- 查询分类
- 递归查询
- 将域名解析的任务交给所联系的服务器
- 迭代查询
- 被查询服务器返回域名解析服务器的IP地址
- 递归查询
- DNS缓存
- 本地服务器能缓存
域名-IP
映射- 一般也会缓存顶级域名服务器的映射(所以根域名服务器不会经常被访问)
- 由于主机与IP地址间的映射不是永久的,所以DNS服务器会在一段时间后丢弃缓存的信息
- 本地服务器能缓存
DNS记录和报文
资源记录(RR)
在 DNS 报文的回答(Answer)部分,资源记录(RR)是核心组成部分。RR用于存储域名相关的各种信息,如IP地址、域名别名等,它是DNS服务器对客户端查询的具体回应内容
DNS报文格式
DNS查询和应答报文采用统一消息格式
- 首部(Header):描述报文类型
- 问题节(Queries):查询的问题
- 答案节(Answers):问题的答案
- 授权信息(Authoritative):对应权威服务器的记录
- 附加信息(Additional):附加记录
Transaction ID(标识) | Flags(标志) |
Questions(问题数) | Answer RRs(回答RR数) |
Authority RRs(权威RR数) | Additional RRs(附加RR数) |
Queries | |
Answers | |
Authoritative nameservers | |
Additional records |
首部总共12字节,长度固定,包括6个部分,每个部分2个字节
- 标识(16b)
- 用来标识DNS报文,请求报文和其对应的响应报文的标识符是相同的
- 标志(16b)
QR | Opcode | AA | TC | RD | RA | Z |
标志位 | 说明 |
---|---|
QR(1b) | 查询响应标志,0为查询,1为响应 |
Opcode(4b) | 查询类型,0为标准查询,1为反向查询,2为服务器状态请求 |
AA(1b) | 权威答案,1表示该响应来自权威DNS服务器 |
TC(1b) | 截断,1表示报文由于长度超过了传输层限制而被截断 |
RD(1b) | 期望递归,1表示客户端希望DNS服务器进行递归查询 |
RA(1b) | 可用递归,1表示DNS服务器支持递归查询 |
Z(3b) | 保留字段 |
rcode(4b) | 响应码,0无错误,1格式错误,2服务器失败,3名称错误,4未实现,5拒绝,6-15保留 |
Queries:保存多条问题记录
- Name:待查询的域名,长度不固定(通常称它为QNAME)
- Type:查询类型(A、AAAA等等)
- Class:查询类,一般为1,表示互联网地址,写作IN(IN占主导地位)
而对于域名字段,每个标签前面都会有一个前导码,代表这个标签的字符数。例如,若查询一个域名edge.microsoft.com
,其对应的字节序列如下:
1
2
0000 04 65 64 67 65 09 6d 69 63 72 6f 73 6f 66 74 03 .edge.microsoft.
0010 63 6f 6d 00 com.
04
:edge
的前导码,代表该标签有4个字符09
:microsoft
的前导码,代表该标签有9个字符03
:com
的前导码,代表该标签有3个字符00
:固定字段,位于每个域名的末尾
Answers:响应查询的回答记录
- Name:被查询的域名
- Type:被查询的类型
- Class:被查询的类
- TTL:生存时间,表示该资源记录在DNS缓存中的有效时间
- RD Length:资源e记录数据部分的长度,也就是RData的长度
- RData:查询的结果,与Type类型对应
Type | RData |
---|---|
A | ipv4地址 |
AAAA | ipv6地址 |
CNAME | 域名的别名 |
NS | 该域名的权威DNS服务器 |
MX | 用于指定接收邮件的邮件服务器,包含了优先级(数字越小优先级越高) |
PTR | 反向解析,IP地址对应的域名 |
SOA | 一个区域(Zone)的起始授权记录 |
TXT | 文本信息,传递辅助信息 |
PTR类型的Name需要使用IPv4反向解析域名格式,如
192.168.1.1
,则对应的反向域名为1.1.168.192.in-addr.arpa
区文件示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ORIGIN example.com. ; zone起点, 以`.’结尾,称作fully qualified domain names
$TTL 1h ; 缺省超时时间
example.com. IN SOA ns.example.com. username.example.com. ( 2007120710 1d 2h 4w 1h );SOA ,关于zone权威的说明,包括域名服务器,管理员email地址,(序列号(SN),refresh, retry, expire(用于从服务器同步), minimum(作为否定缓存(NXDOMAIN)TTL))
example.com. IN NS ns ;域名服务器,相对主机名,ns.example.com
example.com. IN NS ns.somewhere.example. ;域名服务器,绝对主机名,备份服务器
example.com. IN MX 10 mail.example.com. ;邮件服务器,优先级高,mail.example.com
@ IN MX 20 mail2.example.com. ;邮件服务器,优先级中, “@”:zone origin
@ IN MX 50 mail3 ;邮件服务器,优先级低,相对主机名
example.com. IN A 192.0.2.1 ;IPv4地址 example.com
IN AAAA 2001:db8:10::1 ;IPv6地址 exampel.com
ns IN A 192.0.2.2 ;IPv4地址 ns.example.com
www IN CNAME example.com. ;正式域名,www.example.com是别名
wwwtest IN CNAME www ;正式域名,wwwtest是www的别名
mail IN A 192.0.2.3 ;mail.example.com的IPv4地址
mail2 IN A 192.0.2.4 ;mail2.example.com的IPv4地址
subzone IN NS ns.subzone ;授权subzone,域名服务器为ns.subzone
ns.subzone IN A 192.0.3.1 ;胶水记录,ns.subzone的IP地址
域名注册
- 提供基本和辅助权威DNS服务器的名字和IP地址给注册登记机构
- 该机构确保将一个类型NS和一个类型A的记录输入TLD服务器
- 个人还需将用于Web服务器的类型A资源记录或用于邮件服务器的类型MX资源记录出入权威DNS服务器中
2.7 FTP文件传输协议
2.8 P2P应用:文件分发
- 没有服务器
- 任意端系统之间直接通信
扩展性
- 对于文件分发,当对等方数量N不断增大时,P2P相比于C/S体系架构,分发时间更短
BitTorrent
概念 解释 Torrent(洪流) 参与一个特定文件分发的所有对等方的集合 Tracker(追踪器) 跟踪参与torrent的节点 chunk 文件块 - 过程
- 节点加入Torrent
- 节点下载chunk,同时需要向其他节点上传chunk
- 一旦节点获得完整的文件,它可能(自私地)离开或(无私地)留下(任何时候都可选择离开)
- 获取chunk
- 任意时刻,不同节点持有文件的不同chunk集合
- 节点定期查询每个邻居所持有的chunk列表
- 节点发送请求,请求获取缺失的最稀缺的chunk(最稀缺优先)
- 发送chunk:tit-for-tat
- 挑选正在向该节点发送chunk,且速率最快的4个(疏通),向其发送chunk(每10sec重新评估top4)
- 每30sec随机选择一个其他节点,向其发送chunk
2.9 P2P应用:索引技术
- 信息节点位置(IP地址+端口号)的映射
集中式索引
- 存在一个中央服务器存储所有索引
- 内容和文件传输是分布的,但是内容定位是高度集中式的
- 问题:单点失效问题、性能瓶颈、版权问题
洪泛式查询(Query flooding)
- 完全分布式架构
- 工作原理:
- 查询消息通过已有的TCP连接
- 节点转发查询消息
- 如果查询命中,则利用反向路径发回查询节点
- 消耗大量网络带宽
层次式覆盖网络
- 介于集中式索引和洪泛式查询之间的方法
- 每个节点或者是一个超级节点,或者被分配一个超级节点
- 节点和超级节点间维持TCP连接
- 某些超级节点对之间维持TCP连接
- 超级节点负责跟踪子节点的内容
2.10 Socket编程
- 网络应用程序
- 由协议标准中所定义的操作的实现(RFC或其他标准文档)
- 专用的网络应用程序
Winsock
Windows Socket Interface
Socket API函数
函数 说明 WSAStartup 初始化socket库 WSACleanup 终止socket库的使用 socket 创建套接字
(协议族(PF_INET), 套接字类型(SOCK_STREAM, SOCK_DGRAM or SOCK_RAW(面向网络层)), 协议号)closesocket 释放/关闭套接字 bind 绑定套接字的本地IP地址和端口号(客户端通常不需要,由操作系统实现)
服务器端通常绑定INADDR_ANY(地址通配符)recv 接收数据(用于TCP套接字或连接模式的客户端UDP套接字) send 发送数据(用于TCP套接字或连接模式的客户端UDP套接字) recvfrom 接收数据报(用于非连接模式的UDP套接字) sendto 发送数据报(用于非连接模式的UDP套接字) setsockopt 设置套接字选项参数 getsockopt 获取套接字选项参数 客户端
函数 说明 connect 连接远端服务器
TCP套接字:建立TCP连接
UDP套接字:指定服务器端点地址(不是真正的连接)服务器端
函数 说明 listen 置服务器端TCP套接字为监听模式,并设置队列大小(仅用于TCP套接字) accept 接受一个连接请求,创建新套接字,通过新套接字接受数据(仅用于TCP套接字)
- 网络字节顺序
- TCP/IP定义了标准的用于协议头中的二进制整数表示,即网络字节顺序
- 某些socket API函数的参数需要存储为网络字节顺序(如IP地址、端口号等)
可实现本地字节与网络字节顺序间转换的函数
函数 说明 htons 本地——>网络(16bits) ntohs 网络——>本地(16bits) htonl 本地——>网络(32bits) ntohl 网络——>本地(32bits)
- 解析服务器IP地址+端口号+协议号
IP协议需要使用32位二进制IP地址,所以需要转换
函数 说明 inet_addr() 十进制IP地址——>32位IP地址 gethostbyname() 域名——>32位IP地址 getservbyname() 服务名——>熟知端口号 getprotobyname() 协议名——>协议号
客户端软件流程
流程步骤 | TCP | UDP |
---|---|---|
1 | 确定服务器IP地址与端口号 | 确定服务器IP地址与端口号 |
2 | 创建套接字 | 创建套接字 |
3 | 分配本地端点地址(由操作系统完成) | 分配本地端点地址(由操作系统完成) |
4 | 连接服务器(套接字) | 指定服务器端点地址,构造UDP数据报 |
5 | 遵循应用层协议进行通信 | 遵循应用层协议进行通信 |
6 | 关闭/释放连接 | 关闭/释放套接字 |
服务器端软件流程
- 循环无连接
- 循环面向连接
- 并发无连接
- 并发面向连接
This post is licensed under CC BY 4.0 by the author.