linux內核協議棧
A. 什麼是linux
大家對Linux這個詞比較陌生吧,那麼Linux是什麼呢?
Linux是什麼
Linux是一種自由和開放源碼的類Unix操作系統。目前存在著許多不同的Linux,但它們都使用了Linux內核。Linux可安裝在各種計算機硬體設備中,從手機、平板電腦、路由器和視頻游戲控制台,到台式計算機、大型機和超級計算機。Linux是一個領先的操作系統,世界上運算最快的10台超級計算機運行的都是Linux操作系統。
優點
1、Linux由眾多微內核組成,其源代碼完全開源;
2、Linux繼承了Unix的特性,具有非常強大的網路功能,其支持所有的網際網路協議,包括TCP/IPv4、TCP/IPv6和鏈路層拓撲程序等,且可以利用Unix的網路特性開發出新的協議棧;
3、Linux系統工具鏈完整,簡單操作就可以配置出合適的開發環境,可以簡化開發過程,減少開發中模擬工具的障礙,使系統具有較強的移植性。
B. Linux 內核的特點有哪些
Linux 是一個開放自由的操作系統內核,具有一些鮮明特點如下:
(1) Linux 是一賣亮個一體化內核;
註:「一體化內核」是也稱「宏內核」,是相對於「微內核」而言的。幾乎所有
的嵌入式和實時系統都採用微內核,如 VxWorks、uC/OS-II、PSOS 等。
(2) 可移植性強。盡管 Linus 最初只為在 X86 PC 上實現一個「類 UNIX」,後來隨
著加入者的努力,Linux 目前已經成為支持硬體平台最廣泛的操作系統;
註:目前已經在 X86、IA64、ARM、MIPS、AVR32、M68K、S390、Blackfin、M32R
等眾多架構處理器上運行。
(3) 是一個可裁剪核銷操作系統內核。Linux 極具伸縮性,內核可以任意裁剪,可以大至
幾十或者上百兆,可以小至幾百 K,運行的設備從超級計算機、大型伺服器到
小型嵌入式系統、掌上移動設備或者嵌入式模塊,都可以運行;
(4) 模塊化。Linux 內核採用模塊化設計,很多功能模塊都可以編譯為模塊,可以在
內核運行中動態載入/卸載而無需重啟系統;
(5) 網路支持完善。Linux 內核集成了完整的 POSIX 網路協議棧,網路功能完善;
(6) 穩定性強。運行 Linux 的內核的伺服器可以做到幾年不用復位改配游重啟;
(7) 安全性好。Linux 源碼開放,由眾多黑客參與 Linux 的開發,一旦發現漏洞都能及時修復;
(8) 支持的設備廣泛。Linux 源碼中,設備驅動源碼佔了很大比例,幾乎能支持任何
常見設備,無論是很老舊的設備還是最新推出的硬體設備,幾乎都能找到 Linux下的驅動。致遠電子那邊有很多的,你可以去看一下
C. linux xclient 有哪些
linux xclient 有基於H3C 802.1x協議,兼容至H3C iNode Client及H3C 802.1x 客戶端的最新版本。
如果對安全要求不是很高,帶寬也是在1Mbps-2Mbps之間的,可以選擇使用VNC,VNC可以對數據進行壓縮,使得傳輸的數據量比直接用SSH加密的小,但是缺點有一到兩次機會讓同意網段的計算機用sniffer竊聽到用戶名和密碼。
優點:
1.Linux由眾多微內核組成,其源代碼完全開源。
2.Linux繼承了Unix的特性,具有非常強大的網路功能,其支持所有的網際網路協議,包括TCP/IPv4、TCP/IPv6和鏈路層拓撲程序等,且可以利用Unix的網路特性開發出新的協議棧。
3.Linux系統工具鏈完整,簡單操作就可以配置出合適的開發環境,可以簡化開發過程,減少開發中模擬工具的障礙,使系統具有較強的移植性。
D. linux 網路路徑中網路協議棧有幾種
1.總述
Linux中用戶空間的網路編程,是以socket為介面,一般創建一個sockfd = socket(family,type,protocol),之後以該sockfd為參數,進行各種系統調用來實現網路通信功能。其中family指明使用哪種協議域(如INET、UNIX等),protocol指明該協議域中具體哪種協議(如INET中的TCP、UDP等),type表明該介面的類型(如STREAM、DGRAM等),一般設protocol=0,那麼就會用該family中該type類型的默認協議(如INET中的STREAM默認就是TCP協議)。
Linux中利用mole機制,層次分明地實現了這套協議體系,並具有很好的擴展性,其基本模塊構成如下:
先看右邊,頂層的socket模塊提供一個sock_register()函數,供各個協議域模塊使用,在全局的net_family[]數組中增加一項;各個協議域模塊也提供一個類似的register_xx_proto()函數,供各個具體的協議使用,在該協議域私有的xx_proto[]數組中增加一項。這兩個數組中的存放的都是指針,指向的數據結構如下圖所示:
很明顯它們是用來創建不同類型的socket介面的,且是一種分層次的創建過程,可想而知,頂層socket_create()完成一些共有的操作,如分配內存等,然後調用下一層create;協議域內的create()完成一些該協議域內共有的初始化工作;最後具體協議中的create()完成協議特有的初始化。具體的下一節講。
再來看上圖右邊的,也是頂層socket模塊提供的4個函數,前兩個一般由具體協議模塊調用,由於協議棧與應用層的交互,具體的後面會講到。後兩個一般有協議域模塊調用,用於底層設備與協議棧間的交互。但這也不絕對,如在PPPOE協議中,這4個函數都由具體協議模塊調用,這是因為PPPOX協議域內的共有部分不多,各個協議間幾乎獨立。這4個函數的功能及所用到的數據結構,在後面具體用到時會詳細說明。
2.socket插口創建
首先來看一下最終創建好的socket插口由哪些部分組成,該結構是相當龐大的,這里只給出框架:
基本屬性有state(listen、accept等),flags標志(blocked等),type類型,這里family和protocol都沒有了,因為它們再創建時使用過了,已經被融入到socket結構中。
File指針指向一個file結構,在Linux中一個socket也被抽象為一個文件,所以在應用層一般通過標準的文件操作來操作它。
Ops指向一個struct proto_ops結構,它是每種協議特有的,應用層的系統調用,最終映射到網路棧中具體協議的操作方法。
Sk指向一個struct sock結構,而該結構在分配空間時,多分配了一點以作為該協議的私有部分,這里包含了該協議的具體信息,內容相當多。首先是一個struct sock_common結構,包含了協議的基本信息;然後是一個sk_prot_create指針,指向一個struct proto結構體,該結構體就是第一節中所述的,用proto_regsiter()注冊到內核中的,它包含應用層到協議棧的交互操作和信息(也可以說成是Appà transport layer的交互信息);然後還有一個sk_backlog_rcv函數指針,所指函數在協議棧處理完接收到的包之後調用,一般僅是把數據包放到該socket的接收隊列中,等待APP讀取;最後協議的私有部分里存放該協議的私有信息,如pppoe的sessionID、daddr,tcp的連接4元組等,這些信息很重要,利用它們來區分同一個協議中的多個socket。
附上出處鏈接:http://blog.csdn.net/vfatfish/article/details/9296885
E. Linux內核-arp協議
從ip_finish_output2到dev_queue_xmit路徑:
http://www.bluestep.cc/linux%e5%91%bd%e4%bb%a4arping-%e7%bd%91%e7%bb%9c%e7%ae%a1%e7%90%86-%e9%80%9a%e8%bf%87%e5%8f%91%e9%80%81arp%e5%8d%8f%e8%ae%ae%e6%8a%a5%e6%96%87%e6%b5%8b%e8%af%95%e7%bd%91%e7%bb%9c/
arp協議:
(1).硬體類型:
硬體地址類型,該欄位值一般為ARPHRD_ETHER,表示乙太網。
(2).協議類型:
表示三層地址使用的協議,該欄位值一般為ETH_P_IP,表示IP協議
(3)硬體地址長度,乙太網MAC地址就是6;
(4)協議地址長度,IP地址就是4;
(5)操作碼
常見的有四種,arp請求,arp相應,rarp請求,rarp相應。
(6)發送方硬體地址與IP地址,(7)目標硬體地址與目標IP地址。
arp頭數據結構:
arp模塊的初始化函數為arp_init(),這個函數在ipv4協議棧的初始化函數inet_init()中被調用。
1.初始化arp表arp_tbl;
2.注冊arp協議類型;
3.建立arp相關proc文件,/proc/net/arp;
4.注冊通知事件
一個neigh_table對應一種鄰居協議,IPv4就是arp協議。用來存儲於鄰居協議相關的參數、功能函數、鄰居項散列表等。
一個neighbour對應一個鄰居項,就是一個arp條目
鄰居項函數指針表,實現三層和二層的dev_queue_xmit()之間的跳轉。
用來存儲統計信息,一個結構實例對應一個網路設備上的一種鄰居協議。
注冊arp報文類型 :dev_add_pack(&arp_packet_type);
就是把arp_packet_type添加到ptype_base哈希表中。
注冊新通知事件的時候,在已經注冊和UP的設備上,會調用一次這個通知事件。
設備事件類型:
創建一個鄰居項,並將其添加到散列表上,返回指向該鄰居項的指針。
tbl:待創建的鄰居項所屬的鄰居表,即arp_tbl;
pkey:三層協議地址(IP地址)
dev:輸出設備
want_ref:??
創建鄰居項
1.設置鄰居項的類型
2.設置鄰居項的ops指針
3.設置鄰居項的output函數指針
調用dst_link_failure()函數向三層報告錯誤,當鄰居項緩存中還有未發送的報文,而該鄰居卻無法訪問時被調用。不懂。
用來發送arp請求,在鄰居項狀態定時器處理函數中被調用。
neigh:arp請求的目的鄰居項
skb:緩存在該鄰居項中的待發送報文,用來獲取該skb的源ip地址。
將得到的硬體源、目的地址,IP源、目的地址等作為參數,調用arp_send()函數創建一個arp報文並將其輸出。
創建及發送arp報文
創建arp報文,填充欄位。
發送arp報文
用來從二層接收並處理一個arp報文。這個函數中就是做了一些參數檢查,然後調用arp_process()函數。
neigh_event_ns
neigh_update
這個函數的作用就是更新鄰居項硬體地址和狀態。分支比較多。
neigh_update_notify
代理arp(proxy arp),通常像路由器這樣的設備才使用,用來代替處於另一個網段的主機回答本網段主機的arp請求。
感覺代碼ARP好像沒啥用呀。
網路主機發包的一般過程:
1.當目的IP和自己在同一網段時,直接arp請求該目的IP的MAC。
2.當目的IP和自己不再同一網段時,arp請求默認網關的MAC。
https://www.cnblogs.com/taitai139/p/12336554.html
https://www.cnblogs.com/Widesky/p/10489514.html
當主機沒有默認網關的時候,arp請求別的網段的報文,到達路由器後,本來路由器是要隔離廣播的,把這個arp請求報文給丟棄,這樣就沒法通信了。當路由器開啟arp proxy後,路由器發現請求的目的IP在其他網段,就自己給主機回復一個arp響應報文,這樣源主機就把路由器的MAC當成目的IP主機對應的MAC,可以通信了。這樣可能會造成主機arp表中,多個IP地址都對應於路由器的同一個MAC地址。
可以使用arping命令發送指定IP的arp請求報文。
寫完了發現這個老妹寫的arp代理文章蠻好的,不過她好像是轉載的。
F. linux配置中eth0和eth1做什麼用的
是一種光纖乙太網介面卡,按照乙太網通信協議進行信號傳輸。一般通過光纜與光纖乙太網交換機連接。
Eth0和eth1用於區分網卡名。它們的含義與windows本地連接1和本地連接2相同。
這里的子網卡不是一個實用的網路介面,但是它可以作為一個集合介面在系統中閃現,比如eth0:1,eth1:2。
(6)linux內核協議棧擴展閱讀:
Linux操作系統嵌入了TCP/IP協議棧,協議軟體具有路由轉發功能。路由和轉發依賴於在主機中安裝多個網卡作為路由器。
當某一網卡接收到度包時,系統內核會根據度包的目的IP地址查詢路由表,然後根據查詢結果將度包發送到另一網卡,最後通過該網卡發送度包。主機的進程是路由器的核心功能。
路由功能是通過修改Linux內核參數來實現的。sysctl命令用於配置和顯示/proc/sys目錄中的內核參數。
出於安全原因,Linux內核默認禁止數據包路由和轉發。在Linux系統中,有臨時和永久兩種方法啟用轉發功能。