网络基础:浅谈报文在网络中的传输

目录

1. 报文在网络中是如何传输的

2. 如何理解报头

2.1 生活中的“报头”

2.2 什么是报头

2.3 如何理解封装和解包


1. 报文在网络中是如何传输的

        由于软件是分层的,而网络也属于软件,故网络(此处指网络协议栈)也是层状结构的。

        TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。每一层的主要功能(从下至上)如下:

物理层:负责光/电信号的传递方式。例如现以太网通用的网线(双绞线),早期以太网采用的同轴    电缆(现主要用于有线电视),光纤,现在的无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等,集线器也是工作在物理层的。

数据链路层:负责设备间数据帧的传送和识别。例如网卡设备的驱动,帧同步(从网线上检测到什  么信号算作新帧的开始)、冲突检测(若检测到数据帧冲突就自动重发)、数据差错校验等工作。有以太网(碰撞检测)、令牌环网、无线LAN等标准。交换机工作在数据链路层。

网络层:主要负责地址管理和路由选择。例如在IP协议中,通过IP地址来标识一台网络中主机,    并通过路由表路由查找的方式来规划两台主机间数据传输的线路(路由)。路由器(Router)    工作在网络层。

传输层:负责两台主机间的数据传输。如传输控制协议(TCP), 制定数据传输策略(发多少,怎么发  等),能够确保数据可靠的从源主机发送到目标主机。

应用层:负责应用程序(进程)间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远  程访问协议(Telnet) 等 。

一般来说:

        对于一台主机而言,它得操作系统内核实现了从传输层到物理层的内容;

        对于一台路由器,它实现了从网络层到物理层;

        对于一台交换机,它实现了从数据链路层到物理层;

        对于集线器,它只实现了物理层;             

        那么报文在协议栈中是如何传输的呢?

        首先,报文的传输必须是自顶向下交付给下层协议,且到达每层时,要添加本层的报头交付给下层,通过以太网到达对端向上交付时也必须是一层一层解包向上交付。打个比方,王老师此时在1#楼401教室,需要班长到2#楼401教室送个文件给张老师,那么班长就必须从1#楼4层下到1楼,走一段路,再从2#楼楼门进去,从一楼走楼梯到4楼。他是不能够从1#楼4楼直接到2#楼4楼的,任何同楼层都是不能直接过去的。故报文的传输如下图中绿色线条的路径。

        那么在报文传输的过程中,各层协议又起到什么作用呢?这里就举个“栗子🌰”吧~

        在生活节奏异常快速的当下,网购成为了我们购物的主要手段,这里三个主要的角色:买家卖家以及快递公司,买家就充当应用层的角色,假设在昆明的客户根据自己的需求下单了一个洗发水。而在西安的卖家接收到这个订单后,就立马下楼从仓库把洗发水拿出来,叫了个快递员,打包好,贴上快递单,就把这个快递发出了,从云南省到陕西省,该走哪条路线,是该从云南->四川->陕西,还是说从云南->贵州->重庆->陕西,这个是由IP决定的,而从一站到下一站该怎么去,是空运还是陆运,这个是由数据链路层决定的。假如说这个包裹,在路上丢了,或者是破损了,少配件了,要补发还是重发,这个是由TCP决定的。当然这只是一个生活中的比喻,针对各层协议会在其他的文章中详述。

2. 如何理解报头

        那么我们该如何理解报头呢?

2.1 生活中的“报头”

        在上述例子中,快递单就类似于快递的报头,发快递的是谁,从哪里发的,发到哪里去,或者说物流就类似于报头,信息里记录着这个包裹从哪来,到哪去,还有更详细的,这个包裹,上一站在哪,下一站到哪里。

2.2 什么是报头

        那么在计算机OS中,我们该怎样理解报头和数据呢?此处的数据为报文中的有效载荷。

        LinuxOS是C语言实现的,站在语言的角度,报头是一种结构化的数据。下面用一段伪代码进行说明:

struct my_head {
    unsigned int src:16;
    unsigned int dst:16;
    unsigned int type:8;
    unsigned int len:24;
}

        定义了一个报头(只是为了说明,无意义),该位段中有该报文的源地址,目的地等相关的信息。

struct my_head head;
head.src = 0x1;
head.dst = 0x2;
head.type = 0x3;
head.len = 0x4;

        定义了一个位段变量,将相应的报头信息填写在相应的位置中。这样就有了一个较为简陋的报头。

2.3 如何理解封装和解包

        封装就是每层协议在本层收到的有效载荷前添加自己报头的过程。例如现在的有效载荷为hello,那么将有效载荷和报头信息都拷贝(memcpy&&memmove)至缓冲区,完成封装过程。

        而解包的过程,其实就是去除报头,提取有效载荷。在本文中可通过(struct my_head *)ptr++来实现解包的过程,ptr每加一次就相当于脱一层报头,最终就能够提取到有效载荷,完成解包。若想提取有效载荷的信息,可通过ptr->来实现。


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值