计算机网络自顶向下的方法-第二章 应用层

1. 应用层协议原理

1.1 结构体系

应用程序里面两种主流体系结构:客户-服务器体系结构 / 对等p2p体系结构

客户端-服务器体系结构

  web服务器总是打开,服务于来自浏览器(运行在客户机上)的请求,web服务器接收到请求,向该客户发送所请求的对象作为响应。

  特点:

  (1)  客户端之间不直接通信。两个web浏览器并不直接通信。

  (2)  服务器具有固定的,周知的地址,为IP地址。

 

 

 

 

客户端-服务器体系的问题:一台单独的服务器主机跟不上它所有客户请求的情况。因此出现了数据中心,一个数据中心能够有十万台服务器。

 

对等p2p体系结构

 

在p2p体系结构中,对位于数据中心的专有服务器的依赖很小,甚至没有依赖,相反,应用程序在间断连接的主机对之间使用直接通信,这些主机对称为对等方。这些对等方并不为服务提供商所有,相反却为用户控制的桌面机所有,对等通信不必通过专门的服务器。

  应用程序A(主机A) ----间断连接----应用程序B(主机B)

目前流行的,流量密集型应用都是P2P体系结构,迅雷,BitTorrent,IPTV。

 

一些即时通讯的应用程序,服务器被用于跟踪用户的IP地址,但用户到用户的报文在用户主机之间(无需通过中间服务器)直接发送。

p2p体系结构的自扩展性十分强大,成本也是有效的,因为它们通常不需要庞大的服务器基础设置和服务器宽带(这与具有数据中心的客户端-服务器体系形成反差)。

p2p也面临如下三个挑战:

(1) ISP友好,大多数住宅的ISP(包括DSL和电缆ISP)已经受制于非对称的带宽应用。也就是说,下载比上传要多的多,但是p2p视频流和文件分发应用改变了从服务器到住宅ISP的上载流量,因此给ISP带来了巨大压力,未来P2P应用需要设计对ISP友好的模式。

(2) 安全性,因为它们的高度分布和开放特性,p2p应用给安全带来了挑战。

(3) 激励,未来P2P应用的成功也取决于说服用户自愿向应用提供带宽、存储和计算。

 

1.2 进程通信

操作系统中,进行通信的实际上是进程,而不是程序,一个进程可以认为是运行在端系统中的一个程序。当进程运行在相同的端系统上时,它们使用进程间通信机制互相通信。进程间通信的规则由端系统上的操作系统确定。

不同端系统之间(可能具有不同的操作系统)上的进程,通过跨越计算机网络交换报文,而互相通信。发送进程生成并向网络中发送报文,接收进程接收这些报文并通过该报文发送回去进行响应。

(1) 客户端和服务器进程

通常将两个进程之一表示为客户client,另一个进程表示为服务器,server。对于WEB而言,浏览器是客户进程,web服务器是服务器进程。对p2p文件共享,下载文件的对等方表示为客户,上载文件的对等方表示为服务器。

(2) 进程与计算机网络之间的接口

从一个进程向另一个进程发送的报文,必须通过下面的网络,进程通过一个称为套接字socket的软件接口向网络发送报文和从网络接收报文,进程类比于房子,套接字相当于门,总是要借助门 socket,来发送和接收报文。

 

 

如上图所示,套接字是同一台主机内应用层与传输层之间的接口,应用程序开发者可以控制套接字在应用层的一切,但对套接字在运输层端没有控制权,应用程序开发者对于运输层的控制仅限于:

  • 选择运输层协议
  • 设置运输层参数,如最大缓存,最大报文段长度。

 

(3) 进程寻址

为了向特定目标地发送邮政邮件,目的地需要一个地址,类似地,在一台主机上运行的进程为了向在另一台主机上运行的进程发送分组,接收进程需要有一个地址,为了标识该接收进程,需要定义两种信息

  • 主机地址,IP标识
  • 定义在目的主机中的接收进程的标识符。port标识,web服务器用80端口来标识,邮件服务器进程用25端口来标识。

 

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

上面讲过,套接字socket是应用程序和运输层协议之间的接口,发送端的应用程序将报文推进该套接字,另一侧,运输层协议负责是该报文进入接收进程的套接字。运输协议网络提供了好几种,怎么选择运输协议,从四个方面挑选合适的运输协议。

  • 可靠数据传输
  • 吞吐量
  • 定时
  • 安全性

可靠性数据传输

  分组在计算机网网络中可能丢失,因为交换机的分组队列满了,会自动丢弃后面的分组,电子邮件,文件传输,远程主机访问,web文档传输及金融应用,数据丢失可能会造成灾难性的后果,因此为了支持这些应用,必须想办法确保发送的数据正确、完全交付给接收方。多媒体应用,如音频/视频,能够承受一定量的数据丢失,多媒体应用中,丢失的数据引起播放的音频/视频出现小的干扰,而不是致命的损伤。

吞吐量

  具有吞吐量要求的应用程序称为带宽敏感的应用。许多多媒体应用都是带宽敏感应用。弹性应用能够根据情况或多或少的利用可提供使用的吞吐量,电子邮件、文件传输以及web传送都属于弹性应用。当然吞吐量越多越好。

定时

  传输层协议能够提供定时保证,定时保证能够用多种形式实现,例如,发送方注入进套接字的每个比特到达接收方的套接字不迟于100ms。

安全性

  发送主机中,运输协议能够加密由发送方发送进程传输的所有数据,在接收主机中,运输层协议能够在将数据交付给接收进程前,解密这些数据。

 

1.4 因特网提供的运输服务

  一般是udp和tcp。软件开发者创建应用时,首先做决定的是,选择udp还是tcp。

 

 

 

(1) tcp服务

tcp服务模型,包括面向连接服务和可靠数据传输服务。

  • 面向连接服务
    •   握手:应用层报文开始流动前,tcp让客户端和服务器互相交换传输层控制信息。这个所谓的握手过程提示客户和服务器,使它们为大量分组的到来做好准备。
    •       握手后:tcp连接就在两个进程的套接字之间建立了,连接是全双工的,彼此可以接收和发送报文,应用程序结束报文发送时,应该断开连接。
  • 可靠数据传输服务
    •   不会字节的丢失和冗余

tcp协议还拥有阻塞控制机制,这种服务不一定为通信进程带来好处,但却能为因特网整体带来好处,当发送方和接收方之间的网络出现拥塞时,tcp拥塞机制会抑制发送进程。

 

tcp没有提供任何加密机制,如果发送明文,进入套接字,该明文将会经过发送方和接收方之间的所有连路传送,有可能在中间连路被嗅探和发现,因此提出了tcp的加强版,安全套接字层,secure socket layer,SSL。SSL不是运输层协议,而是应用在应用层,一个用用程序需要使用ssl服务,它需要在客户端和服务器端代码都包含ssl代码,ssl有自己的套接字api,类似于tcp的套接字api。 应用程序使用了ssl服务,发送进程向ssl套接字发送明文数据,ssl则会加密该数据并将加密的数据传递给tcp套接字,最后接收方的ssl会解密数据,然后将数据发给接收进程。

 

(2) udp服务

udp是一种不提供不必要服务的轻量级运输协议,仅提供最小服务,udp是无连接的。两个进程之间没有握手的过程,udp提供一种不可靠数据传输服务,udp不保证报文到达接收方进程,也不保证接收方接收的报文是有序的。

udp没有拥塞控制机制,udp的发送端可以用它选定的任何速率向下层(网络层)注入数据。

 

(3) 不提供的服务

  定时和吞吐量,tcp和udp都没有提供

 

 

1.5 应用层协议

如何构造报文,报文各字段的含义,进程如何发送报文,这些问题都属于应用层协议的范畴。

应用层协议定义类

  • 交换的报文类型,例如请求报文和响应报文
  • 各种类型报文的语法
  • 字段的语义
  • 进程如何发送报文,对报文进行响应规则

有些应用层协议由PRF文档定义,如web应用的http超文本传输协议。如专用协议,skyper提供的专用的应用层协议。

 

1.6 涉及的网络应用

web应用、文件传输应用、电子邮件、目录服务、p2p

 

 

2. web和http

2.1 http 概况

hypertext transfer protocol,超级文本传输协议。http由两个程序实现,客户程序和服务器程序。客户端程序和服务端程序运行在不同的端系统中,通过交换http报文进行会话。

常见的web术语

  • web页面:由文本对象组成,html文件,jpg图片,视频片段文件。
  • web浏览器:chrome,firefox
  • web服务器:自己开发的服务器

 

 

http使用tcp作为运输协议,http客户端首先发起一个与服务器的tcp连接,连接建立,客户端的套接字是客户进程与tcp连接之间的门,也是服务端进程与tcp连接之间的门。服务端进程通过套接字接口发送了一个请求报文,该报文就脱离了客户端的控制并进入tcp的控制。

http是一种无状态协议,因为http服务器并不保存关于客户的任何信息。

 

2.2 非持续性连接和持续性连接

 

每次请求和响应时经过一个单独的tcp连接发送:非持续性连接,短连接

每次请求和响应时经过相同的tcp连接发送:持续性连接,长连接

 

(1) 非持续性连接

  以服务器向客户端发送一个web页面的步骤为例。页面包含1个html文件和10个jpeg图片。11个对象位于同一个服务器上。html文件的url为:www.test.com/index,看看发生了什么?

  第一步:http客户端进程在端口80发起了一个到服务器www.test.com的tcp链接。该端口号是http的默认端口号,在客户端和服务器上分别有一个套接字与该链接相关联。

  第二步:http客户端进程经过它的套接字向服务器发送一个http请求报文,报文包含了路径名/index。

  第三步:http服务器进程经过它的套接字接收了该请求报文,从存储器ram或磁盘中检索对象 www.test.com/index,在一个http相应报文中封装对象,并通过其套接字向客户端发送响应报文。

  第四步:http服务器进程通知tcp断开该tcp链接(但是直到tcp确认客户端已经完整的收到响应报文为止,它才会实际中断链接)

  第五步:http客户端收到响应报文,tcp关闭链接,该报文指出封装对象是一个Html文件,客户从响应报文中提取文件,检查该html文件,得到10个jepg图片的引用。

  第六步:对每个引用的Jpeg图片重复前4个步骤。

 

当浏览器收到web页面后,显示给用户,两个不同的浏览器也许会以不同的方式解释(向用户展示)该页面。http与客户端如何解释web页面毫无关系。

每个tcp链接在服务器发送最后一个对象后关闭,即该链接不为其他的对象而持续下来,值得注意的是,每个tcp链接只传输一个请求报文和响应报文。上面的例子中,要产生11个tcp链接。

 

用户点击超链接会发生什么,引起了浏览器在它和web服务器之间发起了一个tcp连接,这涉及到一次,三次握手的过程。

  第一次握手:xx

  第二次握手:xx

  第三次握手:xx

 

(2) 持续性的连接

非持续性连接有缺点

  • 必须为每一个请求的对象建立和维护一个全新的连接。每一次这样的连接,客户端和服务器中都要分配tcp的缓存区和保持tcp变量,这给服务器带来了严重的负担,因为一台web服务器可能同时服务数以百计不同的客户的请求。
  • 每一个请求对象都要经历三次握手的耗时。

一般来说,一个连接经过一段时间间隔(可以配置的超时间隔)仍未被使用。http服务器就会关闭这个连接。

 

2.3 http报文

(1) 请求报文

GET /api/qbpv?q=177049250&qid=177049250 HTTP/1.1
Host: zhidao.baidu.com
Connection: keep-alive
Accept: */*
X-Requested-With: XMLHttpRequest
X-ik-ssl: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://zhidao.baidu.com/question/177049250.html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BIDUPSID=DE5FF68024EBC9E49E0FC67C92BB2380; PSTM=1607003694; BDUSS=NLUzJIQmZnRVFBQUFBJCQZ0R2NaRjNxY2NoSFFBck9maGIwVVFBQm5icHBCAAAAAAAAAAIhY5F-IWORfeU; 

 

 

http报文请求行: 

  GET /api/qbpv?q=177049250&qid=177049250 HTTP/1.1,请求行,请求行有三个字段,字段一:GET ,方法字段,常见有,POST、PUT、DELETE等值,字段二:URL字段,带有请求对象的标识,/api/qbpv?q=177049250&qid=177049250 字段三:         版本字段,解释浏览器实现的版本是,HTTP/1.1

 

http首部行

  第一行:Host 表示主机

  第三行:User-Agent 表示用户

 

 

 

(2)  响应报文

 

 

 

2.4 cookie

http无序,为了让服务器知道请求来自于谁,因此采用cookie

2.5 web缓存

web缓存器,也叫做代理服务器,能够初始web服务器来满足http请求,web缓存器有自己的磁盘存储空间,在磁盘存储空间中保存最近请求过的对象副本。浏览器配置后,所有用户的http请求先打到web缓存器。

 

 

  • 浏览器建立一个到web缓存器的tcp连接,并向web缓存器中的对象发送一个Http请求。
  • web缓存器检查,看本地是否存储了该对象的副本,如果有,web缓存器就像客户端浏览器用Http响应报文返回该对象。
  • 如果没有,它就打开一个与该对象的初始服务器的tcp连接,web缓存器则在这个缓存器到服务器的tcp连接上发送一个该对象的http请求,在收到请求后,初始服务器向web缓存器发送具有该对象的http响应。
  • web缓存器收到该对象时,在本地存储空间存储一份副本,并向客户的浏览器用http响应报文发送该副本。

web缓存器即是客户端也是服务器。

部署web缓存器有两个原因

  大大减少对客户请求的响应时间,特别是当客户与初始服务器之间的瓶颈带宽远低于客户与web缓存器之间的瓶颈带宽时更是如此,更加能够减少用户等待的时间。

  web缓存器大大的减少了一个机构的接入连路到因特网的通信量,减少通信量,降低费用。

  web服务器从整体上大大减低因特网上的web流量,从而改善了所有应用的性能。

 

 

 

机构内部是高速的局域网,一台路由器与因特网的路由器通过一个15Mbps的链路相连,初始服务器位于全世界各地,与因特网相连。直接访问初始服务器,速度慢。

解决办法一:将15Mbps的接入链路升级为100Mbps,能够降低时延,提高访问速度。

解决办法二:不升级链路,通过使用内容分发网络.content distribution network,CDN,CDN就是web缓存服务器,CDN公司在因特网上安装了许多地理上分散的缓存器,因此使流量实现了本地化,网上有共享CDN和专用CDN

 

3. 文件传输协议 TFP

用户坐在一台主机前面,向另一台远程主机发送文件。

 

 

http和ftp都是文件传输协议,有很多共同点,都运行在tcp上

ftp使用两个并行的tcp连接来传输文件,

  控制连接TCP:用于两个主机之间传输控制信息,如用户标识,口令,改变远程目录文件的命令以及存放和获取文件的命令。

  数据连接TCP:用于实际发送文件。

 ftp协议使用一个独立的控制连接tcp,因此我们称FTP的控制信息是外带传送的。我们知道,http协议是在传输文件的同一个tcp连接中发送请求和响应首部行的。http为带内发送控制信息。 

 

 

 

 当用户主机和远程主机开始一个ftp会话时,ftp的客户端首先在本地服务器的21号端口与服务器(远程服务器)端发起一个用于控制的tcp连接。ftp客户端也通过该控制连接发送用户的标识和口令,发送改变远程目录的命令。当ftp服务器端从该连接上接收到一个文件传输命令后,就发起一个到客户端TCP数据连接,ftp在该数据连接上准确地传送一个文件,然后关闭连接。因此对ftp传输而言,控制连接贯穿真个用户会话期间。但是每次文件传输都需要建立一个新的数据连接。

控制连接tcp:长连接

数据传输tcp:短连接

ftp服务器必须在整个会话中保存用户状态,state,特别是服务器必须把特定用户账户与控制连接联系起来。用户在远程目录树上徘徊,服务器必须能够追踪用户在远程目录树上的当前位置,对每个进行中的用户会话的状态信息进行追踪,大大的限制了ftp同时维护的会话总数。

 

ftp的命令与回答

客户端到服务器还是服务器到客户端的回答,都是以7个比特ASCII格式在控制台上传送的。FTP协议的命令也是人能看懂的。为了区分连续命令,每个命令后跟回车换行符,每个命令都由4个大写字母ASCII字符组成,有些具有可选参数。

 

常见命令如下:

  USER username:用于向服务器发送用户标识。

  PASS  password :口令

  LIST : 用于请求服务区回送远程目录的所有文件列表。文件列表是经一个(新建且非持续性连接)数据连接传送的。而不是在控制TCP连接传送的。

  RETR filename : 用于从远程主机当前目录检索文件,该命令引起远程主机发起一个数据连接,并经该数据连接发送所请求的文件。

  STOR filename : 用于在远程主机的当前目录上存放文件。

 

 

例子:vmware下的两个centos虚拟机,通过tfp实现文件传输。

4. 电子邮件 email

#TODO

 

5. DNS 因特网的目录服务

身份证,电话号码:为了识别人

主机名hostname:为了识别主机,IP也能用于识别主机

IP组成:127.7.106.83,4个字节,因为计算机底层每个字节由8个bit组成,如果是不考虑负号,能表示的范围为0~255。

IP是具有层次的,用.隔开,访问的时候会从左到右扫描,就会得到主机的具体的位置。

(1) DNS提供的服务

IP和hostname都能识别主机,但是ip太长,因此需要进行主机名到IP地址的转换的服务。就是域名系统。Domain Name System,简称DNS。

DNS特点

  一个由分层的DNS服务器实现的分布式数据库。

  一个使得主机能够查询分布式数据库的应用协议。

DNS服务器通常是运行BIND软件的UNIX机器。DNS协议运行在UDP上,使用53端口。

DNS协议是应用层协议,使用客户-服务器模式运行在通信的端系统之间,在通信的端系统之间通过下面的端到端运输协议来传送DNS报文,DNS和一般的应用程序不同,主要为因特网上的用户应用程序以及其他软件提供一种核心功能,就是将主机名转换为背后的IP地址。DNS通过采用位于网络边缘的客户和服务器,实现了名字到地址转换功能。

 

DNS通常被其他应用层协议使用,HTTP,SMTP和FTP,一个用户主机上的浏览器,访问www.baidu.com,为了使用户的主机能够将HTTP请求报文发送到服务器上,用户主机必须知道服务器www.baidu.com的IP地址,具体实现如下

  (1) 同一台用户主机上运行这DNS应用的客户端。

  (2) 浏览器从url中抽取主机名www.baidu.com,将这台主机名传递给DNS应用的客户端。

  (3) DNS客户端向DNS服务器发送一个包含主机名的请求。

  (4) DNS客户端最终会受到一份应答报文,其中包含对应该主机名的IP地址。

  (5) 浏览器接收到来自于DNS的该IP地址,它能够向位于该IP地址的80端口的HTTP服务器进程发起一个TCP连接。

虽然DNS需要多一个通过主机名向服务器要IP的过程,带来了额外的时延,如果我们能够获得IP地址缓存在一个附近的DNS服务器中,这样就减少了DNS的网络流量和DNS的平均时延。

 

DNS还提供其他的服务

  (1) 主机别名,一个复杂的主机可能拥有多个别名,例如名为relay.1.westxxx.com的主机,别名1为enterprise.com,别名2为enterprise.com,relay.1.westxxx.com为规范主机名,但是不好记,应用程序可以调用DNS来获得主机别名对应的规范主机名以及主机IP地址。主机别名--IP地址

  (2) 邮件别名

  (3) 负载均衡

 

 

 

 

 

 

 

 

 

 

 

 

 

 

# TODO

posted @ 2021-02-28 17:10  张京墨  阅读(341)  评论(0编辑  收藏  举报