中断还是轮询取个数据包真麻烦

本文来自微信公众号:编程技术宇宙 (ID:xuanyuancoding),作者:轩辕之风 O

网络部新员工

我叫 Robert,是 Linux 帝国一个普通的公民。

今天是我第一天上班的日子,我下了好大功夫才考上了帝国的公务员,根据我的成绩,我被分到了帝国网络部。

一进入帝国的办公园区,我就被眼前的景象惊呆了,一座座高楼大厦,富丽堂皇,鳞次栉比,我忍不住驻足多看了几眼。

这些大楼上面都有招牌,最高的那一座是帝国的进程 & 线程管理部门的办公大厦,旁边还有内存管理部门、文件管理等部门办公大厦。

网卡驱动部门

我只顾东张西望,不小心跟旁边小路跑出来的一位小哥撞了一个满怀,他手里抱的一堆数据散落的满地都是。

我一边道歉,一边帮他捡起数据。

“这位小哥行色匆匆,不知要去哪里啊”,我好奇的问到。

“哦,你好,我是网卡驱动部门的,这是从网卡那里刚刚拿到的数据包,我得赶紧交给协议栈处理”,说完整理了下数据,就匆忙离开了。

寻着他出来的地方看去,不远处就是他说的网卡驱动部门,难道我办公的地方就在这里?我沿着这条小路走了过去。

一进入网卡驱动部门,出现在眼前的就是一副热火朝天的景象,收包的,解包的,发包的,一群人忙的不亦乐乎。

“这么早就这么忙碌了啊”,我问门口的保安大叔。

“是啊,这平时这个点也没什么网络访问,不知道今天怎么回事,一大早的数据就传输个不停”,保安说到。

我指着里面一个员工问保安:“大叔,那人在干嘛呢?一直在转来转去的”

“你说他啊,他在从网卡轮询读取数据包呢!”

轮询?网络数据包不是网卡发中断通知吗,干嘛要去轮询呢?”,我不解的问到。

“以前是这样的,不过后来 CPU 那边有个叫阿 Q 的家伙不干了,说网卡数据太频繁,老是打断他们正常的工作。不仅如此,中断响应的时候还得把中断给关了,避免出现错误,时间久了,键盘、鼠标等单位就得不到响应纷纷闹事了”,保安说完点了一支香烟。

我若有所思的点了点头,“那现在就改成轮询了?不过这样好浪费时间哦”

保安吐了一个烟圈,继续说到:“倒也不是全都是轮询,现在把处理过程分成了两段,最开始的第一部分还是靠中断来通知的,这个时候需要关一下中断,不过通知后不会真正处理数据包,而是开启了一个软中断,所以关不了太久时间。第二部分在软中断中去轮询处理的,这个时候就不用关中断了。把硬中断和轮询结合了一下,就不用每个数据包来都中断一次了,也不用关中断太长时间,还给这技术取了个名字叫 NAPI

“保安大叔,你怎么什么都知道啊?”

“我以前就在里面工作啊,现在年纪稍微大了些,比不上年轻人,就让我来当保安了,唉~”,大叔说完又猛抽了一口香烟,整理了下自己日益稀疏的头发。

“唉,对了,你是谁啊,怎么没见过你?”

“我是帝国网络部新来的员工,今天来报道的。我把手中的录取通知书递给了保安”

保安大叔看了看说到:“你走错了,不是这里,你该去网络协议栈大厦”。

协议栈大厦

离开网卡驱动部门,我继续前行终于找到了网络协议栈大厦,这便是我今后工作的地方了。

走近一看,这座网络大厦并不如前面看到的高大,只有三层高,每一层的墙上都挂着一个巨大的招牌,上面写着这一层的名字,从上向下分别是:

  • 应用层

  • 传输层

  • 网络层

大厦的门口还有一个收发室,门牌上写着 netif_receive_skb,收发室坐着一位大爷。

正在这时,先前碰到的小哥又来了,将手里的数据放到了收发室就离开了,看来这里就是网络协议栈的入口了。

大爷拆开这个数据包看了看,随即按了下按钮,数据包就顺着管道传到了背后协议栈大厦一楼的一个办公室,我抬头一看,上面写着 IPv4。再向旁边看去,还有好几间办公室,分别写了 IPv6、ICMP、IGMP、ARP・・・

我来到这个 IPv4 的门口,里面也是忙的不亦乐乎,有分片的、组包的、计算校验和的、有条不紊。

办公室正中央有一个圆柱形的管道,通向了二楼,一楼处理完毕就通过这管道把数据包送了上去。

墙上还有另一个管道,上面写着 netfilter hook,不知道是通向了哪里。

“你找谁?”,我正看得入神,里面一个负责人发现了我,我赶紧表明来意。

他看过我手中的录取通知书后说到,“你是在传输层啊,出门右拐上二楼就是了。我们这一楼都是网络层协议的办公室。”

我又看了下手里的录用通知书,这才发现被分配在了传输层工作。

传输层工作

来到二楼,总算见到了我的主管。

“Robert,欢迎加入网络部,工作岗位在传输层的 TCP 小组,大家欢迎!”

“谢谢主管!谢谢大家!”

“这是 Cerf,你刚来,就让他先带带你,有什么不懂的就向他请教吧。”

我点头感谢,和一旁这个叫 Cerf 的握了握手。

接下来,主管向我介绍了咱们传输层的几个小组的情况:TCP、UDP、SCTP、UDP-lite・・・・・・我这才知道,原来传输层不是只有 TCP 和 UDP。

Cerf 带我来到了工位,不愧是国有单位,无比宽敞,桌上还有一堆奇怪的设备。

“这是一堆什么东西啊”,我问 Cerf。

“这些都是定时器,后面你工作处理 TCP 连接会用到的”

我点了点头,环顾四周,工位旁边的墙壁上还贴满了什么东西,我凑近了一看,才发现满满的都是 RFC 几千条的规定。

“好好看,以后的工作可是要天天用到这些东西呢”,Cerf 略开玩笑的说着。

“这些我基本都背的下来了,要不然我也考不到这里来”,我笑着说,略带一些得意。

Cerf 也笑了笑,“别大意,之前也有人也说过这话,后来还不是走了”

我有些尴尬,不知道说些什么,这时办公室中央的管道里冒出了一个数据包。

“Robert,你刚来,这个新的连接数据包就交给你来处理下,熟悉下工作流程”,主管说到。

我刚刚放松的心情一下紧张了起来,毕竟以前都是纸上谈兵,还从没有真正处理过数据包呢。

我小心翼翼的接过这个数据包,定位到 TCP 的头部,瞧了一眼标志位,发现 SYN 位是 1,看来是有新的连接到来了,接下来不就是三次握手吗,我再熟悉不过了。

我准备了一个响应包,将 SYN 标记和 ACK 标记都点亮后,接下来就犯了难了。这个确认号 ACK 我倒是知道是对方的序列号 + 1,不过我回复的序列号该是多少呢?一时之间,不知道如何是好。

你们知道吗?在线等,挺急的。

未完待续・・・・・・

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注