上一篇我们主要讨论了,TCP和UDP协议的区别,本文我们来探讨计算机网络中的应用层
域名,域名的出现解决了我们不用每时每刻都记录网站的IP地址,要不然现在网站这么多,都去用IP地址访问,太考验人的记忆力了,于是需要一个“类似于电话簿的”东西——域名,可以根据名字来查看IP地址
DNS在日常生活中的重要性,就是每个人上网,都需要它,但是同时,这对它来讲也是非常大的挑战。一旦它出了故障,整个互联网都将瘫痪。另外,上网的人分布在全世界各地,如果大家都去同一个地方访问某一台服务器,时延将会非常大。因此:DNS服务器一定要设置成高可用,高并发和分布式的
比如,下面这张树状的层次结构
像下面这个图一样
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请求到服务器的请求消息包括以下格式:
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
GET
、HEAD
、POST
。每种方法规定了客户与服务器联系的类型不同。由于HTTP
协议简单,使得HTTP
服务器的程序规模小,因而通信速度很快。Content-Type
加以标记。Connection: Keep-Alive
实现长连接HTTP
协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。从而引出了我们下文中的HTTPS
HTTP
协议中没有加密机制,但可以通 过和 SSL
(Secure Socket Layer, 安全套接层 )或 TLS
(Transport Layer Security, 安全层传输协议)的组合使用,加密 HTTP
的通信内容。属于通信加密,即在整个通信线路中加密。
HTTP + 加密 + 认证 + 完整性保护 = HTTPS(HTTP Secure )
HTTPS
采用共享密钥加密(对称)和公开密钥加密(非对称)两者并用的混合加密机制。若密钥能够实现安全交换,那么有可能会考虑仅使用公开密钥加密来通信。但是公开密钥加密与共享密钥加密相比,其处理速度要慢。
HTTPS的不足:
电子邮件,可靠的传输是第一位,所以使用TCP协议,目前我们常用的SMTP作为邮件发送协议,常用的POP3作为邮件读取协议。SMTP和 POP3 (或IMAP)都是使用TCP连接来传送邮件的,下面我们基于邮件的发送和接收来简述一下这几个协议
SMTP规定了在两个相互通信的SMTP进程之间应如何交换信息。由于SMTP使用客户服务器方式,因此负责发送邮件的SMTP进程就是SMTP客户,而负责接收邮件的SMTP进程就是SMTP服务器。至于邮件内部的格式,邮件如何存储,以及邮件系统应以多快的速度来发送邮件,SMTP也都未做出规定。
SMTP规定了在两个相互通信的SMTP进程之间应如何交换信息,负责发送邮件的SMTP进程是SMTP客户,负责接收邮件的进程是SMTP服务器。SMTP规定了14条命令和21种应答信息,总结上面的几句
POP3协议是邮件访问协议:从服务器获取邮件,邮局协议( Post Office Protocol, POP) 是一个非常简单但功能有限的邮件读取协议,现在使用的是它的第3个版本POP3 POP: Post Office Protocol [RFC 1939] 认证/授权(客户端<—>服务器)和下载
POP3 采用的是“拉”(Pull)的通信方式,当用户读取邮件时,用户代理向邮件服务器发出请求,“拉”取用户邮箱中的邮件, 首先要进行认证,然后才可以进入事务阶段,进行获取邮件
POP使用客户/服务器的工作方式,在传输层使用TCP,端口号为110
POP有两种工作方式:“下载并保留”和“下载并删除”
(1)用户从邮件服务器上读取邮件后,邮件依然会保存在邮件服务器上,用户可再次从服务器上读取该邮件
(2)下载并删除 邮件一旦被读取,就被从邮件服务器上删除,用户不能再次从服务器上读取
注:POP3是无状态的
因特网报文存取协议(IMAP), 它比POP复杂得多,IMAP为用户提供了创建文件夹、在不同文件夹之间移动邮件及在远程文件夹中查询邮件的命令,为此IMAP服务器维护了会话用户的状态信息
IMAP允许用户代理只获取报文的某些部分,例如可以只读取一个报文的首部,或一个多部分MIME报文的一部分。这非常适用于低带宽的情况,用户可能并不想取回邮箱中的所有邮件,尤其是包含很多音频或视频的大邮件
POP3和IMAP的区别
POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作邮件,是不会反馈到服务器上,比如通过客户端读取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的邮件不会改变
IMAP提供webmail 与电子邮件客户端之间的双向通信
DHCP是动态主机配置协议的缩写。它是一种存在于应用层的网络管理协议。在DHCP的帮助下,可以动态地给网络上的任何设备或节点分配一个互联网协议IP地址,使它们可以使用这个IP进行通信。网络管理员的任务是将大量的IP地址手动分配给网络中的所有设备。然而,在DHCP中,这个任务是自动化的,是集中管理,而不是手工管理。无论是小型本地网络还是大型企业网络都实现了DHCP。DHCP的基本目标是为主机分配一个唯一的IP地址。
当DHCP服务器作为服务器时,DHCP服务器是用来自动分配唯一的IP地址,同时配置网络的其他信息。在小型企业或家庭中,DHCP服务器除了路由器之外,没有其他任何一个是DHCP服务器。然而,在大型网络中,DHCP服务器可以是一台计算机。
过程简单总结如下:
优缺点:
优点:
缺点:
由于它是自动分配,所以在将IP地址分配给不同的主机时,有时会出现IP地址冲突的情况
总结:
动态主机配置协议是一个非常关键和重要的网络服务,是必须要有的,因为使用它可以帮助你作为一个系统管理员或网络管理员,通过分配、跟踪和重新分配IP来处理客户端。离开管理,此外,如果有任何问题,你只需要保持与服务器连接,并验证设置,而不是在客户端之间运行。
简单的来说:
大多数操作系统使用系统调用机制在应用程序和操作系统之间传递控制权 对程序员来说,系统调用和一般程序设计中的函数调用非常相似,只是系统调用是将控制权传递给了操作系统(用户态->内核态)
1)作用:应用进程的控制权和操作系统的控制权进行转换的接口 ①当某个应用进程启动系统调用时,控制权就从应用进程传递给了系统调用接口 ②此接口再将控制权传递给计算机的操作系统,操作系统将此调用转给某个内部过程,并执行所请求的操作 ③内部过程一旦执行完毕,控制权就又通过系统调用接口返回给应用进程
但是无论是 HTTP 的方式,还是 FTP 的方式,都有一个比较大的缺点,就是难以解决单一服务器的带宽压力, 因为它们使用的都是传统的客户端服务器的方式。
后来,一种创新的、称为 P2P 的方式流行起来。P2P 就是 peer-to-peer。资源开始并不集中地存储在某些设备上,而是分散地存储在多台设备上。这些设备我们姑且称为 peer。
想要下载一个文件的时候,你只要得到那些已经存在了文件的 peer,并和这些 peer 之间,建立点对点的连接,而不需要到中心服务器上,就可以就近下载文件。一旦下载了文件,你也就成为 peer 中的一员,你旁边的那些机器,也可能会选择从你这里下载文件,所以当你使用 P2P 软件的时候,例如 BitTorrent,往往能够看到,既有下载流量,也有上传的流量,也即你自己也加入了这个 P2P 的网络,自己从别人那里下载,同时也提供给其他人下载。可以想象,这种方式,参与的人越多,下载速度越快,一切完美。
例子:
这里就要搬出来,迅雷了,我不知道你们有没有印象,在当时版权意识还不是特别明确的时候,想看一步电影也不需要去各大网站找vip,迅雷种子,这个在P2P模式中称为种子(.torrent)文件
种子,也即咱们比较熟悉的.torrent 文件。.torrent 文件由两部分组成,分别是:announce(tracker URL)和文件信息。
文件中有这些信息:
下载时,BT 客户端首先解析.torrent 文件,得到 tracker 地址,然后连接 tracker 服务器。tracker 服务器回应下载者的请求,将其他下载者(包括发布者)的 IP 提供给下载者。下载者再连接其他下载者,根据.torrent 文件,两者分别对方告知自己已经有的块,然后交换对方没有的数据。此时不需要其他服务器参与,并分散了单个线路上的数据流量,因此减轻了服务器的负担。
下载者每得到一个块,需要算出下载块的 Hash 验证码,并与.torrent 文件中的对比。如果一样,则说明块正确,不一样则需要重新下载这个块。这种规定是为了解决下载内容的准确性问题。
从这个过程也可以看出,这种方式特别依赖 tracker。tracker 需要收集下载者信息的服务器,并将此信息提供给其他下载者,使下载者们相互连接起来,传输数据。虽然下载的过程是非中心化的,但是加入这个 P2P 网络的时候,都需要借助 tracker 中心服务器,这个服务器是用来登记有哪些用户在请求哪些资源。所以,这种工作方式有一个弊端,一旦 tracker 服务器出现故障或者线路遭到屏蔽,BT 工具就无法正常工作了。
那么有没有办法去除中心化,当tracker服务器出现故障或者线路遭到屏蔽后,BT工具也能正常工作的呢?这时就要引出DHT去中心化网络,每个加入这个 DHT 网络的人,都要负责存储这个网络里的资源信息和其他成员的联系信息,相当于所有人一起构成了一个庞大的分布式存储数据库。
这里有个协议: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 网络中,会有节点告诉它,你既然加入了咱们这个网络,你也有责任知道某些文件的下载地址。好了,一切都分布式了。