网络应用是计算机网络存在的理由
应用层协议原理
研发网络应用的核心是写出能够运行在不同端系统和通过网络彼此通信的程序。因此研发新应用程序时,需要编写将在多台端系统上运行的软件,并且即使你要为网络核心设备写应用程序软件,也不需要写在网络核心设备如路由器上运行的软件。网络核心设备并不在应用层上起作用,只在较低层起作用,特别是网络层及下面层次,这种基本设计也即将应用软件限制在了端系统上。帮助了大量的应用程序研发
从宏观的角度来看,两个应用仿佛直接通信一样,而对于应用层只需要考虑如何与运输层进行交互即可。
网络应用程序体系结构
从应用程序研发者的角度看,网络体系结构是固定的,并为应用程序提供了特定的服务集合。另一方面,应用程序体系结构由应用程序研发者设计,规定了如何在各种端系统上组织该应用程序,常见的结构有:CS结构与P2P结构
CS结构
CS结构的特征
- 有一个总是打开的主机称为服务器,服务于来自许多其他称为客户的主机的请求。例如Web应用程序。
- 服务器具有固定的、周知的地址,并且因为该服务器总是打开的,客户总是能够通过向该服务器的IP地址发送分组来与其联系
对于CS结构,常出现一台单独的服务器主机跟不上它所有客户的请求的情况,为此配备大量主机的数据中心常被用于创建强大的虚拟服务器,如Google搜索引擎。
P2P结构
对位于数据中心的专用服务器有最小的依赖,应用程序在间断连接的主机对之间直接通信,这些主机对被称为对等方,对等方并不为服务提供商所有,而是用户控制的PC所有,大多数对等方驻留在家庭、大学等,其不必通过专门的服务器。常见的有文件共享、因特网电话等。
P2P结构存在自扩展性,在一个P2P文件共享应用中,尽管每个对等方都由于请求文件产生工作量,但每个对等方通过向其他对等方分发文件也为系统增加服务能力。P2P结构不需要庞大的服务器设施与服务器带宽,但面临三个主要挑战。
- ISP友好:大多数ISP受限于非对称的带宽应用,因此下载比上传要多得多。P2P结构改变了从服务器到住宅ISP的上传流量,为ISP带来了巨大压力
- 安全性:高分布性与开放性
- 激励:说服用户自愿向应用提供带宽、存储和计算资源
进程通信
客户与服务器进程
网络应用程序由成对的进程组成,这些进程通过网络相互发送报文,其中一个请求数据的进程为客户,另一个回应请求的进程为服务器。而在P2P的应用中,则一个进程既可以是客户又是服务器,因为它既可以上传数据也可以请求数据。
在给定的一对进程之间的通信会话场景中,发起通信(即在会话开始时发起与其他进程的连续)的进程被标识为客户,在会话开始时等待联系的进程是服务器
进程与计算机网络之间的接口
多数应用程序是由通信进程对组成的,每对中的两个进程互相发送报文。从一个进程向另一个进程发送的报文必须通过下面的网络。
进程通过一个称为套接字的软件接口向网络发送报文和从网络接收报文。套接字类似于房子的门,而进程就是房子,通过套接字走出门外到另一个进程。
套接字是同一台主机内应用层与运输层之间的接口,由于该套接字是建立网络应用程序的可编程接口,因此套接字也被称为应用程序与网络间的应用程序编程接口(API),应用程序开发者可以控制套接字在应用层端的一切, 但对该套接字在运输层端几乎没有控制权。对于运输层的控制权有
- 选择运输层协议
- 设定几个运输层参数,如最大缓存和最大报文段长度。
进程寻址
为了向特定目的地发送邮件,目的地需要一个地址,在一台主机上的进程为了向另一台主机上运行的进程发送分组,接收进程需要一个地址。为了标识接收进程需要两种信息
- 主机的地址。即IP地址,是一个32比特的量且能够唯一标识主机
- 定义在目的主机中的接收进程的标识符。即接收套接字,一般是指端口号
可供应用程序使用的运输服务
包括因特网在内的很多网络提供了不止一种的运输层协议,当开发一个应用时,必须选择一个可用的运输层协议。最可能的方式是研究这些可用的运输层协议所提供的服务,选择一个最能为你的应用需求提供恰当服务的协议。
如何界定一个运输层协议能够为调用它的应用程序提供什么样的服务呢,大体从四个角度分类:可靠数据传输、吞吐量、定时、安全性
可靠数据传输
分组在计算机网络中可能丢失。例如分组使得路由器中的缓存溢出,分组中的某些比特损坏后可能丢弃。而数据丢失可能会造成很严重的后果,因此为了支持一些对数据要求十分严格的应用,就需要保证确保数据交付服务,即可靠数据传输。
当一个运输协议能够提供这种服务时,发送进程只要将其数据传输进套接字,就可以完全相信该数据将能够无差错到达接收进程。而对于音频等应用,它们是容忍丢失的应用,即使音频等出现小干扰,也并不是十分关键
吞吐量
在沿着一条网络路径上的两个进程间的通信会话场景中,可用吞吐量即发送进程能够向接收进程交付比特的速率。由于其他会话将共享沿着该网络路径的带宽,并且这些会话将到达和离开,因此可用吞吐量也会随时间波动。当一种服务能够以某种特定速率提供确保的可用吞吐量,即应用程序能够请求r/s的稳定速率,并且运输协议确保可用吞吐量至少为r/s,这样的确保吞吐量的协议将很有作用
例如电话需要对语音以32kbps速率进行编码,那么他必须以这个速率向网络发送数据。具有吞吐量要求的应用称为带宽敏感的应用。弹性应用能够根据请求或多或少地利用吞吐量,例如文件传输应用、web传输应用等。
定时
运输层协议也能提供定时保证。如发送方注入进套接字中的每个比特到达接收方的套接字不迟于100ms,这种服务对于交互式的应用程序有吸引力。即实时应用
安全性
如在发送主机中,运输协议能够加密由发送进程传输的所有数据,接收主机中,运输协议能够在将数据交付前解密数据,并且在进程间提供机密性,以及数据完整性和端口鉴别等。
因特网提供的运输服务
因特网为应用层协议提供两个运输层协议,即TCP与UDP。而某些应用程序对运输层协议的要求是:
TCP服务
TCP服务模型包括面向连接服务于可靠数据传输服务
- 面向连接服务:
- 在应用层数据报文流动前,TCP让客户和服务器互相交换运输层控制信息,这个握手过程提示客户和服务器为大量分组的到来做好准备。
- 在握手阶段,一个TCP连接就在两个进程的套接字间建立了,这条连接是全双工的,即双方进程可以在此连接上同时进行报文收发。
- 当结束发送时,必须拆除连接
- 可靠的数据传输服务
- 通信进程能够依靠TCP无差错、按适当顺序交付所有发送的数据。
TCP协议提供拥塞控制功能,虽然不能为通信进程提供好处,但是为因特网整体带来好处。
UDP服务
UDP是一种不提供不必要服务的轻量级运输协议,它仅仅提供最小服务,是无连接的,即无需握手。并且UDP提供一种不可靠数据传输服务。UDP不包含拥塞控制。
因特网运输协议不提供的服务
不提供定时与吞吐量的保证,而可以使用SSL(应用层)为TCP提供安全性,TCP提供可靠传输
应用层协议
应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文,应用层协议定义了
- 交换的报文类型,例如请求报文和响应报文
- 各自报文类型的语法,如报文中的各个字段及这些字段是如何描述的
- 字段的语义,即这些字段中包含的信息的含义
- 一个进程何时以及如何发送报文,对报文进行响应的规则
Web和HTTP
HTTP概况
Web的应用层协议是超文本传输协议(HTTP),是Web核心。在RFC文档中定义HTTP由两个程序实现,一个客户端和一个服务器,运行在不同的端系统中,通过交换报文进行会话,HTTP定义了报文的结构以及客户和服务器进行报文交换的方式。
Web术语
Web页面是由对象组成的,一个对象只是一个文件,如HTML文件、一个图形等,它们可以通过一个URL地址寻址,多数Web页面包含一个HTML基本文件以及几个引用对象。HTML基本文件通过对象的URL地址引用页面中的其他对象,每个URL地址由两部分组成:存放对象的服务器主机名与对象的路径名。
Web浏览器实现了HTTP的客户端,Web服务器实现了HTTP的服务器端,用于存储Web对象,每个对象由URL寻址。
HTTP
HTTP定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户传送Web页面的方式。HTTP使用TCP作为运输层层协议。服务器向客户发送被请求的文件,而不存储任何关于该客户的状态信息,假如某个特定的客户在短短几秒内两次请求同一个对象,服务器依然会重新发送该对象。因此HTTP是一个无状态协议
非持续连接与持续连接
在许多因特网应用程序中,客户和服务器在一个相当长的时间范围内通信,客户发出一系列请求并且服务器对每个请求进行响应,这一系列请求可以以规则的间隔周期性地或者间断性地一个接一个发出。当这种客户-服务器交互是由TCP进行的,则应用程序研制者就需要考虑每个请求是由一个单独的TCP连接发送还是所有请求及响应由相同的TCP发送。前一种为非持续连接,后一种为持续连接
非持续连接
持续连接
HTTP报文格式
套接字编程
探讨网络应用程序是如何实际编写的,典型的网络应用是由一对程序组成的,即客户端与服务端。他们位于不同的端系统中,当运行这两个程序时,创建一个客户进程与服务器进程,同时它们通过从套接字读出和写入数据彼此进行通信。
网络应用程序有两种,一类是实现在协议标准(如RFC标准文档)中定义的操作,又称为开放的应用程序。另一类是专用的网络应用程序,应用层协议没有公开,其他的开发者无法开发出与该应用程序交互的代码。
UDP套接字编程
TCP套接字编程
协议
域名系统
DNS 是一个分布式数据库,提供了主机名和 IP 地址之间相互转换的服务。这里的分布式数据库是指,每个站点只保留它自己的那部分数据。
域名具有层次结构,从上到下依次为:根域名、顶级域名、二级域名。
DNS 可以使用 UDP 或者 TCP 进行传输,使用的端口号都为 53。大多数情况下 DNS 使用 UDP 进行传输,这就要求域名解析器和域名服务器都必须自己处理超时和重传来保证可靠性。在两种情况下会使用 TCP 进行传输:
- 如果返回的响应超过的 512 字节(UDP 最大只支持 512 字节的数据)。
- 区域传送(区域传送是主域名服务器向辅助域名服务器传送变化的那部分数据)。
DNS优化
DNS缓存
DNS存在着多级缓存,从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存。
DNS负载均衡
不知道大家有没有思考过一个问题: DNS返回的IP地址是否每次都一样?如果每次都一样是否说明你请求的资源都位于同一台机器上面,那么这台机器需要多高的性能和储存才能满足亿万请求呢?
其实真实的互联网世界背后存在成千上百台服务器,大型的网站甚至更多。但是在用户的眼中,它需要的只是处理他的请求,哪台机器处理请求并不重要。DNS可以返回一个合适的机器的IP给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是DNS负载均衡,又叫做DNS重定向。大家耳熟能详的CDN(Content Delivery Network)就是利用DNS的重定向技术,DNS服务器会返回一个跟用户最接近的点的IP地址给用户,CDN节点的服务器负责响应用户的请求,提供所需的内容。
文件传送协议
FTP 使用 TCP 进行连接,它需要两个连接来传送一个文件:
- 控制连接:服务器打开端口号 21 等待客户端的连接,客户端主动建立连接后,使用这个连接将客户端的命令传送给服务器,并传回服务器的应答。
- 数据连接:用来传送一个文件数据。
根据数据连接是否是服务器端主动建立,FTP 有主动和被动两种模式:
- 主动模式:服务器端主动建立数据连接,其中服务器端的端口号为 20,客户端的端口号随机,但是必须大于 1024,因为 0~1023 是熟知端口号。
- 被动模式:客户端主动建立数据连接,其中客户端的端口号由客户端自己指定,服务器端的端口号随机。
主动模式要求客户端开放端口号给服务器端,需要去配置客户端的防火墙。被动模式只需要服务器端开放端口号即可,无需客户端配置防火墙。但是被动模式会导致服务器端的安全性减弱,因为开放了过多的端口号。
动态主机配置协议
DHCP (Dynamic Host Configuration Protocol) 提供了即插即用的连网方式,用户不再需要去手动配置 IP 地址等信息。
DHCP 配置的内容不仅是 IP 地址,还包括子网掩码、网关 IP 地址。
DHCP 工作过程如下:
- 客户端发送 Discover 报文,该报文的目的地址为 255.255.255.255:67,源地址为 0.0.0.0:68,被放入 UDP 中,该报文被广播到同一个子网的所有主机上。如果客户端和 DHCP 服务器不在同一个子网,就需要使用中继代理。
- DHCP 服务器收到 Discover 报文之后,发送 Offer 报文给客户端,该报文包含了客户端所需要的信息。因为客户端可能收到多个 DHCP 服务器提供的信息,因此客户端需要进行选择。
- 如果客户端选择了某个 DHCP 服务器提供的信息,那么就发送 Request 报文给该 DHCP 服务器。
- DHCP 服务器发送 Ack 报文,表示客户端此时可以使用提供给它的信息。
远程登录协议
TELNET 用于登录到远程主机上,并且远程主机上的输出也会返回。
TELNET 可以适应许多计算机和操作系统的差异,例如不同操作系统系统的换行符定义。
电子邮件协议
一个电子邮件系统由三部分组成:用户代理、邮件服务器以及邮件协议。
邮件协议包含发送协议和读取协议,发送协议常用 SMTP,读取协议常用 POP3 和 IMAP。
1. SMTP
SMTP 只能发送 ASCII 码,而互联网邮件扩充 MIME 可以发送二进制文件。MIME 并没有改动或者取代 SMTP,而是增加邮件主体的结构,定义了非 ASCII 码的编码规则。
2. POP3
POP3 的特点是只要用户从服务器上读取了邮件,就把该邮件删除。
3. IMAP
IMAP 协议中客户端和服务器上的邮件保持同步,如果不手动删除邮件,那么服务器上的邮件也不会被删除。IMAP 这种做法可以让用户随时随地去访问服务器上的邮件。
常用端口
应用 | 应用层协议 | 端口号 | 传输层协议 | 备注 |
---|---|---|---|---|
域名解析 | DNS | 53 | UDP/TCP | 长度超过 512 字节时使用 TCP |
动态主机配置协议 | DHCP | 67/68 | UDP | |
简单网络管理协议 | SNMP | 161/162 | UDP | |
文件传送协议 | FTP | 20/21 | TCP | 控制连接 21,数据连接 20 |
远程终端协议 | TELNET | 23 | TCP | |
超文本传送协议 | HTTP | 80 | TCP | |
简单邮件传送协议 | SMTP | 25 | TCP | |
邮件读取协议 | POP3 | 110 | TCP | |
网际报文存取协议 | IMAP | 143 | TCP |
常见问题
从输入网址到获取页面的过程(其实这个很不好)
- DNS解析
- TCP
- HTTP
- 处理并返回
- 解析
- 连接结束。
因为它这种很基础,而实际上的会和Tomcat等一系列内容相关
1. DHCP 配置主机信息
- 假设主机最开始没有 IP 地址以及其它信息,那么就需要先使用 DHCP 来获取。
- 主机生成一个 DHCP 请求报文,并将这个报文放入具有目的端口 67 和源端口 68 的 UDP 报文段中。
- 该报文段则被放入在一个具有广播 IP 目的地址(255.255.255.255) 和源 IP 地址(0.0.0.0)的 IP 数据报中。
- 该数据报则被放置在 MAC 帧中,该帧具有目的地址,将广播到与交换机连接的所有设备。
- 连接在交换机的 DHCP 服务器收到广播帧之后,不断地向上分解得到 IP 数据报、UDP 报文段、DHCP 请求报文,之后生成 DHCP ACK 报文,该报文包含以下信息:IP 地址、DNS 服务器的 IP 地址、默认网关路由器的 IP 地址和子网掩码。该报文被放入 UDP 报文段中,UDP 报文段有被放入 IP 数据报中,最后放入 MAC 帧中。
- 该帧的目的地址是请求主机的 MAC 地址,因为交换机具有自学习能力,之前主机发送了广播帧之后就记录了 MAC 地址到其转发接口的交换表项,因此现在交换机就可以直接知道应该向哪个接口发送该帧。
- 主机收到该帧后,不断分解得到 DHCP 报文。之后就配置它的 IP 地址、子网掩码和 DNS 服务器的 IP 地址,并在其 IP 转发表中安装默认网关。
2.ARP 解析 MAC 地址
- 主机通过浏览器生成一个 TCP 套接字,套接字向 HTTP 服务器发送 HTTP 请求。为了生成该套接字,主机需要知道网站的域名对应的 IP 地址。
- 主机生成一个 DNS 查询报文,该报文具有 53 号端口,因为 DNS 服务器的端口号是 53。
- 该 DNS 查询报文被放入目的地址为 DNS 服务器 IP 地址的 IP 数据报中。
- 该 IP 数据报被放入一个以太网帧中,该帧将发送到网关路由器。
- DHCP 过程只知道网关路由器的 IP 地址,为了获取网关路由器的 MAC 地址,需要使用 ARP 协议。
- 主机生成一个包含目的地址为网关路由器 IP 地址的 ARP 查询报文,将该 ARP 查询报文放入一个具有广播目的地址的以太网帧中,并向交换机发送该以太网帧,交换机将该帧转发给所有的连接设备,包括网关路由器。
- 网关路由器接收到该帧后,不断向上分解得到 ARP 报文,发现其中的 IP 地址与其接口的 IP 地址匹配,因此就发送一个 ARP 回答报文,包含了它的 MAC 地址,发回给主机。
3.DNS 解析域名
- 知道了网关路由器的 MAC 地址之后,就可以继续 DNS 的解析过程了。
- 网关路由器接收到包含 DNS 查询报文的以太网帧后,抽取出 IP 数据报,并根据转发表决定该 IP 数据报应该转发的路由器。
- 因为路由器具有内部网关协议(RIP、OSPF)和外部网关协议(BGP)这两种路由选择协议,因此路由表中已经配置了网关路由器到达 DNS 服务器的路由表项。
- 到达 DNS 服务器之后,DNS 服务器抽取出 DNS 查询报文,并在 DNS 数据库中查找待解析的域名。
- 找到 DNS 记录之后,发送 DNS 回答报文,将该回答报文放入 UDP 报文段中,然后放入 IP 数据报中,通过路由器反向转发回网关路由器,并经过以太网交换机到达主机。
4. HTTP 请求页面
- 有了 HTTP 服务器的 IP 地址之后,主机就能够生成 TCP 套接字,该套接字将用于向 Web 服务器发送 HTTP GET 报文。
- 在生成 TCP 套接字之前,必须先与 HTTP 服务器进行三次握手来建立连接。生成一个具有目的端口 80 的 TCP SYN 报文段,并向 HTTP 服务器发送该报文段。
- HTTP 服务器收到该报文段之后,生成 TCP SYN ACK 报文段,发回给主机。
- 连接建立之后,浏览器生成 HTTP GET 报文,并交付给 HTTP 服务器。
- HTTP 服务器从 TCP 套接字读取 HTTP GET 报文,生成一个 HTTP 响应报文,将 Web 页面内容放入报文主体中,发回给主机。
- 浏览器收到 HTTP 响应报文后,抽取出 Web 页面内容,之后进行渲染,显示 Web 页面。
1.DNS解析
- 先从浏览器缓存里找IP,因为浏览器会缓存DNS记录一段时间
- 从操作系统缓存查找,查找存储在系统运行内存中的缓存。
- 如没找到,再从Hosts文件查找是否有该域名和对应IP,看看其中有没有和这个域名对应的规则
- 如没找到,再从路由器缓存找,一些路由器有DNS缓存功能
- 如没好到,再从ISP DNS缓存查找,互联网服务提供商(如中国电信)也会提供DNS服务
- 如果都没找到,浏览器域名服务器向根域名服务器(baidu.com)查找域名对应IP,还没找到就把请求转发到下一级,直到找到IP
- dns劫持:黑客攻击根域名服务器的节点,发生在上面第四步,从DNS缓存数据库里找时被恶意改为其他的网址,所以请求到的是其他网址.
- 最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
2.TCP连接
3.发送HTTP请求
4.服务器处理请求并返回HTTP报文
- 后端从在固定的端口接收到TCP报文开始,它会对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,供上层使用。
- 一些大一点的网站会将你的请求到反向代理服务器中,因为当网站访问量非常大,网站越来越慢,一台服务器已经不够用了。于是将同一个应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。此时,客户端不是直接通过HTTP协议访问某网站应用服务器,而是先请求到Nginx,Nginx再请求应用服务器,然后将结果返回给客户端,这里Nginx的作用是反向代理服务器。同时也带来了一个好处,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。
5.浏览器解析渲染页面
6.连接结束