前言
上一篇我们主要讨论了,TCP和UDP协议的区别,本文我们来探讨计算机网络中的应用层
- 域名系统DNS——从域名解析出IP地址
- 万维网和HTTP协议
- 电子邮件的传送过程,SMTP协议和POP3协议,IMAP协议使用的场合
- 动态主机配置协议DHCP的特点
- 网络管理的三个组成部分
- 系统调用和应用编程接口的基本概念
- P2P文件系统
DNS
域名,域名的出现解决了我们不用每时每刻都记录网站的IP地址,要不然现在网站这么多,都去用IP地址访问,太考验人的记忆力了,于是需要一个“类似于电话簿的”东西——域名,可以根据名字来查看IP地址
DNS在日常生活中的重要性,就是每个人上网,都需要它,但是同时,这对它来讲也是非常大的挑战。一旦它出了故障,整个互联网都将瘫痪。另外,上网的人分布在全世界各地,如果大家都去同一个地方访问某一台服务器,时延将会非常大。因此:DNS服务器一定要设置成高可用,高并发和分布式的
比如,下面这张树状的层次结构
- 根 DNS 服务器 :返回顶级域 DNS 服务器的 IP 地址顶级域
- DNS 服务器:返回权威 DNS 服务器的 IP 地址
- 权威 DNS 服务器 :返回相应主机的 IP 地址
DNS解析过程
- 电脑客户端会发出一个 DNS 请求,问 www.163.com 的 IP 是啥啊,并发给本地域名服务器 (本地 DNS)。那本地域名服务器 (本地 DNS) 是什么呢?如果是通过 DHCP 配置,本地 DNS 由你的网络服务商(ISP),如电信、移动等自动分配,它通常就在你网络服务商的某个机房。
- 本地 DNS 收到来自客户端的请求。你可以想象这台服务器上缓存了一张域名与之对应 IP 地址的大表格。如果能找到 www.163.com,它就直接返回 IP 地址。如果没有,本地 DNS 会去问它的根域名服务器:“老大,能告诉我 www.163.com 的 IP 地址吗?”根域名服务器是最高层次的,全球共有 13 套。它不直接用于域名解析,但能指明一条道路。
- 根 DNS 收到来自本地 DNS 的请求,发现后缀是 .com,说:“哦,www.163.com 啊,这个域名是由.com 区域管理,我给你它的顶级域名服务器的地址,你去问问它吧。”
- 本地 DNS 转向问顶级域名服务器:“老二,你能告诉我 www.163.com 的 IP 地址吗?”顶级域名服务器就是大名鼎鼎的比如 .com、.net、 .org 这些一级域名,它负责管理二级域名,比如 163.com,所以它能提供一条更清晰的方向。
- 顶级域名服务器说:“我给你负责 www.163.com 区域的权威 DNS 服务器的地址,你去问它应该能问到。”
- 本地 DNS 转向问权威 DNS 服务器:“您好,www.163.com 对应的 IP 是啥呀?”163.com 的权威 DNS 服务器,它是域名解析结果的原出处。为啥叫权威呢?就是我的域名我做主。
- 权威 DNS 服务器查询后将对应的 IP 地址 X.X.X.X 告诉本地 DNS。
- 本地DNS在将IP地址返回客户端,客户端和目标建立连接
像下面这个图一样
HTTP协议
HTTP 协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
注意:客户端与服务器的角色不是固定的,一端充当客户端,也可能在某次请求中充当服务器。这取决与请求的发起端。HTTP协议属于应用层,建立在传输层协议TCP之上。客户端通过与服务器建立TCP连接,之后发送HTTP请求与接收HTTP响应都是通过访问Socket接口来调用TCP协议实现。
HTTP 是一种无状态 (stateless) 协议, HTTP 协议本身不会对发送过的请求和相应的通信状态进行持久化处理。这样做的目的是为了保持HTTP协议的简单性,从而能够快速处理大量的事务, 提高效率。
然而,在许多应用场景中,我们需要保持用户登录的状态或记录用户购物车中的商品。由于HTTP 是无状态协议,所以必须引入一些技术来记录管理状态,例如Cookie 。
http url
HTTP URL 包含了用于查找某个资源的详细信息, 格式如下:
http://host[":"port][abs_path]
http请求Request
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
http响应Response
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
http5大特点
- 支持客户/服务器模式
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有
GET 、HEAD 、POST 。每种方法规定了客户与服务器联系的类型不同。由于HTTP 协议简单,使得HTTP 服务器的程序规模小,因而通信速度很快。 - 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由
Content-Type 加以标记。 - 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原因是请求资源少,追求快。后来通过
Connection: Keep-Alive 实现长连接 - 无状态:
HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP的不足
- 通信使用明文(不加密),内容可能会被窃听
- 不验证通信方的身份,因此有可能遭遇伪装
- 无法证明报文的完整性,所以有可能已遭篡改
从而引出了我们下文中的HTTPS
HTTPS
HTTP 协议中没有加密机制,但可以通 过和 SSL (Secure Socket Layer, 安全套接层 )或 TLS (Transport Layer Security, 安全层传输协议)的组合使用,加密 HTTP 的通信内容。属于通信加密,即在整个通信线路中加密。
HTTP + 加密 + 认证 + 完整性保护 = HTTPS(HTTP Secure )
HTTPS 采用共享密钥加密(对称)和公开密钥加密(非对称)两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。
HTTPS的不足:
- SSL证书需要去,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
- SSL证书通常需要绑定IP,不能再同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗(SSL有扩展可以部分解决这个问题,但是比较麻烦,而且要求浏览器、操作系统支持,Windows XP就不支持这个扩展,考虑到XP的装机量,这个特性几乎没用)。
- https连接缓存不如http高效,大流量网站如非必要也不会采用,流量成本太高。
- https连接服务器端资源占用高很多,支持访客稍多的网站需要投入更大的成本,如果全部采用https,基于大部分计算资源闲置的假设的VPS的平均成本会上去。
- https协议握手阶段比较费时,对网站的响应速度有负面影响,如非必要,没有理由牺牲用户体验。
电子邮件的传送过程
电子邮件,可靠的传输是第一位,所以使用TCP协议,目前我们常用的SMTP作为邮件发送协议,常用的POP3作为邮件读取协议。SMTP和 POP3 (或IMAP)都是使用TCP连接来传送邮件的,下面我们基于邮件的发送和接收来简述一下这几个协议
SMTP协议
SMTP规定了在两个相互通信的SMTP进程之间应如何交换信息。由于SMTP使用客户服务器方式,因此负责发送邮件的SMTP进程就是SMTP客户,而负责接收邮件的SMTP进程就是SMTP服务器。至于邮件内部的格式,邮件如何存储,以及邮件系统应以多快的速度来发送邮件,SMTP也都未做出规定。
SMTP规定了在两个相互通信的SMTP进程之间应如何交换信息,负责发送邮件的SMTP进程是SMTP客户,负责接收邮件的进程是SMTP服务器。SMTP规定了14条命令和21种应答信息,总结上面的几句
- 客户端:发送信息的服务器
- 服务端:接收信息的服务器
- 使用TCP进行email信息的可靠传输
- 传输的三个阶段
- 命令/响应交互模式
命令(command): ASCII文本 响应(response): 状态代码和语句 - Email消息只能包含7位ASCII码
POP3协议
POP3协议是邮件访问协议:从服务器获取邮件,邮局协议( Post Office Protocol, POP) 是一个非常简单但功能有限的邮件读取协议,现在使用的是它的第3个版本POP3 POP: Post Office Protocol [RFC 1939] 认证/授权(客户端<—>服务器)和下载
POP3 采用的是“拉”(Pull)的通信方式,当用户读取邮件时,用户代理向邮件服务器发出请求,“拉”取用户邮箱中的邮件, 首先要进行认证,然后才可以进入事务阶段,进行获取邮件
POP使用客户/服务器的工作方式,在传输层使用TCP,端口号为110
POP有两种工作方式:“下载并保留”和“下载并删除”
(1)用户从邮件服务器上读取邮件后,邮件依然会保存在邮件服务器上,用户可再次从服务器上读取该邮件
(2)下载并删除 邮件一旦被读取,就被从邮件服务器上删除,用户不能再次从服务器上读取
注:POP3是无状态的
IMAP协议
因特网报文存取协议(IMAP), 它比POP复杂得多,IMAP为用户提供了创建文件夹、在不同文件夹之间移动邮件及在远程文件夹中查询邮件的命令,为此IMAP服务器维护了会话用户的状态信息
- 所有消息统一保存在一个地方:服务器
- 允许用户利用文件夹组织消息
- MAP支持跨会话(Session)的用户状态
IMAP允许用户代理只获取报文的某些部分,例如可以只读取一个报文的首部,或一个多部分MIME报文的一部分。这非常适用于低带宽的情况,用户可能并不想取回邮箱中的所有邮件,尤其是包含很多音频或视频的大邮件
POP3和IMAP的区别
POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作邮件,是不会反馈到服务器上,比如通过客户端读取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的邮件不会改变
IMAP提供webmail 与电子邮件客户端之间的双向通信
DHCP的特点
DHCP是动态主机配置协议的缩写。它是一种存在于应用层的网络管理协议。在DHCP的帮助下,可以动态地给网络上的任何设备或节点分配一个互联网协议IP地址,使它们可以使用这个IP进行通信。网络管理员的任务是将大量的IP地址手动分配给网络中的所有设备。然而,在DHCP中,这个任务是自动化的,是集中管理,而不是手工管理。无论是小型本地网络还是大型企业网络都实现了DHCP。DHCP的基本目标是为主机分配一个唯一的IP地址。
当DHCP服务器作为服务器时,DHCP服务器是用来自动分配唯一的IP地址,同时配置网络的其他信息。在小型企业或家庭中,DHCP服务器除了路由器之外,没有其他任何一个是DHCP服务器。然而,在大型网络中,DHCP服务器可以是一台计算机。
过程简单总结如下:
-
客户端向主机发送一个IP地址请求。客户端可以是任何发送请求的设备,主机可以是路由器。 -
主机将寻找一个可用的IP地址并分配给客户端。 -
使用这个IP地址,客户端就可以在网络上进行通信。
优缺点:
优点:
- 可以很容易地在网络中添加新的客户端。
- IP地址是由DHCP集中管理的。
- IP地址可以重复使用,从而减少了对IP地址总数的要求。
- DHCP服务器上的IP地址空间可以很容易地进行重新配置,而不需要单独重新配置客户端。
- 网络管理员可以利用DHCP协议提供的方法,从集中区域配置网络。
缺点:
? 由于它是自动分配,所以在将IP地址分配给不同的主机时,有时会出现IP地址冲突的情况
总结:
动态主机配置协议是一个非常关键和重要的网络服务,是必须要有的,因为使用它可以帮助你作为一个系统管理员或网络管理员,通过分配、跟踪和重新分配IP来处理客户端。离开管理,此外,如果有任何问题,你只需要保持与服务器连接,并验证设置,而不是在客户端之间运行。
网络管理的三个组成部分
简单的来说:
- 若干个主机,它们向各用户提供服务
- 一个通信子网,它由一些专用的结点交换机和连接这些结点的通信链路所组成。
- 一系列的协议。这些协议是为在主机之间或主机和子网之间的通信而用的。
系统调用和应用编程接口的基本概念
系统调用接口
大多数操作系统使用系统调用机制在应用程序和操作系统之间传递控制权 对程序员来说,系统调用和一般程序设计中的函数调用非常相似,只是系统调用是将控制权传递给了操作系统(用户态->内核态)
应用编程接口
1)作用:应用进程的控制权和操作系统的控制权进行转换的接口 ①当某个应用进程启动系统调用时,控制权就从应用进程传递给了系统调用接口 ②此接口再将控制权传递给计算机的操作系统,操作系统将此调用转给某个内部过程,并执行所请求的操作 ③内部过程一旦执行完毕,控制权就又通过系统调用接口返回给应用进程
P2P
但是无论是 HTTP 的方式,还是 FTP 的方式,都有一个比较大的缺点,就是难以解决单一服务器的带宽压力, 因为它们使用的都是传统的客户端服务器的方式。
后来,一种创新的、称为 P2P 的方式流行起来。P2P 就是 peer-to-peer。资源开始并不集中地存储在某些设备上,而是分散地存储在多台设备上。这些设备我们姑且称为 peer。
想要下载一个文件的时候,你只要得到那些已经存在了文件的 peer,并和这些 peer 之间,建立点对点的连接,而不需要到中心服务器上,就可以就近下载文件。一旦下载了文件,你也就成为 peer 中的一员,你旁边的那些机器,也可能会选择从你这里下载文件,所以当你使用 P2P 软件的时候,例如 BitTorrent,往往能够看到,既有下载流量,也有上传的流量,也即你自己也加入了这个 P2P 的网络,自己从别人那里下载,同时也提供给其他人下载。可以想象,这种方式,参与的人越多,下载速度越快,一切完美。
例子:
这里就要搬出来,迅雷了,我不知道你们有没有印象,在当时版权意识还不是特别明确的时候,想看一步电影也不需要去各大网站找vip,迅雷种子,这个在P2P模式中称为种子(.torrent)文件
种子(.torrent)文件
种子,也即咱们比较熟悉的.torrent 文件。.torrent 文件由两部分组成,分别是:announce(tracker URL)和文件信息。
文件中有这些信息:
- info 区:这里指定的是该种子有几个文件、文件有多长、目录结构,以及目录和文件的名字。
- Name 字段:指定顶层目录名字。
- 段哈希值:将整个种子中,每个段的 SHA-1 哈希值拼在一起。
下载时,BT 客户端首先解析.torrent 文件,得到 tracker 地址,然后连接 tracker 服务器。tracker 服务器回应下载者的请求,将其他下载者(包括发布者)的 IP 提供给下载者。下载者再连接其他下载者,根据.torrent 文件,两者分别对方告知自己已经有的块,然后交换对方没有的数据。此时不需要其他服务器参与,并分散了单个线路上的数据流量,因此减轻了服务器的负担。
下载者每得到一个块,需要算出下载块的 Hash 验证码,并与.torrent 文件中的对比。如果一样,则说明块正确,不一样则需要重新下载这个块。这种规定是为了解决下载内容的准确性问题。
从这个过程也可以看出,这种方式特别依赖 tracker。tracker 需要收集下载者信息的服务器,并将此信息提供给其他下载者,使下载者们相互连接起来,传输数据。虽然下载的过程是非中心化的,但是加入这个 P2P 网络的时候,都需要借助 tracker 中心服务器,这个服务器是用来登记有哪些用户在请求哪些资源。所以,这种工作方式有一个弊端,一旦 tracker 服务器出现故障或者线路遭到屏蔽,BT 工具就无法正常工作了。
去中心化
那么有没有办法去除中心化,当tracker服务器出现故障或者线路遭到屏蔽后,BT工具也能正常工作的呢?这时就要引出DHT去中心化网络,每个加入这个 DHT 网络的人,都要负责存储这个网络里的资源信息和其他成员的联系信息,相当于所有人一起构成了一个庞大的分布式存储数据库。
这里有个协议:Kademlia协议,我们来详细说一下
Kademlia协议
简单的说,Kad 是一种分布式哈希表技术,任何一个 BitTorrent 启动之后,它都有两个角色。一个是 peer,监听一个 TCP 端口,用来上传和下载文件,这个角色表明,我这里有某个文件。另一个角色 DHT node,监听一个 UDP 的端口,通过这个角色,这个节点加入了一个 DHT 的网络。在 DHT 网络里面,每一个 DHT node 都有一个 ID。这个 ID 是一个很长的串。每个 DHT node 都有责任掌握一些知识,也就是文件索引,也即它应该知道某些文件是保存在哪些节点上。它只需要有这些知识就可以了,而它自己本身不一定就是保存这个文件的节点。
哈希值
DHT 算法是这样规定的:如果一个文件计算出一个哈希值,则和这个哈希值一样的那个 DHT node,就有责任知道从哪里下载这个文件,即便它自己没保存这个文件。
当然不一定这么巧,总能找到和哈希值一模一样的,有可能一模一样的 DHT node 也下线了,所以 DHT 算法还规定:除了一模一样的那个 DHT node 应该知道,ID 和这个哈希值非常接近的 N 个 DHT node 也应该知道。
什么叫和哈希值接近呢?例如只修改了最后一位,就很接近;修改了倒数 2 位,也不远;修改了倒数 3 位,也可以接受。总之,凑齐了规定的 N 这个数就行。
在 DHT 网络中,每个 node 都保存了一定的联系方式,但是肯定没有 node 的所有联系方式。DHT 网络中,节点之间通过互相通信,也会交流联系方式,也会删除联系方式。和人们的方式一样,你有你的朋友圈,你的朋友有它的朋友圈,你们互相加微信,就互相认识了,过一段时间不联系,就删除朋友关系。
有个理论是,社交网络中,任何两个人直接的距离不超过六度,也即你想联系比尔盖茨,也就六个人就能够联系到了。
所以,node new 想联系 node C,就去万能的朋友圈去问,并且求转发,朋友再问朋友,很快就能找到。如果找不到 C,也能找到和 C 的 ID 很像的节点,它们也知道如何下载文件 1。在 node C 上,告诉 node new,下载文件 1,要去 B、D、 F,于是 node new 选择和 node B 进行 peer 连接,开始下载,它一旦开始下载,自己本地也有文件 1 了,于是 node new 告诉 node C 以及和 node C 的 ID 很像的那些节点,我也有文件 1 了,可以加入那个文件拥有者列表了。但是你会发现 node new 上没有文件索引,但是根据哈希算法,一定会有某些文件的哈希值是和 node new 的 ID 匹配上的。在 DHT 网络中,会有节点告诉它,你既然加入了咱们这个网络,你也有责任知道某些文件的下载地址。好了,一切都分布式了。
|