本文配图来源于B站up技术蛋老师视频截图
后续补充
端到端 跳到跳 中继器和集线器 端口 ARP
协议
通信协议概况(以osi
模型为框架)
osi
网络参考模
目的:两台主机(例如华为和苹果电脑)具体如何交互 应用如何沟通
osi
各层次作用:
-
物理层:
-
物理上联通 把信息以比特形式用电磁波传输出去
-
数据从网络接口出去之后,经历不同的网络拓扑,需要中继器和集线器等设备。
物理层网络拓扑结构
-
-
数据链路层:
-
比特被封装成帧 封装时被加上MAC地址(物理地址) (例如网卡有唯一物理地址)
-
传输时需要使用交换机 交换机接受信息时得到发送端MAC地址,如果得知接收端MAC地址,就可以把信息传输过去。
-
由于物理传输时可能把1变成0,0变成1等错误,因此采用差错检测,检查物理层传输时信息是否错误。
-
流控制,避免传入速率与接收速率的不对称。
-
-
网络层:
-
假设两台电脑网卡的MAC差别不大,但是出场后卖到了南极和北极,这样就会导致单单通过网卡寻找主机无法做到快速物理定位。
-
因此需要
IP
地址来进行寻址和路由选择 -
实现端到端的传输,而不是物理地址跳到跳的传输
-
路由器是网络层的核心
-
以包的形式传输
-
地址管理和路由选择是本层核心
-
-
-
传输层:
-
对方主机可能运行着无数软件进程,如何让数据进入指定软件上,是本层所要实现的功能;
-
通过端口号来进行地址定位
-
段 是本层数据的名字
-
传输层管理两个节点之间的数据传输
可靠传输TCP 不可靠传输
UDP
QUIC
-
TCP 字节流按段发送 可以实现流量控制和错误控制
-
-
流量控制 保证数据的传输速度
-
错误控制 保证数据的完整接收
-
-
会话层:
-
一般用于网站服务 比如免密登录
-
可以提供同步服务
-
-
表示层:
-
编码和解码
-
数据的加密和解密如
HTTPS(SSL/TLS)
-
文件压缩
-
-
应用层 :
-
最接近用户的一层。
-
应用之间如何交互 比如常见的
http
协议,开发者按照这一协议来编写程序,使得应用之间得以相互沟通。
-
数据流通过程
传输过程:(是一个由上到下的过程)
-
客户端要发送数据,即报文
-
报文来到传输层,加上端口号,封装成段
-
段来到网络层,加上
IP
地址,封装成包(包含有目标IP
地址的) -
由于客户端和接收端不在同一个网络之下,因此要经过网关;
-
而现在客户端是不知道接默认网关的MAC地址,无法封装成帧。因此需要使用
ARP
协议进行广播,找到网关IP
对应的MAC地址把包封装成帧 -
帧里面有 自己的源MAC地址和 目标MAC地址(填广播地址)
-
假设现在有一个二层交换机,则这个交换机只需要记录下不同接口对应的MAC地址,交换机收到广播后就帮忙发出去,人手一份
-
默认网关接受到消息之后,查看帧,发现了发送端的MAC地址,再解封发现包里的
IP
地址,就会把客户端的MAC地址和IP
地址关联为同一台主机; -
同时,默认网关会把自己的
IP
地址放入包中,再结合自己的MAC地址封装成帧;默认网关做出相应,原路返回,这样客户端就知道默认网关的IP
地址了 -
比特流到了默认网关之后发现是发送给自己的,再解封为包,查看到目标的
IP
地址在另一网络中,就会进行路由转发,最终通过互联网到达目的网络(服务器网关); -
如果目标网关知道目标的
IP
地址和MAC地址是那台主机,封装成帧,就可以直接发送过去了;如果不知道,还是使用ARP
协议广播一下就知道了; -
目标主机收到包,确认是自己的
IP
地址之后,解封查看段可以发现源目标的端口号,按照目标端口号将报文给到指定的应用程序,应用程序就可以按照源的信息作出相应了。
参考模型 常用TCP 和实际划分
Bitcoin
主链使用的是基于TCP协议的P2P
协议
比特币
-
一种免费的开源点对点电子现金系统,完全去中心化
-
不需要中央服务器或可信方
-
用户持有自己货币的加密密钥,在
P2P
网络的帮助下直接与他人进行交易,以检查双重支出。
TCP协议(也叫TCP/IP
协议族)
TCP/IP
协议族提供了点对点的连结机制,并且将传输数据帧的封装、寻址、传输、路由以及接收方式,都予以标准化。
各层基本协议与作用
应用层
主要协议:应用层协议包括HTTP(万维网服务)、FTP(文件传输)、SMTP(电子邮件)、SSH(安全远程登陆)、DNS(域名解析)以及许多其他协议。
用途:用读取来自传输层的数据或者将数据传输写入传输层
包括所有和应用程序协同工作,并利用基础网络交换应用程序的业务数据的协议。一些特定的程序被认为运行在这个层上,该层协议所提供的服务能直接支持用户应用。
传输层
主要协议:有UDP、TCP,实现端对端的数据传输;
传输层的协议,解决了诸如端到端可靠性问题,能确保数据可靠的到达目的地,甚至能保证数据按照正确的顺序到达目的地。传输层的主要功能大致如下:
(1)为端到端连接提供传输服务;
(2)这种传输服务分为可靠和不可靠的,其中TCP是典型的可靠传输,而UDP则是不可靠传输;
(3)为端到端连接提供流量控制、差错控制、QoS(Quality of Service)服务质量等管理服务。
传输层主要有两个性质不同的协议:TCP传输控制协议和UDP用户数据报协议。
TCP协议是一个面向连接的、可靠的传输协议,它提供一种可靠的字节流,能保证数据完整、无损并且按顺序到达。TCP尽量连续不断地测试网络的负载并且控制发送数据的速度以避免网络过载。另外,TCP试图将数据按照规定的顺序发送。
UDP协议是一个无连接的数据报协议,是一个“尽力传递”和“不可靠”协议,不会对数据包是否已经到达目的地进行检查,并且不保证数据包按顺序到达。
总体来说,TCP协议传输效率低,但可靠性强;UDP协议传输效率高,但可靠性略低,适用于传输可靠性要求不高、体量小的数据(比如QQ聊天数据)。
网络层
网络层的主要协议有ICMP、IP、IGMP,主要负责网络中数据包的传送等
TCP/IP协议网络层的作用是在复杂的网络环境中为要发送的数据报找到一个合适的路径进行传输。简单来说,网络层负责将数据传输到目标地址,目标地址可以是多个网络通过路由器连接而成的某一个地址。另外,网络层负责寻找合适的路径到达对方计算机,并把数据帧传送给对方,网络层还可以实现拥塞控制、网际互连等功能。网络层协议的代表包括:ICMP、IP、IGMP等。
链路层
链路层有时也称作数据链路层或网络接口层,主要协议有ARP、RARP, 通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与传输媒介(如电缆或其他物理设备)的物理接口细节。
链路层有时也称作数据链路层或网络接口层,用来处理连接网络的硬件部分。该层既包括操作系统硬件的设备驱动、NIC(网卡)、光纤等物理可见部分,还包括连接器等一切传输媒介。在这一层,数据的传输单位为比特。其主要协议有ARP、RARP等。
数据传输与各层形成原因
物理层
假设我们最初只需要在一台电脑进行操作,那么我们就不需要任何传输设备
网线
直到有一天,我们需要和另一台电脑传输数据,我们就需要一个传输工具——网线
集线器
后来,加入我们的电脑越来越多,在三台,四台的时候网线还好说
但是如果来了十台电脑,那么我们难道要一个电脑接9根网线吗?
这时候就需要一个中枢装置——集线器
MAC 地址
现在问题来了,我们要如何确定数据发给谁呢?
这时候就需要一个全局唯一的地址,我们称之为——MAC地址
你的 MAC 地址是 aa-aa-aa-aa-aa-aa,你的伙伴 b 的 MAC 地址是 bb-bb-bb-bb-bb-bb,以此类推,不重复就好。
这样,A 在发送数据包给 B 时,只要在头部拼接一个这样结构的数据,就可以了。
B 在收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包的确是发给自己的,于是便收下。
其他的 C D E 收到数据包后,根据头部的目标 MAC 地址信息,判断这个数据包并不是发给自己的,于是便丢弃
数据链路层
交换机
集线器虽然使整个布局干净不少,但原来我只要发给电脑 B 的消息,现在却要发给连接到集线器中的所有电脑,这样既不安全,又不节省网络资源。
那么如何解决这个问题呢?
我们优先想到的就是一个设备,它只把文件发给目标 MAC 地址指向的那台电脑,这个设备被称为交换机
MAC地址表
在最初时,交换机是不知道各个端口和计算机的对应关系的,这时候通过响应等方式生成一张记录端口与对应MAC地址的表,叫MAC地址表
由于这个包从端口 4 进入的交换机,所以此时交换机就可以在 MAC地址表记录第一条数据:
MAC:aa-aa-aa-aa-aa-aa-aa 端口:4
交换机看目标 MAC 地址(bb-bb-bb-bb-bb-bb)在地址表中并没有映射关系,于是将此包发给了所有端口,也即发给了所有机器。
之后,只有机器 B 收到了确实是发给自己的包,于是做出了响应,响应数据从端口 1 进入交换机,于是交换机此时在地址表中更新了第二条数据:
MAC:bb-bb-bb-bb-bb-bb-bb 端口:1
随着经过该网络中的机器不断地通信,交换机最终将 MAC 地址表建立完毕
随着机器数量越多,交换机的端口也不够了,
但只要将多个交换机连接起来,这个问题就轻而易举搞定
你完全不需要设计额外的东西,只需要按照之前的设计和规矩来,按照上述的接线方式即可完成所有电脑的互联,所以交换机设计的这种规则,真的很巧妙。你想想看为什么(比如 A 要发数据给 F)。
但是你要注意,上面那根红色的线,最终在 MAC 地址表中可不是一条记录呀,而是要把 EFGH 这四台机器与该端口(端口6)的映射全部记录在表中。
MAC 地址和端口的映射记录 最终,两个交换机将分别记录 A ~ H 所有机器的映射记录。
左侧的
右侧的
传输层
路由器 二级交换机 IP地址
路由器独立的拥有 MAC 地址,并且可以帮我们把数据包做一次转发,定在网络层。
路由器数据结构
HTTP传输协议
HTTP
协议的用途
用于客户端和服务端之间的数据传输
-
由客户端发出请求
-
服务端做出响应响应
-
传递的数据被称为资源(文档 图片 文本等等)
-
资源通过URL进行定位
URL的构成
发送HTTP请求
请求构成
-
请求头包含额外的信息来帮助服务器决定如何响应
比如ACCEPT设置接受相应资源的类型
-
请求体(只有POST PUT有)是需要发送给服务器的数据
请求方式有以下四种
POST PUT带有请求体 用于向服务端发送资源信息
GET DELETE 通常不带请求体
接收HTTP请求
响应构成
-
响应头:包含额外的信息来告诉客户端如何控制缓存和cookie
-
相应体是服务端返回的数据
响应状态和状态码
HTTP无状态
HTTP协议使用时一次就是一次,不会记录和判断两次信息是否来自同一客户端,因此需要使用cookie和session来保持会话,来实现登录和购物车之类的功能。
cookie
HTTP协议中的Cookie是一种被服务器保存在用户计算机上的小型文本文件。当用户访问一个网站时,服务器可以通过设置Cookie将一些数据存储在用户的浏览器中,并在以后的请求中将该数据发送回服务器。这样,服务器就可以通过读取Cookie来识别用户、保持用户的登录状态、存储用户的偏好设置等。
Cookie通常包含名称、值、过期时间、路径和域等信息。当浏览器向服务器发送请求时,会自动将与该域相关的Cookie信息包含在其中。服务器可以通过读取这些Cookie信息来识别用户,处理用户的请求,并根据需要将新的Cookie信息发送给浏览器。
通过使用Cookie,网站可以实现各种功能,例如记住用户的登录状态、跟踪用户的浏览行为、个性化用户体验等。同时,Cookie也可能引发一些隐私和安全问题,因此现代浏览器提供了一些选项来允许用户控制Cookie的行为,例如允许/阻止Cookie的存储和发送。
SESSION
在HTTP协议中,Session是一种服务器端的机制,用于跟踪和管理与特定用户相关的状态信息。与Cookie不同,Session是在服务器端存储用户数据的一种方式。
当用户访问一个网站时,服务器会为该用户创建一个唯一的Session,并为该Session分配一个唯一的标识符(通常称为Session ID)。这个Session ID会被存储在一个Cookie中,发送给用户的浏览器,以便在后续的请求中进行识别。
服务器会使用这个Session ID来关联用户发送的请求,并将相关的数据存储在服务器的内存或持久化存储中,例如数据库或文件系统。随着用户在网站上的访问,服务器可以通过读取Session ID来获取和更新与该用户相关的数据,从而实现用户状态的跟踪和管理。
Session可以用于存储用户的登录状态、购物车信息、个人偏好设置等。相比于Cookie,Session更安全,因为用户无法修改Session数据,只能通过服务器进行操作。此外,Session的数据存储在服务器端,用户无法直接查看或修改。
需要注意的是,由于Session数据存储在服务器上,因此服务器需要维护用户的Session状态。这通常是通过在服务器上存储Session数据并设置Session超时时间来完成的。一旦Session超时或用户关闭了浏览器,Session数据将被清除
HTTP /2
多路复用
建立连接后可以发送多个HTTP请求
压缩header
减少负载
Server Push
在HTTP/2协议中,引入了一项称为Server Push的功能。Server Push允许服务器在客户端请求之前主动将附加资源发送给客户端,从而提高页面加载性能。
在传统的HTTP/1.1协议中,客户端需要单独发送请求获取页面所需的各个资源(如CSS
、JavaScript、图像等)。这会导致额外的延迟,因为每个资源都需要发送额外的请求。
而在HTTP/2的Server Push中,服务器可以主动推送资源给客户端,不需要等待客户端发送相应的请求。当客户端请求主页面时,服务器可以检测到该页面所需的附加资源,然后将这些资源主动发送给客户端,以及与之关联的响应头信息。这样,客户端在收到主页面的响应时,已经预先获取了所需的资源,无需再次发送请求,减少了延迟和通信开销。
通过使用Server Push,服务器可以更有效地提供页面所需的资源,加快页面加载速度,提升用户体验。但需要注意的是,Server Push应该谨慎使用,确保只推送客户端真正需要的资源,避免不必要的数据传输和浪费。
Ethereum
主链使用的是基于以太坊独有的RLPx
协议,其底层也是基于TCP协议
RLPx(Recursive Length Prefix)是一种用于建立点对点连接并进行通信的协议。它是以太坊所使用的一种协议,用于节点之间安全地交换信息和建立连接。
RLPx 的设计目标是保障通信的机密性、完整性和身份认证。它采用了基于密钥的认证方法,使用公钥加密技术来加密和认证通信数据。这确保了通信双方的身份验证和数据的安全性。
该协议还采用了递归长度前缀编码(RLP)来编码和解码消息。RLP 是一种用于序列化和反序列化数据的编码规范,它能够将不同类型的数据结构转化为字节数组,并且能够高效地将字节数组还原为原始数据结构。
通过使用 RLPx 协议,节点可以在以太坊网络中进行安全的通信,并共享交易、区块和其他信息。这对于实现去中心化应用程序的分布式通信和共识非常重要。
Hyperledger Fabric
使用的是gRPC
协议
Hyperledger Fabric 使用了 gRPC 协议作为链码(Chaincode)和 Peer 节点之间的通信协议。
gRPC 是一种高性能、开源的远程过程调用(RPC)框架,可以支持多种编程语言。它基于 Protocol Buffers 序列化和反序列化数据,并使用 HTTP/2 作为底层传输协议。
在 Hyperledger Fabric 中,Chaincode 是合约代码的运行实例,它们通常需要与网络中的多个 Peer 进行交互以执行业务逻辑。为了实现这种交互,Fabric 使用了 gRPC 协议,在 Peer 和 Chaincode 之间建立基于二进制流的传输通道,以实现高效且可靠的通信。
使用 gRPC 协议可以大大提高 Hyperledger Fabric 系统的性能和可靠性,因为它具有较低的延迟、高的并发性和内置的错误处理机制。
Corda
使用的是自研的AMQP
协议
实际上,Corda 并没有使用自研的 AMQP(Advanced Message Queuing Protocol)。Corda 是一个开源的分布式账本平台,使用的是自己设计的点对点网络协议。
Corda 的网络通信协议建立在 TCP/IP 上,并使用了自定义的二进制通信协议。这个协议是为了满足 Corda 平台独特的需求而设计的,旨在提供安全、高效和可靠的通信。
与 AMQP 不同,Corda 协议将数据和事务直接发送给对等节点,而不是通过集中的消息队列。这种点对点的通信模式使得 Corda 能够实现高度私密的交易,并具备更高的性能和可扩展性。
尽管 Corda 不使用 AMQP 协议,但它支持与外部系统的集成,并提供了适配器(adapters)来与其它协议进行通信,如 HTTP、JMS 等。这使得开发者可以与现有的消息队列和消息中间件进行集成,实现与外部系统的连接。
IPFS
使用的是自研的libp2p
协议,该协议是构建大规模去中心化应用程序的基础通信协议
IPFS使用的是自研的libp2p协议,该协议是构建大规模去中心化应用程序的基础通信协议。
libp2p抽象集成了所有开发者基本都需要的一些工具属性功能,这些工具的功能主要包括:节点之间的链接复用、节点信息之间的互相交换、指定中继节点、网络地址转换(NAT)、分布式哈希表(dht)寻址、消息往返时延(RTT)统计等。libp2p的核心组件可以帮助开发者轻松地构建去中心化应用程序,而不必关注底层的具体实现。