改变的速度,即对学习来说,最重要的东西是学习的方法,在特定的技术中如何灵活地适应改变,当你在职业生涯中前行时,在新的机会和可能性方面如何保持开放的思想 --Marc Andreessen
应用层
研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序
进程通信
-
在操作系统中,进行通信的实际上是进程(process)而不是程序。一个进程可以被认为是运行在端系统的一个程序
-
当进程运行在相同的端系统上时,它们使用进程间的通信机制相互通信。进程间通信的规则由端系统上的操作系统确定
-
在两个不同端系统上的进程,通过跨越计算机网络交换报文而相互通信。发送进程生成报文并发送到网络中,接收进程接收这些报文并可能通过将报文发送回去进行响应
-
定义客户和服务器进程:在给定的一对进程之间的通信会话场景中,发起通信(即在该会话开始时发起与其他进程的联系)的进程被标识为客户,在会话开始时等待联系的进程是服务器
-
进程间通过套接字(socket)软件接口向网络发送或者接收报文
-
套接字是同一台主机内应用层和传输层之间的接口,由于套接字是建立网络应用程序的可编程接口,因此套接字也被称为应用程序和网络之间的应用程序编程接口(API)
-
通过 ip(主机地址) 和 port(主机中接收进程标识符)来标识进程通信中的接收进程
运输层服务的四个重要属性
-
包括因特网在内的很多网络提供了不止一种运输层协议,协议的选取由调用它的应用程序的需求来决定,这里有四个重要属性:可靠数据传输,吞吐量,定时和安全性
-
如果一个协议提供确保数据交付的服务,就认为提供了可靠数据传输(reliable data transfer)。当一个运输协议提供这种服务时,发送进程只需要将其数据传递进套接字,就可以完全相信该数据能够无差错地达到接收进程
-
在沿着一条网路路径上的两个进程之间的通信会话场景中,可用吞吐量就是发送进程能够向接收进程交付比特的速率
-
由于其他会话将共享沿着该网络路径的带宽,并且随着这些会话的到达和离开,某一会话的可用吞吐量会随着时间波动。为此,产生一种服务,即运输层协议能够以某种特定的速率提供确保的可用吞吐量
-
具有吞吐量要求的应用程序被称为带宽敏感应用,与之对应的是弹性应用(能够根据情况或多或少地利用可供使用的吞吐量)
-
运输层协议也能提供定时保证,比如:发送方注入进套接字中的每个比特到达接收方的套接字不迟于100ms
-
运输层协议能够为应用程序提供一种或者多种安全性服务,比如:在发送和接收进程之间提供机密服务(即发送加密,接收解密),以防该数据在这两个进程之间直接暴露
web && http
-
Web 应用的底层协议是超文本传输协议(HyperText Transfer Protocol, HTTP),这是 Web 的核心
-
Web 页面由对象组成,一个对象就是一个文件,该文件可以是一个 .html文件,一个 .jpg图片等等,比如:一个 Web 页面包含1个 html 基本文件和2个 css 引用文件,则这个 Web 页面包含3个对象
-
HTTP 定义了 web客户与 web服务器之间进行 http报文交换的方式以及这些报文的结构
-
HTTP 使用 TCP 作为它的支撑运输协议
-
HTTP客户首先通过发起一个与服务器的 TCP 连接,一旦连接建立,该浏览器与服务器进程就可以通过套接字接口访问 TCP,然后客户和服务器从它的套接字发送或者接收 HTTP 报文
-
一旦客户向它的套接字发送了一个请求报文,该报文就脱离了客户控制并进入 TCP 控制,由于 TCP 为 HTTP 提供可靠数据传输服务,所以在客户和服务器交换报文的过程,不必担心数据丢失
-
这也体现了分层体系的最大优点:HTTP 协议不必担心数据丢失,也不必了解 TCP 从网络的数据丢失和乱序故障中恢复的细节
-
HTTP 服务器不会保存关于客户的任何信息,所以 HTTP 是无状态协议,这意味着服务器不会因为刚刚为该用户提供了对象就不再响应,而是会重新发送该对象
-
RTT指往返时间(Round-Trip Time),该时间指一个短分组从客户到服务器然后再返回客户所花费的时间,RTT 包括分组时延,分组在中间路由器和交换机上的排队时延以及分组处理时延
-
大致上说,一次 HTTP 请求/响应时间等于两次 RTT 加上服务器文件传输文件的时间
-
客户到服务器的每个请求/响应是经单独的 TCP 连接发送,则该应用程序使用非持续连接(non-persistent connection),每个 TCP 连接在服务器发送一个对象后关闭,即每个 TCP 连接只传输一个请求报文和一个响应报文
-
由此可见,非持续连接的缺点在于:其一,必须为每一个请求对象建立和维护一个全新的连接,对于每个这样的连接,在客户和服务器都要分配 TCP 的缓冲区和保持 TCP 变量;其二,每个对象都要经受两倍 RTT 的交付时延
-
客户到服务器的所有请求/响应是经相同的 TCP 连接发送,即服务器在发送响应后保持该 TCP 连接打开,在相同的客户与服务器之间的后续请求和响应报文能够通过相同的连接进行传输
-
HTTP 在其默认方式下使用持续连接
POST http://172.17.2.42/api/task/list-task-for-applicant http/1.1Host: 172.17.2.42Connection: keep-aliveUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3390.0 Safari/537.36Accept-Language: zh-CN,zh;q=0.9 复制代码
-
☝HTTP 请求报文的通用格式:请求行,首部行,空行,实体主体
-
HTTP 请求报文的第一行叫做请求行(request line),其后继的行叫做首部行(header line)
-
请求行包含三个字段:请求方法,URL,HTTP版本
-
首部行 Host 指明了对象所在的主机,该字段提供的信息是 Web 代理高速缓存所要求的
-
首部行 Connection 告诉服务器是否需要持续使用该连接,可取值 keep-alive 或者 close
-
首部行 User-Agent 用来指明用户代理,即向服务器发送请求的浏览器类型
-
首部行 Accept-Language 表示用户想要得到该对象的语言版本
-
使用 GET 方法时,实体主体为空,使用 POST 方法时,才使用实体主体
-
HTTP/1.1 200 OKServer: nginx/1.10.1Date: Sun, 08 Apr 2018 08:47:04 GMTContent-Type: application/json;charset=UTF-8Connection: keep-aliveLast-Modified: Sun, 08 Apr 2018 08:46:04 GMTentity body data...复制代码
-
☝HTTP 响应报文的通用格式:状态行,首部行,空行,实体主体
-
状态行包含三个字段:协议版本,状态码和相应的状态信息
-
首部行 Server 指示该报文是由 nginx/1.10.1 服务器产生的
-
首部行 Date 指示服务器从它的文件系统找到该对象,插入到响应报文,并且发送该响应报文的日期和时间
-
首部行 Content-Type 指示了实体主体中的对象类型
-
首部行 Connection 告诉客户是否需要持续使用该连接,可取值 keep-alive 或者 close
-
首部行 Last-Modified 最后修改日期和时间,对于本地客户和代理服务器上的对象缓存来说很重要
-
实体主体是响应报文的主要部分,它包含了所请求的对象本身
-
-
cookie 可以在无状态的 HTTP 之上建立一个用户会话层,允许站点对用户进行跟踪
-
cookie 技术包含四个组件:
-
在 HTTP 响应报文中有一个 cookie 首部行
-
在 HTTP 请求报文中有一个 cookie 首部行
-
在用户端系统中保留一个 cookie 文件,并由用户的浏览器进行管理
-
位于 Web 站点的一个后端数据库
-
-
Web 缓存器也叫代理服务器,它是能够代表初始 Web 服务器来满足 HTTP 请求的网络实体
-
在 Internet 上部署代理服务器的两个原因:
-
代理服务器可以大大减少对客户请求的响应时间
-
代理服务器可以大大减少一个机构的接入链路到 Internet 的通信量
-
-
HTTP 协议有一种机制,允许代理服务器证实它的对象是最新的,这种机制就是条件GET方法
-
条件GET方法实现要求
-
请求报文使用 GET 方法
-
请求报文中含有 If-Modified-Since 首部行
-
-
代理服务器在存储响应对象的同时,也对其响应报文的 Last-Modified 值进行存储,当同一对象再次被请求时,代理服务器会在请求报文中添加 If-Modified-Since 字段,且其值等于之前存储的 Last-Modified 的值,通过该条件GET方法告诉服务器,仅当自指定日期之后该对象被修改过,才发送此对象
-
如果响应对象未被修改,则 Web 服务器还是会向代理服务器发送响应报文,但是该响应报文中不包含所请求的对象,并且最后响应报文中,状态行为 304 Not Modified
FTP 文件传输协议
-
用户首先提供远程主机的主机名,使本地主机的 FTP客户进程建立一个到远程主机 FTP服务器进程的 TCP 连接
-
随后,该用户提供用户标识和口令,作为 FTP 命令的一部分在该 TCP 连接上传送
-
一旦该服务器向该用户授权,用户可以将存放在本地文件系统中的文件与远程文件系统文件进行传输
-
FTP 使用两个并行的 TCP 连接来传输文件,一个是控制连接(control connection),一个是数据连接(data connection)
-
控制连接用于在两主机之间传输控制信息,如用户标识,口令以及文件操作命令
-
数据连接用于实际发送一个文件
-
当用户主机与远程主机发起一个 FTP 会话时,FTP客户首先与FTP服务器发起一个用于控制的 TCP 连接(即控制连接),当 FTP服务器从该连接上接收到一个文件传输的命令后,就会发起一个到 FTP客户的 TCP 数据连接
-
对 FTP 传输而言,控制连接贯穿整个会话期间,但是数据连接是非持续连接,会话中每一次文件传输都需要建立一个新的数据连接
-
FTP服务器必须在整个会话期间追踪用户的状态,将用户账户与控制连接关联,这就大大地限制了 FTP 同时维持的会话总数
-
Internet 邮件电子邮件系统的构成:用户代理(user-agent)、邮件服务器(mail server)和简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)
-
SMTP 使用 TCP 可靠数据传输服务
-
SMTP 用于从发送方的邮件服务器发送报文到接收方的邮件服务器
-
SMTP 将一个报文从发送邮件服务器传送到接收邮件服务器的过程
-
SMTP客户(运行在发送邮件服务器上)建立一个到SMTP服务器(运行在接收邮件服务器上)的 TCP 连接
-
如果服务器未开机,客户会继续尝试连接
-
一旦连接建立,客户与服务器执行某些应用成握手,在 SMTP 握手阶段,SMTP客户指示发送方和接收方的邮件地址
-
SMTP客户发送报文,如果客户有另外的报文要继续发送到该服务器,则会在同一 TCP连接上继续发送,否则,客户指示 TCP连接关闭
-
-
SMTP 和 HTTP 的区别
-
HTTP 主要是一个拉协议(pull protocol),即在方便的时候,有些人在 Web服务器上装在信息,用户使用 HTTP 从该服务器上拉取这些信息,特别是 TCP连接是由想接收文件的机器发起的
-
SMTP 主要是一个推协议(push protocol),即发送邮件服务器把文件推向接收邮件服务器,特别是TCP连接是由要发送该文件的机器发起的
-
SMTP 强制要求每个报文使用 7 byte 的 ASCII 编码,HTTP 数据则不受这种限制
-
对待含有引用的文件对象,HTTP 把每个对象封装在自己的 HTTP响应报文中,而 SMTP 则会把所有报文对象放在一个报文里面
-
-
邮件报文格式需要由包含环境信息的首部行,首部行和报文实体通过换行分隔,每个首部必须含有一个 From: 首部行,一个 To: 首部行
-
用户代理A ---> (SMTP) ---> 邮件服务器A ---> (SMTP) ---> 邮件服务器B ---> (POP3,IMAP,HTTP) ---> 用户代理B
-
这这个过程中,用户代理A是 SMTP客户,邮件服务器A即是 SMTP服务器也是 SMTP客户,邮件服务器B是 SMTP服务器
-
实际上,SMTP 被设计成将电子邮件从一台主机推到另一台主机
-
为什么用户代理A要通过邮件服务器A作为中继,而不是直接将邮件推送给邮件服务器B呢?
-
代理服务器A将没有任何办法到达一个不可达的目的地接收服务器
-
如果邮件服务器A不能将邮件交付给邮件服务器B,邮件服务器A会在一个报文列队中保持该报文并在以后尝试再次发送,如果一定时间后仍不能成功,邮件服务器A就会删除该报文,并且以邮件形式通知用户代理A
-
-
用户代理B从邮件服务器B上取报文是一个拉操作,而 SMTP 协议是一个推协议,因此需要引入邮件访问协议来解决难题,包括 POP3(Post Office Protocol-Version 3)、IMAP(Internet Mail Access Protocol)以及 HTTP
-
POP3 按照三个阶段进行工作:特许,事务处理,更新
-
特许阶段,用户通过明文形式发送用户名和口令认证用户
-
事务处理阶段,用户可以进行一系列操作,比如获取邮件的统计信息,标记删除报文,取回报文等
-
更新阶段,在用户发出 quit 命令之后,目的是结束 POP3 会话,此时,邮件服务器会删除被标记删除的报文
-
-
在用户代理与邮件服务器之间的 POP3 会话期间,POP3服务器会保留一些状态信息,特别是记录被标记删除的报文,然而,POP3服务器并不在POP3会话过程中携带状态信息,这大大简化了 POP3 服务的实现
-
IMAP服务器将每个报文与文件夹联系起来,为用户提供创建远程文件夹并为报文指派文件夹的方法
-
IMAP协议为用户提供在邮件服务器新建文件夹,移动邮件,阅读邮件,删除邮件等命令
-
与 POP3 不同,IMAP服务器维护了 IMAP会话的用户状态信息
-
IMAP协议的另一个重要特性就是它具有允许用户代理获取获取报文组件的命令
DNS 因特网的目录服务
-
主机名和IP地址是识别主机的两种方式,人们喜欢主机名的标记方式,而路由器则更喜欢定长的,有着层次结构的IP地址,为此,我们需要一种能进行主机名到IP地址转换的目录服务,这就是域名系统(Domain Name System, DNS)
-
DNS 是一个由分层的 DNS服务器实现的分布式数据库;是一个使得主机能够查询分布式数据库的应用层协议
-
DNS 协议运行在 UDP 之上,使用53端口
-
DNS 提供的一些重要服务
-
主机名到IP地址的转换
-
主机别名(区别于规范主机名),有着复杂主机名的主机能拥有一个或者多个别名
-
邮件服务器别名
-
负载分配,比如一个访问频繁的站点冗余分布在多个服务器上,因此一个规范主机名与IP地址集合对应,DNS数据库中存储着这些IP集合,当客户对映射到某地址集合的名字发出一个 DNS 请求,该服务器用IP地址集合进行响应,但是在每次回答中循环这些地址次序。由于客户总数项IP地址集合排在最前面的服务器发送请求,所以 DNS 就在所有这些冗余的服务器之间循环分配了负载
-
-
从用户主机上调用应用程序的角度看,DNS 是一个提供简单直接的转换服务的黑盒子。实际上,DNS 是由分布于全球的大量 DNS 服务器以及定义了 DNS 服务器与查询主机通信方式的应用成协议组成
-
DNS 一种集中式设计是指,在 Internet 中只使用一个 DNS 服务器,它包含了所有的映射。尽管这种设计很简单,但是它并不适用,原因如下:
-
单点故障(a single point of failure),如果该 DNS 服务器崩溃,则整个 Internet 随之瘫痪
-
通信容量(traffic volume),单个 DNS 服务器必须处理所有的 DNS 查询
-
远距离的集中式数据库(distant centralized database),在全球化的 Internet 环境中,单个 DNS 服务器不可能临近所有地区
-
维护(maintenance),单个 DNS 服务器必须为所有的主机保留记录,这回让其变得难以维护
-
-
为此,DNS 采取了分布式的设计方案,在 Internet 上实现分布式数据库
-
为了处理扩展性问题,DNS 使用了大量的 DNS 服务器,它们以层次方式组织,并且分布在全世界范围内,并且没有一台 DNS 服务器拥有 Internet 的所有主机的映射
-
大致来说,有三种类型的 DNS 服务器:
-
根DNS服务器
-
顶级域(Top-Level Domain, TLD)DNS服务器
-
权威DNS服务器
-
-
此外,还有一类重要的 DNS 服务器,为本地DNS服务器(local DNS server),本地DNS服务器严格来说并不属于分布式DNS服务器的结构层次,但是其对于 DNS 层次结构是重要的。当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 服务器层次结构中
-
为了改善时延性能并减少在 Internet 上传输的 DNS 报文数量,大量使用了 DNS缓存(DNS caching)。例如,本地DNS服务器能够缓存权威DNS服务器某主机/IP的映射,并且在一段时间将丢弃缓存信息
-
共同实现 DNS 分布式数据库的所有 DNS 服务器存储了资源记录(Resource Record,RR),RR 提供了主机名到 IP 地址的映射。而每个 DNS 响应报文包含了若干条资源记录
-
资源记录是一个4元组,包含 Name, Value, Type, TTL 四个字段,TTL 是该资源记录的生存时间,它决定了资源记录应该从缓存中删除的时间。Name 和 Value 的值取决于 Type
-
Type 为 A,则 Name 为主机名,Value 为 IP 地址
-
Type 为 NS,则 Name 为个域,Value 为该域中主机IP地址的权威DNS服务器的主机名,这个记录用于沿着查询链来路由 DNS 查询
-
Type 为 CNAME,则 Name 为主机别名,Value 为别名为 Name 的主机所对应的规范主机名
-
Type 为 MX,则 Value 是个别名为 Name 的邮件服务器的规范主机名
-
-
DNS 只有两种报文:DNS查询报文和DNS回答报文,两种报文格式相同,包含五个区域
-
首部区域,包含标识符,标志,问题数,回答RR数,权威RR数,附加RR数
-
问题区域,查询的名字和类型字段
-
回答区域,对查询的响应中的RR
-
权威区域,权威服务器的记录
-
附加区域,可被使用的附加“有帮助的”信息
-
-
通过本地主机向DNS服务器发送 DNS查询报文,
win-r-cmd
操作后,控制台输入nslookup
,调用 nslookup 程序,然后输入 Web 站点即可 -
DDoS 通过向每个 DNS 服务器发送大量分组,使得大多数合法的 DNS 请求得不到回答
-
中间人攻击,攻击者截获来自主机的请求并返回伪造的回答
-
DNS毒害攻击,攻击者向一台 DNS 服务器发送伪造的回答,诱使服务器在它的缓存中接收伪造的记录