導航:首頁 > 編程大全 > linux網路協議結構

linux網路協議結構

發布時間:2023-02-23 13:50:08

linux裡面tcp和tcp6區別是什麼

指代不同
TCP:是一種面向連接的、可靠的、基於位元組流的傳輸層通信協議。
TCP6:是互聯網工程任務組設計的用於替代ipv4的下一代ip協議。
功能不同
TCP:適應支持多網路應用的分層協議層次結構,連接到不同但互連的計算機通信網路的主計算機中的成對進程之間依靠TCP提供可靠的通信服務。
TCP6:ipv6具有更大的地址空間,ipv4中規定ip長度為32,最大地址個數為2^32,IPv6中ip地址的長度為128,即最大地址個數為2^128。與32位地址空間對比,其地址空間增加了2^128-2^32個。
特點不同
TCP:TCP應該能夠在從硬線連接到分組交換或電路交換網路的各種通信系統之上操作。
TCP6:不僅能解決網路地址資源數量的問題,而且也解決了多種接入設備連入互聯網的障礙。

❷ linux操作系統有哪五個基本的組成部分

Linux系統一般有4個主要部分:內核、shell、文件系統和應用程序。Linux內核主要由五個子系統組成:進程調度,內存管理,虛擬文件系統,網路介面,進程間通信。

操作系統的組成要素:

操作系統 = 內核 + 系統程序

系統程序 = 編譯環境 + API

編譯環境 = 編譯程序 + 連接程序 + 裝載程序

API = 系統調用 + 語言庫函數(C、C++、Java等等)

AUI = shell + 系統服務常式(如x伺服器等)+ 應用程序(瀏覽器,字處理,編輯器等)

軟體系統:

軟體系統 = 操作系統 + AUI

操作系統最底層的組件是內核,其上層搭建了許多系統軟體。

系統程序包括三個部分,分別是:編譯環境、應用程序介面和用戶介面。

編譯環境包含匯編、C 等低高級語言編譯程序,連接程序和裝載程序,這些程序負責將文本格式的程序語言轉變為機器能識別和裝載的機器代碼

應用程序介面(API)包含內核提供的系統調用介面和語言庫,系統調用是為了能讓應用程序使用內核服務,語言庫函數則是為了方便應用程序開發,所以將一些常用的基礎功能預先編譯以供使用,比如對C語言來說常用的C庫等;

用戶介面(AUI)包括我們熟悉的shell、系統服務程序和常用的應用程序。

這是一個典型的結構,但不是一成不變。許多操作系統的發行中會有所刪減,比如應用於嵌入式設備的系統,對X伺服器就可能不做要求。但是像內核、系統調用等要素是必不可少的。

Linux系統一般有4個主要部分:內核、shell、文件系統和應用程序。內核、shell和文件系統一起形成了基本的操作系統結構,它們使得用戶可以運行程序、管理文件並使用系統。

一.Linux內核

內核是操作系統的核心,具有很多最基本功能,如虛擬內存、多任務、共享庫、需求載入、可執行程序和TCP/IP網路功能。Linux內核主要由五個子系統組成:進程調度,內存管理,虛擬文件系統,網路介面,進程間通信。

二.Linux shell

shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種介面。它接收用戶輸入的命令並把它送入內核去執行,是一個命令解釋器。另外,shell編程語言具有普通編程語言的很多特點,用這種編程語言編寫的shell程序與其他應用程序具有同樣的效果。

三.Linux文件系統

文件系統是文件存放在磁碟等存儲設備上的組織方法。Linux系統能支持多種目前流行的文件系統,如EXT2、 EXT3、 FAT、 FAT32、VFAT和ISO9660。

四.Linux應用程序

標準的Linux系統一般都有一套都有稱為應用程序的程序集,它包括文本編輯器、編程語言、X

Window、辦公套件、Internet工具資料庫等。

❸ 嵌入式Linux內核和網路協議棧的特點,和代表性產品有哪些

首先,嵌入Linux內核是可定製的內核:
1 Linux內核的配置系統
2 Linux內核的模塊機制
3 Linux內核的源代碼開放
4 經裁減的 Linux內核最小可達到 150KB以下,尤其適合嵌入式領域中資源受限的實際情況。
其次,它的性能優越:Linux 系統內核精簡、高效和穩定,能夠充分發揮硬體的功能,因此它比其他操作系統的運行效率更高。
再者,它有良好的網路支持:
1 支持 TCP/IP 協議棧
2 提供對包括十兆位、百兆位及千兆位的乙太網,還有無線網路、Tokenring(令牌環)和光纖甚至衛星的支持
3 對現在依賴於網路的嵌入式設備來說是很好的選擇。

至於網路協議的話,有很多種,就目前主流的3種網路協議是:NetBEUI、IPX/SPX及其兼容協議、TCP/IP,而其他的像Lwip、ZigBee、Sip等很多。
1 NetBEUI的前身是NetBIOS,這一協議是IBM1983年開發完成的,早期的微軟OS產品中都選擇該協議作為通信協議。它是一套用於實現僅僅在小型區域網上PC見相互通信的標准。該網路最大用戶數不能超過30個,1985年,微軟對其改進,增加了SMB(Server Message Blocks,伺服器消息塊)的組成部分,以降低網路的通信阻塞,形成了現在的NetBEUI通信協議。
特點:體積小、效率高、速度快、佔用內存少。
2 IPX/SPX及其兼容協議:它的全稱是「Internwork Packet Exchange/Sequence Packet Exchange」即網際包交換/順序包交換。
特點:體積較大、能夠連接多種網路、具有強大的路由功能,適合大型網路的使用。windows網路中無法直接使用該協議。
3 TCP/IP是國際互聯網Internet採用的協議標准,早期用於ARPANet網路,後來開放用於民間。
特點:靈活性,支持任意規模的網路,可以連接所有的計算機,具有路由功能,且TCP/IP的地址是分級的,容易確定並找到網上的用戶,提高了網路代換的利用率。

而其他的像Lwip協議棧的特點:
(1)支持多網路介面的IP轉發
(2)支持ICMP協議
(3)包括實驗性擴展的UDP
(4)包括阻塞控制,RTT估算和快速恢復和快速轉發的TCP
(5)提供專門的內部回調介面用於提高應用程序性能
(6)可選擇的Berkeley介面API
(7)在最新的版本中支持ppp

不知道這些是不是你想要的。

❹ 關於 Linux 網路,你必須知道這些

我們一起學習了文件系統和磁碟 I/O 的工作原理,以及相應的性能分析和優化方法。接下來,我們將進入下一個重要模塊—— Linux 的網路子系統。

由於網路處理的流程最復雜,跟我們前面講到的進程調度、中斷處理、內存管理以及 I/O 等都密不可分,所以,我把網路模塊作為最後一個資源模塊來講解。

同 CPU、內存以及 I/O 一樣,網路也是 Linux 系統最核心的功能。網路是一種把不同計算機或網路設備連接到一起的技術,它本質上是一種進程間通信方式,特別是跨系統的進程間通信,必須要通過網路才能進行。隨著高並發、分布式、雲計算、微服務等技術的普及,網路的性能也變得越來越重要。

說到網路,我想你肯定經常提起七層負載均衡、四層負載均衡,或者三層設備、二層設備等等。那麼,這里說的二層、三層、四層、七層又都是什麼意思呢?

實際上,這些層都來自國際標准化組織制定的開放式系統互聯通信參考模型(Open System Interconnection Reference Model),簡稱為 OSI 網路模型。

但是 OSI 模型還是太復雜了,也沒能提供一個可實現的方法。所以,在 Linux 中,我們實際上使用的是另一個更實用的四層模型,即 TCP/IP 網路模型。

TCP/IP 模型,把網路互聯的框架分為應用層、傳輸層、網路層、網路介面層等四層,其中,

為了幫你更形象理解 TCP/IP 與 OSI 模型的關系,我畫了一張圖,如下所示:

當然了,雖說 Linux 實際按照 TCP/IP 模型,實現了網路協議棧,但在平時的學習交流中,我們習慣上還是用 OSI 七層模型來描述。比如,說到七層和四層負載均衡,對應的分別是 OSI 模型中的應用層和傳輸層(而它們對應到 TCP/IP 模型中,實際上是四層和三層)。

OSI引入了服務、介面、協議、分層的概念,TCP/IP借鑒了OSI的這些概念建立TCP/IP模型。

OSI先有模型,後有協議,先有標准,後進行實踐;而TCP/IP則相反,先有協議和應用再提出了模型,且是參照的OSI模型。

OSI是一種理論下的模型,而TCP/IP已被廣泛使用,成為網路互聯事實上的標准。

有了 TCP/IP 模型後,在進行網路傳輸時,數據包就會按照協議棧,對上一層發來的數據進行逐層處理;然後封裝上該層的協議頭,再發送給下一層。

當然,網路包在每一層的處理邏輯,都取決於各層採用的網路協議。比如在應用層,一個提供 REST API 的應用,可以使用 HTTP 協議,把它需要傳輸的 JSON 數據封裝到 HTTP 協議中,然後向下傳遞給 TCP 層。

而封裝做的事情就很簡單了,只是在原來的負載前後,增加固定格式的元數據,原始的負載數據並不會被修改。

比如,以通過 TCP 協議通信的網路包為例,通過下面這張圖,我們可以看到,應用程序數據在每個層的封裝格式。

這些新增的頭部和尾部,增加了網路包的大小,但我們都知道,物理鏈路中並不能傳輸任意大小的數據包。網路介面配置的最大傳輸單元(MTU),就規定了最大的 IP 包大小。在我們最常用的乙太網中,MTU 默認值是 1500(這也是 Linux 的默認值)。

一旦網路包超過 MTU 的大小,就會在網路層分片,以保證分片後的 IP 包不大於 MTU 值。顯然,MTU 越大,需要的分包也就越少,自然,網路吞吐能力就越好。

理解了 TCP/IP 網路模型和網路包的封裝原理後,你很容易能想到,Linux 內核中的網路棧,其實也類似於 TCP/IP 的四層結構。如下圖所示,就是 Linux 通用 IP 網路棧的示意圖:

我們從上到下來看這個網路棧,你可以發現,

這里我簡單說一下網卡。網卡是發送和接收網路包的基本設備。在系統啟動過程中,網卡通過內核中的網卡驅動程序注冊到系統中。而在網路收發過程中,內核通過中斷跟網卡進行交互。

再結合前面提到的 Linux 網路棧,可以看出,網路包的處理非常復雜。所以,網卡硬中斷只處理最核心的網卡數據讀取或發送,而協議棧中的大部分邏輯,都會放到軟中斷中處理。

我們先來看網路包的接收流程。

當一個網路幀到達網卡後,網卡會通過 DMA 方式,把這個網路包放到收包隊列中;然後通過硬中斷,告訴中斷處理程序已經收到了網路包。

接著,網卡中斷處理程序會為網路幀分配內核數據結構(sk_buff),並將其拷貝到 sk_buff 緩沖區中;然後再通過軟中斷,通知內核收到了新的網路幀。

接下來,內核協議棧從緩沖區中取出網路幀,並通過網路協議棧,從下到上逐層處理這個網路幀。比如,

最後,應用程序就可以使用 Socket 介面,讀取到新接收到的數據了。

為了更清晰表示這個流程,我畫了一張圖,這張圖的左半部分表示接收流程,而圖中的粉色箭頭則表示網路包的處理路徑。

了解網路包的接收流程後,就很容易理解網路包的發送流程。網路包的發送流程就是上圖的右半部分,很容易發現,網路包的發送方向,正好跟接收方向相反。

首先,應用程序調用 Socket API(比如 sendmsg)發送網路包。

由於這是一個系統調用,所以會陷入到內核態的套接字層中。套接字層會把數據包放到 Socket 發送緩沖區中。

接下來,網路協議棧從 Socket 發送緩沖區中,取出數據包;再按照 TCP/IP 棧,從上到下逐層處理。比如,傳輸層和網路層,分別為其增加 TCP 頭和 IP 頭,執行路由查找確認下一跳的 IP,並按照 MTU 大小進行分片。

分片後的網路包,再送到網路介面層,進行物理地址定址,以找到下一跳的 MAC 地址。然後添加幀頭和幀尾,放到發包隊列中。這一切完成後,會有軟中斷通知驅動程序:發包隊列中有新的網路幀需要發送。

最後,驅動程序通過 DMA ,從發包隊列中讀出網路幀,並通過物理網卡把它發送出去。

多台伺服器通過網卡、交換機、路由器等網路設備連接到一起,構成了相互連接的網路。由於網路設備的異構性和網路協議的復雜性,國際標准化組織定義了一個七層的 OSI 網路模型,但是這個模型過於復雜,實際工作中的事實標准,是更為實用的 TCP/IP 模型。

TCP/IP 模型,把網路互聯的框架,分為應用層、傳輸層、網路層、網路介面層等四層,這也是 Linux 網路棧最核心的構成部分。

我結合網路上查閱的資料和文章中的內容,總結了下網卡收發報文的過程,不知道是否正確:

當發送數據包時,與上述相反。鏈路層將數據包封裝完畢後,放入網卡的DMA緩沖區,並調用系統硬中斷,通知網卡從緩沖區讀取並發送數據。

了解 Linux 網路的基本原理和收發流程後,你肯定迫不及待想知道,如何去觀察網路的性能情況。具體而言,哪些指標可以用來衡量 Linux 的網路性能呢?

實際上,我們通常用帶寬、吞吐量、延時、PPS(Packet Per Second)等指標衡量網路的性能。

除了這些指標,網路的可用性(網路能否正常通信)、並發連接數(TCP 連接數量)、丟包率(丟包百分比)、重傳率(重新傳輸的網路包比例)等也是常用的性能指標。

分析網路問題的第一步,通常是查看網路介面的配置和狀態。你可以使用 ifconfig 或者 ip 命令,來查看網路的配置。我個人更推薦使用 ip 工具,因為它提供了更豐富的功能和更易用的介面。

以網路介面 eth0 為例,你可以運行下面的兩個命令,查看它的配置和狀態:

你可以看到,ifconfig 和 ip 命令輸出的指標基本相同,只是顯示格式略微不同。比如,它們都包括了網路介面的狀態標志、MTU 大小、IP、子網、MAC 地址以及網路包收發的統計信息。

第一,網路介面的狀態標志。ifconfig 輸出中的 RUNNING ,或 ip 輸出中的 LOWER_UP ,都表示物理網路是連通的,即網卡已經連接到了交換機或者路由器中。如果你看不到它們,通常表示網線被拔掉了。

第二,MTU 的大小。MTU 默認大小是 1500,根據網路架構的不同(比如是否使用了 VXLAN 等疊加網路),你可能需要調大或者調小 MTU 的數值。

第三,網路介面的 IP 地址、子網以及 MAC 地址。這些都是保障網路功能正常工作所必需的,你需要確保配置正確。

第四,網路收發的位元組數、包數、錯誤數以及丟包情況,特別是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指標不為 0 時,通常表示出現了網路 I/O 問題。其中:

ifconfig 和 ip 只顯示了網路介面收發數據包的統計信息,但在實際的性能問題中,網路協議棧中的統計信息,我們也必須關注。你可以用 netstat 或者 ss ,來查看套接字、網路棧、網路介面以及路由表的信息。

我個人更推薦,使用 ss 來查詢網路的連接信息,因為它比 netstat 提供了更好的性能(速度更快)。

比如,你可以執行下面的命令,查詢套接字信息:

netstat 和 ss 的輸出也是類似的,都展示了套接字的狀態、接收隊列、發送隊列、本地地址、遠端地址、進程 PID 和進程名稱等。

其中,接收隊列(Recv-Q)和發送隊列(Send-Q)需要你特別關注,它們通常應該是 0。當你發現它們不是 0 時,說明有網路包的堆積發生。當然還要注意,在不同套接字狀態下,它們的含義不同。

當套接字處於連接狀態(Established)時,

當套接字處於監聽狀態(Listening)時,

所謂全連接,是指伺服器收到了客戶端的 ACK,完成了 TCP 三次握手,然後就會把這個連接挪到全連接隊列中。這些全連接中的套接字,還需要被 accept() 系統調用取走,伺服器才可以開始真正處理客戶端的請求。

與全連接隊列相對應的,還有一個半連接隊列。所謂半連接是指還沒有完成 TCP 三次握手的連接,連接只進行了一半。伺服器收到了客戶端的 SYN 包後,就會把這個連接放到半連接隊列中,然後再向客戶端發送 SYN+ACK 包。

類似的,使用 netstat 或 ss ,也可以查看協議棧的信息:

這些協議棧的統計信息都很直觀。ss 只顯示已經連接、關閉、孤兒套接字等簡要統計,而 netstat 則提供的是更詳細的網路協議棧信息。

比如,上面 netstat 的輸出示例,就展示了 TCP 協議的主動連接、被動連接、失敗重試、發送和接收的分段數量等各種信息。

接下來,我們再來看看,如何查看系統當前的網路吞吐量和 PPS。在這里,我推薦使用我們的老朋友 sar,在前面的 CPU、內存和 I/O 模塊中,我們已經多次用到它。

給 sar 增加 -n 參數就可以查看網路的統計信息,比如網路介面(DEV)、網路介面錯誤(EDEV)、TCP、UDP、ICMP 等等。執行下面的命令,你就可以得到網路介面統計信息:

這兒輸出的指標比較多,我來簡單解釋下它們的含義。

其中,Bandwidth 可以用 ethtool 來查詢,它的單位通常是 Gb/s 或者 Mb/s,不過注意這里小寫字母 b ,表示比特而不是位元組。我們通常提到的千兆網卡、萬兆網卡等,單位也都是比特。如下你可以看到,我的 eth0 網卡就是一個千兆網卡:

其中,Bandwidth 可以用 ethtool 來查詢,它的單位通常是 Gb/s 或者 Mb/s,不過注意這里小寫字母 b ,表示比特而不是位元組。我們通常提到的千兆網卡、萬兆網卡等,單位也都是比特。如下你可以看到,我的 eth0 網卡就是一個千兆網卡:

我們通常使用帶寬、吞吐量、延時等指標,來衡量網路的性能;相應的,你可以用 ifconfig、netstat、ss、sar、ping 等工具,來查看這些網路的性能指標。

小狗同學問到: 老師,您好 ss —lntp 這個 當session處於listening中 rec-q 確定是 syn的backlog嗎?
A: Recv-Q為全連接隊列當前使用了多少。 中文資料里這個問題講得最明白的文章: https://mp.weixin.qq.com/s/yH3PzGEFopbpA-jw4MythQ

看了源碼發現,這個地方講的有問題.關於ss輸出中listen狀態套接字的Recv-Q表示全連接隊列當前使用了多少,也就是全連接隊列的當前長度,而Send-Q表示全連接隊列的最大長度

❺ TCP/IP網路模型從上至下哪四層組成各層主要功能是什麼

1、組成:應用層、傳輸層、網路層、鏈路層

2、各層主要功能:

應用層:負責向用戶提供應用程序,比如HTTP、FTP、Telnet、DNS、SMTP等。

傳輸層:負責對報文進行分組和重組,並以TCP或UDP協議格式封裝報文。

網路層:負責路由以及把分組報文發送給目標網路或主機。

鏈路層:負責封裝和解封裝IP報文,發送和接受ARP/RARP報文等。

(5)linux網路協議結構擴展閱讀

OSI是開放系統互連參考模型 (Open System Interconnect 簡稱OSI),是國際標准化組織(ISO)和國際電報電話咨詢委員會(CCITT)聯合制定的開放系統互連參考模型,為開放式互連信息系統提供了一種功能結構的框架。

它從低到高分別是:物理層、數據鏈路層、網路層、傳輸層、會話層、表示層和應用層。

而TCP/IP簡單來說就是OSI的簡化版,把OSI的七層簡化為了四層。TCP/IP 定義了電子設備如何連入網際網路,以及數據如何在它們之間傳輸的標准。

協議採用了4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成自己的需求。

❻ 簡述linux系統的特點以及文件的結構

1.模塊化程度高
Linux的內核設計非常精巧,分成進程調度、內存管理、進程間通信、虛擬文件系統和網路介面五大部分;其獨特的模塊機制可根據用戶的需要,實時地將某些模塊插入或從內核中移走,使得Linux系統內核可以裁剪得非常小巧,很適合於嵌入式系統的需要。
2.源碼公開
由於Linux系統的開發從一開始就與GNU項目緊密地結合起來,所以它的大多數組成部分都直接來
自GNU項目。任何人、任何組織只要遵守GPL條款,就可以自由使用Linux
源代碼,為用戶提供了最大限度的自由度。這一點也正投嵌入式系統所好,因為嵌入式系統應用千差萬別,設計者往往需要針對具體的應用對源碼進行修改和優化,
所以是否能獲得源代碼
對於嵌入式系統的開發是至關重要的。加之Linux的軟體資源十分豐富,每種通用程序在Linux上幾乎都可以找到,並且數量還在不斷增加。這一切就使設
計者在其基礎之上進行二次開發變得非常容易。另外,由於Linux源代碼公開,也使用戶不用擔心有「後閘」等安全隱患。
同時,源碼開放給各教育機構提供極大的方便,從而也促進了Linux的學習、推廣和應用。
3.廣泛的硬體支持
Linux能支持x86、ARM、MIPS、ALPHA和PowerPC等多種體系結構的微處理器。目前已成功地移植到數十種硬體平台,幾乎能運行在所有流行的處理器上。
由於世界范圍內有眾多開發者在為Linux的擴充貢獻力量,所以Linux有著異常豐富的驅動程序資源,支持各種主流硬體設各和最新的硬體技術,甚至可在沒有存儲管理單元MMU 的處理器上運行,這些都進一步促進了Linux在嵌入式系統中的應用。
4.安全性及可靠性好
內核高效穩定。Linux內核的高效和穩定已在各個領域內得到了大量事實的驗證。
Linux中大量網路管理、網路服務等方面的功能,可使用戶很方便地建立高效穩定的防火牆、路由器、工作站、伺服器等。為提高安全性,它還提供了大量的網路管理軟體、網路分析軟體和網路安全軟體等。
5.具有優秀的開發工具
開發嵌入式系統的關鍵是需要有一套完善的開發和調試工具。傳統的嵌入式開發調試工具是在線模擬器(In Circuit Emulator,ICE),它通過取代目標板的微處理器,給目標程序提供一個完整的模擬環境,從而使開發者能非常清楚地了解到程序在目標板上的工作狀態,便於監視和調試程序。在線模擬器的價格非常高,而且只適合做非常底層的調試。如果使用的是嵌人式Linux,一旦軟硬體能支持正常的串口功能,即使不用在線模擬器,也可以很好地進行開發和調試工作,從而節省了一筆不小的開發費用。嵌入式Linux為開發者提供了一套完整的工具鏈(Tool Chain),能夠很方便地實現從操作系統到應用軟體各個級別的調試。
6.有很好的網路支持利文件系統支持
Linux從誕生之日起就與Internet密不可分,支持各種標準的Internet網路協議,並且很容易移植到嵌入式系統當中。目前,Linux幾乎支持所有主流的網路硬體、網路協議和文件系統,因此它是NFS的一個很好的平台。
另一方面,由於Linux有很好的文件系統支持(例如,它支持Ext2、FAT32、romfs等文件系統),是數據各份、同步和復制的良好平台,這些都為開發嵌入式系統應用打下了堅實的基礎。
7.與UNIX完全兼容
目前,在Linux中所包含的工具和實用程序,可以完成UNIX的所有主要功能。
但由於Linux不是為實時而設計的,因而這就成了Linux在實時系統中應用的最大遺憾。不過,目前有眾多的自由軟體愛好者正在為此進行不懈的努力,也取得了諸多成果。

❼ Linux網路協議棧7--ipsec收發包流程

流程路徑:ip_rcv() --> ip_rcv_finish() --> ip_local_deliver() --> ip_local_deliver_finish()
解封側一定是ip報文的目的端,ip_rcv_finish中查到的路由肯定是本機路由(RTCF_LOCAL),調用 ip_local_deliver 處理。
下面是貼的網上的一張圖片。

ip_local_deliver_finish中 根據上次協議類型,調用對應的處理函數。inet_protos 中掛載了各類協議的操作集,對於AH或者ESP來說,是xfrm4_rcv,對於ipsec nat-t情況下,是udp協議的處理函數udp_rcv,內部才是封裝的ipsec報文(AH或者ESP)。

xfrm4_rcv --> xfrm4_rcv_spi --> xfrm4_rcv_encap --> xfrm_input
最終調用 xfrm_input 做收包解封裝流程。
1、創建SKB的安全路徑;
2、解析報文,獲取daddr、spi,加上協議類型(esp、ah等),就可以查詢到SA了,這些是SA的key,下面列出了一組linux ipsec的state(sa)和policy,方便一眼就能看到關鍵信息;
3、調用SA對應協議類型的input函數,解包,並返回更上層的協議類型,type可為esp,ah,ipcomp等。對應的處理函數esp_input、ah_input等;
4、解碼完成後,再根據ipsec的模式做解封處理,常用的有隧道模式和傳輸模式。對應xfrm4_mode_tunnel_input 和 xfrm4_transport_inout,處理都比較簡單,隧道模式去掉外層頭,傳輸模式只是設置一些skb的數據。
5、協議類型可以多層封裝,如ESP+AH,所以需要再次解析內存協議,如果還是AH、ESP、COMP,則解析新的spi,返回2,查詢新的SA處理報文。
6、經過上面流程處理,漏出了用戶數據報文(IP報文),根據ipsec模式:

流程路徑如下圖,這里以轉發流程為例,本機發送的包主要流程類似。
轉發流程:

ip_forward 函數中調用xfrm4_route_forward,這個函數:
1、解析用戶報文,查找對應的Ipsec policy(__xfrm_policy_lookup);
2、再根據policy的模版tmpl查找對應最優的SA(xfrm_tmpl_resolve),模版的內容以及和SA的對應關系見上面貼出的ip xfrm命令顯示;
3、最後根據SA生成安全路由,掛載再skb的dst上; 一條用戶流可以聲明多個安全策略(policy),所以會對應多個SA,每個SA處理會生成一個安全路由項struct dst_entry結構(xfrm_resolve_and_create_bundle),這些安全路由項通過 child 指針鏈接為一個鏈表,其成員 output掛載了不同安全協議的處理函數,這樣就可以對數據包進行連續的處理,比如先壓縮,再ESP封裝,再AH封裝。
安全路由鏈的最後一個路由項一定是普通IP路由項,因為最終報文都得走普通路由轉發出去,如果是隧道模式,在tunnel output封裝完完成ip頭後還會再查一次路由掛載到安全路由鏈的最後一個。
註: SA安全聯盟是IPsec的基礎,也是IPsec的本質。 SA是通信對等體間對某些要素的約定,例如使用哪種協議、協議的操作模式、加密演算法、特定流中保護數據的共享密鑰以及SA的生存周期等。

然後,經過FORWARD點後,調用ip_forward_finish()-->dst_output,最終調用skb_dst(skb)->output(skb),此時掛載的xfrm4_output

本機發送流程簡單記錄一下,和轉發流程殊途同歸:
查詢安全路由: ip_queue_xmit --> ip_route_output_flow --> __xfrm_lookup
封裝發送: ip_queue_xmit --> ip_local_out --> dst_output --> xfrm4_output

註:
1). 無論轉發還是本地發送,在查詢安全路由之前都會查一次普通路由,如果查不到,報文丟棄,但這條路由不一定需要指向真實的下一跳的出介面,只要能匹配到報文DIP即可,如配置一跳其它介面的defualt。
2). strongswan是一款用的比較多的ipsec開源軟體,協商完成後可以看到其創建了220 table,經常有人問裡面的路由有啥用、為什麼有時有有時無。這里做個測試記錄: 1、220中貌似只有在tunnel模式且感興趣流是本機發起(本機配置感興趣流IP地址)的時候才會配置感興趣流相關的路由,路由指定了source;2、不配置也沒有關系,如1)中所說,只要存在感興趣流的路由即可,只不過ping的時候需要指定source,否者可能匹配不到感興趣流。所以感覺220這個表一是為了保證

ipsec封裝發送流程:
xfrm4_output-->xfrm4_output_finish-->xfrm_output-->xfrm_output2-->xfrm_output_resume-->xfrm_output_one
xfrm4_output 函數先過POSTROUTING點,在封裝之前可以先做SNAT。後面則調用xfrm_output_resume-->xfrm_output_one 做IPSEC封裝最終走普通路由走IP發送。

貼一些網上的幾張數據結構圖
1、安全路由

2、策略相關協議處理結構

3、狀態相關協議處理結構

❽ 簡單的給我介紹下網路協議中的TCP協議的數據結構是怎麼樣的

TCP協議的數據結構是,原IP地址-原埠號-目標IP地址-目標埠號-數據檢測-數據-校驗。
這就是TCP協議數據的簡單傳輸原理,也是它簡單的數據結構,
如果你真想詳細的了解這些知道話,可以去長沙新華看下,它們還想有這類的課程。

❾ 從ip addr add和ifconfig的區別看linux網卡ip地址的結構

如果你非常理解網路協議的原理以及網路的分層架構那麼我想你就不會有這個問題,實際上,每一個網卡設備都有一個mac地址,但是卻可 以有多個網路層地址,比如IP地址,然而這個事實無法很好地像用戶提供操作介面,所以就引出了ip別名(IP aliases)和輔助ip(secondary IP addresses)的概念。其實很容易理解這個事實,按照分層的思想,下層總是為上層服務,也就是為上層提供舞台,上層利用下層的服務,而不必讓下層知 道自己的情況,如果一個擁有合理mac地址的網卡沒有配置網路層地址(比如IP地址)這件事合理的話,那麼為這個設備配置多個IP地址也是合理的,正好像 一個ip可以對應多個應用層埠一樣,也就是說,下層對上層總是一對多的關系,在分層架構中這種關系是合理的。下面我們就看一下linux的網卡的ip地 址結構。剛才說了在linux中,一個網卡可以有多個IP,那麼這多個ip有什麼關系呢?其實這些ip組成了一個吊鏈結構,所謂吊鏈結構就是一些節點鏈接 成一條鏈,然後每個節點帶有自己的一條鏈


每個節點代表的ip地址標識一個網段,這個節點的ip就是這個網段的 Primary地址,它下面所帶的ip就是這個網段的Secondary地址,也就是說一個網卡可以帶有各個節點所帶鏈表長度之和個ip地址,而且這些 ip不是線形的,而是上述的吊鏈結構。我們看一下這么做有什麼好處。玩過Cisco路由器的朋友可能都知道有個Secondary IP的概念,這個特性可以創建邏輯子網,也就是說在一個物理網口上連接兩個子網,這咋看起來好像不可思議,其實很簡單,比如這個網口接到一台交換機上,如 果這個網口沒有配置Secondary IP的話,那麼這台交換機只能連接一個網段的主機,比如192.168.1.1/24,但是,如果它配置了Secondary IP,那麼就可以連接兩個網段的主機,比如192.168.1.1/24和10.0.0.1/24,道理就是這么簡單,但是卻很有用,該機制可以被路由匯 總策略所使用。注意上面這個例子中的Secondary IP不是這里說的linux的Secondary address,在linux中恰恰相反,只要一個網卡上配置的ip不是一個網段的,那麼都是Primary IP,就是吊鏈結構中上面的那條主鏈中的IP,linux中的Secondary address是主鏈結點的子鏈結點中的IP,這一點一定注意,概念是不能混淆的。前面說的只是吊鏈中主鏈的作用,那麼子鏈呢?其實想像一下也很簡單,比 如一台機器上運行著一個代理伺服器或者負載均衡服務,代理伺服器或者負載均衡服務和主伺服器要監聽相同的埠,那麼就可以用secondary address來解決了,只要需要在同一網段監聽同一個埠的應用都是吊鏈中子鏈存在的原因,因此可以說,主鏈對外部或者說對下面鏈路層虛擬了多塊網卡, 而子鏈向上層虛擬了多台機器,配置了吊鏈結構的linux主機如果說只有一塊網卡,那麼外部會認為它有多塊網卡,對於內部,應用層會認為彼此在不同的主機 上,這就是效果。
除了上面大體的介紹之外,還有很多細節,吊鏈在主鏈上是沒有主次的,子鏈除了第一個節點其它節點也不分主次,都是平行的關系,但是子鏈中的第一個節點總是 鏈接在主鏈中,它們攜帶的地址就是primary地址,它們下面隸屬的子鏈攜帶的地址就是這個primary地址的secondary地址,如此看來,一 旦主鏈上一個節點被刪除了,那麼它的子鏈也將不復存在,所謂皮之不存毛將焉附。但是這種策略總是顯得不是那麼優美,因為父親犯錯,兒子也要受連累,這在現 代社會早就不時行了,那麼就需要改變機制了,因此linux中特意有了一個選項,就是當一個primary地址被刪除時,如果它有secondary地址 的話,那麼它的第一個secondary地址(長子)繼承被刪除的primary地址的位置成為primary地址,這樣就顯得很合理了,要不然在刪除 primary地址的時候,如果有程序用secondary地址,那麼要麼延遲刪除,要麼程序崩潰,採用自動提升策略的話就不會出現問題。
至於說IP aliases,那是以前版本有的了,就是一個實現問題,解決的問題和現在的secondary IP機制一樣,它主要就是在物理網卡名字後面加上後綴從而成為虛擬網路介面,本質上和secondary IP機制沒有區別,區別就是IP aliases顯得不是那麼直觀,而secondary IP卻是真正讓應用看到了一個網卡的多個地址,比如你要是用IP aliases的話,有的時候你總是會問eth0:0是什麼?我就曾經在內核裡面拚命找eth0:0這個網路設備的注冊代碼,都要瘋掉了也沒有找到,其實 我並不是很傻,但是我卻因為那個該死的名字作出了傻事。
下面就可以看看linux內核的實現代碼了,首先弄明白一些數據結構,最重要的就是net_device,其次就是in_device,然後就是in_ifaddr,明白了這三個數據結構,一切就明白了,這是真的。

structnet_device
{
...
void*ip_ptr;//指向一個in_device結構,這欄位從net_device中分離表明一個網卡可以支持多種網路層協議的
...
}
structin_device
{
structnet_device*dev;//指向它隸屬的net_device,也就是網卡
atomic_trefcnt;//引用計數
intdead;
structin_ifaddr*ifa_list;//所有的ip地址鏈表
...
};
structin_ifaddr//代表一個ip地址
{
structin_ifaddr*ifa_next;//上面的in_device中的ifa_list欄位就是靠這個欄位連成鏈的
structin_device*ifa_dev;//回指in_device結構
structrcu_headrcu_head;
u32ifa_local;//ip地址
u32ifa_address;
u32ifa_mask;//掩碼
u32ifa_broadcast;//廣播地址
u32ifa_anycast;
unsignedcharifa_scope;
unsignedcharifa_flags;//只有IFA_F_SECONDARY標志,因為除了這個就是primary地址了
unsignedcharifa_prefixlen;
charifa_label[IFNAMSIZ];//名字,在ipaliases時代,它就可能是ethx:y的形式,在secondaryip時代,它統一就是ethx
};


注 意,上面的結構並沒有將linux網卡的ip地址結構表示為吊鏈結構,所謂的吊鏈結構只是邏輯上的,在數據結構上,一個網卡所有的ip地址全部都在 ifa_list中被鏈接成一個線性的鏈表,至於是primary地址還是secondary地址就看in_ifaddr的ifa_flags欄位了。每 當有新的地址被設置的時候,inet_insert_ifa總是被調用,linux為何沒有在代碼上將ip地址表示為吊鏈結構呢?我也不知道,個人感覺一 個net_device帶有一個primary ip鏈表,然後每個primary ip節點帶有一個secondary ip鏈表,這樣會更好一些的,我覺得inet_insert_ifa實現的十分拙劣。添加地址可以通過兩個用戶空間程序搞定,一個是ifconfig,另 一個是ip addr add,ifconfig是基於ioctl進行地址添加的,而ip程序是基於netlink進行地址添加的,不管哪一種方式都可以達到目的,現在就可以看 看另一個問題了:為何用ip addr add添加的ip地址用ifconfig看不到,而ifconfig設置的地址ip addr show卻是可以看到。這個問題通過看代碼一眼就可以明白,在ifconfig獲得ip地址的時候,代碼:

for(ifap=&in_dev->ifa_list;(ifa=*ifap)!=NULL;ifap=&ifa->ifa_next)
{
if(!strcmp(ifr.ifr_name,ifa->ifa_label)&&sin_orig.sin_addr.s_addr==ifa->ifa_address)
{
break;
}
}


取 的是這個被找到的ifa的ip地址,而我們知道,所有的ifa鏈接成一個線性鏈表,那麼找到了第一個就不會再往後走了,因此只能得到一個結果,就是鏈表最 前面的那個,而ip add show就不同了,具體在函數inet_mp_ifaddr中實現,該函數遍歷所有的ifa,並且傳到用戶空間緩沖區。這里可以做一個實驗:首先用 ip addr add添加幾個不在同一個網段的primary ip地址,然後再ifconfig一個和前面的ip都不在一個網段的ip,然後可以用ifconfig查看一下,發現不是剛剛用ifconfig設置進去 的那個ip,而是用ip addr add添加進去的,這就說明ifconfig永遠都是取的ifa鏈表最前面的那一個,還有一點要注意,就是如果你用ip addr add添加了很多的secondary ip地址,那麼恰好你用ifconfig設置的ip地址和那些secondary ip在一個網段,那麼所有的secondary ip都將被刪除,這些都是sencondary ip的規范決定的,而且在代碼中也有體現。另外還要注意,路由表的表項都是基於primary ip的,因為所有的操作都是以primary ip為主的,比如在添加路由的時候:

voidfib_add_ifaddr(structin_ifaddr*ifa)
{
structin_device*in_dev=ifa->ifa_dev;
structnet_device*dev=in_dev->dev;
structin_ifaddr*prim=ifa;
...
if(ifa->ifa_flags&IFA_F_SECONDARY){//如果ifa是個sencondary地址,那麼就找到它隸屬的primary地址後然後以這個primary為主進行設置
prim=inet_ifa_byprefix(in_dev,prefix,mask);
if(prim==NULL){
printk(KERN_DEBUG"fib_add_ifaddr:bug:prim==NULL/n");
return;
}
}
fib_magic(RTM_NEWROUTE,RTN_LOCAL,addr,32,prim);//添加進路由表
...
}


到 此為止我們知道了不少東西,最重要的就是linux中網卡ip地址的吊鏈結構以及這么設計的好處,另外就是設置ip地址的方式有ioctl和 netlink。其實網卡擁有多個ip並不會帶來什麼沖突,本質上ip和網卡沒有什麼關系,它們唯一的關系就是靠網路分層模型聯系在一起的,細節上就是靠 路由聯系在一起的,比如我添加路由的時候指定了一個目的地址和下一跳ip地址以及一個網卡出口,那麼內核會根據提供的目的地址將路由插在合式的位置,然後 將nh的網路設備設置為你提供的網卡出口,等到傳輸數據的時候就會查找路由從而找到出口,就是這么簡單,你自己手動設置的路由可以隨意設置,即使完全錯誤 內核也會將之加入路由表的,還有一種路由是內核自動生成的,就是在網卡剛剛up的時候,這時通過網卡的net_device找到其in_device然後 找到其ip地址,這樣的路由稱為鏈路路由。
通過secondary IP機制,你可以認為你的機器有很多網卡,對於應用,監聽同一埠的應用會認為它們在區域網中不同的機器上,你可以隨意使用這些ip地址而不會發生混亂,路由和底層的arp會處理好這一切,當然前提是你將路由設置對。
附: 用戶空間有ifup/ifdown,/sbin/ip,ifconfig,還有netplugd守護進程,這些有何關系嗎?這中間ip程序是最基本的,沒 有任何策略,策略就是參數指定,要麼就是別的程序調用它,而netplugd就是一個監控守護進程,通過netlink監控網卡狀態,然後根據不同的監控 結果調用/etc/netplug.d/netplug腳本,進而可能調用ifup/ifdown腳本,而後者就是腳本,其中會調用ifup-eth腳 本,最終整理好參數後調用ip程序(典型的就是:ip link set eth0 up/down),當然ip程序完全可以自己調用,比如ip addr add以及ip route add等等,而ifconfig沒有那麼繞圈子,就是通過ioctl進行設置,可以通過strace來觀察。這其中奧妙大了去了,說白了就是策略和機制分 離,另外還體現出linux中的很多功能都是很小的程序組合而成的。

Linux的ip地址的吊鏈結構以及ip地址的定址特性(詳見《關於IP網段間互訪的問題—路由是根本》)充分說明了linux的協議棧實現多麼的完美,完全符合分層和封裝模型,使得下層的邏輯和上層的邏輯完全解除耦合,也就是說ip層完全不依賴鏈路層以及物理層的物理布局,最後記住,ip層事情比如定址路由只由ip層實現,之所有有鏈路層發現的路由,完全是為了方便。

閱讀全文

與linux網路協議結構相關的資料

熱點內容
4kb的txt文件差不多多少字 瀏覽:984
u盤文件突然變成exe 瀏覽:164
現在哪些學校初中有學編程的 瀏覽:402
word查找全選 瀏覽:599
開工報告附什麼文件資料 瀏覽:150
分區工具app怎麼用 瀏覽:212
安卓堅果雲文件路徑 瀏覽:591
sqllog文件 瀏覽:236
如何在電腦中找到文件路徑 瀏覽:830
數據結構訪問和查找有什麼區別 瀏覽:401
怎麼清空icloud內的數據 瀏覽:338
微信鎖屏後音樂停止 瀏覽:668
applepay蘋果手機卡 瀏覽:835
一個14mb的文件能儲存多少萬漢字 瀏覽:478
騰訊文檔里如何導出數據 瀏覽:979
java面試題csdn 瀏覽:410
rpgnvp是什麼文件 瀏覽:594
如何將一列數據復制到excel 瀏覽:488
sd卡怎麼恢復excel文件 瀏覽:282
gdblinux內核多核調試 瀏覽:24

友情鏈接