改变的速度,即对学习来讲,最重要的东西是学习的方法,在特定的技术中如何灵活地适应改变,当你在职业生涯中前行时,在新的机会和可能性方面如何保持开放的思想 --Marc Andreessencss
研发网络应用程序的核心是写出可以运行在不一样的端系统和经过网络彼此通讯的程序html
在操做系统中,进行通讯的其实是进程(process)而不是程序。一个进程能够被认为是运行在端系统的一个程序nginx
当进程运行在相同的端系统上时,它们使用进程间的通讯机制相互通讯。进程间通讯的规则由端系统上的操做系统肯定web
在两个不一样端系统上的进程,经过跨越计算机网络交换报文而相互通讯。发送进程生成报文并发送到网络中,接收进程接收这些报文并可能经过将报文发送回去进行响应数据库
定义客户和服务器进程:在给定的一对进程之间的通讯会话场景中,发起通讯(即在该会话开始时发起与其余进程的联系)的进程被标识为客户,在会话开始时等待联系的进程是服务器编程
进程间经过套接字(socket)软件接口向网络发送或者接收报文json
套接字是同一台主机内应用层和传输层之间的接口,因为套接字是创建网络应用程序的可编程接口,所以套接字也被称为应用程序和网络之间的应用程序编程接口(API)后端
经过 ip(主机地址) 和 port(主机中接收进程标识符)来标识进程通讯中的接收进程api
包括因特网在内的不少网络提供了不止一种运输层协议,协议的选取由调用它的应用程序的需求来决定,这里有四个重要属性:可靠数据传输,吞吐量,定时和安全性浏览器
若是一个协议提供确保数据交付的服务,就认为提供了可靠数据传输(reliable data transfer)。当一个运输协议提供这种服务时,发送进程只须要将其数据传递进套接字,就能够彻底相信该数据可以无差错地达到接收进程
在沿着一条网路路径上的两个进程之间的通讯会话场景中,可用吞吐量就是发送进程可以向接收进程交付比特的速率
因为其余会话将共享沿着该网络路径的带宽,而且随着这些会话的到达和离开,某一会话的可用吞吐量会随着时间波动。为此,产生一种服务,即运输层协议可以以某种特定的速率提供确保的可用吞吐量
具备吞吐量要求的应用程序被称为带宽敏感应用,与之对应的是弹性应用(可以根据状况或多或少地利用可供使用的吞吐量)
运输层协议也能提供定时保证,好比:发送方注入进套接字中的每一个比特到达接收方的套接字不迟于100ms
运输层协议可以为应用程序提供一种或者多种安全性服务,好比:在发送和接收进程之间提供机密服务(即发送加密,接收解密),以防该数据在这两个进程之间直接暴露
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.1
Host: 172.17.2.42
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3390.0 Safari/537.36
Accept-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 OK
Server: nginx/1.10.1
Date: Sun, 08 Apr 2018 08:47:04 GMT
Content-Type: application/json;charset=UTF-8
Connection: keep-alive
Last-Modified: Sun, 08 Apr 2018 08:46:04 GMT
entity 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服务器进程的 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协议的另外一个重要特性就是它具备容许用户代理获取获取报文组件的命令
主机名和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 服务器发送伪造的回答,诱使服务器在它的缓存中接收伪造的记录