天天看點

Linux協定棧(1)——協定介紹

本系列材料是關于Linux網絡核心協定棧的,總體上将其分10個文章,主要目的是簡明扼要的描述Linux協定棧在核心中的實作,從總體上掌握linux網絡協定棧。因為作業系統中的網絡子系統非常龐大,加上本系列材料有限,是以路由系統、鄰接子系統、無線系統、橋接等不會涉及,後續有機會再系列介紹。

材料先會介紹網絡相關相關的TCP/IP協定族知識(本章),然後從總體上觀測包的接收和發送流程及代碼(第二章和第三章)。(第四章和第五章)介紹網絡協定棧相關的資料結構為後續的代碼解讀打下基礎,接着是從最新git代碼分支上來走讀鍊路層、網絡層、傳輸層(第六章、第七章和第八章),以及網絡驅動(第十章)。最後會介紹Layer5應用層的開發(第十章)以及對本系列的一個總結(第十一章)。

下面我們開始:

       網絡協定的正式模型其實是

OSI(Open Systems Interconnection)7層模型,但事實标準是TCP/IP四層模型,linux中的協定模型也是這TCP/IP模型的。這個是曆史原因我們不去關注。

其兩者模型之間的對應關系如下圖所示:

Linux協定棧(1)——協定介紹

       對于某些問題來說,7層模型過于詳細,現在完全按照七層來實作的比較少。模型中每層隻能與緊鄰的層通信。

本系列中基本不涉及應用層(如HTTP(Hyper text

transfer protocol)、FTP(file transfer protocol)、SMTP(simple mail

transfer rotocol)、POP3(post office protocol 3)、IMAP4(Internet mail access protocol))的具體細節,主要是下面三層的流程、函數和實作。

各層對應的資料如下:

應用層——消息

傳輸層——資料段(segment)

網絡層——分組、資料包(packet)

鍊路層——幀(frame)

實體層——P-PDU(bit)

當然這個隻是稱呼,如果非要把每層都叫消息也是可以的,不過這樣在交流或者看材料的時候可能會引起誤解了。

本章還要先準備一些相關的知識用于後面章節的預熱,主要是傳輸層的協定格式、網絡層的協定格式、資料鍊路層的協定格式。

傳輸層主要的是TCP和UDP,具有代表性的兩個傳輸層協定。除此之外還有SCTP(Stream Control Transmission Protocol,流控制傳輸協定),DCCP(資料報擁塞控制協定Datagram

Congestion Control Protocol)等傳輸層協定,當然遠沒有TCP/UDP兩兄弟那麼火熱。

TCP(Transmission

Control Protocol 傳輸控制協定)是一種面向連接配接的、可靠的、基于位元組流的傳輸層通信協定,由IETF的RFC 793定義。通過檢驗和、序列号、确認應答、重發控制、連接配接管理以及視窗控制等機制實作可靠性傳輸。

       它的首部如下,注意TCP首部是從20位元組~60位元組可變的:

Linux協定棧(1)——協定介紹

       如果大家對網絡開發比較熟悉的話,這個圖應該是比較熟悉的。當然如果不熟悉的話,可以複制下來貼在一個顯眼的地方可以讓自己能随時看到。

而UDP 是User

Datagram Protocol的簡稱,

中文名是使用者資料報協定,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種<b>無連接配接的傳輸層協定,提供面向事務的簡單不可靠資訊傳送服務</b>,IETF RFC 768是UDP的正式規範。

       UDP的格式如下:

Linux協定棧(1)——協定介紹

       他們的格式有個相同點,就是前面4個自己都是記錄源端口号和目标端口号的哦。不過在這一層記住并沒有IP位址,這是因為在下層網絡層的時候會有IP位址的。

       TCP和UDP兩個協定各有優缺點,我們先記住一點就好了,TCP是可靠的,UDP是不可靠的。UDP協定時發出包之後就不管了,無法确定對端是否收到了這個包,需要應用程式來判斷,而TCP協定在發出包之後是會等待對面發送ACK應答回來的,逾時不發送回來說明對面沒收到就會觸發重傳機制。

IP(網際協定,Internet

Protocol).

       TCP/IP心髒是網際網路層。主要由IP和ICMP兩個協定組成。

IP分為三大作用子產品:IP尋址、路由、以及IP分包與組包。

       IP包格式如下:

Linux協定棧(1)——協定介紹

       這個報頭内容也挺多,大家不用一次記住它,可以和TCP/UDP協定頭一起列印出來貼起來。

最後我們來看下鍊路層,鍊路層協定有以太網、SLIP、令牌網等等,我們這裡以目前最常用的以太網為例。

<b>在資料鍊路層中稱這種資料為幀(frame</b><b>)</b>

我們來看下以太網格式,如下圖:

Linux協定棧(1)——協定介紹

       以太網的幀尾是一個叫做FCS(Frame Check

Sequence,幀檢驗序列)的4個位元組。用于檢查幀是否有所損壞。傳輸過程中如果出現電子噪聲幹擾,可能會導緻亂碼位的出現。

知道這些TCP/IP協定的知識足夠我們繼續往下走了,至于那些RFC中陳芝麻、爛谷子的事情就不提了。

       後面我們開始看在Linux網絡協定棧中的接收流程。

上一篇: nginx之yum源
下一篇: 域模型介紹

繼續閱讀