精华内容
下载资源
问答
  • 在用户在客户端界面中 单击 网络设置 按钮后 客户端程序将弹出设置对话框 该设置 对方框 可以根据用户输入的信息连接指定的服务器 ...服务器端显示当前连接的客户端数客户端的ip地址 等信息 在操作过程中 用户需...

    在用户在客户端界面中
    单击 网络设置 按钮后
    客户端程序将弹出设置对话框
    该设置 对方框 可以根据用户输入的信息连接指定的服务器
    默认连接端口为80

    如果运行该程序的机器没有连接网络
    则可以使用计算机的回环ip地址"127.0.0.1"
    当服务器监听并响应客户端的请求后
    在服务器界面上会显示当前连接到服务器的客户端个数

    服务器端显示当前连接的客户端数和客户端的ip地址
    等信息
    在操作过程中
    用户需要特别注意
    一定需要先启动服务器
    再启动客户端
    否则连接不一定成功
    用户从服务器和客户端界面中
    两者的状态栏不但有提示作用
    还具有根据时间变化而改变颜色的作用

    展开全文
  • 北京思科ccie网络工程师三分钟读懂NAT-PT技术原理详解 网络工程师收藏Pv6的应用是个循序渐进的过程,在很长时间内,IPv4网络和IPv6网络会同时存在且需要相互通信。在IPv4网络完全过渡到IPv6网络之前,两个网络之间...

    北京思科ccie网络工程师三分钟读懂NAT-PT技术原理详解 网络工程师收藏Pv6的应用是个循序渐进的过程,在很长时间内,IPv4网络和IPv6网络会同时存在且需要相互通信。在IPv4网络完全过渡到IPv6网络之前,两个网络之间直接的网络通信可以通过NAT-PT(Network Address Translation-Protocol Translation,附带协议转换的网络地址转换)所提供的IPv4和IPv6地址之间的相互转换功能来实现。例如,使用此技术可以使IPv6网络中的主机直接访问IPv4网络中的FTP服务器。NAT-PT作用于IPv4和IPv6网络边缘的设备上,所有的地址转换过程都在该设备上实现,对IPv4和IPv6网络来说是透明的,即用户不必改变目前的IPv4网络中主机得配置就可实现IPv6网络与IPv4网络的通信。

    有三种NAT-PT机制可实现IPv4和IPv6地址之间的相互转换:

    1. 静态映射的NAT-PT机制

    静态映射的NAT-PT机制是指采用手工配置的IPv6地址与IPv4地址的一一对应关系来实现IPv6地址与IPv4地址的转换。

    2. 动态映射的NAT-PT机制

    和静态映射不同,动态映射没有IPv6和IPv4地址之间的一一对应关系。动态映射要求先创建一个地址池,然后根据需要从地址池中选取空闲地址来完成IPv6地址与IPv4地址的映射。

    3. NAPT-PT机制

    NAPT-PT(Network Address Port Translation-Protocol Translation,附带协议转换的网络地址端口转换)是在IP地址动态转换的基础上对TCP、UDP的端口号也进行IPv6到IPv4的转换。采用这种“地址+端口号”的映射方式,不同的IPv6地址转换时,可以对应同一个IPv4地址,通过端口号来区分不同的IPv6主机,从而使多个IPv6主机能共享一个IPv4地址完成转换。

    实现过程:

    IPv6发起访问IPv4地址的会话:

    (1)当IPv6网络中的设备发送给IPv4网络的报文到达NAT-PT设备后,如果设备判断该报文是要转发到IPv4网络,则会利用在IPv6侧已经配置的静态或者动态的映射关系,将报文的源IPv6地址转换为IPv4地址。

    (2)根据IPv4侧配置的IPv4与IPv6的映射关系将目的地址转换为IPv4地址。如果没有配置映射关系,报文中的目的IPv6地址的低32位可以直接转换为合法的IPv4地址,则直接转换为目的IPv4地址;否则,转换不成功。

    (3)报文的源IPv6地址和目的IPv6地址都转换为IPv4地址后,设备按照正常的转发流程将报文转发到IPv4网络。同时,将IPv6地址与转换后的IPv4地址的映射关系保存在设备中。

    (4)IPv4网络中的设备发送给IPv6网络中的报文到达NAT-PT设备后,将根据存储的映射关系进行相反的转换,从而将报文回送到IPv6网络中的设备。

    IPv4网络发起访问IPv6地址的会话:

    (1)当IPv4网络中的设备发送给IPv6网络的报文到达NAT-PT设备后,如果判断该报文是要转发到IPv6网络,则会利用在IPv4侧已经配置的映射关系,进行IPv4地址到IPv6地址的转换,将报文的源IPv4地址转换为IPv6地址。

    (2)根据IPv6侧配置的IPv6与IPv4的映射关系将目的IPv4地址转换为IPv6地址。北京思科ccie网络工程师三分钟读懂NAT-PT技术原理详解 网络工程师收藏

    (3)报文的源IPv4地址和目的IPv4地址都转换为IPv6地址后,设备按照正常的转发流程将报文转发到IPv6网络中。同时,将IPv4地址与转换后的IPv6地址的映射关系保存在设备中。

    (4)IPv6网络中的设备发送给IPv4网络中的报文到达NAT-PT设备后,将根据存储的映射关系进行相反的转换,从而将报文发回到IPv4网络中。

    经过20多年的发展和完善,基于IPv4的互连网络在各个领域内得到了空前的发展。但是由于新型业务不断涌现,本来IP地址就匮乏的现状进一步加剧,并带来了路由表急剧膨胀,对网络服务质量要求的提高以及网络安全性的进一步加强。IPv6正是为解决这些问题而产生的。虽说IPv6有很多优点,但我们又不能完全丢弃现有的IPv4网络,而完全使用IPv6网络。因为当前的IPv4网络投资巨大,而且新的技术的成长与不断完善也需要很长的时间,所以说,IPv4和IPv6并存现象将会持续很长的一段时间是必然的。北京思科ccie网络工程师三分钟读懂NAT-PT技术原理详解 网络工程师收藏

    展开全文
  • DNS原理及解析过程详解

    千次阅读 2020-10-19 20:17:37
    我们都知道,TCP/IP中使用的是IP地址端口号来确定网络上某一台主机上的某一个程序,不免有人有疑问,为什么不用域名来直接进行通信呢? 1. 因为IP地址是固定长度的,IPv4是32位,IPv6是128位,而域名是变长的,不...

    目录

    1 域名系统概述

    2 因特网的域名结构

    3 域名服务器

    4 域名的解析原理过程

    4.1 DNS解析原理

    4.2 域名解析过程

    5 查询过程

    5.1 演示整个查询过程

    5.2 关于DNS解析的TTL参数:

    5.3 IP地址分类


    1 域名系统概述

    我们都知道,TCP/IP中使用的是IP地址和端口号来确定网络上某一台主机上的某一个程序,不免有人有疑问,为什么不用域名来直接进行通信呢?
    1. 因为IP地址是固定长度的,IPv4是32位,IPv6是128位,而域名是变长的,不便于计算机处理。
    2. IP地址对于用户来说不方便记忆,但域名便于用户使用,例如www.baidu.com这是百度的域名。
    总结一点就是IP地址是面向主机的,而域名则是面向用户的。
    hosts文件
    域名和IP的对应关系保存在一个叫hosts文件中。
    最初,通过互联网信息中心来管理这个文件,如果有一个新的计算机想接入网络,或者某个计算IP变更都需要到信息中心申请变更hosts文件。其他计算机也需要定期更新,才能上网。
    但是这样太麻烦了,就出现了DNS系统。

    域名系统DNS(Domain Name System)是因特网使用的命名系统,用来把便于人们使用的机器名字转换成为IP地址。域名系统其实就是名字系统。为什么不叫“名字”而叫“域名”呢?这是因为在这种因特网的命名系统中使用了许多的“域(domain)”,因此就出现了“域名”这个名词。“域名系统”明确地指明这种系统是应用在因特网中。

    我们都知道,IP地址是由32位的二进制数字组成的。用户与因特网上某台主机通信时,显然不愿意使用很难记忆的长达32位的二进制主机地址。即使是点分十进制IP地址也并不太容易记忆。相反,大家愿意使用比较容易记忆的主机名字。但是,机器在处理IP数据报时,并不是使用域名而是使用IP地址。这是因为IP地址长度固定,而域名的长度不固定,机器处理起来比较困难。

    因为因特网规模很大,所以整个因特网只使用一个域名服务器是不可行的。因此,早在1983年因特网开始采用层次树状结构的命名方法,并使用分布式的域名系统DNS。并采用客户服务器方式。DNS使大多数名字都在本地解析(resolve),仅有少量解析需要在因特网上通信,因此DNS系统的效率很高。由于DNS是分布式系统,即使单个计算机除了故障,也不会妨碍整个DNS系统的正常运行。

    域名到IP地址的解析是由分布在因特网上的许多域名服务器程序共同完成的。域名服务器程序在专设的结点上运行,而人们也常把运行域名服务器程序的机器称为域名服务器。

    域名到IP地址的解析过程的要点如下:

    1. 当某一个应用需要把主机名解析为IP地址时,该应用进程就调用解析程序,并称为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式发给本地域名服务器。
    2. 本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回。应用程序获得目的主机的IP地址后即可进行通信。
    3. 若本地域名服务器不能回答该请求,则此域名服务器就暂时称为DNS的另一个客户,并向其他域名服务器发出查询请求。

    //用一个图总结下就是:

    这里写图片描述

    2 因特网的域名结构

    由于因特网的用户数量较多,所以因特网在命名时采用的是层次树状结构的命名方法。任何一个连接在因特网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。这里,“域”(domain)是名字空间中一个可被管理的划分。

    从语法上讲,每一个域名都是有标号(label)序列组成,而各标号之间用点(小数点)隔开。

    如下例子所示:
    这里写图片描述

    1.这是中央电视台用于手法电子邮件的计算机的域名,它由三个标号组成,其中标号com是顶级域名,标号cctv是二级域名,标号mail是三级域名。

    DNS规定,域名中的标号都有英文和数字组成,每一个标号不超过63个字符(为了记忆方便,一般不会超过12个字符),也不区分大小写字母。

    级别最低的域名写在最左边,而级别最高的字符写在最右边。
    由多个标号组成的完整域名总共不超过255个字符。

    DNS既不规定一个域名需要包含多少个下级域名,也不规定每一级域名代表什么意思。各级域名由其上一级的域名管理机构管理,而最高的顶级域名则由ICANN进行管理。用这种方法可使每一个域名在整个互联网范围内是唯一的,并且也容易设计出一种查找域名的机制。

    编号 类型 详情
    (1) 国家顶级域名nTLD 采用ISO3166的规定。如:cn代表中国,us代表美国,uk代表英国,等等。国家域名又常记为ccTLD(cc表示国家代码contry-code)。
    (2) 通用顶级域名gTLD 最常见的通用顶级域名有7个,即:com(公司企业),net(网络服务机构),org(非营利组织),int(国际组织),gov(美国的政府部门),mil(美国的军事部门)。
    (3) 基础结构域名(infrastructure domain) 这种顶级域名只有一个,即arpa,用于反向域名解析,因此称为反向域名。(2)通用顶级域名gTLD:最常见的通用顶级域名有7个,即:com(公司企业),net(网络服务机构),org(非营利组织),int(国际组织),gov(美国的政府部门),mil(美国的军事部门)。

    来一个大概图:
    这里写图片描述

    3 域名服务器

    如果采用上述的树状结构,每一个节点都采用一个域名服务器,这样会使得域名服务器的数量太多,使域名服务器系统的运行效率降低。所以在DNS中,采用划分区的方法来解决。

    一个服务器所负责管辖(或有权限)的范围叫做区(zone)。
    各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。每一个区设置相应的权限域名服务器,用来保存该区中的所有主机到域名IP地址的映射。

    总之,DNS服务器的管辖范围不是以“域”为单位,而是以“区”为单位。区是DNS服务器实际管辖的范围。

    区 <= 域。

    下图是区的不同划分方法的举例。假定abc公司有下属部门x和y,部门x下面有分三个分布们u,v,w,而y下面还有下属部门t。图a表示abc公司只设一个区abc.com。这是,区abc.com和域abc.com指的是同一件事。但图b表示abc公司划分为两个区:abc.com和y.abc.com。这两个区都隶属于域abc.com,都各设置了相应的权限域名服务器。不难看出,区是域的子集。

    这里写图片描述
    下图是以上图b中abc公司划分的两个区为例,给出了DNS域名服务器树状结构图。这种DNS域名服务器树状结构图可以更准确地反映出DNS的分布式结构。图中的每一个域名服务器都能够部分域名到IP地址的解析。当某个DNS服务器不能进行域名到IP地址的转换时,它就会设法找因特网上别的域名服务器进行解析。

    从下图可以看出,因特网上的DNS服务器也是按照层次安排的。每一个域名服务器只对域名体系中的一部分进行管辖。根据域名服务器所起的作用,可以把域名服务器划分为下面四种不同的类型。

    这里写图片描述

    根域名服务器:最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和IP地址。不管是哪一个本地域名服务器,若要对因特网上任何一个域名进行解析,只要自己无法解析,就首先求助根域名服务器。所以根域名服务器是最重要的域名服务器。假定所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。需要注意的是,在很多情况下,根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。

    顶级域名服务器:负责管理在该顶级域名服务器注册的二级域名。

    权限域名服务器:负责一个“区”的域名服务器。

    本地域名服务器:本地服务器不属于下图的域名服务器的层次结构,但是它对域名系统非常重要。当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。

    • 从”根域名服务器”查到”顶级域名服务器”的NS记录和A记录(IP地址)
    • 从”顶级域名服务器”查到”次级域名服务器”的NS记录和A记录(IP地址)
    • 从”次级域名服务器”查出”主机名”的IP地址

    4 域名的解析原理过程

    4.1 DNS解析原理

    blob.png

    (1)当用户在浏览器中输入www.qq.com域名访问该网站时,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。 

    (2)如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。 

     (3)如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/ip参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。 

    (4)如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。 

    (5)如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。 

    (6)如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
    提示:从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间的交互查询就是迭代查询。

    4.2 域名解析过程

    域名解析总体可分为一下过程:
    (1) 输入域名后, 先查找自己主机对应的域名服务器,域名服务器先查找自己的数据库中的数据.
    (2) 如果没有, 就向上级域名服务器进行查找, 依次类推
    (3) 最多回溯到根域名服务器, 肯定能找到这个域名的IP地址
    (4) 域名服务器自身也会进行一些缓存, 把曾经访问过的域名和对应的IP地址缓存起来, 可以加速查找过程
    具体可描述如下:
    1. 主机先向本地域名服务器进行递归查询
    2. 本地域名服务器采用迭代查询,向一个根域名服务器进行查询
    3. 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器的IP地址
    4. 本地域名服务器向顶级域名服务器进行查询
    5. 顶级域名服务器告诉本地域名服务器,下一步查询权限服务器的IP地址
    6. 本地域名服务器向权限服务器进行查询
    7. 权限服务器告诉本地域名服务器所查询的主机的IP地址
    8. 本地域名服务器最后把查询结果告诉主机
    如图所示:
    这里写图片描述
    上文我们提出了两个概念:递归查询和迭代查询

    注意:

    一、主机向本地域名服务器的查询一般都是采用递归查询。

    所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。

    二、本地域名服务器向根域名服务器的查询的迭代查询。

    迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。

    下图给出了这两种查询的差别

    5 查询过程

    5.1 演示整个查询过程

    5.2 关于DNS解析的TTL参数:

    我们在配置DNS解析的时候,有一个参数常常容易忽略,就是DNS解析的TTL参数,Time To Live。TTL这个参数告诉本地DNS服务器,域名缓存的最长时间。用阿里云解析来举例,阿里云解析默认的TTL是10分钟,10分钟的含义是,本地DNS服务器对于域名的缓存时间是10分钟,10分钟之后,本地DNS服务器就会删除这条记录,删除之后,如果有用户访问这个域名,就要重复一遍上述复杂的流程。

    其实,如果网站已经进入稳定发展的状态,不会轻易更换IP地址,我们完全可以将TTL设置到协议最大值,即24小时。带来的好处是,让域名解析记录能够更长时间的存放在本地DNS服务器中,以加快所有用户的访问。设置成24小时,其实,还解决了Googlebot在全球部署的服务器抓取网站可能带来的问题,这个问题麦新杰专门有一篇博文,请参考:“Googlebot无法访问您的站点”问题理解和处理方法

    阿里云之所以只将TTL设置成10分钟,是为了让域名解析更快生效而已。因为之前的解析会在最长10分钟之后失效(本地DNS服务器将对应的解析条目删除),然后新的解析生效。如果是24小时,这个生效的时间最长就是24小时,甚至更长(本地DNS服务器要有用户请求,才会发起查询)。

    5.3 IP地址分类

    最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。IP地址根据网络ID的不同分为5种类型,A类地址、B类地址、C类地址、D类地址和E类地址。

    序号 类别 解释
    1 A类IP地址 一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个,每个网络能容纳1亿多个主机。
    2 B类IP地址 一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个,每个网络能容纳6万多个主机 。
    3 C类IP地址 一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个,每个网络能容纳254个主机。
    4 D类地址用于多点广播(Multicast)。 D类IP地址第一个字节以“lll0”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。224.0.0.0到239.255.255.255用于多点广播 。
    5 E类 E类IP地址 以“llll0”开始,为将来使用保留。240.0.0.0到255.255.255.254,255.255.255.255用于广播地址。全零(“0.0.0.0”)地址对应于当前主机。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。

    在IP地址3种主要类型里,各保留了3个区域作为私有地址,其地址范围如下:

    • A类地址:10.0.0.0~10.255.255.255
    • B类地址:172.16.0.0~172.31.255.255
    • C类地址:192.168.0.0~192.168.255.255

    A类地址的第一组数字为1~126。其中0代表任何地址,127为回环测试地址,注意,数字0和 127不作为A类地址,数字127保留给内部回送函数,而数字0则表示该地址是本地宿主机,不能传送。

    B类地址的第一组数字为128~191。C类地址的第一组数字为192~223。
    1. A类地址 A类地址的表示范围为:0.0.0.0~126.255.255.255,默认网络掩码为:255.0.0.0;A类地址分配给规模特别大的网络使用。A类网络用第一组数字表示网络本身的地址,后面三组数字作为连接于网络上的主机的地址。分配给具有大量主机(直接个人用户)而局域网络个数较少的大型网络。例如IBM公司的网络。
    2. B类地址B类地址的表示范围为:128.0.0.0~191.255.255.255,默认网络掩码为:255.255.0.0;B类地址分配给一般的中型网络。B类网络用第一、二组数字表示网络的地址,后面两组数字代表网络上的主机地址。
    3. C类地址 C类地址的表示范围为:192.0.0.0~223.255.255.255,默认网络掩码为:255.255.255.0;C类地址分配给小型网络,如一般的局域网和校园网,它可连接的主机数量是最少的,采用把所属的用户分为若干的网段进行管理。C类网络用前三组数字表示网络的地址,最后一组数字作为网络上的主机地址。

    实际上,还存在着D类地址和E类地址。但这两类地址用途比较特殊,在这里只是简单介绍一下:D类地址称为广播地址,供特殊协议向选定的节点发送信息时用。E类地址保留给将来使用。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • ProtoBuf 原理详解

    2020-08-02 14:01:14
    之前在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML,而在最近的开发中接触到了 Google 的 ProtoBuf。 在查阅相关资料学习 ProtoBuf 以及研读其源码之后,发现其在效率、兼容性等方面非常出色...

    前言

    之前在网络通信和通用数据交换等应用场景中经常使用的技术是 JSON 或 XML,而在最近的开发中接触到了 Google 的 ProtoBuf。

    在查阅相关资料学习 ProtoBuf 以及研读其源码之后,发现其在效率、兼容性等方面非常出色。在以后的项目技术选型中,尤其是网络通信、通用数据交换等场景应该会优先选择 ProtoBuf。

    自己在学习 ProtoBuf 的过程中翻译了官方的主要文档,一来当然是在学习 ProtoBuf,二来是培养阅读英文文档的能力,三来是因为 Google 的文档?不存在的!

    看完这些文档对 ProtoBuf 应该就有相当程度的了解了。

    翻译文档见 [索引]文章索引,导航为翻译 - 技术 - ProtoBuf 官方文档。

    但是官方文档更多的是作为查阅和权威参考,并不意味着看完官方文档就能立马理解其原理。

    本文以及接下来的几篇文章会对 ProtoBuf 的编码、序列化、反序列化、反射等原理做一些详细介绍,同时也会尽量将这些原理表达的更为通俗易懂。


    什么是 ProtoBuf?

    我们先来看看官方文档给出的定义和描述:

    protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。

    Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。

    你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。

    简单来讲, ProtoBuf 是结构数据序列化[1] 方法,可简单类比于 XML[2],其具有以下特点:

    • 语言无关、平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台
    • 高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单
    • 扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序

    序列化[1]:将结构数据对象转换成能够被存储和传输(例如网络传输)的格式,同时应当要保证这个序列化结果在之后(可能在另一个计算环境中)能够被重建回原来的结构数据或对象。
    更为详尽的介绍可参阅 维基百科
    类比于 XML[2]:这里主要指在数据通信和数据存储应用场景中序列化方面的类比,但个人认为 XML 作为一种扩展标记语言和 ProtoBuf 还是有着本质区别的。

     

    使用 ProtoBuf

     

    对 ProtoBuf 的基本概念有了一定了解之后,我们来看看具体该如何使用 ProtoBuf。
    第一步,创建 .proto 文件,定义数据结构,如下例1所示:

     

    // 例1: 在 xxx.proto 文件中定义 Example1 message
    message Example1 {
        optional string stringVal = 1;
        optional bytes bytesVal = 2;
        message EmbeddedMessage {
            int32 int32Val = 1;
            string stringVal = 2;
        }
        optional EmbeddedMessage embeddedExample1 = 3;
        repeated int32 repeatedInt32Val = 4;
        repeated string repeatedStringVal = 5;
    }
    

    我们在上例中定义了一个名为 Example1 的 消息,语法很简单,message 关键字后跟上消息名称:

    message xxx {
    
    }
    

    之后我们在其中定义了 message 具有的字段,形式为:

     

    message xxx {
      // 字段规则:required -> 字段只能也必须出现 1 次
      // 字段规则:optional -> 字段可出现 0 次或1次
      // 字段规则:repeated -> 字段可出现任意多次(包括 0)
      // 类型:int32、int64、sint32、sint64、string、32-bit ....
      // 字段编号:0 ~ 536870911(除去 19000 到 19999 之间的数字)
      字段规则 类型 名称 = 字段编号;
    }
    

    在上例中,我们定义了:

    • 类型 string,名为 stringVal 的 optional 可选字段,字段编号为 1,此字段可出现 0 或 1 次。
    • 类型 bytes,名为 bytesVal 的 optional 可选字段,字段编号为 2,此字段可出现 0 或 1 次。
    • 类型 EmbeddedMessage(自定义的内嵌 message 类型),名为 embeddedExample1 的 optional 可选字段,字段编号为 3,此字段可出现 0 或 1 次。
    • 类型 int32,名为 repeatedInt32Val 的 repeated 可重复字段,字段编号为 4,此字段可出现 任意多次(包括 0)。
    • 类型 string,名为 repeatedStringVal 的 repeated 可重复字段,字段编号为 5,此字段可出现 任意多次(包括 0)。

    关于 proto2 定义 message 消息的更多语法细节,例如具有支持哪些类型,字段编号分配、import
    导入定义,reserved 保留字段等知识请参阅 [翻译] ProtoBuf 官方文档(二)- 语法指引(proto2)

    关于定义时的一些规范请参阅 [翻译] ProtoBuf 官方文档(四)- 规范指引

    第二步,protoc 编译 .proto 文件生成读写接口

    我们在 .proto 文件中定义了数据结构,这些数据结构是面向开发者和业务程序的,并不面向存储和传输。

    当需要把这些数据进行存储或传输时,就需要将这些结构数据进行序列化、反序列化以及读写。那么如何实现呢?不用担心, ProtoBuf 将会为我们提供相应的接口代码。如何提供?答案就是通过 protoc 这个编译器。

    可通过如下命令生成相应的接口代码:

     

    // $SRC_DIR: .proto 所在的源目录
    // --cpp_out: 生成 c++ 代码
    // $DST_DIR: 生成代码的目标目录
    // xxx.proto: 要针对哪个 proto 文件生成接口代码
    
    protoc -I=$SRC_DIR --cpp_out=$DST_DIR $SRC_DIR/xxx.proto
    

    最终生成的代码将提供类似如下的接口:

    例子-序列化和解析接口.png

    例子-protoc 生成接口.png

    第三步,调用接口实现序列化、反序列化以及读写
    针对第一步中例1定义的 message,我们可以调用第二步中生成的接口,实现测试代码如下:

     

    //
    // Created by yue on 18-7-21.
    //
    #include <iostream>
    #include <fstream>
    #include <string>
    #include "single_length_delimited_all.pb.h"
    
    int main() {
        Example1 example1;
        example1.set_stringval("hello,world");
        example1.set_bytesval("are you ok?");
    
        Example1_EmbeddedMessage *embeddedExample2 = new Example1_EmbeddedMessage();
    
        embeddedExample2->set_int32val(1);
        embeddedExample2->set_stringval("embeddedInfo");
        example1.set_allocated_embeddedexample1(embeddedExample2);
    
        example1.add_repeatedint32val(2);
        example1.add_repeatedint32val(3);
        example1.add_repeatedstringval("repeated1");
        example1.add_repeatedstringval("repeated2");
    
        std::string filename = "single_length_delimited_all_example1_val_result";
        std::fstream output(filename, std::ios::out | std::ios::trunc | std::ios::binary);
        if (!example1.SerializeToOstream(&output)) {
            std::cerr << "Failed to write example1." << std::endl;
            exit(-1);
        }
    
        return 0;
    }
    

    关于 protoc 的使用以及接口调用的更多信息可参阅 [翻译] ProtoBuf 官方文档(九)- (C++开发)教程

    关于例1的完整代码请参阅 源码:protobuf 例1。其中的 single_length_delimited_all.* 为例子相关代码和文件。

    因为此系列文章重点在于深入 ProtoBuf 的编码、序列化、反射等原理,关于 ProtoBuf 的语法、使用等只做简单介绍,更为详见的使用教程可参阅我翻译的系列官方文档。

    关于 ProtoBuf 的一些思考

    官方文档以及网上很多文章提到 ProtoBuf 可类比 XML 或 JSON。

    那么 ProtoBuf 是否就等同于 XML 和 JSON 呢,它们是否具有完全相同的应用场景呢?

    个人认为如果要将 ProtoBuf、XML、JSON 三者放到一起去比较,应该区分两个维度。一个是数据结构化,一个是数据序列化。这里的数据结构化主要面向开发或业务层面,数据序列化面向通信或存储层面,当然数据序列化也需要“结构”和“格式”,所以这两者之间的区别主要在于面向领域和场景不同,一般要求和侧重点也会有所不同。数据结构化侧重人类可读性甚至有时会强调语义表达能力,而数据序列化侧重效率和压缩。

    从这两个维度,我们可以做出下面的一些思考。

    XML 作为一种扩展标记语言,JSON 作为源于 JS 的数据格式,都具有数据结构化的能力。

    例如 XML 可以衍生出 HTML (虽然 HTML 早于 XML,但从概念上讲,HTML 只是预定义标签的 XML),HTML 的作用是标记和表达万维网中资源的结构,以便浏览器更好的展示万维网资源,同时也要尽可能保证其人类可读以便开发人员进行编辑,这就是面向业务或开发层面的数据结构化

    再如 XML 还可衍生出 RDF/RDFS,进一步表达语义网中资源的关系和语义,同样它强调数据结构化的能力和人类可读。

    关于 RDF/RDFS 和语义网的概念可查询相关资料了解,或参阅 2-Answer 系列-本体构建模块(一)3-Answer 系列-本体构建模块(二) ,文中有一些简单介绍。

    JSON 也是同理,在很多场合更多的是体现了数据结构化的能力,例如作为交互接口的数据结构的表达。在 MongoDB 中采用 JSON 作为查询语句,也是在发挥其数据结构化的能力。

    当然,JSON、XML 同样也可以直接被用来数据序列化,实际上很多时候它们也是这么被使用的,例如直接采用 JSON、XML 进行网络通信传输,此时 JSON、XML 就成了一种序列化格式,它发挥了数据序列化的能力。但是经常这么被使用,不代表这么做就是合理。实际将 JSON、XML 直接作用数据序列化通常并不是最优选择,因为它们在速度、效率、空间上并不是最优。换句话说它们更适合数据结构化而非数据序列化。

    扯完 XML 和 JSON,我们来看看 ProtoBuf,同样的 ProtoBuf 也具有数据结构化的能力,其实也就是上面介绍的 message 定义。我们能够在 .proto 文件中,通过 message、import、内嵌 message 等语法来实现数据结构化,但是很容易能够看出,ProtoBuf 在数据结构化方面和 XML、JSON 相差较大,人类可读性较差,不适合上面提到的 XML、JSON 的一些应用场景。

    但是如果从数据序列化的角度你会发现 ProtoBuf 有着明显的优势,效率、速度、空间几乎全面占优,看完后面的 ProtoBuf 编码的文章,你更会了解 ProtoBuf 是如何极尽所能的压榨每一寸空间和性能,而其中的编码原理正是 ProtoBuf 的关键所在,message 的表达能力并不是 ProtoBuf 最关键的重点。所以可以看出 ProtoBuf 重点侧重于数据序列化 而非 数据结构化

    最终对这些个人思考做一些小小的总结:

    1. XML、JSON、ProtoBuf 都具有数据结构化数据序列化的能力
    2. XML、JSON 更注重数据结构化,关注人类可读性和语义表达能力。ProtoBuf 更注重数据序列化,关注效率、空间、速度,人类可读性差,语义表达能力不足(为保证极致的效率,会舍弃一部分元信息)
    3. ProtoBuf 的应用场景更为明确,XML、JSON 的应用场景更为丰富。


     

     

    展开全文
  • 网络编程--6 C/S通信原理(Client/Server)  TCP客户端服务端会话 ----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------ ... Server端单个Client端通信过程 {1}. 服务
  • HTTPS链接的建立过程中涉及到服务器端证书、客户端证书(可选)、服务器端的非对称秘钥以及后续通信过程中使用的对称秘钥几个内容。 客户端对HTTPS的地址发出请求,并且将自己的SSL版本号等信息发送给服务器 ...
  • 网络通信过程中会使用到这两种地址,逻辑IP地址物理MAC地址,一般情况下,正常通信需要这两种地址协同工作。一个主机要另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的...
  • 在只有一个网段的网络中,数据包可以很容易从源主机到达目标主机,但如果一台计算机要非本网段的计算机进行通信,数据包可能就要经过多个路由器。 路由器需要其根据路由表来转发数据。 1.路由器的工作原理 路由器...
  • 网络通信过程中会使用到这两种地址,逻辑IP地址物理MAC地址,一般情况下,正常通信需要这两种地址协同工作。一个主机要另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的...
  • 两个应用部署在两台服务器A,B上,由于不在同一台服务器上,所以不能直接调用,所以需要通过网络来表达调用的语义数据。 实现原理 1、建立通信 在两服务器间建立连接-TCP,可以是按需建立(调用时建立,结束...
  • 5、 新一代路由器 由于多媒体等应用在网络中的发展,以及ATM、快速以太网等新技术的不断采用,网络的带宽与速率飞速提高,传统...另外,由于路由器是网络互连的关键设备,是网络与其它网络进行通信的一个“关口”,...
  • 《Android网络开发技术实战详解》分为18章,分别介绍了Android开发之前所要做的工作、必须具备的网页开发技术、HTML 5基础、在Android系统中开发网页的必备技术、HTTP通信处理、URL地址处理、WebKit、Wi-Fi、蓝牙、...
  • 课程内容如下: 通信协议的概念 ISO、OSI七层参考模型详解 TCP、IP模型详解 网络接口层详解 IP协议详解 IP地址MAC地址特征分析 有了IP地址为什么还要使用MAC地址 ARP工作过程及工作原理解析 ICMP知识解析 ping命令...
  • 本手册主要依据3GPP相关协议,对TD-SCDMA网络中涉及的小区选择/重选、UE状态迁移、无线基本通信过程、呼叫建立及释放、寻呼、无线链路同步状态、同步控制算法、无线资源管理、HSDPA等相关参数进行了详细探讨。...
  • 刚看了反应堆模式的原理,特意复习了socket编程,本文主要介绍python的基本socket使用select使用,主要用于了解socket通信过程一、socket模块socket — Low-level networking interfaceThis module provides ...
  • 详解Twitter开源分布式自增ID算法snowflake,附演算验证过程. ...snowflake算法是一款本地生成的(ID生成过程不依赖任何中间件,无网络通信),保证ID全局唯一,并且ID总体有序递增,性能每秒生成300w+
  • 网络通信技术(TCP/IP)

    2020-01-01 21:25:55
    文章目录网络基础OSI七层网络模型TCP/UDPTCP协议的3次握手与4次挥手过程详解TCP三次握手过程,为什么需要三次?为什么TCP建立连接需要三次握手,而断开连接需要四次挥手?TIME_WAIT的意义,为什么等于2MSL?TCP头部...
  • 也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义传达调用的数据。 比如说,A服务器想调用B服务器...
  • GSM模块_GPRS数据传输机制和原理

    千次阅读 2018-10-13 17:24:04
    GSM模块_GPRS数据传输机制和原理   通信专业术语 GPRS网络结构 GPRS工作原理 GPRS协议模型 GPRS连接过程详解 GPRS的应用--TCPIPPPP GPRS相关AT指令集 GPRS网络优势 通信专业术语 BSS--基站子系统,通过...
  • 课程内容如下: 通信协议的概念 ISO、OSI七层参考模型详解 TCP、IP模型详解 网络接口层详解 IP协议详解 ...IP地址MAC地址特征分析 ...ARP工作过程及工作原理解析 ...网络通信协议(应用层)协议...
  • Frame-Relay(帧中继)简称FR,是国际电信联盟通信标准化组(ITU-T)美国国家标准化协会(ANSI)制定的一种标准,它定义在公共数据网络(PDN)上发送数据的过程。它是一种面向连接的数据链路技术,为提高高性能高.....
  • 7.5.5 ipc的安全通信 216 7.5.6 报警改变帧率技术 218 7.5.7 ipc的多码流技术 218 7.5.8 视频质量控制qos 219 7.5.9 视频移动探测 220 7.6 ipc的选型要点 220 7.6.1 ipc的主要参数 220 7.6.2 图像质量...
  • 7.5.5 ipc的安全通信 216 7.5.6 报警改变帧率技术 218 7.5.7 ipc的多码流技术 218 7.5.8 视频质量控制qos 219 7.5.9 视频移动探测 220 7.6 ipc的选型要点 220 7.6.1 ipc的主要参数 220 7.6.2 图像质量...
  • 54 3.2.4 光纤测试仪 57 3.3 网络监视器分析仪 58 3.3.1 概述 58 3.3.2 微软的网络监视器 59 3.3.3 Novell的网络分析仪 60 3.3.4 网络分析软件 60 3.4 过程监督 61 3.5 测试标准 62 ...
  • 7.5.5 ipc的安全通信 216 7.5.6 报警改变帧率技术 218 7.5.7 ipc的多码流技术 218 7.5.8 视频质量控制qos 219 7.5.9 视频移动探测 220 7.6 ipc的选型要点 220 7.6.1 ipc的主要参数 220 7.6.2 图像质量 221 ...
  • 54 3.2.4 光纤测试仪 57 3.3 网络监视器分析仪 58 3.3.1 概述 58 3.3.2 微软的网络监视器 59 3.3.3 Novell的网络分析仪 60 3.3.4 网络分析软件 60 3.4 过程监督 61 3.5 测试标准 62 ...
  • 54 3.2.4 光纤测试仪 57 3.3 网络监视器分析仪 58 3.3.1 概述 58 3.3.2 微软的网络监视器 59 3.3.3 Novell的网络分析仪 60 3.3.4 网络分析软件 60 3.4 过程监督 61 3.5 测试标准 62 ...
  • 54 3.2.4 光纤测试仪 57 3.3 网络监视器分析仪 58 3.3.1 概述 58 3.3.2 微软的网络监视器 59 3.3.3 Novell的网络分析仪 60 3.3.4 网络分析软件 60 3.4 过程监督 61 3.5 测试标准 62 ...
  • 54 3.2.4 光纤测试仪 57 3.3 网络监视器分析仪 58 3.3.1 概述 58 3.3.2 微软的网络监视器 59 3.3.3 Novell的网络分析仪 60 3.3.4 网络分析软件 60 3.4 过程监督 61 3.5 测试标准 62 ...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 124
精华内容 49
关键字:

网络通信过程和原理详解