《探寻linux协议栈》之一:linux协议栈概述

来源:互联网 发布:mac地址查询厂商设备 编辑:程序博客网 时间:2024/05/22 16:39

  • 写在前面的话
    • 如何定义linux协议栈
      • 真实的报文是怎么样的
      • linux收发包大概流程
    • linux协议栈分层设计思想
    • linux分层究竟对报文做了什么
  • 总结

写在前面的话

本人所从事开发以来,一直在做数据面相关。数据面是一个通信设备最终好不好用最直接的体现。
因为一个网络设备,好不好用,数据转发快不快,数据转发稳定不稳定,全部都是用户最直接体
现。所以工作八年以来,对linux内核协议栈业也积累了自己的一些心得。现在想通过系列博文,
写出来,也算是对自己的一个好的总结。如果有人看到该系列博文,而且有所帮助,那也是我的
最大的荣幸所在了。

如何定义linux协议栈

写这个标题我心里其实非常发虚,为毛?因为这个概念实在有点大,好比小时候我们谈到理想,要成为接班人一样。到后面就会发现,接班人这个概念很大,这些年一直做的事情其实就是学习,工作,赚钱,买房结婚等等。

同样,linux协议栈很大。最开始我们接触TCP/IP中提到过一个概念,就是分层。比如比较认可的分层方法如下图:

常规的分层

除此之外,还有比较经典的osi七层模型。不管是tcpip中的分层或者是osi的分层,都无所谓。这里我们会不会问一个问题:为什么需要分层?不分行不行?

关于这个问题,我试图从以下两个方面来说下我自己对这个问题的看法:

真实的报文是怎么样的?

真实的报文,我们都在谈论报文,说明是报文?小明和女朋友两地分居,到晚上,经不住思念困扰,小明拿起手机打开微信给女朋友发了一条信息:我想你亲爱的。这条信息经过手机系统里通信协议栈处理,最后通过驱动层变成一堆比特流发送出去,这就是一个报文,当然更加确切说,是在驱动层发送出去之前。那么。一个报文的样子其实是这样的,见下图:
一个TCP报文

没错,不那么好看,和我们想象中真的不太一样。然而,这就是真实的报文。仔细看会发现,一个以太网数据报,拿tcp为例子,包含以下信息:

  • 以太网头
  • IP头
  • tcp头
  • http/ssh 等头
  • 数据部分(比如小明发送的:亲爱的,我想你)

这个例子中的是一个tcp报文,不同报文的结构是不一样的,从上面的图中可以发现,报文像是穿了一层层的衣服,剥开这一层层的衣服,才可以看到里面的奥妙。这就是协议栈采用分层后的效果。这些也就是我接下来要系统写的协议栈内容。

linux收发包大概流程

为了更加清晰的看到协议栈分层思想,我们不妨从一个报文从进入linux机器网卡开始追踪报文的一生。人总有一死,或重于泰山,或轻于鸿毛。报文也一样,从生到死,一样精彩,一样要不停的选路,走路。那么究竟一个报文从进入linux中之后,要经历怎样的有趣旅程呢?看下面这一附图:

报文旅程

linux协议栈分层设计思想

  • 分层就像一栋大楼里的每层楼一样,层次分明。你要办理什么事情,该去哪一层的办理就去哪一层办理。与之不太一样的是,linux协议栈的分层设计,可以确保报文在每一层的独立性以及整个报文转发的逻辑性稳定性。

因为linux每个层面只用关心本层需要的报文信息和内容,不需要关心其它的任何多余信息。举例来说,L2层中,主要就是linux的bridge转发处理。那么只需要关注报文的eth_headr中的内容,就可以完成学习,转发。也就是只关心报文的MAC地址以及下一层的协议号即可。(L2转发后续会详细写文分析)。

  • 分层让整个协议栈看起来分工明确,协议标准化操作中,也有固化下来的流程组成完整架构,这样的话,即便有需求实现自己独有功能,从现有协议栈中比较轻易的切入和二次扩展开发。

linux分层究竟对报文做了什么

其实,总体说来,就是一年四季来回变化,我们不得不加衣服,去衣服。

对于linux内核来说,协议栈处理网络报文也是这么一个类似过程。首先我们要知道,每一层都有对应的协议头,比如L2层是ETH头,L3层是IP头/ARP头。等等。

那么,我把linux接收报文流程称作上行,发送一个报文称作下行。上行就是脱衣服的过程,报文从驱动进入时候,穿的非常齐整,经过L2层要去掉ETH头,经过L3层要去掉IP头,再后面就是依次脱掉TCP/UDP头,接下来是具体应用层协议头比如ftp/http等等。

详细可以参考下图:

linux协议栈发包流程

经过这样的处理,一个消息就发送出去了。可以看到,这样发送流程其实就是层层加头的流程。当然了,这幅图画的仅仅是个粗略的大概括,真实情况的封包转发远比这幅图复杂多了,后面我会详细写到。

同样道理,收包流程就是层层去头的过程。

总结

linux协议栈,就是一个报文从进入驱动开始,经过层层转发传输处理,最终达到报文终点,这一些列的流程,都是协议栈处理范围。也是我之后要重点写的内容。

阅读全文
1 0
原创粉丝点击