通信协议 订阅
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。 展开全文
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议。
信息
外文名
Communication Protocol
中文名
通信协议
通信协议定义
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传送到确定的地方。 在计算机通信中,通信协议用于实现计算机与网络连接之间的标准,网络如果没有统一的通信协议,电脑之间的信息传递就无法识别。 通信协议是指通信各方事前约定的通信规则,可以简单地理解为各计算机之间进行相互会话所使用的共同语言。两台计算机在进行通信时,必须使用的通信协议。
收起全文
精华内容
参与话题
问答
  • 计算机网络协议——通信协议综述

    万次阅读 多人点赞 2019-09-03 23:20:58
    通信协议综述概述一、为什么学习网络协议1.1 常见的网络协议二、网络分层的真正含义2.1 为什么网络要分层?2.2 浏览点击请求过程2.3 揭秘层与层之间的关系三、ifconfig 命令行的由来3.1 ip地址3.2 无类型域间选路...

    这个专栏的计算机网络协议,我是在极客时间上学习 已经有三万多人购买的刘超老师趣谈网络协议专栏,讲的特别好,像看小说一样学习到了平时很枯燥的知识点,计算机网络的书籍太枯燥,感兴趣的同学可以去付费购买,绝对物超所值,本文就是对自己学习专栏的总结,评论区可以留下你的问题,咱们一起讨论!


    概述

    本文也是根据专栏里的板块,对通信网络协议做一个综述,共分为四节去进行介绍;

    • 为什么学习网络协议?
    • 网络协议分层的真正含义;
    • ifconfig命令行的背后;
    • DHCP和PXE:ip的由来;

    一、为什么学习网络协议

    协议

    协议的三要素是:语法、语义、顺序
    连通互联网世界,只教给一台电脑做什么是不够的,需要教会一大片机器做什么,这就是网络协议。只有通过网络协议,才能够使得一大片机器互相协作、共同完成一件事。

    1.1 常见的网络协议

    采用一个下单购物的场景,看看整个过程运用了哪些网络协议。


    首先,在浏览器中输入一个网址www.taobao.com URL,浏览器只知道名字是www.taobao.com,但是不知道具体的地点,所以不知道该如何访问;

    于是,打开地址簿去查找,可以使用一般的地址簿DNS去查找,也可以采用更为精确的地址簿查找协议HTTPDNS

    无论哪一种查找,最后都会得到一个地址:106.114.134.24(任意赋值),这个是IP地址,相当于你在互联网世界中的“门牌号”。知道了目标地址,浏览器开始打包他们的请求。对于普通的浏览请求,往往会采用HTTP协议;但是对于购物的请求,往往需要进行加密传输,因而使用HTTPS协议。无论是什么协议,里面都会声明“你要买什么和买多少”。HTTP头中包含了请求的信息:

    HTTP
    DNS、HTTP、HTTPS所在的层为应用层;


    经过封装以后,浏览器会将应用层的包交给下一层去完成,然后通过socket编程来实现。下一层是传输层,传输层有两种协议:

    • 无连接的协议UDP
    • 面向连接的协议TCP

    对于支付来说,往往采用TCP协议,所谓的面向连接就是,TCP会保证这个包能够到达目的地。如果不能到达,就会重新发送,直至到达;TCP协议中有两个端口,一个是浏览器监听的端口,一个是电商服务器监听的端口。操作系统往往通过端口来判断,它得到的包应该给哪个进程;
    TCP协议


    传输层封装完之后,浏览器会将包交给操作系统的网络层。网络层的协议是IP协议,在IP协议里面会有源IP地址,即浏览器的所在的机器的IP地址和目标IP地址,也就是电商所在的IP地址
    IP地址
    目标IP就是电商地址的门牌号,操作系统知道了目的地的门牌号,就要想着该如何找到目的地;

    首先先判断,目的地是在本地还是在外地;电商系统一般都在那遥远的地方,就比如你到国外要去海关一样,去外地就要经过网关。操作系统启动以后,就会被DHCP协议配置IP地址,以及默认的网关IP地址192.168.1.1;

    如果是本地通信就是靠吼——ARP协议,操作系统大吼一声,谁是192.168.1.1啊?网关会回答它,我就是。这个本地地址就是MAC地址,吼靠的就是ARP协议;

    IP包

    于是操作系统将IP包交给了下一层,也就是MAC层。网卡再将包发出去,包里面包含MAC地址,因此可以到达网关。网关收到包以后,会根据自己的知识,判断下一步该怎么走。网关往往是一个路由器,到了某个IP地址应该怎么走,这个叫作路由表

    路由器就像唐僧西天取经路过的一个个国家之间的城关,每个城关都连接着两个国家,每一个国家都相当于一个局域网,每个国家的内部都可以使用MAC地址进行通信;

    一旦跨越城关,就需要拿出IP头来,里面记录着IP源地址(东土大唐),欲前往西天拜佛取经(目的IP地址),路过宝地,借宿一晚,请问接下来该如何走?
    在这里插入图片描述
    城关与城关之间的沟通协议叫做路由协议,常用的由OSPF和BGP

    城关与城关之间是一个国家,网络包知道了要去哪个城关的时候,还是要使用国家内部的MAC地址,通过下一个城关的MAC地址,找到下一个城关,然后在问下一步该怎么走,一直走到最后一个城关。最后一个城关知道这个网络包要去的地方。于是,对着这个国家吼一声,谁是目标IP啊?目标服务器就会回复一个MAC地址。网络包过关后,通过这个MAC地址就能找到目标服务器;


    目标服务器发现MAC地址对上了以后,取下MAC头来,发送给操作系统的网络层,发现IP地址对上了,在取下IP头。IP头里会写上一层封装的TCP协议,然后交给传输层,即TCP层

    在这一层中,对于收到的每个包,都会有一个回复说明收到了。这个回复的包绝非这次单次请求的结果,例如购物是否成功,扣了多少钱等,而仅仅是TCP层的一个说明,即收到之后的回复。当然这个回复,会沿着刚才来的方向走回去,报个平安,防止在传输过程中造成的丢包等。

    如果过一段时间还没有收到的话,发的端TCP层会重新发送这个包,还是上面的请求,直到收到平安到达的回复。这个重试绝非你的浏览器重新将下单这个动作重新请求一次。对于浏览器来讲,就发送了一次下单请求,TCP层不断自己闷头重试。除非TCP这一层出了问题,例如连接断了,才轮到浏览器的应用层重新发送下单请求。

    当网络包平安到达TCP层之后,TCP头中有目标端口号,通过这个端口号,可以找到电商网站的进程正在监听这个端口号,假设一个Tomcat,将这个包发给电商网站。

    电商网站的进程得到的是HTTP请求知道要买什么东西,买多少。往往一个电商网站最初接待请求的这个Tomcat只是个接待员,负责统筹处理这个请求,而不是所有的事情都自己做。例如,这个接待员要告诉专门管理订单的进程,登记要买某个商品,买多少,要告诉管理库存的进程,库存要减少多少,要告诉支付的进程,应该付多少钱,等等。

    如何告诉相关的进程呢?往往通过RPC调用,即远程过程调用的方式来实现。远程过程调用就是当告诉管理订单进程的时候,接待员不用关心中间的网络互连问题,会由RPC框架统一处理。RPC框架有很多种,有基于HTTP协议放在HTTP的报文里面的,有直接封装在TCP报文里面的。

    当接待员发现相应的部门都处理完毕,就回复一个HTTPS的包,告知下单成功。这个HTTPS的包,会像来的时候一样,经过千难万险到达你的个人电脑,最终进入浏览器,显示支付成功;

    看到这里相信你对于自己之前学过的计算机网络知识有一个连串的感觉了吧,很多公司的面试题都会问在浏览器中输入一个URL的整个过程? 把这一连串说完,相信你的面试官也会觉得你学的很扎实;
    网络协议

    二、网络分层的真正含义

    计算机网络知识点需要背诵,但是更是要理解透彻;

    2.1 为什么网络要分层?

    因为不同层次之间有不同的沟通方式,叫做协议。就像一家公司也是分“层次”,分为总经理、经理、组长、员工,每个人之间都有不同的沟通方式;

    因为复杂的程序都要分层,想象网络包就是一段Buffer,或者一块内存,是有格式的。同时,想象自己是一个处理网络包的程序,而且这个程序可以跑在电脑上,可以跑在服务器上,可以跑在交换机上,也可以跑在路由器上。你想象自己有很多的网口,从某个口拿进一个网络包来,用自己的程序处理一下,再从另一个网口发送出去;

    当然网络包的格式很复杂,这个程序也很复杂,复杂的程序都要分层,这是程序设计的要求。

    2.2 浏览点击请求过程

    浏览点击请求过程如下所示:
    在这里插入图片描述
    在这里插入图片描述
    假设你发现这个包的MAC地址和你的相符,那说明就是发给你的,于是需要调用process_layer3(buffer):这个时候,Buffer里面往往就没有二层的头了,因为已经在上一个函数的处理过程中拿掉了,或者将开始的偏移量移动了一下。在这个函数里面,摘掉三层的头,看看到底是发送给自己的,还是希望自己转发出去的;

    如果IP地址不是自己的,那就应该转发出去;如果IP地址是自己的,那就是发给自己的。根据IP头里面的标识,拿掉三层的头,进行下一层的处理,到底是调用process_tcp(buffer)呢,还是调用process_udp(buffer)呢?

    假设地址是TCP,就会调用process_tcp(Buffer)。这时候,Buffer里面没有三层的头,就需要查看四层的头,看这是一个发起,还是一个应答,又或者是一个正常的数据包,然后分别由不同的逻辑进行处理。如果是发起或者应答,接下来可能要发送一个回复包;如果是一个正常的数据包,就需要交给上层了。交给谁呢?是不是有**process_http(buffer)**函数呢?

    如果你是一个网络包处理程序,你不需要有process_http(buffer),而是应该交给应用去处理。交给哪个应用呢?在四层的头里面有端口号,不同的应用监听不同的端口号。如果发现浏览器应用在监听这个端口,那你发给浏览器就行了。至于浏览器怎么处理,和你没有关系;

    浏览器是解析HTML,显示出页面来。当你再次点击鼠标,点击动作被浏览器捕获,于是浏览器知道又会发起另一个HTTP请求了,于是使用端口号,将请求发送给你。

    你应该调用send_tcp(buffer)。不用说,Buffer里面就是HTTP请求的内容。这个函数里面加一个TCP的头,记录下源端口号。浏览器会给你目的端口号,一般为80端口;

    然后调用send_layer3(buffer)。Buffer里面已经有了HTTP的头和内容,以及TCP的头。在这个函数里面加一个IP的头,记录下源IP的地址和目标IP的地址;随后调用send_layer2(buffer),**Buffer里面已经有了HTTP的头和内容、TCP的头,以及IP的头。这个函数里面要加一下MAC的头,记录下源MAC地址,得到的就是本机器的MAC地址和目标的MAC地址。**不过,这个还要看当前知道不知道,知道就直接加上;不知道的话,就要通过一定的协议处理过程,找到MAC地址。反正要填一个,不能空着;

    2.3 揭秘层与层之间的关系

    现实生活中,往往是员工说一句,组长补充两句,然后经理补充两句,最后总经理再补充两句。但是在网络世界,应该是总经理说话,经理补充两句,组长补充两句,员工再补充两句。

    TCP在三次握手时,TCP每一个消息都会带着IP层和MAC层。因为,TCP每次发送一个消息,IP层和MAC层的所有机制都要重新运行一次,所以TCP在三次握手时,IP和MAC也运行了好久。

    只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层;如果一个HTTP协议的包跑在网络上,它一定是完整的。无论这个包经过哪些设备,它都是完整的。所谓的二层设备、三层设备只是跑在设备上的程序不同;

    • 二层设备:只把MAC头摘下来,看看到底是丢弃、转发,还是自己留着;
    • 三层设备:把MAC头摘下来之后,再把IP头摘下来,看看到底是丢弃、转发,还是自己留着;

    三、ifconfig 命令行的由来

    ifconfig是linux系统中查询ip地址的一个命令,windows是ipconfig;

    3.1 ip地址

    IP地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号。
    例如:10.100.122.2就是一个IP地址,地址被分为四个部分,每个部分8个bit,所以IP地址总共是32位;

    IP地址被分成了5类,A-E类
    IP地址
    在网络地址中,A、B、C类主要分为两个部分,前一部分是网络号,后一部分是主机号。大家都是六单元1001号,你是小区A的,我是小区B的;

    ip地址范围

    3.2 无类型域间选路(CIDR)

    无类型域间选路,简称CIDR,将IP地址一分为二,前面是网络号,后面是主机号。10.100.122.2/24,这个IP地址中有一个斜杠,斜杠后面有个数字24,这种地址表示形式,就是CIDR,后面24的意思是,32位中,前24位是网络号,后8位是主机号。

    伴随着CIDR存在的,一个是广播地址,10.100.122.125,如果发送这个地址,所有10.100.122网络内的机器都可以收到,另一个是子网掩码,255.255.255.0

    将子网掩码和IP地址按位计算AND,就可以得到网络号,那么上面的ip地址与子网掩码按位取AND,网络号就是10.100.122.0;(1和任意数值取AND,值不变;0和任意数值取AND,即为0);

    3.3 公有IP地址和私有IP地址

    在这里插入图片描述
    平时我们在办公室、学校、家里的IP地址,一般都是私有IP地址,因为这些地址,允许组织内部的IP地址自己管理、自己分配,因此可以重复。就比如你们学校可能由六单元一号,我们学校可能也有六单元1号。

    但是,一旦离开学校就需要使用公有IP地址,就像上海市南京西路88号,这个是国家同统一分配的。公有IP地址,由相关的组织去分配,如果使用,需要购买。

    192.168.0.x,是最常见的私有IP地址,家里有wifi,对应就有一个ip地址,但是一般家庭中的上网设备不会超过256个,所以/24基本就够用了。

    举例:CIDR中容易犯错的点
    16.158.165.91/22,这个CIDR,求网络中的第一个地址、子网掩码和广播地址
    16.158的部分不会动,它占了前16位。中间的165,变为二进制为‭10100101‬。除了前面的16位,还剩6位。所以,这8位中前6位是网络号,16.158.<101001>,而**<01>.91是机器号**;所以第一个地址是16.158.<101001><00>.1,即16.158.164.1,子网掩码是255.255.<111111><00>.0,即255.255.252.0,广播地址是16.158.<101001><11>.255,即16.158.167.255.

    这五类地址中,还有一类D类是组播地址,使用这一类地址,属于某个组的机器都能够收到,这就有点类似于公司中大家加入了一个邮件组,发送邮件,加入这个组的大家都能收到;

    IP地址的后面有个scope对于eth0这张网卡来讲,是global,说明这张网卡是可以对外的,可以接收来自各个地方的包。对于lo来讲,是host,说明这张网卡仅仅可以供本机相互通信;

    lo又被称为loopback,又称环回接口,往往会被分配到127.0.0.1这个地址,这个地址可以用于本机通信,经过内核处理以后直接返回,不会在任何网络中出现;

    3.4 MAC地址

    在IP地址的上一行是link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff,这个被称为MAC地址,是一个网卡的物理地址,用十六进制,6个byte表示。既然已经知道了MAC地址,是不是意味着直接可以通过MAC地址进行通信啊?

    个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。 而有门牌号码属性的IP地址,才是有远程定位功能的。

    比如:你要去某某大学某某学院找小明,你在路上问,有些人不知道某某学院,但是可以给你说某某学校在哪里,但是你直接根据 小明的身份证号 问别人知不知道他在哪个学院,那么肯定没人知道;

    MAC地址更像是身份证,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识

    MAC地址是有一定的定位功能的,你可以根据ip地址找到某某学校某某学院某号楼某个实验室,当你到了以后,大吼一声,小明 是哪位,那么他听到了 就会回应你;

    MAC地址的通信范围比较小,局限在一个子网里面。例如,从192.168.0.2/24访问192.168.0.3/24是可以用MAC地址的。一旦跨子网,即从192.168.0.2/24到192.168.1.2/24,MAC地址就不行了,需要IP地址起作用了

    总结:

    • ip是地址,有定位功能;MAC是身份证,无定位功能;
    • CIDR可以用来判断是不是本地人;
    • IP分为公有地址IP和私有地址IP

    四、DHCP和PXE:ip的由来

    只要是在网络上跑的包可以有下层没上层,但是不可以有上层没下层;当一个数据包有自己的ip地址,有目的地的ip地址,但是包发不出去的原因是因为,MAC层还没有填写。

    Linux的默认逻辑是,如果是一个跨网段的调用,它便不会将包直接发送到网络上,而是企图将包发送到网关。网关要和当前的网络至少一个网卡是同一个网段;

    4.1 动态主机配置协议(DHCP)

    动态主机配置协议(Dynamic Host Configuration Protocol),简称DHCP

    有了这个协议,网络管理员就轻松多了。他只需要配置一段共享的IP地址。每一台新接入的机器都通过DHCP协议,来这个共享的IP地址里申请,然后自动配置好就可以了。等人走了,或者用完了,还回去,这样其他的机器也能用。

    如果是数据中心里面的服务器,IP一旦配置好,基本不会变,这就相当于买房自己装修。DHCP的方式就相当于租房。你不用装修,都是帮你配置好的。你暂时用一下,用完退租就可以了。

    4.2 解析DHCP的工作方式

    当一台机器加入一个新的网络的时候,只知道自己的mac地址,先吼一句,有人吗?这一步就是DHCP Discover

    新来的机器使用IP地址0.0.0.0发送了一个广播包,目的IP地址为255.255.255.255。广播包封装了UDP,UDP封装了BOOTP。其实DHCP是BOOTP的增强版,但是如果你去抓包的话,很可能看到的名称还是BOOTP协议;

    在这个广播包里,新人喊一句:我是新来的(Boot request),我的MAC地址是多少,但是我还没有ip地址,谁能给我一个?
    在这里插入图片描述
    网络管理员在网络配置了DHCP server,就相当于IP管理员,MAC地址是其唯一的身份。只有MAC地址唯一,IP管理员才能知道这是一个新人,需要租给它一个新的IP地址,这个过程就是DHCP Offer.

    DHCP Offer格式如下:
    里面会有给新人分配的地址;
    DHCP Offer
    DHCP Server仍然使用广播地址作为目的地址。如果同时收到多个IP地址,那么会选择最先到达的DHCP Offer,并且会向网络发送一个DHCP Request广播数据包,其中包含客户端的MAC地址、接受的租约中的IP地址,提供租约的DHCP服务器地址等,并且告诉所有的DHCP Offer,它将接受哪一台服务器所提供的IP地址,感谢其他DHCP服务器,并且请求撤销他们提供的ip地址,以便提供给下一个租用者。

    在这里插入图片描述
    由于还没有收到DHCP server的最后确认,客户端依然使用自己的源ip地址0.0.0.0、255.255.255.255为目标地址进行广播。在BOOTP里面,接受某个DHCP Server的分配 ip;

    当DHCP Server接收到客户机的DHCP request之后,会广播返回给客户机的一个DHCP ACK消息包,表明已经接受客户机的选择,并且将这一IP地址合法租用信息和其他的配置信息都放到该广播包中,发送给客户机,欢迎它加入网络大家庭;

    在这里插入图片描述
    租约达成以后,还是要广播一下,让大家都知道呢

    ip地址的收回和续租

    如果需要续租的话,需要提前租期的50%,客户机会在租期过去50%的时候,直接向为其提供ip地址的DHCP Server发送DHCP Request消息包,客户机收到该服务器的DHCP ACK消息包之后,会根据包中提供的新的租期,以及其他的已经更新的TCP/IP参数更新自己的配置,这样,ip的租用更新就已经完成了。

    网络管理员不仅能自动分配IP地址,还能帮你自动安装操作系统;

    4.3 预启动执行环境(PXE)

    普通的笔记本一般不会有这种雪球,已经预装好了操作系统。但是数据中心的管理员,可能一下子拿到了几百台空的机器,一台一台装就累死了。

    管理员们不仅希望可以分配好ip地址,还可以自动安装系统,装好系统之后会自动分配IP地址,直接启动最好了。

    安装操作系统的过程,只能插在BIOS启动之后了。因为没安装系统之前,连启动扇区都没有。因而这个过程叫做预启动执行环境(Pre-boot Execution Environment),简称PXE。

    默认的DHCP Server是需要配置的,无非是我们配置IP的时候所需要的IP地址段、子网掩码、网关地址、租期等。如果想使用PXE,则需要配置next-server,指向PXE服务器的地址,另外要配置初始启动文件filename。

    这样PXE客户端启动之后,发送DHCP请求之后,除了能得到一个IP地址,还可以知道PXE服务器在哪里,也可以知道如何从PXE服务器上下载某个文件,去初始化操作系统。

    解析PXE的工作过程

    首先是启动PXE客户端第一步是通过DHCP协议告诉DHCP Server,我啥都没有,DHCP Server便租给它一个ip地址,同时给他PXE服务器的地址、启动文件pexlinux.0;

    其次,PXE客户端知道要去PXE服务器下载这个文件后,就可以初始化机器。于是便开始下载,下载的时候使用的是TFTP协议。所以PXE服务器上,往往还需要有一个TFTP服务器。PXE客户端向TFTP服务器请求下载这个文件,TFTP服务器说好啊,于是就将这个文件传给它;

    然后,PXE客户端收到这个文件后,就开始执行这个文件。这个文件会指示PXE客户端,向TFTP服务器请求计算机的配置信息pxelinux.cfg。TFTP服务器会给PXE客户端一个配置文件,里面会说内核在哪里、initramfs在哪里。PXE客户端会请求这些文件;

    最后,启动Linux内核,一旦启动了操作系统,啥都好办。

    在这里插入图片描述

    总结


    本文是对通信协议综述的总结,共分为四节去介绍:

    1. 为什么学习网络协议?
      通过一个简简单单的下单过程,中间牵扯到这么多的协议,展开介绍;

    2. 网络协议分层的真正含义
      始终想象自己是一个处理网络包的程序:如何拿到网络包,如何根据规则进行处理,如何发出去;
      始终牢记一个原则:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层;

    3. ifconfig命令行的背后;
      IP是地址,有定位功能;MAC是身份证,无定位功能;
      CIDR可以用来判断是不是本地人;
      IP分公有的IP和私有的IP。后面的章节中我会谈到“出国门”,就与这个有关。

    4. DHCP和PXE:ip的由来;
      DHCP协议主要是用来给客户租用IP地址,和房产中介很像,要商谈、签约、续租,广播还不能“抢单”;
      DHCP协议能给客户推荐“装修队”PXE,能够安装操作系统,这个在云计算领域大有用处;

    展开全文
  • 通信协议

    千次阅读 2018-07-22 08:29:10
    通信协议  由于没有存储共享器,分布式系统中的所有通信都是基于底层消息交换的。如果进程A要与进程B通信,A必须首先在自己的地址空间中生成该消息,再执行一个系统调用,通知操作系统将该消息通过网络发送给B。 ...

    通信协议


           由于没有存储共享器,分布式系统中的所有通信都是基于底层消息交换的。如果进程A要与进程B通信,A必须首先在自己的地址空间中生成该消息,再执行一个系统调用,通知操作系统将该消息通过网络发送给B。

      为了使一组计算机能够通过网络相互通信,它们必须使用相同的协议。可以把协议划分为两大类。

      一类是面向连接协议,使用这种协议,消息发送方和接收方必须首先显式地确立连接,可能还需要就采用的协议进行协商,然后两者才能进行数据交换。通信完毕之后必须释放连接。

      一类是无连接协议,使用这种协议,交换数据之前不需要有建立连接的过程,消息发送方只需要在准备好的时候开始传送第一个消息即可。

      通信过程划分为7层:

      如机器1上的进程A想与机器2上的进程B通信,它先生成一个消息,然后将该消息传递给机器1上的应用层,该层可能是一个库过程,也可能通过其他方式实现。应用层软件随后在消息前面增加一个报头(header),并通过第6层与第7层之间的接口将处理后的消息传递给表示层。表示层在得到的消息中增加自己的报头,并将得到的消息传给下一层即会话层。逐层向下传递,某些层不仅要在消息头部增加自己的报头,而且还要在消息末尾增加报尾,当消息最终到达底层物理层时,由该层执行实际的消息传输,把它放置在屋里传输介质上去。

      那么此时封装的消息就为:

    1、传输协议

      当应用层接收到消息时,传输层将消息分为适于传输的足够小的块,每块都分配一个序列号,然后将它们发送出去,在传输层报头中设计的内容包括哪些包已发送、哪些包已接收到、接收方所拥有的空间还能够容纳多少包、哪些包应该重发以及其他一些类似的主题。

      网络传输协议称为传输控制协议(TCP),因特网协议簇也支持无连接的传输协议,该协议称为通用数据报协议(UDP),从本质上说,它不过是附加了某些次要内容的IP协议。不需要面向连接协议的用户程序通常使用UDP。

      会话层本质上是传输层的增强版本,它提供对话控制,还提供了同步功能,对于长时间的传输过程非常有用,它允许用户在传输过程中插入若干检查点,如果传输崩溃,只需要回退到最近的一个检查点(跟打游戏死了后回到前一个检查点一样哈哈),而不需要重新传输。不过实践中很少用到会话层。

    2、通信类型

      电子邮件系统是一个其通信为持久的典型示例。对于持久通信,提交传输的消息一直由通信中间件存储,直到该消息被传送给接收方为止。因此对于发送者来说,在提交消息后,就没必要持续运行了,同样,消息提交后,接收应用程序也没有必要持续运行。

      对于瞬时通信,通信系统只有在发送和接收应用程序正在运行时才存储消息。由于终端或因为接收方当前不在活动状态,中间件就不能传送消息了,而是把它丢掉。

    3、远程过程调用

      当机器A上的进程调用机器B上的进程时,A上的调用进程被挂起,而B上的被调用进程开始执行。调用方可以通过使用参数将信息传送给被调用方,然后可以通过传回的结果得到信息。编程人员看不到任何消息传递过程,这种方法称之为远程过程调用(RPC)

    3.1常规过程调用

      eg:count - read(fd,buf,bytes);

      其中,fd为一个整数型,表示一个文件。buf为一个字符数组,用于存储输入的数据,nbytes为另一个整型数,用来记录实际输入的字节数。调用前的堆栈如下图左,进行了调用,调用方先把参数反序压入堆栈,即最后一个参数最先压入。在read操作完后将返回值放入某个寄存器中,移出返回地址,并将控制权交回调用方。随后调用方将参数从堆栈移出,使堆栈还原到初始的状态。

    3.2 客户与服务器存根程序

      RPC背后隐含的思想是尽量使远程过程调用具有与本地调用相同的形式。即调用过程不应该发现被调用的过程实际在另一台机器上执行。比如犹如刚才的read,虽然read中执行了系统调用,但是它本身依然是通过将参数压入堆栈的常规方式调用。

      RPC是通过类似的途径获得透明性的。不同点在于,它并不要求操作系统提供数据,而是将参数打包成一个消息,然后将请求此消息发送到服务器。

      

      当消息到达服务器时,服务器上的操作系统将它传递给服务器存根,服务器存根是客户存根在服务器端的等价物,它也是一段代码,用来将通过网络输入的请求转换为本地过程调用,服务器存根一般先调用receive,然后被阻塞,等待消息输入。

    总的来说,远程过程调用包含下列步骤:

    (1)客户过程以正常的方式调用客户存根

    (2)客户存根生成一条消息,然后调用本地操作系统

    (3)客户端操作系统将消息发送给远程操作系统

    (4)远程操作系统将消息发送给服务器存根

    (5)服务器存根将参数提取出来,然后调用服务器

    (6)服务器执行要求的操作,操作完后将结果返回给服务器存根

    (7)服务器存根将结果打包成一个消息,然后调用本地操作系统

    (8)服务器操作系统将含有结果的消息发送回客户端操作系统

    (9)客户端操作系统将消息交给客户存根

    (10)客户存根将结果从消息中提取出来,返回给调用它的客户过程

    展开全文
  • Zookeeper通信协议

    千次阅读 2018-12-31 23:20:48
    通信协议

    请求部分

    请求头:RequestHeader

    请求头中包含了请求最基本的信息,包括xid和type。xid用于记录客户端请求发起的先后序号,用来确保单个客户端请求的响应顺序。type代表请求的操作类型,这些操作类型都被定义在类org.apache.zookeeper.ZooDefs.OpCode中,除非是“会话创建”请求,其他所有客户端请求中都会带上请求头。

    请求体:Request

    请求体包含了请求的所有操作内容。不同的请求类型,其请求体部分的结构是不同的。

    ConnectRequest:会话创建,zookeeper客户端和服务端在创建会话的时候,会发送ConnectRequest请求,该请求体中包含了协议的版本号protocolVersion、最近一次接收到的服务器ZXID lastZxidSeen、会话超时时间timeOut、会话标识sessionId和会话密码passwd。

    GetDataRequest:获取节点数据,zookeeper客户端在向服务端发送获取节点数据请求的时候,会发送GetDataRequest请求,该请求体中包含了数据节点的节点路径path和是否注册Watcher的标识Watch。

    SetDataRequest:更新节点数据,zookeeper客户端在向服务端发送更新节点数据请求的时候,会发送SetDataRequest请求,该请求体中包含了数据节点的节点路径path、数据内容data和节点数据的期望版本号version。

    响应部分

    响应头:ReplyHeader

    响应头中包含了每一个响应最基本的信息,包括xid、zxid和err。xid和请求头中的xid是一致的,响应中只是将请求中的xid原值返回。zxid代表zookeeper服务器上当前最新的事务ID。err则是一个错误码,当请求处理过程中出现异常情况时,会在这个错误码中标识出来。所有错误码都定义在类org.apache.zookeeper.org.apache.zookeeper.Code中。

    响应体:Response

    响应体包含了响应的所有返回数据。不同的请求类型,其响应体部分的结构是不同的。

    ConnectResponse:会话创建,针对客户端的会话创建请求,服务端会返回客户端一个ConnectResponse响应,该响应体中包含了协议的版本号protocolVersion、会话超时时间timeOut、会话标识SessionId和会话密码passwd。

    GetDataResponse:获取节点数据,针对客户端的获取节点数据请求,服务端会返回客户端一个GetDataResponse响应,该响应体中包含了数据节点的数据内容data和节点状态Stat。

    SetDataResponse:更新节点数据,针对客户端的更新节点数据请求,服务端会返回客户端一个SetDataResponse响应,该响应体中包含了最新的节点状态Stat。

    展开全文
  • Redis通信协议

    万次阅读 2019-07-02 23:25:08
    对于redis的通信协议基本上都没怎么留意过。了解相对底层的东西,有助于我们更好的使用redis以及排查错误。 2.redis通信协议的基本内容   协议,无外乎就是信息内容的格式要client和server端遵守的某种...

    1.前言

      redis日常开发多多少少都有使用过。不过大多数都停留在get set等基本操作,存数据,取数据等简单操作。对于redis的通信协议基本上都没怎么留意过,所以自己有必要通过博文记录一番。了解相对底层的东西,有助于我们更好的使用redis以及排查错误。

    2.redis通信协议的基本内容

      协议,无外乎就是信息内容的格式要client和server端遵守的某种规范。这个我们可以类比以前学习http协议的时候,是怎么来了解这个协议内容的。http协议分2大模块来研究,无外乎就是请求报文和响应报文的格式,以及其中参数的各种意义是什么,使用之后会产生什么效果罢了。那么我们也大致从这个思路来了解redis的通信协议。 暂且就叫 “请求报文” 和 "响应报文"吧。
    详细文档信息,参考: http://doc.redisfans.com/topic/protocol.html
    原官方文档参考: https://redis.io/topics/protocol

    3.client请求报文

      
     1. 基本语法格式如下:
      
    		  *<参数个数n>  #表示接下来有几个参数
    		  $<param_num> #第一个参数的长度
    		  参数内容 
    		  ...
    		  ...
    		  $<param_num> #第n个参数的长度
    
             (注:  redis的每个命令必须都是\r\n结尾。)
            
    
     2. 举例:
    
            select 0
            set name zhangsan
            
      真实报文内容:
      
            *2 \r\n   # 接下来有2个参数
            $5  \r\n  #第一个参数长度是5 (select)
            select \r\n 
            $1  \r\n  #第二个参数是1  (0)
            0  \r\n
            *3  \r\n  #接下来有3个参数  
            $3   \r\n#第一个参数 长度是3 (set)
            set  \r\n
            $4   \r\n #第二个参数  长度是4 (name)
            name \r\n
            $8    \r\n  #第三个参数  长度是8 (zhangsan)
            zhangsan\r\n
                 
    

    4.server响应报文

    
    基本语法解释:
    
    server端响应的第一个字节代表含义如下:
    
    	1.正确状态回复  +
    	
    	   举例: 
    	       set name zhangsan  #   +OK\r\n   (set成功)
    	        
    	2.错误状态回复  -
    	
    	   举例:
    	       gets name         #  - command error\r\n
    	       
    	3.整数信息回复 :
    	
    	   举例: 
    	       zcard  collection  # 获取集合的总数  :10\r\n
    	       
    	4.批量信息回复  $
    	
    	   举例: 
    	       get name         # $8\r\nzhangsan\r\n
    	       
    	5.多批量信息回复  *
    	
    	   举例:
    	       keys *           # *3\r\n$3abc\r\n$4name\r\n  (集合存在 abc,name 2个key)
    
    

    5.telnet连接redis

      由于我们现在知道了redis采用明文安全二进制文本的redis序列化协议实现通信。 那么可以通过telnet连接server。 类似 我们在使用memcached的时候,由于memcached使用存文本明文协议通信, 通过telnet充当客户端使用即可。 假如你本地没有安装redis官方客户端, 那么可以使用telnet充当客户端完全没有问题。

    telnet  server  6379
    
    
    >select 0
    >+OK
    >set name zhangsan
    >+OK
    >get name
    >$8\r\nzhangsan\r\n  (\r\n在屏幕上以及被显示成回车换行了,这里只是还原server端原文信息)
    
    
    

    6.总结

      无论是java的客户端Jredis 还是说 针对php的redis客户端扩展,原理其实是一样的。这些客户端只是把我们的命令翻译成为了redis请求报文格式,发送给server端的6379端口,server端响应请求之后, 客户端拿到信息 ,解析成为java变量或者php变量等等而已, 这些工具包所提供的功能经此而已。

       我们自己完全可以使用socket进行编程, 按照redis客户端请求报文规范,一样能访问和操作redis。只不过,我们的主要精力在工作的业务代码逻辑上,而非是在处理redis的操作上,所以没必要自己去搞一个工具库。不过,这样能够让你对于理解redis客户端和服务端通信过程更加深刻和理解。 每当操作redis的时候,我们的脑海中自然出现了底层实际发送数据流向的画面, 自然以后排查错误就知根知底了

      知其然,更要知其所以然。我觉得这个对于我们学习是很有帮助的。

    展开全文
  • 无线充电Qi通信协议分析

    万次阅读 2020-04-05 09:30:50
    无线充电Qi通信协议分析
  • 1.闲话闲聊 最重要的写在前面:用户层通信协议就是数据包格式!!! ...没有进行串口通讯实践的朋友可能会想:...串口通信协议一般可以从两个角度来思考:底层通信协议和用户层协议。底层协议一般有计算机硬件提供商
  • 网络通信协议

    千次阅读 2017-11-30 15:33:40
    网络通信协议 今天学习了网络通信协议,总结出来的知识点,不足之处请大家多多指教! 网络通信协议:负责在网络上建立通信通道和控制通过通道的信息流的规则 为了进行网络通信,通信双方必须遵守通信...
  • 物联网通信协议

    千次阅读 2017-05-07 09:38:09
    物联网通信协议
  • 数据通信协议 Data communication protocol 亦称数据通信控制协议。是为保证数据通信网中通信双方能有效,可靠通信而规定的一系列约定。这些约定包括数据的格式,顺序和速率,数据传输的确认或拒收,差错检测,重传...
  • Dubbo支持的通信协议和序列化协议

    千次阅读 2020-07-24 13:40:51
    Dubbo支持的通信协议和序列化协议 通讯协议(10种) Dubbo 默认协议:议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。 REST 协议: 基于...
  • 通信协议制定

    万次阅读 2015-10-29 23:24:00
    通信协议定义    用于实现计算机与网络连接之间的标准,网络如果没有统一的通信协议,电脑 之间的信息传递就无法识别。 通信协议是指通信各方事前约定的用心规则,我们可以简单地理解为各计算机之间进行相互会话...
  • 如何自定义一个通信协议

    万次阅读 多人点赞 2018-01-21 14:07:27
    借鉴简单的OSI和TCP/IP通信模型来讨论如何自定义一个适应自己的通信协议 前言 经典的OSI七层模型 1TCPIP模型解析 11整体介绍 22数据链路层 23网络层 24传输层 25应用层 不同类型的通信方式的总结 1从上述模型...
  • RTU通信协议

    千次阅读 2018-12-27 10:09:11
    RTU通信协议 一、通讯模式 1.通讯接口电气标准: 通讯接口符合RS-232 RS–485国际标准。 2. 通讯协议: 采用MODBUS通讯协议RTU模式。 3.通讯格式约定: (1)通信速率: 300 600 1200 2400 4800 9600可选 (2)...
  • WebRTC实时通信协议详解

    万次阅读 2019-05-07 00:21:56
    这篇主要来讲WebRTC实时通信协议,协议原理以及在Android中如何实现。
  • Http通信协议

    千次阅读 2018-12-12 11:32:50
    HTTP是一个基于TCP / IP通信协议来传递数据(HTML文件,图片文件,查询结果等)。 HTTP是一个属于应用层的面向对象的协议,由于其简捷,快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与...
  • 自定义通信协议

    千次阅读 2018-01-08 09:48:59
    1.自定义数据通信协议  这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软件提供两个基本的操
  • Modbus通信协议由Modicon公司(现已经为施耐德公司并购,成为其旗下的子品牌)于1979年发明的,是全球最早用于工业现场的总线规约。由于其免费公开发行,使用该协议的厂家无需缴纳任何费用,Modbus通信协议采用的是...
  • MODBUS_RTU通信协议

    万次阅读 多人点赞 2019-05-29 09:23:12
    Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子...
  • 上期,转载了一篇自定义的通信协议的制定以及使用的一篇帖子,个人觉得相当不错。 但是就目前而已,谷歌的PB使用要更广泛一些,不管是哪个方面。 对于PB的话,也就是Google Protocol Buffer。假如您在网上搜索,...
  • ZMQ通信协议小结

    万次阅读 2019-05-06 23:25:19
    ZMQ 通信协议小结 前言:最近项目中用到 ZMQ,所以研究了一下,总结了一些使用方法! zmq的三种模型: 1、Request_Reply模式: >> 一发一收 无缓存 断开连接数据丢失。 2、Publish-Subscribe模式: ...
  • IIC通信协议

    千次阅读 2016-11-09 23:35:07
    IIC简单介绍 小编能力有限,写的不对处还望诸位大侠指正哈... 其次IIC通信过程由开始、结束、发送、接收四个函数构成,接下来小编通过介绍这四个函数来介绍IIC通信协议。 假设我现在有一个单片机和一个拥有IIC接口的
  • 微信公众号“智物客”和您免费分享物联网、智慧...在上文分析物联网常用通讯协议的基础上,本文按近距离通信、远距离蜂窝通信、远距离非蜂窝通信、有线通信4个方面分享了物联网常用通信协议。后续将分享三表远抄系统。
  • http层协议是哪层通信协议

    千次阅读 2020-01-19 10:54:47
    OSI 和 TCP/IP通信协议对比 如图 HTTP协议处于TCP/IP协议体系的应用层。HPPT协议属于应用层的协议,因此工作在最高层,即应用层。图中未标记出HTTP协议,它与FTP、DNS等协议工作 在同一层。 应用层(Application ...
  • 通信协议的理解

    千次阅读 2019-04-28 16:39:03
    1:(无线)通信协议是为了完成了通信实体之间的通信而做的一些规则和约定的集合。因为没有实体,所以不是很好理解。 2:可以类比下交通运输,路需要多宽,限速多少,道路标示怎么画,路两侧怎么防护,红绿灯的规则...

空空如也

1 2 3 4 5 ... 20
收藏数 108,316
精华内容 43,326
关键字:

通信协议