您好,登錄后才能下訂單哦!
僅有理論而無實例只是紙上談兵,unix的流機制是很妙的機制,但是unix流究竟是如何實現以及如何使用的呢,雖然unix流已經提出了很久很久,但是時至今日它也沒有普遍被使用,出了solaris和windows等操作系統外,幾乎沒有什么系統在使用它,當今世上操作系統無非也就幾家獨大,按照不失一般性的分類,首先就是windows,然后是linux以及幾家的unix,如solaris和各種bsd以及darvin,然后就是各家小諸侯了,不足掛齒,在幾家大的中,獨有windows和solaris吸取了unix的流思想,其余的好像都是比拼內功的結果,絲毫不在乎整體架構,只是在細節上略勝一籌,比如通讀linux源碼就會發現,里面有十分糟糕的算法,也有十分美妙的,顯然不是一伙人所為,各個開發者都在各行其是,于是便失去了整體的美感,結果就是效率的提升,這也許就是GNU的絕美的地方吧(雖solaris10以及微軟的開發框架也開源,但卻是在不同license下的開源,和linux不可同日而語)。從windows內核來解析流之美,眾人可閱讀很多資料,可是unix自身的流實現,卻只能縱覽system V以后后商用unix實現,最可觀的當屬solaris了,以我比較熟悉的open***為例,在打開且初始化tun/tap設備的時候,open***會調用open_tun,需要初始化整個虛擬設備的協議棧,于是linux和solaris就分道揚鑣了,在linux中,實現如下:
void open_tun (...)
{
...//linux的實現就不多說了,本質上就是初始化內核的tun設備而已
}
由于linux并沒有實現unix的流機制,因此linux只是簡單的調用虛擬網卡設備的open例程以及TUNSETIFF的ioctl例程,及結果無非就是“直接”初始化虛擬網卡設備的協議棧以備后用。看看solaris的實現:
void open_tun (...)
{
...
if (tt->type == DEV_TYPE_TAP) {
ip_node = "/dev/ip";
if (!dev_node)
dev_node = "/dev/tun";
...
}
...
if_fd = open (dev_node, O_RDWR, 0);
ioctl (if_fd, I_PUSH, "ip");
...
}
很明顯,solaris的方式比linux更好,它直接將ip協議“壓”在了虛擬網卡設備之上,于是就相當于實現了虛擬網卡設備的tcp/ip協議棧,不光是可以壓入ip協議模塊,還可以壓入諸如arp,icmp等的一切協議處理模塊,unix的流機制可以對任何的IO數據實行過濾,其關鍵在于一個I_PUSH/I_POP命令參數的使用,在用戶空間通過ioctl就可以完成如此底層的協議整合,多么靈活,多么美妙啊!采用unix流的方式無需直接初始化整個協議棧,而是可以再流模塊被壓入的時刻再初始化之。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。