二、应用层

网络应用是计算机网络存在的理由,如果我们不能构想出任何有用的应用,也就没有任何必要去设计支持它们的网络协议了。

1. 应用层协议原理

研发网络应用程序的核心是写出能够运行在不同的端系统通过网络彼此通信的程序。
在研发网络应用程序时,我们不需要写出在网络核心设备(如路由器或链路层)上运行的软件。因为网络核心设备并不在应用层上起作用,而时仅在较低层起作用。这种基本设计将应用程序将应用程序限制在端系统,并且使大量的网络应用程序迅速研发和部署。

1.1 网络应用程序体系结构

应用程序体系结构由应用程序研发者设计,规定了如何在各种端系统上组织运行该应用程序。

主流应用程序结构有两种

  • 客户-服务器体系结构(client-server architecture):即我们身边常见的CS模式,客户端发送请求,服务端处理客户端请求并返回结果;
  • P2P体系结构(P2P architecture):即点对点,应用程序在间断连接的主机之间使用直接通信,这些主机被称为对等方;
1.2 进程通信

运行在端系统上的程序互相通信,进行通信的实际上是进程而不是程序。一个进程可以被认为是运行在端系统中的一个程序。
在两个不同端系统上的进程,通过跨越计算机网络交换报文相互通信;

  • 客户和服务器进程:在一对进程之间的通信会话场景中,发起通信的进程被标识为客户,在会话开始时等待联系的进程被称为服务器;
  • 进程与计算机网络之间的接口进程通过一个称为套接字的软件接口向网络发送报文和从网络接收报文。例如将进程比作一座房子,而套接字就相当于它的门,当一个进程想向另一台主机发送报文时,就相当于通过门将报文推出去,假定门外有运输的基础设施,该设施将报文送到目的进程的门口;
  • 进程寻址:在一台主机上运行的进程为了向另一台主机上运行的进程发送分组,接受进程需要有一个地址;该地址需要包含两种信息:(1).主机的地址(即IP地址)(2).在主机中指定接受进程的标识符(即端口号)
1.3 可供应用程序使用的运输服务

套接字是应用程序进程和运输层协议之间的接口,在发送端的应用程序将报文推进套接字,在该套接字的另一端,运输层协议负责从接收进程的套接字得到该报文。

运输层能够为调用它的应用程序提供的服务:

  • 可靠的数据传输:传输过程中不会丢失数据
  • 吞吐量保证:以某种特定的速率提供确保的可用吞吐量
  • 定时保证:如在发送邮件场景中,保证100ms内将邮件送达
  • 安全性:对传输数据的加密和验证
1.4 Internet提供的运输服务

Internet为应用程序提供了两个运输层协议,TCPUDP

  • TCP: 面向连接服务和可靠数据传输服务;
    • 面向连接服务:在传输报文之前,需要通过三次握手建立TCP连接,双方在建立好的TCP连接上收发报文
    • 可靠的数据传输服务:在传输过程中,依靠TCP可以保证无差错、按适当顺序交付所有发送的数据
    • 拥塞控制机制: 当发送方和接收方之间的网络出现拥塞时,TCP的拥塞机制会抑制发送进程(发送进程可为客户端和服务端)

TCP没有提供任何加密机制,所以在发送过程中容易造成信息泄露的问题,所以现在已经研制出了TCP的加强版——SSL(Secure Sockets Layer),SSL除了满足TCP的所有功能,还满足了加密、数据完整性、端点验证的功能。(注意SSL不是新的传输层协议,他只是TCP的加强版,而强化主要是在应用层实现的)

  • UDP:无连接不可靠传输(主要用于对信息流没那么严格要求的产品,如看视频等)
  • Internet运输协议所不提供的服务:Internet运输协议并没有提供吞吐量保证定时保证这两个服务
1.5 应用层协议

应用层协议定义了运行在不同端系统上的应用程序进程如何传递报文,有如下定义:

  • 交换的报文类型,如请求报文和响应报文
  • 各种报文类型的语法,如报文中的各个字段如何描述
  • 字段的含义
  • 确定一个进程何时及如何发送报文,对报文响应的规则

应用层协议和网络应用的关系:应用层协议只是网络应用的一部分;

2. Web和HTTP

2.1 HTTP概况
  • Web的应用层协议是HTTP协议(HyperText Transfer Protocol,超文本传输协议)
  • HTTP由两个程序实现:一个客户程序和一个服务器程序
  • HTTP定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户端传送Web页面的方式
  • HTTP使用TCP作为它的支撑传输协议
  • 因为HTTP服务器并不保存关于客户的任何信息,所以我们说HTTP是一个无状态协议
2.2 非持续连接和持续连接(即长连接和短链接)
  • 持续连接:客户端所有的请求及其响应经相同的TCP连接发送
  • 非持续连接:每个请求和响应对是经过一个TCP连接发送
2.3 HTTP报文格式
  • HTTP请求报文:
GET /baidu/hello.html HTTP /1.1       // 请求行
Host: www.baiodu.com                  // 首部行
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
......
  • HTTP请求报文的通用格式


    HTTP请求报文的通用格式.png
  • HTTP响应报文
HTTP /1.1 200 OK                      // 状态行
Connection: close                     // 首部行
Date: Tue, 19 Aug 2019 12:00:00 GMT
Server: Apache/2.2.3
Last-Modified: Tue, 19 Aug 2019 12:00:00 GMT
Content-Length: 6821
Content-Type: text/html
......
  • HTTP响应报文的通用格式


    HTTP响应报文的通用格式.png
2.4 Cookie
  • 什么是Cookie?设置Cookie的目的是什么?
    因为HTTP服务器是无状态的,即在一个请求中不会保存用户的相关信息。但是在实际应用场景中我们希望可以识别用户,或者限制用户访问的次数、或者给用户推荐一些定制化的内容。由此,我们使用了Cookie,他可以使站点对用户进行跟踪,保留用户的一些信息。

这里提一下Session,其实Session和Cookie存在的目的我认为都是一样的,都是为了站点可以识别客户。但不同点在于Cookie存储在用户本地,站点可以对Cookie的生命周期进行设置,而Session则是与当前请求会话绑定,当会话结束时,Session中的数据站点就再也访问不到了。

2.5 Web缓存(代理服务器)

不使用Web缓存和使用对比

  • 不使用:用户每次请求Web服务器,Web服务器接受请求,处理之后返回给用户响应
  • 使用: 用户每次请求不是请求Web服务器,而是请求Web缓存器,然后Web缓存器再将接受到的请求继续请求目的Web服务器,最后返回给客户。但是Web缓存器会在本地缓存之前请求获得的响应,当一个新的请求进来时,如果和之前缓存的请求内容一样,Web缓存器直接返回本地存储的响应内容,从而降低了链路和Web服务器的压力。

因为引入了Web缓存器,所以也产生了一个新的问题。如何保证Web缓存器上的响应是最新的呢?
这里HTTP协议提供了一种条件GET方法。如果请求使用GET方法,并且请求报文中包含一个"If-Modifief-Since"首部行,那么这个请求就是条件GET方法。
条件GET方法主要步骤:

  1. 向Web缓存器发送一个GET请求,然后Web服务器返回首部行中包含一个Last-Modified的字段(表示最后修改时间)
  2. 当一周后发送同样的请求到Web缓存器,Web缓存器存储的Last-Modified字段值为上周请求的日期,Web缓存器通过发送一个条件GET请求来检查更新,如果检查更新没变,会直接返回Web缓存器中存储的响应,并且状态码为304 Not Modified

3. 电子邮件

  • 电子邮件是一种异步通信媒介,即当人们方便时就可以收发邮件,不必与他人的计划进行协调。
  • 电子邮件应用层协议主要使用SMTP
  • 邮件访问协议:
    • POP3
    • IMAP
    • 基于Web的电子邮件

4. DNS:Internet的目录服务

人类能以很多方式来标识(如姓名、身份证号码等)。Internet和人类一样,可以使用多种方式进行标识。主机可以用主机名和IP地址进行标识。人类是比较倾向于主机名更符合人类记忆的标识方法,而路由器等网络设备则更亲近IP地址来表示主机。所以DNS(Domain Name System,域名系统)应运而生,用来将人们喜欢的计算机标识转换成IP地址。

DNS是什么?本质是什么?
DNS是一个由分层的DNS服务器实现的分布式数据库,是一个使得主机能够查询分布式数据库的应用层协议; DNS服务器的本质是运行BIND(Berkeley Internet Name Domain)软件的UNIX服务器;

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

  • DNS不是一个直接和用户打交道的应用。相反,DNS是为因特网上的用户应用程序以及其他软件提供一种核心功能——将主机名转换为背后的IP地址;

思考:由上所述得知,加入我们请求一个网址,首先客户端会请求DNS服务器获取该网址的IP地址再去访问。试想一下一个新的域名肯定是要添加到DNS服务器中的,不然用户键入新的域名但是在DNS服务器中却找不到对应的IP地址。如何在DNS数据库中插入记录呢?
我们首先需要找当地的注册登陆机构注册域名,域名的唯一性由注册登陆机构确保,同时注册登陆机构需要收取相的费用;我国的注册登陆机构有阿里云、百度云等

你可能感兴趣的:(二、应用层)