在他对“ SSL/TLS 如何工作? ”的回答中, Luc解释了 SSL 的工作原理:
SSL(及其后继者 TLS)是一种直接在 TCP 之上运行的协议(尽管也有基于数据报的协议的实现,例如 UDP)。这样,更高层的协议(例如 HTTP)可以保持不变,同时仍提供安全连接。在 SSL 层之下,HTTP 与 HTTPS 相同。
在他的第一句话中,他说高层协议可以保持不变。
他什么意思?我知道 OSI 层,但我认为我在这里遇到了一些知识问题。
在他对“ SSL/TLS 如何工作? ”的回答中, Luc解释了 SSL 的工作原理:
SSL(及其后继者 TLS)是一种直接在 TCP 之上运行的协议(尽管也有基于数据报的协议的实现,例如 UDP)。这样,更高层的协议(例如 HTTP)可以保持不变,同时仍提供安全连接。在 SSL 层之下,HTTP 与 HTTPS 相同。
在他的第一句话中,他说高层协议可以保持不变。
他什么意思?我知道 OSI 层,但我认为我在这里遇到了一些知识问题。
您应该将 OSI 层视为封装。
假设我想给你寄一杯。我选择了一个原始包装用于广告目的,展示我的产品有多好,以及您可以购买什么来增加您的“玻璃”体验。这是我的协议的高层。
然后我把这个包裹放在一个装满柔软东西的盒子里,因为我不希望它被运输损坏。这是第二层。
然后我的装运部门把这个盒子装进一个更大的包裹里,上面贴上要运到你家的标签。再次,另一层。
然后运输商把这个箱子和许多其他箱子一起放在一辆卡车上,并指示司机去另一个送货中心,再上一层。
据我们所知,卡车司机不需要知道:
现在假设我想为我的货物保密。因为,好奇的司机可能会试图篡改包裹以了解里面的内容,或者偷走并转售。
我可以使用一个协议,将包装好的软镀膜玻璃也放入带储物柜的金属盒中。它将保护它不被卡车司机篡改,因为他将无法窥视内部或拿走商品。它不保护下层,他仍然可以将所有烦恼都倾倒在湖中,这是拒绝服务。此外,我的储物柜不在乎里面有什么。它可能是你的杯子,可能是鲜花,也可能是空的。但它仍然有助于避免除您(和 c 的托运人)以外的任何人知道里面有什么。
OSI 中的协议也是如此。下层并不关心上层发生了什么。这留给另一个代理来解码/处理它。
编辑澄清:当我们说“保持不变”时,并不意味着信息没有被处理。特别是对于 SSL,SSL 层的有效负载是对更高层数据包的加密。但是当SSL在对方操作时,它会解密原始数据包而不做任何修改。
虽然 OSI 只是一个模型,实际上这些层可能是模糊的或不存在的,但分层协议的概念是专门允许在特定层中进行更改以使其上方和下方的层单独存在。
举个例子:
因此,重要的部分是每一层如何与相邻层交互。
@M'vy 运输实物的比喻在这里非常合适。
TCP 向应用程序提供流接口。有一些细节泄漏的例外情况,但通常打开一个 TCP 套接字,然后每一方向另一方发送一系列字节。这些字节将完好无损地按顺序传递,直到远程端关闭连接(您将被告知)。应用程序只需要知道流接口。他们不需要知道底层网络硬件的细节,他们不需要知道拥塞控制、窗口大小、包的重传,甚至不需要知道有包。
TLS 位于 TCP 之上,提供身份验证和加密服务,还为应用程序提供流接口。幕后还有一堆额外的东西,一堆新的潜在错误条件,以及一堆新的元数据,应用程序可以查询套接字(例如,有关远程证书及其颁发者的信息),但是基本操作是相同的——连接到给定地址,发送字节,接收字节,关闭连接,并被通知远程关闭。
关键在于,任何可以在 TCP 提供的流之上运行的应用程序级协议也可以在SSL提供的流之上运行,而无需对应用程序本身进行任何根本性的改变。事实上,如果应用程序接收有关使用的加密或远程方的证书或任何其他信息并不重要,您可以使用像stunnel这样的代理在 TLS 加密的 TCP 连接和未加密的 TCP 连接之间进行转换一。例如,客户端计算机上的 stunnel 可以允许指向 IMAP 服务器的常规(不支持 TLS)邮件客户端localhost:143
连接到 IMAPS 服务器mymailserver:993
;或服务器机器上的 stunnel 可以监听 HTTPS 连接externalip:443
并将它们代理到internalserver:80
,允许internalserver
(HTTP 服务器)与世界进行安全通信,即使它本身没有实现 TLS。
这就像在路上移动车辆一样。就像道路是固定介质一样,许多类型的车辆都可以在上面行驶,因此如果您制造新车使其在道路上行驶,则车辆必须具有可以在该道路上行驶的轮胎。
同样,如果您将以太网视为一种媒介,它可以承载各种网络协议,如 IPv4 或 IPv6。所以这里的重点是网络模型是如此模块化,你可以随意更换任何东西,只要它们符合某些接口规范。
因此,模块化设计指定无论您的内部工作是什么,重要的是您以某种方式处理输入并生成下一个模块可以理解的输出。