
改变的速度,即对学习来讲,最重要的东西是学习的方法,在特定的技术中如何灵活地适应改变,当你在职业生涯中前行时,在新的机会和可能性方面如何保持开放的思想 --Marc Andreessen
应用层
研发网络应用程序的核心是写出可以运行在不一样的端系统和经过网络彼此通讯的程序css
进程通讯
- 在操做系统中,进行通讯的其实是进程(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.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/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...

FTP 文件传输协议
- 用户首先提供远程主机的主机名,使本地主机的 FTP客户进程创建一个到远程主机 FTP服务器进程的 TCP 链接
- 随后,该用户提供用户标识和口令,做为 FTP 命令的一部分在该 TCP 链接上传送
- 一旦该服务器向该用户受权,用户能够将存放在本地文件系统中的文件与远程文件系统文件进行传输
- FTP 使用两个并行的 TCP 链接来传输文件,一个是控制链接(control connection),一个是数据链接(data connection)
- 控制链接用于在两主机之间传输控制信息,如用户标识,口令以及文件操做命令
- 数据链接用于实际发送一个文件
- 当用户主机与远程主机发起一个 FTP 会话时,FTP客户首先与FTP服务器发起一个用于控制的 TCP 链接(即控制链接),当 FTP服务器从该链接上接收到一个文件传输的命令后,就会发起一个到 FTP客户的 TCP 数据链接
- 对 FTP 传输而言,控制链接贯穿整个会话期间,可是数据链接是非持续链接,会话中每一次文件传输都须要创建一个新的数据链接
- FTP服务器必须在整个会话期间追踪用户的状态,将用户帐户与控制链接关联,这就大大地限制了 FTP 同时维持的会话总数
E-mail
- Internet 邮件电子邮件系统的构成:用户代理(user-agent)、邮件服务器(mail server)和简单邮件传输协议(Simple Mail Transfer Protocol, SMTP)
- SMTP 使用 TCP 可靠数据传输服务
- SMTP 用于从发送方的邮件服务器发送报文到接收方的邮件服务器
-
SMTP 将一个报文从发送邮件服务器传送到接收邮件服务器的过程json
- 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呢?api
- 代理服务器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 服务器发送伪造的回答,诱使服务器在它的缓存中接收伪造的记录