精华内容
下载资源
问答
  • 自定义应用层通信协议

    千次阅读 2013-11-04 21:48:21
    在OSI开放互联参考模型中,对等实体之间数据单元在发送方逐层封装,在接收方的逐层解析。发送方N实体从N+1实体得到的数据包称为服务数据单元(Service Data Unit,SDU)。N实体只将其视为需要本实体提供服务的...

    1.通信协议的概念及其要素

    在OSI开放互联参考模型中,对等实体之间数据单元在发送方逐层封装,在接收方的逐层解析。发送方N层实体从N+1层实体得到的数据包称为服务数据单元(Service Data Unit,SDU)。N层实体只将其视为需要本实体提供服务的数据,将服务数据单元进行封装,使其成为一个对方能够理解的数据单元(Protocol Data Unit,PDU),封装过程实际上是为SDU增加对等实体间约定的控制信息(Protocol Control Information,PCI)的过程。

    为了保证网络的各个功能的相对独立性,以及便于实现和维护,通常将协议划分为多个子协议,并且让这些协议保持一种层次结构,子协议的集合通常称为协议簇。

    网络协议的分层有利于将复杂的问题分解成多个简单的问题,从而分而治之。各层的协议由各层的实体实现,通信双方对等层中完成相同协议功能的实体称为对等实体。对等实体按协议进行通信,所以协议反映的是对等层的对等实体之间的一种横向关系,严格地说,协议是对等实体共同遵守的规则和约定的集合。

    通信协议精确地定义了双方通信控制信息和解释信息:发送方能将特定信息(文本、图片、音频、视频)按协议封装成指定格式的数据包,最终以串行化比特流在网络上传输;接收方接收到数据包后,根据协议将比特流解析为本地化数据,从而获取对方发送过来的原始信息。

    通信协议包括三个要素:

    (1)语法:规定了信息的结构和格式;

    (2)语义:表明信息要表达的内容;

    (3)同步:规则涉及双方的交互关系和事件顺序。

    整个计算机网络的实现体现为协议的实现,TCP/IP协议是Internet互联网的核心协议。

    2.通信协议开发步骤

    (1) 协议的开发主要包括协议设计、协议形式描述、协议实现和协议一致性测试。协议的开发过程与步骤如图1所示。

        图1 协议开发过程与步骤

    (2) 协议设计过程中的分组发送接收模型如图2所示。

    图2协议设计过程中的分组发送接收模型

    (3)协议的一致性测试

    协议的一致性测试是指测试协议能否按照预想的控制策略实现正确的通信,主要体现在数据包通过信道从信源传送到信宿后,信宿能够根据协议正确的解析出原始信息。

    协议的一致性测试如图3所示。

    图3 协议一致性测试环境

    根据测试环境的可以分为局部测试和分布式测试,如图4所示。

    图4局部测试法、分布式测试法

    3.数据包和数据报

    为方便描述自定义协议,还是借用数据包和数据报来描述封装数据单元和传输数据单元,但这里的数据包和数据报完全不同于TCP/IP架构中的Packet和Datagram概念。

    下文所述的数据包指封装的基本单位,以TLV(Type-Length-Value)格式封装基本消息单位;数据报Package是传输的基本单位,头部包含序列号和命令信息。接收端根据命令信息分辨事件类型,做出不同的解析。报文实体是多个TLV数据包组成的链表。

    参考:

    《计算机网络协议和实现技术》 鲁士文

    展开全文
  • TCP/IP模型是当今IP网络的基础(也被称为DoD模型,上图我贴出的并不是标准的TCP/IP模型,为了方便下文的阐述,这里给出的是一个TCP/IP模型与OSI模型的对等模型),它将整个数据通信的任务划分成不同的功能层次(Laye

    1. 回顾TCP/IP模型

    什么是数据网络(Data Network)?简单地说,数据网络就是一个由各种设备搭建起来的一张网,常见的设备有:路由器、交换机、防火墙、负载均衡器、IDS/IPS、VPN服务器等等。数据网络最基本的功能就是实现不同节点之间的数据互通,也就是数据通信。

    TCP/IP模型是当今IP网络的基础(也被称为DoD模型,上图我贴出的并不是标准的TCP/IP模型,为了方便下文的阐述,这里给出的是一个TCP/IP模型与OSI模型的对等模型),它将整个数据通信的任务划分成不同的功能层次(Layer),每一个层次有其所定义的功能,以及对应的协议。打个比方,对于一家公司而言,一笔业务需要各个部门相互协同工作才能完成,部门与部门之间既相互独立,但是又需要相互配合,可以借用这种思路来理解TCP/IP参考模型。分层参考模型的设计是非常经典的理念:

    1. 层次化的模型设计将网络的通信过程划分为更小、更简单的部件,因此有助于各个部件的独立开发、设计和故障排除;
    2. 层与层之间相互独立,又互相依赖,每一层都有该层的功能、以及定义的协议标准。层层之间相互配合,共同完成数据通信的过程;
    3. 通过组件的标准化,允许多个供应商进行开发;
    4. 通过定义在模型的每一层实现什么功能,鼓励产业的标准化;
    5. 允许各种类型的网络硬件和软件相互通信。

    上面这张图显示的就是每个层次对应的代表性协议。

    2. 理解数据通信过程

    根据上图所示的网络拓扑(Topology),我们来分析一下PC访问Server的WEB服务的详细通信过程。

    在阐述过程中,我们聚焦的重点是利用TCP/IP参考模型理解数据通信过程,因此可能会忽略部分技术细节,例如DNS、TCP三次握手等,这些技术细节这里暂不做讨论。现在你要换一种视野来看待这个“世界”了,想象一下上图所示的终端以及路由器都是一个个的“TCP/IP通信模型”,事实上,整个过程在宏观层面体现如下:

    我们一步一步的来分析:

    1. PC的用户在WEB浏览器中访问Server的WEB服务(这里我们暂且不去关注HTTP交互、DNS交互等细节,重点看通信过程),PC的这次操作将触发HTTP应用为用户构造一个应用数据(如下图所示)。当然这个数据最终要传递到Server并“递交”到Server的HTTP应用来处理,但是HTTP不关心数据怎么传、怎么寻址、怎么做差错校验等等,这些事情交由专门的层次来完成,所以HTTP应用数据还需经过一番“折腾”才能从PC传到Server,OK GO。

    1. 由于HTTP基于TCP,因此这个应用数据交由参考模型中的主机到主机层(第4层)进一步处理。在该层,上层HTTP应用的数据被封装一个TCP的头部(可以简单的理解为套了一个TCP的信封)在TCP头部中我们重点关注两个字段(信封上写的东西),一个是源端口号,另一个是目的端口号,源端口号为随机产生的端口号(是PC本地设置的、专门用于本次会话的端口),目的端口号为80(HTTP服务对应的默认端口号是80),如下图所示。然后这个数据段(Segment)被交给下一个层处理。

    1. 下一层是网络层,也叫因特网层(第3层),处于这个层的IP协议为这个上层下来的数据封装一个IP头部(在之前的基础上又套了一个信封,如下图所示),以便该数据能够在IP网络中被网络设备从源转发(路由)到目的地。在IP头当中我们重点关注源IP地址、目的IP地址、协议号这三个字段。其中源地址填写的是PC自己的IP地址192.168.1.1,目的地址存放的是Server的IP地址192.168.2.1,而协议号字段则存放的是值6,这个值是一个众所周知(Well-Known),也就是行业约定的值,该值对应上层协议类型TCP,表示这个IP头后面封装的上层协议为TCP(形象点的描述是,协议字段用于表示这个IP信封里装的是一个TCP的内容)。搞定之后,这个数据被交给下一层处理。

    1. 为了让这个IP数据包能够在链路上传输(从链路的一个节点传到另一节点),还要给数据包封装上一个数据链路层(第2层)的头部,以便该数据能够在链路上被顺利传输到对端。由于PC与R1之间为以太网链路,因此上层来的IP数据包被封装一个以太网的数据帧头(再增加一个信封)。这个帧头中写入的源MAC地址为PC的网卡MAC,那么目的MAC呢?PC知道,数据的目的地是192.168.2.1这个IP,而本机IP是192.168.1.1/24,显然,目的地与自己并不在同一个IP网段,因此需要求助于自己的默认网关,让网关来帮助自己将数据包转发出去。那首先得把数据转发到网关吧?因此目的MAC地址填写的就是网关192.168.1.254对应的MAC地址。但是初始情况下,PC可能并不知晓192.168.1.254对应的MAC地址,所以,它会发送一个ARP广播去请求192.168.1.254的MAC,R1的GE0/0/0口会收到这个ARP请求并且回送ARP响应报文。如此一来PC就知道了网关的MAC,它将网关MAC 0018-0011-0001填写在以太网数据帧头部的目的MAC地址字段中。另外,以太网数据帧头的类型字段写上0x0800这个值,表示这个数据帧头后面封装的是一个IP包。费了好大劲儿,这个数据帧(Frame)终于搞定了,如下图所示:

    1. 值得一提的是,事实上在物理链路中传输的是比特(bit)流,或者电气化的脉冲型号,只不过为了方便理解和更加直观地分析,我们往往会以IP包或者数据帧的形式来阐述通信过程。所以从物理上说,最终这个以太网数据帧变成了一堆的101110101从网线传到了路由器R1上,如下图所示:

    1. 路由器R1在收到这一串的1010…后,先将他们还原成数据帧(如下图所示)。然后会采用相应的机制检查一下数据帧在传输过程中是否有损坏,如果没有损坏,那么就瞅瞅数据帧头部中的目的MAC地址,看看目的MAC地址是不是我收到这个数据帧的GE0/0/0接口的MAC,结果发现正好是自己的MAC,那么它会很高兴,觉得这个数据帧是给它的,它查看数据帧头部的类型字段,发现是0x0800,于是它知道里头装的是一个IP包,接着它将以太网帧头剥去,或者说解封装,然后将里面的数据移交给上层的IP协议继续处理。

    1. 现在R1的IP协议栈接着处理这个报文。它会先校验一下数据在传输过程中IP报文有没有受损,如果没有,它就查看IP头中的目的IP地址(如下图所示),结果发现目的IP地址为192.168.2.1,并不是自己的IP地址——原来这个数据包是发给别人的,于是它开始拿着目的地址192.168.2.1到自己的地图(路由表)里去查询,看看有没有到192.168.2.1这个目的地的路径,结果发现有,并且这个路由条目指示它把数据包从从GE0/0/1口送出去,并交给192.168.12.2这个下一跳IP地址。于是它不再继续拆开IP头看里头的东东了,而是乖乖的将IP数据包往下交还给数据链路层去处理。

    1. 现在数据链路层继续处理上层下来的IP包,它为这个IP包封装上一个新的以太网帧头,帧头中源MAC地址为R1的GE0/0/1口的MAC:0018-0011-0002,目的MAC是这个数据包即将交给的下一跳路由器192.168.12.2对应的MAC,当然初始情况下R1是不知道这个MAC的,因此又是一轮ARP请求广播及回应过程并最终拿到这个MAC:0018-0022-0001,于是它将这个值填写在目的MAC字段中。完成了新的数据帧封装后(如下图所示),R1把这个数据帧变成1010101…通过电气信号传递给R2。

    1. R2收到这些10101…后,同样的,还是先将其还原成帧,然后查看帧头,发现目的MAC填写的就是自己接口的MAC,并且帧头中类型字段写的是0x0800(指示上层协议是IP,也就是数据帧头内封装的是一个IP包),于是将数据帧头剥去,将里头的IP数据包交给IP协议去处理。

    2. 而IP协议在处理过程中发现,目的IP地址并非本路由器的IP(如下图所示),于是它知道这个数据包不是发送给自己的,它拿着目的IP地址192.168.2.1在自己路由表中查询,结果发现,R2的GE0/0/1口就连接着192.168.2.0/24网络,原来家门口就是了,于是它将这个IP包交还给下层协议去处理。

    1. 接下来又是重新封装成帧,R2为这个IP包封装一个新的数据帧头部,帧头中,源MAC为R2的GE0/0/1口的MAC,目的MAC为192.168.2.1这个IP地址对应的MAC,如果ARP表里有192.168.2.1对应的MAC,则直接将MAC地址写入目的MAC中,如果没有,则发ARP请求报文去请求该地址。另外类型字段依然填写0x0800。最终,R2将这个数据帧传给了Server,如下图所示:

    1. 好不容易,终于数据帧到达了Server(如下图所示)。Server首先将这些比特流还原成帧,然后做校验看看帧是否损坏,如果没有,则查看数据帧的目的MAC,结果发现就是自己的网卡MAC,于是查看类型字段,发现是0x0800,知道这里头装的是一个IP包,于是将帧头剥去,将内层的IP数据包交给IP协议去处理。IP协议层收到这个数据包之后,首先查看IP包是否损坏,如果没有,则查看目的IP地址,发现目的IP地址是192.168.2.1——正是自己的网卡IP,于是它知道,这个IP包是发给自己的,因此继续查看IP包头中的协议字段,发现协议字段填写的是6这个值,原来这个IP包头后面封装的是一个TCP的数据,于是将IP包头剥去,将里头的TCP数据交给上层的TCP协议处理。而TCP在处理这个数据的时候,查看TCP头部的目的端口号,发现目的端口号是80,而Server本地的TCP 80端口是开放的,开放给HTTP应用了,因此它将TCP头部剥去,将里头的载荷交给HTTP应用。终于,从PC发送出来的HTTP应用数据到达了目的地——Server的HTTP应用的手中。

    展开全文
  • 在OSI开放互联参考模型中,对等实体之间数据单元在发送方逐层封装,在接收方的逐层解析。发送方N实体从N+1实体得到的数据包称为服务数据单元(Service Data Unit,SDU)。N实体只将其视为需要本实体提供服务的...

    1.通信协议的概念及其要素

    在OSI开放互联参考模型中,对等实体之间数据单元在发送方逐层封装,在接收方的逐层解析。发送方N层实体从N+1层实体得到的数据包称为服务数据单元(Service Data Unit,SDU)。N层实体只将其视为需要本实体提供服务的数据,将服务数据单元进行封装,使其成为一个对方能够理解的数据单元(Protocol Data Unit,PDU),封装过程实际上是为SDU增加对等实体间约定的控制信息(Protocol Control Information,PCI)的过程。

    为了保证网络的各个功能的相对独立性,以及便于实现和维护,通常将协议划分为多个子协议,并且让这些协议保持一种层次结构,子协议的集合通常称为协议簇。

    网络协议的分层有利于将复杂的问题分解成多个简单的问题,从而分而治之。各层的协议由各层的实体实现,通信双方对等层中完成相同协议功能的实体称为对等实体。对等实体按协议进行通信,所以协议反映的是对等层的对等实体之间的一种横向关系,严格地说,协议是对等实体共同遵守的规则和约定的集合。

    通信协议精确地定义了双方通信控制信息和解释信息:发送方能将特定信息(文本、图片、音频、视频)按协议封装成指定格式的数据包,最终以串行化比特流在网络上传输;接收方接收到数据包后,根据协议将比特流解析为本地化数据,从而获取对方发送过来的原始信息。

    通信协议包括三个要素:

    (1)语法:规定了信息的结构和格式;

    (2)语义:表明信息要表达的内容;

    (3)同步:规则涉及双方的交互关系和事件顺序。

    整个计算机网络的实现体现为协议的实现,TCP/IP协议是Internet互联网的核心协议。

     

    2.通信协议开发步骤

    (1) 协议的开发主要包括协议设计、协议形式描述、协议实现和协议一致性测试。协议的开发过程与步骤如图1所示。

    图1 协议开发过程与步骤

    (2) 协议设计过程中的分组发送接收模型如图2所示。

     

    图2协议设计过程中的分组发送接收模型

    (3)协议的一致性测试

    协议的一致性测试是指测试协议能否按照预想的控制策略实现正确的通信,主要体现在数据包通过信道从信源传送到信宿后,信宿能够根据协议正确的解析出原始信息。

    协议的一致性测试如图3所示。

    图3 协议一致性测试环境

    根据测试环境的可以分为局部测试和分布式测试,如图4所示。

    图4局部测试法、分布式测试法

     

    3.数据包和数据报

    为方便描述自定义协议,还是借用数据包和数据报来描述封装数据单元和传输数据单元,但这里的数据包和数据报完全不同于TCP/IP架构中的Packet和Datagram概念。

    下文所述的数据包指封装的基本单位,以TLV(Type-Length-Value)格式封装基本消息单位;数据报Package是传输的基本单位,头部包含序列号和命令信息。接收端根据命令信息分辨事件类型,做出不同的解析。报文实体是多个TLV数据包组成的链表。

     

    4.数据包TLV的设计

    从应用层HTTP协议,到超文本置标语言HTML(HyperText Mark-up Language),再到可扩展置标语言XML(Extensible Markup Language),它们提供了数据的格式化存储、传输和格式化显示的规范,是网络通信的基石。然而HTTP协议以及HTML/XML置标语言的本质就是定义一堆标签(Tag)对数据进行串行化序列化,然后接收方再根据标签解析、还原数据。

    自定义通信协议的关键是对数据包的合理构造(construct)和正确解析(parse),即制定编解码规则。

    抽象语法标记ASN(Abstract Syntax Notation) BER的长度确定的编码方式,由3部分组成Identifier octets、Length octets和Contents octets,实际上这就是一中TLV(Type-Length-Value)模型:类型字段(Type或Tag)是关于标签和编码格式的信息;长度字段(Length)定义数值的长度; 内容字段(Value)表示实际的数值。

    因此,一个编码值又称TLV三元组。编码可以是基本型或结构型,如果它表示一个简单类型的、完整的显式值,那么编码就是基本型(primitive);如果它表示的值具有嵌套结构,那么编码就是结构型 (constructed)。

    TLV编码就是指对Type(Tag)、Length和Value进行编码,形成比特流数据包;解码是编码的逆过程,是从比特流缓冲区中解析还原出原始数据。

    采用C++编程语言设计TLV协议类,其类视图如图5所示。

    图5 CTLV类视图

    目前只提供设置整形值(int型)的setValue_Int和设置字符串值(C_String型)的SetValue_Cstring两个接口。

    TLV将数据封装成包的格式如表1所示。

    表1 TLV包格式

    TLV包

    头部

    包实体

    m_dwTag

    m_nLen

    m_pValue

         

    TLV的接口说明:

    (1)值类型标签m_vtTag是内部辅助枚举变量,它根据构造TLV时传递的服务类型标签m_dwTag来确定。

    (2)TLV::m_nLen在为TLV设置具体值时确定。

    (3)TLV包的封装:

    1)使用Tag参数创建一个TLV对象后,调用TLV::setValue_*方法为TLV填充具体值;

    2)调用TLV::toBuffer方法打包到缓冲区streamBuffer。

    (4)TLV包的解析:创建一个TLV对象后,调用TLV::fromBuffer方法从缓冲区streamBuffer解析出TLV。

    (5)封装和解析涉及到本机字节顺序和网络字节顺序的转换问题。

    (6)调用TLV::setValue_*方法填充TLV时,统一字节边界数为4。

     

    5.数据报Package的设计

    不同于底层的数据包/数据报只是对数据层次的封装解析,实际应用程序是以事件驱动的,因此必须注册不同的信令(事件类型标签),然后填充到数据报中。接收端根据信令做出相应的事件处理。

    例如在C/S通信系统中,客户端往往要先登录,通过服务器端的校验才能进行后续通信。因此客户端运行后,需要构造并向服务器端发送含有LOGIN信令的包含用户名字符串strUserName和密码字符串strPassWord的数据报;服务器端解析LOGIN信令后做校验处理,然后发送含有LOGIN_RESPONSE信令和校验结果的回执数据报给客户端。

    采用C++编程语言设计Package类,其类视图如图6所示。

    图6 CPackage类视图

    Package类将TLV封装成包的格式如表2所示。

    表2 Package包格式

    Package包

    头部

    序列号

    包实体

    m_nCmdLen

    m_dwCmdID

    m_dwCmdState

    m_nSeqNo

    Count*Tlv

             

    Package的接口说明:

    (1)Package::m_nCmdLen是整个Package包的长度,将其作为首个字段的好处在于当传送大数据包时,接收方可以根据数据长度来控制读状态,从而将一个大数据包分批接收。

    (2)Package::m_nCmdLen在构造函数中初始化为16,在调用Package::addTLV方法填充包实体时增长。

    (3)Package包的封装:

    1)创建Package对象后,调用Package::setHeader方法填充头部信令;

    2)创建TLV对象并填充数据,再调用Package::addTLV方法填充包实体;

    3)调用Package::toBuffer方法将Package打包到缓冲区streamBuffer。

    (4)Package包的解析:

    1)先创建一个Package对象,调用Package::fromBuffer方法从缓冲区streamBuffer先解析出Package的头部和序列号,再从剩余缓冲区中解析出TLV并将其串行化到链表。

    2)调用Package::getTLV方法根据Tag从链表中查找具体TLV包,再调用TLV::getValue方法取得具体值。

    (5)Package::toBuffer方法和Package::fromBuffer方法主要遍历Package::m_TLV_List列表,然后调用TLV::toBuffer方法和TLV::fromBuffer方法解析出TLV数据单元。

    TLV数据包的功能测试(主要是本地测试)

    鉴于实际通信数据最后都要转换成比特流,故只测试发送字符串类型的变量,仅测试协议能否正确打包、解析。其他类型的普通数据都可以转换成字符串传输,最后,接收方根据m_dwTag确定值类型m_vtTag,解析出具体值。

    对TLV::setValue_C_String方法填充TLV的测试,需要考虑字节对齐问题。对于长度为4字节倍数的C状态字符串,打包时省去末尾的‘/0’结束标志符。需要测试长度非4倍数的字符串和长度为4倍数的字符串。

    经本地测试,调用TLV::setValue_Int方法和TLV::setValue_C_String方法构造整形和字符串时,能够正确封装、正确解析。

    Package数据报的功能测试,主要是将TLV组合成包,然后添加信令,完成特定的通信。对登陆LOGIN和发送消息SUBMIT_SM的测试表明Package协议能正确封装、正确解析。

    在实际项目中使用Package通信协议,对于稍大一点的数据块需要控制好读的步骤,以便能接收整包完整的信息。


    本文代码下载:《TLV应用层协议开发示例

     

    参考:

    《计算机网络协议和实现技术》 鲁士文

    展开全文
  • TCP/IP模型是当今IP网络的基础(也被称为DoD模型,上图我贴出的并不是标准的TCP/IP模型,为了方便下文的阐述,这里给出的是一个TCP/IP模型与OSI模型的对等模型),它将整个数据通信的任务划分成不同的功能层次(L

    1. 回顾TCP/IP模型

    图片

    什么是数据网络(Data Network)?简单地说,数据网络就是一个由各种设备搭建起来的一张网,常见的设备有:路由器、交换机、防火墙、负载均衡器、IDS/IPS、VPN服务器等等。数据网络最基本的功能就是实现不同节点之间的数据互通,也就是数据通信。

    TCP/IP模型是当今IP网络的基础(也被称为DoD模型,上图我贴出的并不是标准的TCP/IP模型,为了方便下文的阐述,这里给出的是一个TCP/IP模型与OSI模型的对等模型),它将整个数据通信的任务划分成不同的功能层次(Layer),每一个层次有其所定义的功能,以及对应的协议。打个比方,对于一家公司而言,一笔业务需要各个部门相互协同工作才能完成,部门与部门之间既相互独立,但是又需要相互配合,可以借用这种思路来理解TCP/IP参考模型。分层参考模型的设计是非常经典的理念:

    1. 层次化的模型设计将网络的通信过程划分为更小、更简单的部件,因此有助于各个部件的独立开发、设计和故障排除;

    2. 层与层之间相互独立,又互相依赖,每一层都有该层的功能、以及定义的协议标准。层层之间相互配合,共同完成数据通信的过程;

    3. 通过组件的标准化,允许多个供应商进行开发;

    4. 通过定义在模型的每一层实现什么功能,鼓励产业的标准化;

    5. 允许各种类型的网络硬件和软件相互通信。

    图片

    上面这张图显示的就是每个层次对应的代表性协议。

    2. 理解数据通信过程

    图片

    根据上图所示的网络拓扑(Topology),我们来分析一下PC访问Server的WEB服务的详细通信过程。

    在阐述过程中,我们聚焦的重点是利用TCP/IP参考模型理解数据通信过程,因此可能会忽略部分技术细节,例如DNS、TCP三次握手等,这些技术细节这里暂不做讨论。现在你要换一种视野来看待这个“世界”了,想象一下上图所示的终端以及路由器都是一个个的“TCP/IP通信模型”,事实上,整个过程在宏观层面体现如下:

    图片

    我们一步一步的来分析:

    1. PC的用户在WEB浏览器中访问Server的WEB服务(这里我们暂且不去关注HTTP交互、DNS交互等细节,重点看通信过程),PC的这次操作将触发HTTP应用为用户构造一个应用数据(如下图所示)。当然这个数据最终要传递到Server并“递交”到Server的HTTP应用来处理,但是HTTP不关心数据怎么传、怎么寻址、怎么做差错校验等等,这些事情交由专门的层次来完成,所以HTTP应用数据还需经过一番“折腾”才能从PC传到Server,OK GO。

    图片

    1. 由于HTTP基于TCP,因此这个应用数据交由参考模型中的主机到主机层(第4层)进一步处理。在该层,上层HTTP应用的数据被封装一个TCP的头部(可以简单的理解为套了一个TCP的信封)在TCP头部中我们重点关注两个字段(信封上写的东西),一个是源端口号,另一个是目的端口号,源端口号为随机产生的端口号(是PC本地设置的、专门用于本次会话的端口),目的端口号为80(HTTP服务对应的默认端口号是80),如下图所示。然后这个数据段(Segment)被交给下一个层处理。

    图片

    1. 下一层是网络层,也叫因特网层(第3层),处于这个层的IP协议为这个上层下来的数据封装一个IP头部(在之前的基础上又套了一个信封,如下图所示),以便该数据能够在IP网络中被网络设备从源转发(路由)到目的地。在IP头当中我们重点关注源IP地址、目的IP地址、协议号这三个字段。其中源地址填写的是PC自己的IP地址192.168.1.1,目的地址存放的是Server的IP地址192.168.2.1,而协议号字段则存放的是值6,这个值是一个众所周知(Well-Known),也就是行业约定的值,该值对应上层协议类型TCP,表示这个IP头后面封装的上层协议为TCP(形象点的描述是,协议字段用于表示这个IP信封里装的是一个TCP的内容)。搞定之后,这个数据被交给下一层处理。

    图片

    1. 为了让这个IP数据包能够在链路上传输(从链路的一个节点传到另一节点),还要给数据包封装上一个数据链路层(第2层)的头部,以便该数据能够在链路上被顺利传输到对端。由于PC与R1之间为以太网链路,因此上层来的IP数据包被封装一个以太网的数据帧头(再增加一个信封)。这个帧头中写入的源MAC地址为PC的网卡MAC,那么目的MAC呢?PC知道,数据的目的地是192.168.2.1这个IP,而本机IP是192.168.1.1/24,显然,目的地与自己并不在同一个IP网段,因此需要求助于自己的默认网关,让网关来帮助自己将数据包转发出去。那首先得把数据转发到网关吧?因此目的MAC地址填写的就是网关192.168.1.254对应的MAC地址。但是初始情况下,PC可能并不知晓192.168.1.254对应的MAC地址,所以,它会发送一个ARP广播去请求192.168.1.254的MAC,R1的GE0/0/0口会收到这个ARP请求并且回送ARP响应报文。如此一来PC就知道了网关的MAC,它将网关MAC 0018-0011-0001填写在以太网数据帧头部的目的MAC地址字段中。另外,以太网数据帧头的类型字段写上0x0800这个值,表示这个数据帧头后面封装的是一个IP包。费了好大劲儿,这个数据帧(Frame)终于搞定了,如下图所示:

    图片

    1. 值得一提的是,事实上在物理链路中传输的是比特(bit)流,或者电气化的脉冲型号,只不过为了方便理解和更加直观地分析,我们往往会以IP包或者数据帧的形式来阐述通信过程。所以从物理上说,最终这个以太网数据帧变成了一堆的101110101从网线传到了路由器R1上,如下图所示:

    图片

    1. 路由器R1在收到这一串的1010…后,先将他们还原成数据帧(如下图所示)。然后会采用相应的机制检查一下数据帧在传输过程中是否有损坏,如果没有损坏,那么就瞅瞅数据帧头部中的目的MAC地址,看看目的MAC地址是不是我收到这个数据帧的GE0/0/0接口的MAC,结果发现正好是自己的MAC,那么它会很高兴,觉得这个数据帧是给它的,它查看数据帧头部的类型字段,发现是0x0800,于是它知道里头装的是一个IP包,接着它将以太网帧头剥去,或者说解封装,然后将里面的数据移交给上层的IP协议继续处理。

    图片

    1. 现在R1的IP协议栈接着处理这个报文。它会先校验一下数据在传输过程中IP报文有没有受损,如果没有,它就查看IP头中的目的IP地址(如下图所示),结果发现目的IP地址为192.168.2.1,并不是自己的IP地址——原来这个数据包是发给别人的,于是它开始拿着目的地址192.168.2.1到自己的地图(路由表)里去查询,看看有没有到192.168.2.1这个目的地的路径,结果发现有,并且这个路由条目指示它把数据包从从GE0/0/1口送出去,并交给192.168.12.2这个下一跳IP地址。于是它不再继续拆开IP头看里头的东东了,而是乖乖的将IP数据包往下交还给数据链路层去处理。

    图片

    1. 现在数据链路层继续处理上层下来的IP包,它为这个IP包封装上一个新的以太网帧头,帧头中源MAC地址为R1的GE0/0/1口的MAC:0018-0011-0002,目的MAC是这个数据包即将交给的下一跳路由器192.168.12.2对应的MAC,当然初始情况下R1是不知道这个MAC的,因此又是一轮ARP请求广播及回应过程并最终拿到这个MAC:0018-0022-0001,于是它将这个值填写在目的MAC字段中。完成了新的数据帧封装后(如下图所示),R1把这个数据帧变成1010101…通过电气信号传递给R2。

    图片

    1. R2收到这些10101…后,同样的,还是先将其还原成帧,然后查看帧头,发现目的MAC填写的就是自己接口的MAC,并且帧头中类型字段写的是0x0800(指示上层协议是IP,也就是数据帧头内封装的是一个IP包),于是将数据帧头剥去,将里头的IP数据包交给IP协议去处理。

    2. 而IP协议在处理过程中发现,目的IP地址并非本路由器的IP(如下图所示),于是它知道这个数据包不是发送给自己的,它拿着目的IP地址192.168.2.1在自己路由表中查询,结果发现,R2的GE0/0/1口就连接着192.168.2.0/24网络,原来家门口就是了,于是它将这个IP包交还给下层协议去处理。

    图片

    1. 接下来又是重新封装成帧,R2为这个IP包封装一个新的数据帧头部,帧头中,源MAC为R2的GE0/0/1口的MAC,目的MAC为192.168.2.1这个IP地址对应的MAC,如果ARP表里有192.168.2.1对应的MAC,则直接将MAC地址写入目的MAC中,如果没有,则发ARP请求报文去请求该地址。另外类型字段依然填写0x0800。最终,R2将这个数据帧传给了Server,如下图所示:

    图片

    1. 好不容易,终于数据帧到达了Server(如下图所示)。Server首先将这些比特流还原成帧,然后做校验看看帧是否损坏,如果没有,则查看数据帧的目的MAC,结果发现就是自己的网卡MAC,于是查看类型字段,发现是0x0800,知道这里头装的是一个IP包,于是将帧头剥去,将内层的IP数据包交给IP协议去处理。IP协议层收到这个数据包之后,首先查看IP包是否损坏,如果没有,则查看目的IP地址,发现目的IP地址是192.168.2.1——正是自己的网卡IP,于是它知道,这个IP包是发给自己的,因此继续查看IP包头中的协议字段,发现协议字段填写的是6这个值,原来这个IP包头后面封装的是一个TCP的数据,于是将IP包头剥去,将里头的TCP数据交给上层的TCP协议处理。而TCP在处理这个数据的时候,查看TCP头部的目的端口号,发现目的端口号是80,而Server本地的TCP 80端口是开放的,开放给HTTP应用了,因此它将TCP头部剥去,将里头的载荷交给HTTP应用。终于,从PC发送出来的HTTP应用数据到达了目的地——Server的HTTP应用的手中。

    图片

    好文推荐:【新华三】网络工程师 H3C如何配置VLAN-trunk 二层隔离技术

    展开全文
  • 分类将一个MAC SDU映射到一个特定MAC对等实体之间的传输连接上,使MAC SDU与一个连接联系在一起, 同时与连接的服务流特性建立联合。该过程有利于具有适当QoS限制的MAC SDU传输。  一个分类器是一组应用于IEEE 802...
  • 严格对等层通信对等层相同协议 主机间数据传输 1.应用层: 网络用户接口 2.表示层:数据如何表示 加密解密等特殊过程 3.会话层 :保持不同应用进程独立 底层数据流 4.传输层:TCP UP协议 分割上层...
  • 通信协议

    2011-05-13 14:04:00
    开放互联参考模型中,对等实体之间数据单元在发送方逐层封装,在接收方的逐层解析。发送方N 实体从N+1 实体得到的数据包称为服务数据单元(Service Data Unit ,SDU )。N 实体只将其视为需要本实体提供...
  • 通信网课后答案

    2013-05-05 10:48:40
    第一章 1、构成现代通信网的要素有哪些?...画出对等层之间通信过程? 答:(1)降低网络设计的复杂度、方便异构网络间的相互连通、增强网络的可升级性、促进了竞争和设备制造商的分工。(2)图略
  • 严格对等层通信对等层相同协议 主机间数据传输 1.应用层: 网络用户接口 2.表示层:数据如何表示 加密解密等特殊过程 3.会话层 :保持不同应用进程独立 底层数据流 4.传输层:TCP UP协议 分割上层数据...
  • 网络参考模型

    2021-01-17 17:39:16
    增加控制信息,构成协议数据单元PDU,控制信息主要有地址,差错检查,协议控制,OSI统一将对等层之间传输的数据单位称为协议数据单元(Protocal Data Unit) 2.1) 物理层 任务:以比特为单位,实现每一个比特的传输...
  • 信源 对等层通信 信宿 应用层:为应用程序提供网络服务 表示层:数据格式化,加密,解密 会话层:建立、维护、管理、会话连接 传输层:建立,维护管理端到端的连接数据段 网络层:IP寻址和路由选择,分组数据报文 ...
  • 计算机网络 - 网络

    2020-05-18 08:44:58
    网络应用应用的概述网络应用模型Client/Server 客户服务器模型P2P(Peer - to - peer) 对等模型应用的功能查询服务和远程作业登陆 -DNS(域名解析系统)域名域名服务器域名解析过程文件传输,访问,管理 - ...
  • 4.1.6 对等层通信 165 4.1.7 基本过程 165 4.2 无线链路控制(RLC)子层 168 4.2.1 RLC子层的总体模型 169 4.2.2 RLC子层支持的功能 169 4.2.3 RLC子层提供给高层的服务 170 4.2.4 RLC子层与高层(RRC、PDCP、...
  • 刷题day16

    2018-10-31 22:29:22
    1.虚拟通信是指这次通信实际上是不存在的这句话对错与否? 正确答案: B 你的答案: B (正确) A.正确 B....解析:虚拟通信又叫对等通信...在这一过程中,每一层的协议在对等层之间交换信息,该信息成为协议数据单元(PDU...
  • 《阿里技术之瞳》读书笔记网络部分:1、对等层通信的实质:2、对等层实体之间虚拟通信。3、下层向上层提供服务,实际通信在最底层完成。4、OSI每一层把上层的PDU作为本层的数据封装,然后加入本层的头部(或尾部)。...
  • Cisco ❀ 数据封装

    2019-04-01 16:35:22
    在OSI模型七层参考模型中,每层主要负责与其它机器上的对等层进行通信。该过程是在“协议数据单元”(PDU)中实现的,其中每层的 PDU 一般由本层的协议头、协议尾和数据封装构成。 每层可以添加协议头和尾到其对应的...
  • 计算机网络三

    2020-03-17 13:53:32
    讲在前面 信息通过网络传输的处理过程...对等层协议,通过API调用底层提供服务、为了透明,层和层之间交互,就将数据封装完整交给下一层 传输层 网络通信的端是进程 网络层分组存储转发 异构互连 物理层数据校验、辅...
  • OSI模型和TCP/IP模型

    2020-10-20 09:05:13
    不同节点的同等层次(对等层)按照协议实现同等层之间通信。 每个层次收到上层传送过来的数据后将本层次的控制信息加入数据单元的头部,一些层次还将校验和等信息附加到数据单元的尾部,这个过程叫做封装。 当数据...
  • tcp ip socket

    2020-08-17 17:11:40
    会话:管理主机之间会话过程 会话建立 终止 及过程管理 传输:提供数据传输服务,检测丢弃的数据包,并请求重传 网络:将各个子网之间进行路由组合,传输单位位数据包,有IP协议等 数据链路:对比特流数据成...
  • 对等层通信的实质 对OSI/RM与TCP/IP各层功能的理解(6个设计原则) 三.无线和移动网络 无线链路存在的问题(隐藏终端、暴露站等);无线链路的特点;SNR,BER和传输率之间的关系。 802.11无线Lan工作模式:...
  • 3.2 TCP/IP通信过程 (1)应用:浏览器和Web服务器是两个对等的实现,它们之间使用http协议进行通信。 (2)传输:网页传输之前,将数据分段后加上传输首部放入缓存。浏览器的传输收到数据后放入缓存。...
  • 层之间是独立的。 灵活性好。 结构上可分割开。 易于实现和维护。 能促进标准化工作。 与层次模型相关的若干术语 源和目标 实体与对等实体 服务与接口 协议与协议数据单元 源 通信过程中,数据的发送方 目标 ​ ...
  • 电路交换:电路交换用于电话通信系统,两个用户要通信之前需要建立一条专用的物理链路,并且在整个通信过程中始终占用该链路。由于通信的过程中不可能一直在使用传输线路,因此电路交换对线路的利用率很低,往往不到...
  • 网络协议指的是计算机网络中互相通信对等实体之间交换信息时所必须遵守的规则的集合。 对等实体通常是指计算机网络体系结构中处于相同层次的信息单元。一般系统网络协议包括五个部分:**通信环境**,**传输服务**...
  • 计算机网路基本概念链路PPP协议CSMA/CD 协议 基本概念 ISP 互联网服务提供商 ISP ...电路交换用于电话通信系统,两个用户要通信之前需要建立一条专用的物理链路,并且在整个通信过程中始终占用该链路。由于通信的过

空空如也

空空如也

1 2 3 4
收藏数 65
精华内容 26
关键字:

对等层之间通信过程