[计算机网络_自顶向下]:应用层

应用层

一、应用层协议原理

1.网络应用程序体系结构

  • 网络体系结构

    网络体系结构是不变的,即因特网五层模型或OSI七层模型

  • 应用程序体系结构

    应用程序体系结构主要由应用程序研发者决定,主要包括两大类

    • 客户-服务器体系结构
    • 对等体系结构(P2P)

客户-服务器体系结构

  • 服务器:总是不宕机,服务于许多来自于其他客户机的请求
  • 客户:向服务器发送请求的主机

在客户-服务器体系结构中,客户之间互相并不通信

P2P体系结构

  • P2P体系结构几乎不依赖于专有服务器
  • 应用程序在间断连接的主机之间可以直接通信,这些主机对被称为对等方

2.进程通信

从操作系统的角度,主机间进行通信的的其实是进程而不是程序

  • 客户和服务器进程

    在一对进程之间的通话场景中,发起通信的进程被称为 客户,在回话开始时等待联系的进程是服务器

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

    • 套接字

      套接字是进程与网络之间发送、接受报文的软件接口,即应用层与传输层之间的接口,也比称之为应用程序与网络之间的应用程序编程接口(API)

  • 进程寻址

    发送进程要想发送报文给接受进程,必须得知道接受进程的”所在位置”,这个所在位置通过IP地址端口号进行标记

    • IP地址:一个32位字符串,用来标记每一条主机
    • 端口号:端口号是主机上进程的标识符,可以在网络上查到

3.可供应用程序使用的运输服务

  • 可靠数据传输

    能够保证进程到进程的数据将会被无差错的传递

  • 最低限度吞吐量

    能够保证报文在传输过程中的吞吐量至少不会少于某个值

  • 定时保证

    能够保证报文能够以较小的时延进入接受进程

  • 安全性

    能够对传输的数据进行加密

4.因特网提供的运输服务

  • TCP服务

    TCP协议提供面向连接服务和可靠数据传输服务

    • 面向连接服务

      数据包开始流动之前,TCP会让客户和服务器之间互相交换运输层控制信息,被称为握手过程

      握手阶段结束过后,在发送进程与接收进程之间会建立一条TCP连接,双方可以在这条连接上进项数据报的传递

      通信结束过后,会拆除该连接

    • 可靠数据传输服务

    • 安全性

      TCP本身并不提供安全性服务,但它的加强版SSL提供了安全服务,这种加强是在应用层上实现的

    TCP还提供拥塞控制机制,当发送方与接收方进行网络通信发生网络拥塞时,TCP的拥塞控制机制会抑制发送进程

  • UDP服务

    • 面向无连接服务
    • 缺乏可靠性

    UDP虽然可靠性不佳,但是它能自由调整发送速率,速率更快

二、Web和HTTP

1.HTTP概况

Web的应用层协议是HTTP(超文本传输协议)

Web页面的构成

  • Web页面本质上是一个文档,是由各种对象组成的
  • HTML文件,JPEG图形,小程序,视频等都能被称作对象,并且可以通过URL寻址
  • 一个页面总是包含一个HTML文件以及各种其他对象

URL的构成

http://www.someSchool.edu/someDepartment这个URL为例

在浏览器中点击超链接会发生什么

  1. 浏览器向Web服务器发出请求该页面中请求对象的HTTP报文
  2. 服务器接受到请求并用这些对象的HTTP响应报文进行响应

HTTP是无状态协议

服务器向客户发送被请求的文件,但并不存储任何关于该客户的状态信息

加入客户在短时间内请求了两个对象,服务器并不会因为第一次发送了对象第二次就不做出反应,而是重新再发送一次对象

2.非持续连接与持续连接

  • 非持续连接

    客户每发送一个请求,就会单独建立一个TCP连接

  • 持续连接

    所有的请求以及响应经过相同的TCP连接发送

对于HTTP而言,既支持非持续连接,也支持持续连接,默认状态下是持续连接

三次握手

当建立TCP连接后,在客户和服务器之间会发生三次握手

  1. 客户向服务器发送一个小的TCP报文段
  2. 服务器接受到该报文段后,在用一个小的TCP报文段做出确认和响应
  3. 客户接收到确认的TCP报文段后,向服务器发送HTTP请求

1

非持续连接的缺点

  • 必须为每一个请求的对象建立一个全新的连接,这为Web服务器带来了负担
  • 每一个对象的传输都会经历三次握手和自身的传输,相对于持续连接有两倍的往返时延(RTT)

3.HTTP报文格式

  • HTTP请求报文

    2

  1. 请求行

    报文的第一行被称为请求行,包含三个字段,方法字段,URL字段和HTTP版本字段

    • 方法字段

      • GET

        向指定的资源发出“显示”请求,是只读的

      • HEAD

        与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的文本部分

        它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)

      • POST

        向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求体中。这个请求可能会创建新的资源或修改现有资源,或二者皆有

        注:也可使用GET方法,在包含的URL中加入要输入的数据

        如:https://zh.wikipedia.org/wiki/超文本传输协议,后面的`/超文本传输协议`就是附加内容

      • PUT

        向指定资源位置上传其最新内容。

      • DELETE

        请求服务器删除Request-URI所标识的资源。

      • TRACE

        回显服务器收到的请求,主要用于测试或诊断。

      • OPTIONS

        这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*’来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。

      • CONNECT

        HTTP/1.1协议中预留给能够将连接改为隧道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

      方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

      HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的

    • HTTP版本

      目前的HTTP版本有 HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2

    一个经典的HTTP请求报文如图所示,注意每一行都必须以rn结尾

    3

    注:可以使用telnet工具来进行手动报文发送过程

  • HTTP响应报文

    4

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔

状态代码的第一个数字代表当前响应的类型:

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

响应报文例子:

5

cookie是什么

cookie是一种小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据

为什么需要cookie

HTTP服务器是无状态协议,无法保存用户的数据,但是Web网站通常希望能够识别用户的身份,因此他们使用Cookie来绕开HTTP的这种无状态协议

Cookie的使用

Cookie有四个组件

  1. HTTP响应报文中有一个Cookie首部行
  2. HTTP请求报文中有一个Cookie首部行
  3. 用户端系统总有一个Cookie组件,并且由浏览器进行管理
  4. Web站点的后端数据库中存储了记录用户身份的Cookie

Cookie的使用过程

  • 当用户第一次访问某个Web站点时,该Web站点会在响应报文中的首部行中添加一行Set-cookie:xxxx,

    浏览器接收到响应报文,并读取到这一行时,会在它的cookie文件中添加该Web网站的信息,包含服务器的主机名和该用户的识别码

  • 当用户再一次访问该站点时,浏览器会在请求报文中的是首部行加入cookie: xxxx,此时该Web站点会根据该识别码读取记录在它的后端数据库中的用户信息,此时用户就不用再次验证自己的身份

下面是我的chrome浏览器中保存的cookie

  • cookie

6

  • 使用cookie的报文发送过程

    7

5.Web缓存

什么是Web缓存

  • Web缓存是一种临时存储Web文档以减少服务器延迟的一种技术
  • Web缓存器,也叫作代理服务器(proxy server),可以保存最近请求过的对象的副本

Web的使用过程

  • 用户在浏览器上点击一个超链接
  • 浏览器创建一个到Web缓存器的TCP连接,并向Web缓存器的对象发送一个HTTP请求
  • Web缓存器进行检查,看本地是否存储了该对象的副本,如果有,则Web缓存器用HTTP响应报文返回该对象
  • 如果没有,他就打开一个与对象的初始服务器的TCP连接,向该服务器发送HTTP请求报文,服务器接受到请求报文后,向该Web缓存器发送一份响应报文
  • Web缓存器接收到对象后,在本地存储空间存储一份副本,并向客户的浏览器发送该副本

从某种意义来说,Web缓存器既是客户也是服务器,它可以大大减少客户请求的响应时间

  • 图示

    8

6.条件GET方法

条件GET方法的作用

由于Web缓存器中的对象可能是陈旧的,即服务器中的Web文档已经被修改,使用条件GET方法可以证实Web缓存器中的对象是最新的

条件GET请求报文

一个请求报文满足以下条件时就被称为条件请求报文

  • 请求报文使用GET方法
  • 请求报文中包含一个If-Modified-Since: xxxx

条件请求报文的使用

  • 当Web缓存器在本地缓存对象的时候,他也在本地缓存了最后的修改时期
  • 下一次用户再次访问该Web页面的时候,该Web缓存器会向服务器发送条件请求报文
  • 如果该Web页面在条件请求报文if-Modified-Since:xxxx所表示日期后没有发生修改,则Web服务器只会向Web缓存器发送一个不包含对象的响应报文

9

三、因特网中的电子邮件

电子邮件的组成部分

电子邮件通信主要由三大部分组成:

  • 用户代理
  • 邮件服务器
  • 邮件协议

一、用户代理 (user agents)
就像我们常常使用的邮箱客户端,我们能直接接触的部分

  • 允许用户阅读,回复,转发,保存,编辑邮件消息
  • 例如:Outlook, foxmail等
  • 发送, 接收邮件消息到/从服务器
  • 运行邮件协议

二、邮件服务器 mail servers

  • 邮箱mailbox 存放用户接收的邮件消息
  • 外出报文队列outgoing message queue
  • 运行邮件协议

三、邮件协议

  • 简单邮件传输协议
  • 邮件接受协议

一、SMTP简单邮件传输协议

SMTP是因特网电子邮件中主要的应用层协议

  • 客户使用TCP来可靠传输邮件消息到服务器

  • 端口号25

  • 直接传送: 发送服务器到接收服务器

  • 传输的3个阶段

    • 握手 (问候)
    • 邮件消息的传输
    • 结束
  • 命令/应答的交互
    – 命令: ASCII文本格式

    – 应答: 状态码及其短语

  • 邮件消息必须是7-bit ASCII

例子:

10

  • Alice的用户代理发送邮件消息 到她的邮件服务器;邮件消息存放在邮件消息队列
  • Alice邮件服务器的SMTP客户端发起建立一个到Bob的邮件服务器的SMTP服务器端的TCP连接,经过应用层握手

    注:

    • 如果此时Bob的邮件服务器没有开机,那么Alice的邮件服务器会在稍后继续进行尝试
    • Alice的邮件服务器和Bob的与邮件服务器总是直接连接,他们不使用中间邮件服务器
  • SMTP客户在这个TCP连接上发送Alice的邮件消息
  • Bob服务器存放邮件消息存到 Bob的邮箱
  • Bob调用他的用户代理读邮件消息

下面是一个使用telnet发送邮件的例子

11

SMTP总结

  • SMTP使用持续连接
  • SMTP 要求邮件消息 (header & body)必须 是7-bit ASCII
  • SMTP服务器使用 CRLF.CRLF (rn.rn)来判断邮件消息的结束

二、与HTTP对比

  • HTTP是服务器向Web客户传送报文

  • SMTP是邮件服务器向另一个邮件服务器传送报文

  • HTTP是拉协议

    在服务器开机的时候,用户使用HTTP从Web服务器上拉取信息,TCP是由想连接文件发起的

  • SMTP是推协议

    发送邮件服务器使用SMTP把文件推向接收文件服务器,TCP连接是由要发送文件的机器发起的

  • HTTP把每个对象封装到它自己的响应报文中

    SMTP把所有对象都放到一个响应报文中

三、邮件报文格式

首部行

  • To:

  • From:

  • Subject:

    首部必须包含From和To,其他的首部行则是可选的

分隔符

使用回车换行==CRLF==将首部行与body分割

报文体

使用ASCII码格式

四、邮件访问协议

12

  • 邮件接收方通过POP3(第三版邮局协议)、IMAP(因特网邮件访问协议)、HTTP等协议将邮件从自身的邮件服务器拉取到自己的主机上

POP3

当用户代理打开了一个到邮件服务器端口110上的TCP连接后,POP3协议开始发挥作用

POP3按照三个阶段发挥作用:

  • 授权(authorization)

    用户代理以明文形式向服务器发送用户名(user)以及口令(pass)用来鉴别自身身份

  • 事务处理

    用户取得报文(retr),同时还能进行以下操作

    • 对报文做删除标记(dele)
    • 取消删除标记
    • 获取邮件数量以及各自大小(list)
  • 更新

    使用quit指令,POP3对话将会结束,邮件服务器将会是删除那些被标记为删除的报文

IMAP

  • POP3在服务器上不能为用户创建任何远程文件夹

  • IMAP服务器会把报文和每一个文件夹联系起来,当报文第一次到达服务器时,会被存放到收件人的INBOX文件夹中,

    收件人则能够把邮件移动到一个新的文件夹中(邮件服务器上),用户能够对邮件进行删除,阅读等操作, IMAP提供了这些命令

  • IMAP还能允许用户代理获取报文的某些部分,比如首部行

HTTP

当使用Web进行邮件的接受时,用户代理就是普通的浏览器,用户与远程服务之间通过HTTP协议进行通信

四、DNS

什么是DNS

DNS(Domain Name System,域名系统)有两重身份

  • 一个由分层的DNS服务器实现的DNS数据库
  • 一个使得主机能够查询分布式数据库的应用层协议

DNS运行在UDP之上,使用53号端口

域名与IP地址

www.baidu.com为例,baidu.com就是域名,它的IP地址为 220.181.38.148

域名是面向用户的,具有可读性,IP地址是面向网络的,具有规范性

1.DNS提供的服务

  • DNS被其他应用层协议,包括HTTP,STMP,FTP等所使用,将用户提供的主机名(域名)解析为IP地址

  • 主机别名

    一台主机只有一个规范主机名,但它可能有多个别名,应用程序可以调用DNS来取得主机别名对应的规范主机名,以及IP地址

  • 邮件服务器别名

    邮件服务器也可以使用别名,甚至一个公共邮件服务器的别名可以和Web服务器使用相同的别名,应用程序可以调用DNS来取得主机别名对应的规范主机名,以及IP地址

  • 负载分配

    一个站点(如cnn.com)可以被分布在多台服务器上,一台服务器也可以运行在多台端系统上,因此,一个IP地址集合可以与同一个规范主机名相联系,DNS数据库存储这这些IP地址集合

    每次用户总是向IP地址排在第一个的服务器发送HTTP请求报文,DNS在每次回答中都会循环这些地址次序,以此做到循环分配负载

2.DNS工作机理

域名的分级

13

分布式、层次数据库

  • DNS使用了大量的DNS服务器,以层次的方式在全世界的范围内进行组织
分类 作用
根域名服务器 最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助
顶级域名服务器 负责管理在该顶级域名服务器下注册的二级域名
权威域名服务器 负责一个区的域名解析工作
本地域名服务器 当一个主机发出DNS查询请求时,这个查询请求首先发给本地域名服务器

域名的解析流程

域名解析总体可分为以下过程:
(1)输入域名后, 先查找自己主机对应的域名服务器,域名服务器先查找自己的数据库中的数据.
(2) 如果没有, 就向上级域名服务器进行查找, 依次类推
(3) 最多回溯到根域名服务器, 肯定能找到这个域名的IP地址
(4) 域名服务器自身也会进行一些缓存, 把曾经访问过的域名和对应的IP地址缓存起来, 可以加速查找过程
具体可描述如下:

  1. 主机先向本地域名服务器进行递归查询
  2. 本地域名服务器采用迭代查询,向一个根域名服务器进行查询
  3. 根域名服务器根据域名的顶级域名部分,告诉本地域名服务器,下一次应该查询的顶级域名服务器的IP地址
  4. 本地域名服务器向顶级域名服务器进行查询
  5. 顶级域名服务器告诉本地域名服务器,下一步查询权威服务器的IP地址
  6. 本地域名服务器向权威服务器进行查询
  7. 权威服务器告诉本地域名服务器所查询的主机的IP地址
  8. 本地域名服务器最后把查询结果告诉主机
    如图所示:

14

递归查询与迭代查询

  • 递归查询

    本机向本地域名服务器发出一次查询请求,就静待最终的结果,这次查询被称为递归查询。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机

  • 迭代查询

    本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询,本地域名服务器进行的三次查询被称为迭代查询

DNS缓存

DNS缓存可以改善时延性能并减少在因特网上到处传播的DNS报文

  • 工作机理

    当服务器接收到另外一台主机发送的响应报文(包含域名到IP地址的映射)后,会将该映射保存在缓存中,下一次当查询相同域名的请求报文发送到该主机时,可以直接从缓存中拿出并发送

  • DNS服务器一般会在两天后丢弃缓存信息

3.DNS记录和报文

所有的DNS服务器中都存储了资源记录RR(Resource Record)

RR的内容

RR是一个包含了四个字段的四元组:==(Name,Value,Type,TTL)==

  • TTL是该记录的生存时间,它记录了资源记录应当从缓存中删除的时间

下面详细介绍Name,Value和Type

  • Type=A,则Name是主机名,Value是该主机名对应的IP地址
  • Type=NS,则Name是域,Value是该域对应的权威DNS服务器的主机名
  • Type=CNAME,则Value是别名为Name的服务器的规范主机名
  • Type=MX,则Value是个别名为Name的邮件服务器的规范主机名

DNS报文

15

DNS的查询报文与响应报文格式相同,均为上表所示

  • 前12个字节是首部区域,包含6个字段

    • 事务ID,也称标识符,用来标记该查询,该标识符会被复制到响应报文中,以便让客户能够匹配它接收到的和请求的回答

    • 标志

      常见的标志如下:

      • 查询/回答标志(0/1)

        指出该报文是查询还是回答

      • “权威的”标志

        当该报文是权威DNS服务器的响应报文时,应该在首部行加上”权威的”标志

      • “希望递归”标志

        表明客户希望对该域名进行递归查询

      • “递归可用”标志

        如果递归服务器支持递归查询,会加上”递归可用”标志

    • 另外四个字段记录了另外最后四个字段的RR数目

  • 查询问题区域

    包含Name字段和Type字段,用来表明需查询的信息

  • 回答问题区域

    包含了回答的信息,即RR

    由于一个服务器可能对应多个IP,所以回答字段可以包含多个RR

  • 权威区域

    包含了其他权威服务器的信息

  • 附加区域

    如果回答区域有一条RR记录了服务器的规范主机名,则在附加区域会补充一条类型A记录

下面是一个wireshark抓包的例子

16

在域名数据库中插入记录

如今购买域名以及设置DNS已经十分简单,下面是我在腾讯云设置DNS解析的例子

17

  • 主机记录: RR中的Name字段

    • www: 解析后的域名为www.liver0377.xyz

    • @: 直接解析主域名, 如liver0377.xyz

    • : 泛解析,匹配所有域名, 如.liver0377.xyz

  • 记录类型: 就是RR中的type字段

拒绝攻击服务(DDoS):

攻击者对DNS服务器发送大量分组,导致大多数合法DNS请求得不到回答

五、P2P

P2P协议(peer to peer), 与客户-服务器体系不同,资源被分散存储在网络的各个用户上,每个用户既是下载者,也是上传者

  • P2P与C/S体系的分发时间对比

18

最流行的协议是BitTorrent, 可以看看这篇科普博客(https://zhuanlan.zhihu.com/p/87327257)

六、CDN

对如youtube之类的因特网视频公司,提供视频服务最直接的方法是建立单一大规模数据中心,但是这种方法有三个缺点

  1. 如果客户远离数据中心,时延就会很大
  2. 流行的视频可能会在相同的通信链路上发送很多次,这会浪费网络带宽,同时也会使得公司向ISP服务商提供更高的费用
  3. 如果中心节点故障,将会造成整个链路崩溃
  • CDN

    如今大多数公司使用内容分发网(Content Distribution Network, CDN), CDN的基本策略就是在世界各地建立服务器集群,当用户发出请求时,会自动将其定向到一个提供最好用户体验的CDN服务器集群

  • 分类

    CDN分为私有第三方两类,私有即内容提供商私人拥有,如google就拥有很多自己的私人数据中心, 第三方CDN则可以代表多个内容提供商分发内容

1. 服务器安置策略

CDN通常有两种不同的服务器安置策略

  • 深入

    在遍及全球的接入ISP部署服务器集群来深入到ISP的接入网当中,这样做可以更加靠近用户,但缺点是需要很多集群,会带来管理不便

  • 邀请做客

    在少量关键位置建造大集群来邀请客户到ISP做客,通常是在因特网交换点(IXP), 这是如今普遍使用的方式

    注: ISP <==> IXP <==> CDN服务器

实现

当用户向服务器发送请求时,CDN通常会截取请求,并:

  • 确定此时适合该用户的CDN集群
  • 将用户的请求重定向到适合于该用户的CDN服务器集群

通常,CDN会与DNS提供商进行合作,来进行用户请求的截获与重定向

  • 例子

    • 用户访问NetCiema的Web网页

    • 当用户点击视频链接http://video.netcinema.com/XXXXXX时,用户主机发送了一个对于video.netcinema.com的DNS请求

    • 用户的本地DNS服务器(LDNS)将该DNS请求中继到一台用于NetCinema的权威DNS服务器

      NetCinema权威DNS服务器向LDNS返回一个KingCDN域的主机名,而不是IP地址,如a1105.kingcdn.com

    • DNS请求进入KingCDN专用DNS基础设施,LDNS发送对a1101.kingcdn.com的DNS请求

      KingCDN的DNS请求进行重定向操作,返回需要的KingCDN内容服务器的IP地址

    • LDNS向用户主机转发IP地址

    • 用户主机与指定IP地址的主机创建TCP连接,获取到内容

    19

2. 集群选择策略

  • 地理位置最接近
  • 实时测量时延