Post

应用层

应用层

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的加强,是在应用层上实现的。

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

响应报文

  • 状态行
    • 协议版本字段
    • 状态码、相应状态信息
状态行相应状态信息说明
200OK请求成功,信息在响应报文中
301Moved Permanently请求对象已被永久转移,新的URL定义在响应报文的Location
400Bad Request请求不能被服务器理解
404Not Found请求的文档不在服务器上
418I’m a teapot服务器拒绝冲泡咖啡
505HTTP 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/
  • 某些网站为了辨别用户身份,进行session跟踪而存储在用户本地终端上的数据(通常经过加密)
  • Cookie的组件
    • HTTP响应报文的cookie首部行
    • HTTP请求报文的cookie首部行
    • 保存在客户端主机上的cookie文件,由浏览器管理
    • Web服务器端的后台数据库 ^ed8d34

Web缓存(Web Cache)

Web缓存器,也叫代理服务器

  • 浏览器先向代理服务器发送HTTP请求
    • 若请求对象在代理服务器中,则由代理服务器直接返回对象
    • 否则,代理服务器向原始服务器发送HTTP请求,获取对象,然后返回给客户端并保存该对象
  • 一般由ISP架设
  • 条件GET方法
    • 目标:查看代理服务器的对象是否为最新版本
    • 构成:
      1. 请求报文使用GET方法;
      2. 请求报文中包含一个“If-Modified_Since:”首部行(该字段值为“Last-Modified:”的值)
    • 服务器:
      • 若版本为最新,则响应报文不包含对象(HTTP/1.1 304 Not Modified)

2.5 Email应用

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
    • 层次说明
      根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)
QROpcodeAATCRDRAZ
标志位说明
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.
  • 04edge的前导码,代表该标签有4个字符
  • 09microsoft的前导码,代表该标签有9个字符
  • 03com的前导码,代表该标签有3个字符
  • 00:固定字段,位于每个域名的末尾

Answers:响应查询的回答记录

  • Name:被查询的域名
  • Type:被查询的类型
  • Class:被查询的类
  • TTL:生存时间,表示该资源记录在DNS缓存中的有效时间
  • RD Length:资源e记录数据部分的长度,也就是RData的长度
  • RData:查询的结果,与Type类型对应
TypeRData
Aipv4地址
AAAAipv6地址
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文件传输协议

  • C/S模式 FTP
  • 采用TCP可靠的传输服务
  • 维护两条连接
    • 控制连接
      • 端口21(服务器端)
    • 数据连接
      • 端口20(服务器端)
      • 包括主动模式和被动模式

2.8 P2P应用:文件分发

  • 没有服务器
  • 任意端系统之间直接通信

扩展性

  • 对于文件分发,当对等方数量N不断增大时,P2P相比于C/S体系架构,分发时间更短

BitTorrent

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()协议名——>协议号

客户端软件流程

流程步骤TCPUDP
1确定服务器IP地址与端口号确定服务器IP地址与端口号
2创建套接字创建套接字
3分配本地端点地址(由操作系统完成)分配本地端点地址(由操作系统完成)
4连接服务器(套接字)指定服务器端点地址,构造UDP数据报
5遵循应用层协议进行通信遵循应用层协议进行通信
6关闭/释放连接关闭/释放套接字

服务器端软件流程

  • 循环无连接
  • 循环面向连接
  • 并发无连接
  • 并发面向连接
This post is licensed under CC BY 4.0 by the author.