二、应用层

2.1 应用层协议原理

2.1.1 进程通信

  • 客户与服务器进程

    • 网络应用程序运行后,就变成了网络应用进程

    • 两个在不同端系统的进程,通过跨越计算机网络交换报文而相互通信

    • 网络应用程序由成对进程组成,在一对进程的通信会话场景中,发起通信的进程称为客户,等待联系的进程称为服务器

  • 进程与计算机网络的接口

    • 进程通过一个称为套接字$ (Socket) $的软件接口向网络发送报文和从网络接收报文
    • 套接字是同一台主机内应用层与运输层的接口,也成为应用程序和网络之间的应用程序编程窗口
  • 进程寻址

    • 为了与目的主机上进程的通信,需要定义目的主机的地址目的主机中指定接收进程的标识符
    • 目的主机地址由$ 32 $位的$ IP $地址标识
    • 目的进程地址由$ 16 $位目的地端口号$ Port\enspace Number $标识,如$ Web $服务器的端口号为$ 80 $,$ SMTP $的端口号为$ 25 $
    • 套接字长度为$ 48 $位

2.1.2 运输服务简介

  • $ TCP $服务
    • 面向连接:在报文流动前,$ TCP $让客户和服务器互相交换运输层控制信息以为分组运输做好准备(握手),此时,一个$ TCP $连接在两个进程的套接字直接建立
    • 可靠性:无差错、无字节丢失与冗余、顺序地传输分组
    • 拥塞控制机制:当网络拥塞时,抑制发送进程
    • 不提供加密机制
  • $ UDP $服务
    • 没有握手过程
    • 不可靠数据传送服务
    • 没有拥塞控制机制
    • 不提供加密机制
  • $ SSL $安全套接字层
    • 提供加密的$ TCP $连接
    • 提供数据完整性和端点鉴别
  • 应用层协议与支撑的运输层协议
应用 应用层协议 支撑的运输层协议
电子邮件 $ SMTP $ $ TCP $
远程终端访问 $ Telnet $ $ TCP $
$ Web $、流式多媒体 $ HTTP $ $ TCP $
文件传输 $ FTP $ $ TCP $
因特网电话 $ SIP $、$ RTP $ $ UDP $或$ TCP $

2.2 $ Web $和$ HTTP $

2.2.1 $ HTTP $概述

  • 相关概念

    • $ HTTP $全称为超文本传输协议$ (HyperText\enspace Transfer\enspace Protocol) $
    • $ Web $页面由**对象**组成,如$ HTML $文件,$ JPEG $图像
    • 通过$ URL $地址引用对象,$ URL $地址由存放对象的服务器地址对象的路径组成

      如对于$ URL $地址http://cloudchewie.com/index.html:

      $ cloudchewie.com $为主机名,$ /index.html $为对象路径
    • $ Web\enspace Browser $实现了$ HTTP $的客户端,$ Web\enspace Server $实现了$ HTTP $的服务端,用于存储$ Web $对象,每个对象由$ URL $路径访问,因此$ Web $是典型的$ C/S $模式
    • $ HTTP $负责定义客户向服务器请求$ Web $页面的方式以及服务器向客户返回$ Web $页面的方式,其传递的报文称为$ HTTP $报文
    • 客户向其套接字接口发送$ HTTP $请求报文并从其套接字接口接收$ HTTP $响应报文;当客户发送报文后,该报文即脱离客户控制而进入$ TCP $控制,从而使得应用层协议$ HTTP $无需关心报文丢失和运输层的实现细节

    • $ HTTP $服务器不保存关于客户的任何信息,是一个**无状态协议**
  • 非持续连接

    • 每个$ TCP $连接只传输一个请求报文和一个响应报文

    • 当客户接收$ HTTP $响应报文后,$ TCP $连接关闭

    • 如果需要继续发送请求,需要建立全新的$ TCP $连接

    • 可以使用并行的连接改善缩短响应时间

      $ TCP $服务是建立在连接之上的,每次建立连接前,都需要进行三次握手过程,如下图所示:
      1. 客户端向服务器发送一个小的$ TCP $报文段
      2. 服务器用一个小的$ TCP $报文段进行确认和响应
      3. 客户向服务器返回确认并发送$ HTTP $请求报文
      4. 在这之后,服务器开始发送文件到客户

      其中,环节$ 1-2 $占用了一个往返时间$ RTT $,环节$ 3-4 $占用了一个往返时间$ RTT $并且耗费了传输文件的时间

      因此,在非持续连接的HTTP下,每传送一个对象,就需要经受两个RTT的交付时延

  • 持续连接

    • 服务器发送$ HTTP $响应报文后保持$ TCP $连接,使得客户的后续请求继续使用该连接进行传送
    • 当该连接经过一定时间间隔(可配置的超时间隔)仍未使用,其服务器就将关闭该连接

2.2.2 $ HTTP $报文

  • $ HTTP $请求报文(在线交互程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #典型的HTTP请求报文
    GET /index.html HTTP/1.1\r\n
    Host: www-net.cs.umass.edu\r\n
    User-Agent: Mozilla/5.0\r\n
    Accept: text/html,application/xhtml+xml\r\n
    Accept-Language: en-us,en;q=0.5\r\n
    Accept-Encoding: gzip,deflate\r\n
    Accept-Charset: ISO-8859-1,utf-8;q=0.7\r\n
    Keep-Alive: 115\r\n
    Connection: keep-alive\r\n
    \r\n
    • 请求报文的第一行称为请求行,包括方法字段、$ URL $字段、$ HTTP $版本字段
方法字段 主要作用
$ GET $ 向服务器请求指定$ URL $的对象
$ POST $ 用于向服务器提交表单数据也可以同时请求一个$ Web $页面
$ DELETE $ 返回响应报文,不包含请求的对象
$ PUT $ 上传的文件放在实体主体字段中,目标路径由$ URL $字段标明
$ HEAD $ 删除$ URL $字段中指定的文件
  • 其余行称为首部行

    • $ Host $指明了对象所在的主机
    • $ Connection $指明非持续连接$ (Close) $和持续连接$ (keep-alive) $
    • $ Keep-Alive $指明持续连接的超时间隔
    • $ User-agent $指明用户浏览器类型,有助于服务器根据不同的用户代理发送相同对象的不同版本
    • $ Accept-* $指用户想要得到特定语言、编码格式、字符集的该对象
  • 结尾单独一行回车、换行表示报文首部结束

  • 实体体,在首部行之后的请求体

    • 当发送$ GET $请求时,实体体为空;
    • 当用户填写表单并发送$ POST $请求时,实体体即为用户填写的表单;
    • 当用户填写表单时,也可以使用$ GET $方法,如/learning/search?key=banana&lang=zh
  • $ HTTP $请求报文的通用格式
  • $ HTTP $响应报文(在线交互程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #典型的HTTP响应报文
    HTTP/1.1 200 OK\r\n
    Date: Sun, 26 Sep 2010 20:09:20 GMT\r\n
    Server: Apache/2.0.52 (CentOS)\r\n
    Last-Modified: Tue, 30 Oct 2007 17:00:02 GMT\r\n
    ETag: "17dc6-a5c-bf716880"\r\n
    Accept-Ranges: bytes\r\n
    Content-Length: 2652\r\n
    Keep-Alive: timeout=10, max=100\r\n
    Connection: Keep-Alive\r\n
    Content-Type: text/html; charset=ISO-8859-1\r\n
    \r\n
    data data data data data ...
    • 响应报文的第一行称为初始状态行,包括协议版本字段、状态码、状态信息
状态码 状态信息 说明
$ 200 $ $ OK $ 请求成功
$ 301 $ $ Moved\enspace Permanently $ 请求的对象被永久转移,新的$ URL $定义在$ Location $首部行
$ 400 $ $ Bad\enspace Request $ 通用差错代码,请求不能被服务器理解
$ 404 $ $ Not\enspace Found $ 被请求的对象不在服务器
$ 500 $ $ HTTP\enspace Version\enspace Not\enspace Supported $ 服务器不支持请求报文中的$ HTTP $协议版本
  • 其余行称为首部行
    • $ Date $指示服务器发送响应报文的日期时间
    • $ Server $指示服务器类型,类似于请求报文中的$ User-agent $
    • $ Last\enspace Modified $指示对象创建或最后修改的日期时间
    • $ Content-Length $指示被发送对象的字节数
    • $ Content-Type $指示实体体中对象为$ HTML $文本
  • 实体体包含被请求的对象
  • $ HTTP $响应报文的通用格式

2.2.3 $ Cookie $

  • $ Cookie $的意义
    • 限制用户的访问
    • 将内容与用户身份相关联
    • 在无状态的$ HTTP $上建立用户会话层
  • $ Cookie $的组成
    • $ HTTP $响应报文中的$ Cookie $首部行
    • $ HTTP $请求报文中的$ Cookie $首部行
    • 端系统中保留$ Cookie $文件
    • $ Web $服务器的$ Cookie $数据库
  • $ Cookie $的使用
    • 客户向服务器发送普通请求报文
    • 服务器为客户创建$ ID $如U202073245并放置在响应报文的首部行
    • 客户存储$ Cookie $
    • 客户将$ Cookie $放置在请求报文的首部行
    • 服务器根据$ Cookie $采取指定动作,并返回普通响应报文

2.3 电子邮件

2.3.1 电子邮件系统的构成

  • 用户代理
    • 用户可以撰写编辑邮件、查看邮件
    • 如网易邮箱大师、$ FoxMail $
  • 邮件服务器
    • 存储用户邮件的服务器
    • 在报文队列中维护需要发送的邮件报文
  • 简单邮件传输协议$ SMTP $
    • 将邮件从发送方的客户端发送到发送方的邮件服务器
    • 将邮件从发送方的邮件服务器发送到接收方的邮件服务器

2.3.2 $ SMTP $协议

  • 基本介绍(在线交互程序

    • 使用$ TCP $运输协议进行可靠的邮件传送,端口号为$ 25 $
    • 不使用中间邮件服务器发送邮件,而是直接在发送方服务器和接收方服务器间进行传输
    • 使用持续连接
    • 要求报文(首部和信体)全部使用$ 7-bit\enspace ASCII $码
    • $ SMTP $服务器用$ CRLF.CRLF $表示邮件报文的结束
  • 报文格式

    1
    2
    3
    From: alice@qq.com
    To: Bob@google.com
    Subject: Searching for the meaning of life.
  • 与$ HTTP $协议的对比

$ HTTP $ $ SMTP $
协议类型 拉协议 推协议
报文编码格式 不限制 $ 7-bit\enspace ASCII $
多对象 每个对象分装在各自的响应报文中 多个对象在多分部的报文中
  • 使用$ telnet $指令访问$ QQ $邮箱

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    telnet smtp.qq.com 25
    auth login
    base64-mail
    base64-authentication-code
    helo qq.com
    mail from:<xxx@xx.xx>
    rcpt to:<xxx@xx.xx>
    data
    Hello World!
    Hello World!
    .
    quit

2.3.3 $ POP3 $协议

  • 运行在端口$ 110 $的邮件访问协议

  • 运行方式

    • 特许阶段:用户代理发送用户名和口令以鉴别用户

      主要命令:user 和pass

      服务器的响应回答有$ +OK $、$ -ERR $

    • 事务处理阶段:用户代理取回报文,同时可以对报文做删除标记的更改,获取邮件统计信息

      $ list $——列出报文号码 $ retr $——用报文号码取回报文 $ dele $——用报文号码删除邮件
    • 更新阶段

      $ quit $——结束$ POP3 $会话,服务器删除被标记为删除的邮件
  • 使用$ telnet $指令访问$ QQ $邮箱

    1
    2
    3
    4
    5
    6
    7
    telnet pop.qq.com 110
    user QQ-ID
    pass authentication-code
    list
    retr 1
    dele 1
    quit

2.3.4 $ IMAP $协议

  • 允许用户在服务器上组织自己的邮件目录

  • 维护$ IMAP $会话的用户信息:目录名以及报文$ ID $与目录名之间的映射关系

  • 使用$ telnet $指令访问$ QQ $邮箱

    1
    2
    3
    4
    5
    6
    7
    telnet imap.qq.com 143
    a01 login QQ-ID authentication-code
    a02 list "" *
    a03 select inbox
    a04 create folder
    a05 delete folder
    a06 rename oldfolder new folder

2.4 $ DNS $

2.4.1 $ DNS $服务

  • $ DNS $简况(在线交互程序

    • $ DNS $能够将主机名解析为主机的$ IP $地址
    • $ DNS $是一个分布式数据库,由很多$ DNS $服务器按照层次结构组织
    • $ DNS $运行在端到端系统上,且使用$ UDP $协议($ 53 $号端口)进行报文传输
  • $ DNS $解析过程
    • 用户请求$ URL $http://cloudchewie.com/index.html
    • 浏览器抽取出主机名cloudchewie.com并发送给$ DNS $客户端
    • $ DNS $客户端向$ DNS $服务器发送查询请求报文
    • $ DNS $服务器返回包含主机名对应$ IP $地址的响应报文
    • $ DNS $客户端将$ IP $地址传送给浏览器
    • 浏览器向$ IP $地址所在$ Web $服务器发起$ TCP $连接
  • 其他服务

    • 主机别名:获取主机别名对应的主机规范名
    • 邮件服务器别名:获取邮件服务器主机别名对应的主机规范名
    • 负载分配:将一个$ IP $地址集合同一个规范主机名相联系

2.4.2 $ DNS $工作机理

  • 采用单台$ DNS $服务器

    • 单点故障:一旦崩溃,因特网瘫痪
    • 通信容量:该台服务器不得不处理所有$ HTTP $请求报文和电子邮件报文
    • 时延严重:集中式数据库将造成严重的拥塞与时延
    • 难以维护:不得不持续更新以适应数据更改
  • 采用分布式层次化数据库

    • 根服务器提供$ TLD $服务器的$ IP $地址
    • $ TLD $服务器提供权威服务器的$ IP $地址,负责所有顶级域名和所有国家顶级域
    • 权威服务器提供域名到$ IP $地址的映射服务
    • 本地$ DNS $服务器(默认$ DNS $服务器)
      • 当一台主机需要做一个域名查询的时候,查询请求首先被发送到本地域名服务器
  • 递归查询与迭代查询(在线交互程序

  • $ DNS $缓存(在线交互程序

    • 一旦 (任何) 域名服务器得知了某个映射, 就将其缓存
    • 在一定的时间间隔后缓存的条目将会过期(自动消除)
    • $ TLD $服务器的地址通常被缓存在本地$ DNS $服务器中,以减少根服务器负载

2.4.3 $ DNS $记录

格式为四元组$ (Name,Value,Type,TTL) $,其中$ TTL $表示记录的生存时间

$ Type $ $ Name $ $ Value $
$ A $ 主机名 $ IP $地址
$ CNAME $ 主机别名 规范主机名
$ NS $ 该域权威域名服务器的主机名
$ MX $ 邮件服务器的主机别名 邮件服务器的规范主机名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#使用nslookup进行DNS解析
#进入交互模式
nslookup
server www.net.cn
server dns.hust.edu.cn
set ty=A
cloudchewie.com
hust.edu.cn
set ty=ns
cloudchewie.com
set ty=cname
cloudchewie.com
set ty=mx
hust.edu.com