天天看點

網絡程式設計必備:深入了解TCP/IP協定棧

作者:嵌入式Linux核心

TCP/IP協定并不是單純的兩個協定,而是一個很大的協定棧的總稱。TCP/IP 協定棧是構成網絡通信的核心骨架,它定義了電子裝置如何連入網際網路,以及資料如何在它們之間進行傳輸。TCP/IP 協定采用4層結構,分别是應用層、傳輸層、網絡層和鍊路層,每一層都呼叫它的下一層所提供的協定來完成自己的需求。下面我們來看TCP/IP的四層結構。網絡協定有OSI七層協定和TCP/IP四層協定,還有一個五層協定,其實四層協定可以看做是七層協定的簡化版。

一、TCP/IP整體概念

1.1實體媒體

實體媒體就是把電腦連接配接起來的實體手段,常見的有光纖、雙絞線,以及無線電波,它決定了電信号(0和1)的傳輸方式,實體媒體的不同決定了電信号的傳輸帶寬、速率、傳輸距離以及抗幹擾性等等。 TCP/IP協定棧分為四層,每一層都由特定的協定與對方進行通信,而協定之間的通信最終都要轉化為 0 和 1 的電信号,通過實體媒體進行傳輸才能到達對方的電腦,是以實體媒體是網絡通信的基石。

下面我們先通過一張圖先來大概了解一下TCP/IP協定的基本架構以及資料的處理流程:

網絡程式設計必備:深入了解TCP/IP協定棧

當通過http發起一個請求時,應用層、傳輸層、網絡層和鍊路層的相關協定依次對該請求進行包裝并攜帶對應的首部,最終在鍊路層生成以太網資料包,以太網資料包通過實體媒體傳輸給對方主機,對方接收到資料包以後,然後再一層一層采用對應的協定進行拆包,最後把應用層資料交給應用程式處理。

網絡通信就好比送快遞,商品外面的一層層包裹就是各種協定,協定包含了商品資訊、收貨位址、收件人、聯系方式等,然後還需要配送車、配送站、快遞員,商品才能最終到達使用者手中。

一般情況下,快遞是不能直達的,需要先轉發到對應的配送站,然後由配送站再進行派件。

配送車就是實體媒體,配送站就是網關, 快遞員就是路由器,收貨位址就是IP位址,聯系方式就是MAC位址。

快遞員負責把包裹轉發到各個配送站,配送站根據收貨位址裡的省市區,确認是否需要繼續轉發到其他配送站,當包裹到達了目标配送站以後,配送站再根據聯系方式找到收件人進行派件。

1.2鍊路層

網絡通信就是把有特定意義的資料通過實體媒體傳送給對方,單純的發送 0 和 1 是沒有意義的,要傳輸有意義的資料,就需要以位元組為機關對 0 和 1 進行分組,并且要辨別好每一組電信号的資訊特征,然後按照分組的順序依次發送。以太網規定一組電信号就是一個資料包,一個資料包被稱為一幀, 制定這個規則的協定就是以太網協定。

以太網規協定定,接入網絡的裝置都必須安裝網絡擴充卡,即網卡, 資料包必須是從一塊網卡傳送到另一塊網卡。而網卡位址就是資料包的發送位址和接收位址,也就是幀首部所包含的MAC位址,MAC位址是每塊網卡的身份辨別,就如同我們身份證上的身份證号碼,具有全球唯一性。

有了MAC位址以後,以太網采用廣播形式,把資料包發給該子網内所有主機,子網内每台主機在接收到這個包以後,都會讀取首部裡的目标MAC位址,然後和自己的MAC位址進行對比,如果相同就做下一步處理,如果不同,就丢棄這個包。

是以鍊路層的主要工作就是對電信号進行分組并形成具有特定意義的資料幀,然後以廣播的形式通過實體媒體發送給接收方。

1.3網絡層

對于上面的過程,肯定會産生下面幾個疑問:

1.發送者如何知道接收者的MAC位址?

2.發送者如何知道接收者和自己同屬一個子網?

3.如果接收者和自己不在同一個子網,資料包如何發給對方?           

為了解決這些問題,網絡層引入了三個協定,分别是IP協定、ARP協定、路由協定。 IP協定制定了IP位址來判斷倆個主機是否屬于同一個子網。 ARP協定根據IP位址擷取MAC位址。 路由協定根據信道情況,選擇并設定路由,以最佳路徑來轉發資料包。

是以,網絡層的主要工作是定義網絡位址,區分網段,子網内MAC尋址,對于不同子網的資料包進行路由。

1.4傳輸層

鍊路層定義了主機的身份,即MAC位址, 而網絡層定義了IP位址,明确了主機所在的網段,有了這兩個位址,資料包就從可以從一個主機發送到另一台主機。但實際上資料包是從一個主機的某個應用程式發出,然後由對方主機的應用程式(程序)接收。而每台電腦都有可能同時運作着很多個應用程式(程序),是以當資料包被發送到主機上以後,是無法确定哪個應用程式(程序)要接收這個包。傳輸層提供了程序間的邏輯通信,傳輸層向高層使用者屏蔽了下面網絡層的核心細節,使應用程式看起來像是在兩個傳輸層實體之間有一條端到端的邏輯通信信道。

1.5應用層

理論上講,有了以上三層協定的支援,資料已經可以從一個主機上的應用程式傳輸到另一台主機的應用程式了,但此時傳過來的資料是位元組流,不能很好的被程式識别,操作性差。是以,應用層定義了各種各樣的協定來規範資料格式,常見的有 HTTP、FTP、SMTP 等。

1.6四層協定整體流程

鍊路層:對0和1進行分組,定義資料幀,确認主機的實體位址,傳輸資料; 網絡層:定義IP位址,确認主機所在的網絡位置,并通過IP進行MAC尋址,對外網資料包進行路由轉發; 傳輸層:定義端口,确認主機上應用程式的身份,并将資料包交給對應的應用程式; 應用層:定義資料格式,并按照對應的格式解讀資料。

用一句話來概括就是:當你輸入一個網址并按下Enter鍵的時候,首先,應用層協定對該請求包做了格式定義;緊接着傳輸層協定加上了雙方的端口号,确認了雙方通信的應用程式;然後網絡協定加上了雙方的IP位址,确認了雙方的網絡位置;最後鍊路層協定加上了雙方的MAC位址,确認了雙方的實體位置,同時将資料進行分組,形成資料幀,采用廣播方式,通過傳輸媒體發送給對方主機。而對于不同網段,該資料包首先會轉發給網關路由器,經過多次轉發後,最終被發送到目标主機。目标機接收到資料包後,采用對應的協定,對幀資料進行組裝,然後再通過一層一層的協定進行解析,最終被應用層的協定解析并交給伺服器處理。

二、傳輸層

傳輸層(Transport Layer)是ISO OSI協定的第四層協定,實作端到端的資料傳輸。該層是兩台計算機經過網絡進行資料通信時,第一個端到端的層次,具有緩沖作用。當網絡層服務品質不能滿足要求時,它将服務加以提高,以滿足高層的要求;當網絡層服務品質較好時,它隻用很少的工作。傳輸層還可進行複用,即在一個網絡連接配接上建立多個邏輯連接配接。

傳輸層在終端使用者之間提供透明的資料傳輸,向上層提供可靠的資料傳輸服務。傳輸層在給定的鍊路上通過流量控、分段/重組和差錯控制。一些協定是面向連結的。這就意味着傳輸層能保持對分段的跟蹤,并且重傳那些失敗的分段。

傳輸層作用

  • 傳輸層實作應用程序間的端到端(end-to-end)通信
  • 向應用層提供通信服務

多路分解與複用

  • 多路複用:所有應用程序的資料通過傳輸層傳輸到IP層;
  • 多路分解:傳輸層收到的資料傳遞給相應的應用程序。

2.1使用者資料報協定UDP

端到端的、盡力而為的、無連接配接的資料報傳輸服務 1.無連接配接的 2.盡最大努力傳遞,即不保證可靠傳遞 3.面向封包的(在IP的功能上簡單擴充了端到端) 4.沒有擁塞控制 5.支援一對一、一對多、多對一和多對多的互動通信(需要多點傳播的通信都是建立在UDP之上)

網絡程式設計必備:深入了解TCP/IP協定棧

2.2傳輸控制協定TCP

端到端的、可靠的、面向連接配接的位元組流服務 a).面向連接配接:先建立邏輯連接配接,進行雙向資料流傳輸,通信結束後撤銷連接配接 b).面向位元組流 c).點對點的全雙工通信 d).可靠傳輸:對一個連接配接上傳輸的每個位元組編号,通過接收确認和重傳來保證可靠傳輸 c).流量控制:防止發送方發出的資料超出接收方的接收能力。

網絡程式設計必備:深入了解TCP/IP協定棧

多路複用:源、目的端口 連接配接管理:序号、确認号、SYN、FIN 可靠傳輸:序号、确認号 流量控制:接收視窗 擁塞控制:未在TCP首部中展現(序号、确認号、接收視窗)。

2.3連接配接管理

  • 每條TCP連接配接是一對點到點的位元組流
  • 每條TCP連接配接者兩個端點,即套接字(sokect)={IP : port}
  • 每條TCP連接配接由兩個端點唯一辨別,TCP連接配接={socket1, socket2} = {{IP1 : port1}, {IP2 : port2}}
  • TCP連接配接有3個階段:連接配接建立、資料傳輸、連接配接釋放

1)TCP連接配接建立的目的

①使通信雙方确知對方的存在 ②雙方确定自己的初始序列号,并通知對方 ​ ③允許雙方協商一些參數(最大封包長度、視窗大小等) ​ ④對傳輸實體資源進行配置設定

2)TCP連接配接建立的方式

采用用戶端伺服器方式(C/S),主動發起連接配接建立的應用程序叫做用戶端,被動等待連接配接建立的叫伺服器端。

3)連接配接建立(三次握手)

①伺服器程序B被動打開連接配接,進入LISTEN(收聽)狀态,等待用戶端送出請求 ​

②客戶程序A主動打開連接配接,向B發送連接配接請求封包段(封包段不攜帶資料),SYN=1,序号=x,進入SYN-SENT(同步已發送)狀态 ​

③伺服器程序B收到請求後,向A發送确認封包段(封包段不攜帶資料),SYN=1,ACK=1,确認号=x+1,序号=y,進入SYN-RCVD(同步收到)狀态 ​

④客戶程序A收到确認後,向B發送确認封包段(封包段可以攜帶資料,不攜帶資料時不消耗序号,下一個序号依然是x+1),ACK=1,确認号=y+1,序号=x+1,進入ESTABLISHED(已建立連接配接)狀态,B收到确認後,也進入ESTABLISHED狀态

網絡程式設計必備:深入了解TCP/IP協定棧

為什麼A需要向B發送最後一個确認封包段:為了防止“已失效的連接配接請求封包段”突然又傳到B發生錯誤,以至于B一直等待A發送資料,B的資源被浪費。

4)連接配接釋放(四次揮手)

①A,B都處于ESTABLISHED狀态; ​

②客戶程序A主動關閉連接配接,向B發送連接配接釋放請求封包段(封包段不挾帶資料),FIN=1,序列号=u,進入FIN-WAIT-1(終止等待1)狀态; ​

③B收到A的連接配接釋放封包段後,應答确認,ACK=1,确認号=u+1,序号=v,進入CLOSE-WAIT (關閉等待)狀态,B仍然可以向A發送資料,A進入FIN-WAIT-2(終止等待2)狀态; ​

④若B已經沒有向A的資料,其應用程序通知TCP連接配接釋放,B向A發送連接配接釋放封包段,FIN=1,ACK=1,确認号=u+1,序号=w,進入LAST-ACK(最後确認)狀态; ​

⑤A收到B的連結釋放封包段後,應答确認,ACK=1,确認号=w+1,序号=u+1,進入TIME-TIME-WAIT(時間等待)狀态,B收到A的确認後,進入CLOSED狀态

網絡程式設計必備:深入了解TCP/IP協定棧

A必須經過時間等待計時器設定的時間2MSL(預設2分鐘)後,進入CLOSED狀态:確定A發送的最後一個ACK封包段能夠到達B;防止“已失效的連接配接請求封包段”出現在本連接配接中。

背景私信【核心】自行擷取
網絡程式設計必備:深入了解TCP/IP協定棧

可靠傳輸

  • 發送方的TCP:維護一個發送緩沖區
  • 維護3個指針:LastByteAcked、LastByteSent、LastByteWritten
  • 發送視窗=min(通知視窗,擁塞視窗)
  • 累積确認(Cumulative ACK) :對按序到達的最後一個封包段進行确認
  • 選擇确認(Selective ACK) :确認接收到的不連續的資料塊的邊界(使用首部的SACK選項,不影響确認号字段的使用)
網絡程式設計必備:深入了解TCP/IP協定棧

流量控制

目的:為了防止發送方給慢接收方發資料造成接受崩潰,緩沖區溢出 原理:接收方通知發送方自己的接受視窗大小,發送方的發送視窗≤接收方的接受視窗

問題:B向A發送了零視窗封包段後,B的接受緩存有了一些存儲空間,于是B向A發送了rwnd=400的封包段,然而封包段在傳送過程中丢失,這樣A一直等待B發送的非零視窗通知,B一直等待A發送資料,進而形成死鎖局面。

解決:TCP為每一個連接配接設定一個持續計時器,隻要TCP連結一方收到零視窗通知,就啟動持續計時器,計時器到期,發送零視窗探測封包段,而對方就在确認這個探測封包段時給出現在的視窗值,①如果視窗仍然是零,那麼重新設定持續計時器;②否則死鎖的僵局就可以打破。

2.4自适應重傳

1)逾時重傳

封包段的往返時間:RTT 權重平均往返時間:RTTS RTT的偏差權重平均值:RTTD 逾時重傳時間:RTO RTTS = (1 - α) * RTTS + α * 新的RTT樣本值 (α一般為1/8) RTTD = (1 - β) * RTTD + β * | RTTS - 新的RTT樣本值 | (β一般為1/4) RTO = RTTS + 4 * RTTD

Karn算法: ①每次逾時重傳一個封包段時,停止計算新RTT樣本值 ②每次逾時重傳一個封包段時,就把逾時重傳時間RTO增大y倍(一般為2倍) ③當不發生封包段重傳時,才計算RTTS和逾時重傳時間RTO

2)快速重傳

原因:逾時重傳作為TCP最基本的重傳機制,效率較低。

網絡程式設計必備:深入了解TCP/IP協定棧

逾時的粗粒度實作方法導緻連接配接在等待一個定時器逾時時,很長一段時間連接配接無效。

基本思想: ①接收方:當封包段到達,立刻回複ACK,即使該序号已被确認過 ②發送方:收到一個重複ACK(同一個确認的再一次重傳稱為重複确認),就知道接收方必定收到亂序到達的封包段,表明其前面的分組可能丢失。收到3個重複ACK時,立刻觸發重傳。

網絡程式設計必備:深入了解TCP/IP協定棧

2.5擁塞控制

1)視窗大小

MaxWindow = min (cwnd, AdvertisedWindow) 擁塞視窗cwnd (Congestion Windows):擁塞控制算法決定,可以同時發出的最大位元組數以防止造成網絡擁塞 通知視窗 (AdvertisedWindow):接收方決定,可以同時發出的最大位元組數以防止超出接收方的接收能力。

2)擁塞控制算法

①慢啟動 把初始擁塞視窗 cwnd 設定為不超過2至4個SMSS(最大封包段長度),在每收到一個對新的封包段的确認後,把cwnd增加1個 SMSS 的數值數(每經過一個傳輸輪次,cwnd就加倍) 設定一個慢開始門限ssthresh 當cwnd < ssthresh時,使用慢開始算法 當cwnd ≥ ssthresh時,使用擁塞避免算法。

網絡程式設計必備:深入了解TCP/IP協定棧

②擁塞避免(加法增大):每經過一個往返時間RTT把發送方的cwnd加1,使得cwnd慢性增加 ③快重傳(乘法減小):收到3個重複ACK立即觸發重傳 ④快恢複(在快重傳之後)

  1. ssthresh減小為目前cwnd的一半:ssthresh = cwnd / 2
  2. 新擁塞視窗 cwnd = 新的 ssthresh
  3. 執行擁塞避免 (AIMD),使cwnd緩慢線性增大

三、應用層

3.1概念

5層網際網路協定棧:應用層 -> 傳輸層 -> 網絡層 -> 資料鍊路層 -> 實體層

7層OSI參考模型:應用層 ->表示層 -> 會話層 -> 傳輸層 -> 網絡層 -> 資料鍊路層 -> 實體層

為什麼我們要在計算機網絡中分層次?

因為如果兩台計算機能夠互相通信的話,實際實作起來是非常困難操作的。我們分層的目的就是為了将困難的問題簡單化,并且如果我們分層了,我們在使用的時候就可以僅僅關注我們需要關注的層次,而不用理會其他層

如果需要改動設計的時候,我們隻需要把變動的層替換即可,并不用涉及到其他的層次。這與我們程式設計中的低耦合是一個概念。

每層作用如下:

  • 實體層:通過媒介傳輸比特,确定機械及電氣規範(比特Bit),通過電頻的高低來傳輸0和1這樣的電信号
  • 資料鍊路層:将比特組裝成幀和點到點的傳遞(幀Frame),将無規則的0和一同通過一套規則來分組傳輸,于是出現了以太網協定。以太網協定規定:一組電信号構成一個資料包,這個資料包稱為幀,每一個幀由标頭(Head)和資料(Data)兩部分組成,标頭部分的大小為18位元組
  • 網絡層:負責資料包從源到宿的傳遞和網際互連(包PackeT)
  • 傳輸層:提供端到端的可靠封包傳遞和錯誤恢複(段Segment)
  • 會話層:建立、管理和終止會話(會話協定資料單元SPDU)
  • 表示層:對資料進行翻譯、加密和壓縮(表示協定資料單元PPDU)
  • 應用層:允許通路OSI環境的手段(應用協定資料單元APDU)
網絡程式設計必備:深入了解TCP/IP協定棧

每一層的協定如下:

  • 實體層:RJ45、CLOCK、IEEE802.3 (中繼器,集線器,網關)
  • 資料鍊路:PPP、FR、HDLC、VLAN、MAC (網橋,交換機)
  • 網絡層:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGRP、 (路由器)
  • 傳輸層:TCP、UDP、SPX
  • 會話層:NFS、SQL、NETBIOS、RPC
  • 表示層:JPEG、MPEG、ASII
  • 應用層:FTP、DNS、Telnet、SMTP、HTTP、WWW、NFS

3.2DNS域名系統

NS(Domain Name System)提供了什麼服務?

  • 一個由分層的DNS伺服器(DNS Server)實作的分布式資料庫
  • 使得主機能夠查詢分布式資料庫的應用協定
  • DNS協定是運作在UDP之上,用53号端口

分布式、層次資料庫:

  • 根DNS伺服器:全球有四百多個根DNS伺服器,由13個不同的組織管理,根伺服器提供TLD伺服器的IP位址。
  • 頂級域(TLD)DNS伺服器:頂級域(如:com、org、net和org)和所有的國家頂級域(uk、fr、cn、jp)都有TLD伺服器。TLD伺服器提供了權威DNS伺服器的IP位址
  • 權威DNS伺服器:再網際網路上具有公共可通路的主機(就是你的伺服器主機位址),權威DNS伺服器将主機名映射為IP位址
  • 本地DNS伺服器:不屬于DNS伺服器的層次結構,但是也是必不可少的。當我們發出DNS請求時,該請求先被發送到本地DNS伺服器,它起着代理的作用

域名解析過程:

假設我們(主機是http://a.xyz.com)擷取http://www.baidu.com的IP位址,同時本地DNS伺服器為http://dns.xyz.com。首先我們的主機向本地DNS伺服器發送一個DNS查詢封包(封包包含被查詢的主機名),然後本地DNS伺服器将該封包轉發到根DNS伺服器,根DNS伺服器發現了com字首,然後向本地DNS伺服器傳回com的頂級域(TLD)DNS伺服器的IP位址清單。本地DNS服務區再向這些TLD伺服器發送查詢封包,TLD伺服器注意到了http://baidu.com字首,然後将負責http://www.baidu.com的權威DNS伺服器的IP位址傳回給本地DNS伺服器,最後,本地DNS伺服器向該IP位址進行發送封包查詢,權威DNS伺服器傳回了http://www.baidu.com的IP位址給本地DNS伺服器,本地DNS伺服器再将該DNS發送到我們主機,我們開始通路該IP位址。

遞歸查詢過程如下:

網絡程式設計必備:深入了解TCP/IP協定棧

疊代查詢過程如下:

網絡程式設計必備:深入了解TCP/IP協定棧

理論上來講,任何DNS查詢既可以是遞歸也可以是疊代的。在實踐中,查詢通常是從請求主機到本地DNS伺服器的查詢時遞歸的,其餘查詢時疊代的

  • 主機向本地域名伺服器的查詢一般都是采用遞歸查詢:如果主機所詢問的本地域名伺服器不知道被查詢域名的 IP 位址,那麼本地域名伺服器就以 DNS 客戶的身份,向其他根域名伺服器繼續發出查詢請求封包。
  • 本地域名伺服器向根域名伺服器的查詢通常是采用疊代查詢:當根域名伺服器收到本地域名伺服器的疊代查詢請求封包時,要麼給出所要查詢的 IP 位址,要麼告訴本地域名伺服器:“你下一步應當向哪一個域名伺服器進行查詢”。然後讓本地域名伺服器進行後續的查詢。

3.3FTP協定以及端口

檔案傳輸協定FTP(File Transfer Protocol)是世界上使用最廣泛的檔案傳輸協定。FTP 提供互動式的通路,允許客戶指明檔案的類型與格式,并允許檔案具有存取權限

網絡環境下複制檔案的複雜性:

  • 計算機存儲資料的格式的不同
  • 檔案的目錄結構和檔案命名的規定不同
  • 對于相同的檔案存取功能,作業系統使用的指令不同
  • 通路控制方法不同

是以,FTP協定出現了。

FTP協定連接配接過程:

  1. 打開熟知端口(端口号為 21),使客戶程序能夠連接配接上
  2. 等待客戶程序發出連接配接請求
  3. 啟動從屬程序來處理客戶程序發來的請求。從屬程序對客戶程序的請求處理完畢後即終止,但從屬程序在運作期間根據需要還可能建立其他一些子程序
  4. 回到等待狀态,繼續接受其他客戶程序發來的請求。主程序與從屬程序的處理是并發地進行
  5. 當客戶程序向伺服器程序發出建立連接配接請求時,要尋找連接配接伺服器程序的熟知端口 (21),同時還要告訴伺服器程序自己的另一個端口号碼,用于建立資料傳送連接配接
  6. 接着,伺服器程序用自己傳送資料的熟知端口 (20) 與客戶程序所提供的端口号碼建立資料傳送連接配接
  7. 由于 FTP 使用了兩個不同的端口号,是以資料連接配接(20)與控制連接配接(21)不會發生混亂

FTP是使用了兩個TCP連接配接的:

  • 使協定更加簡單和跟容易實作
  • 在傳輸檔案時還可以利用控制連接配接(如:客戶發送請求終止傳輸)
網絡程式設計必備:深入了解TCP/IP協定棧

3.4DHCP動态主機配置協定

DHCP:DHCP(動态主機配置協定)是一個區域網路的網絡協定。指的是由伺服器控制一段IP位址範圍,客戶機登入伺服器時就可以自動獲得伺服器配置設定的IP位址和子網路遮罩。網際網路廣泛使用的動态主機配置協定 DHCP (Dynamic Host Configuration Protocol) 提供了即插即用連網 (plug-and-play networking) 的機制。

DHCP是使用UDP協定工作,他的用途如下:

    1. 為内部網絡或網絡服務供應商自動配置設定IP位址
    2. 為使用者或者内部網絡管理者作為對所有計算機做中央管理的手段
    3. 為内部網絡使用者接受IP租約

并不是每個網絡上都有DHCP伺服器,這樣會使得DHCP伺服器的數量太多了。現在是每個網絡至少有一個DHCP中繼代理,他配置了DHCP伺服器的IP位址資訊

在生活中,DHCP必不可少,為我們帶來了便利,當通過WiFi連上一個陌生的子網,但是我們并沒有做重新為主機配置IP位址的工作,這樣子就可直接上網!假如沒有DHCP協定的幫助:

網絡程式設計必備:深入了解TCP/IP協定棧

而在DHCP協定的支援下:

DHCP工作流程:

  • DHCP伺服器管理着一個包含一系列IP位址的位址池
  • 每當一台新的主機加入時,DHCP伺服器就從其目前可用位址池中配置設定一個任意的位址給它
  • 而每當一台主機離開的時候,其IP位址就被回收到位址池中

3.5簡單網絡管理協定SNMP

簡單網絡管理協定SNMP(Simple Net Manage Protocol)是TCP/IP協定簇的一個應用層協定,網絡管理包括對硬體、軟體和人力的使用、綜合與協調,以便對網絡資源進行監視、測試、配置、分析、評價和控制,這樣就能以合理的價格滿足網絡的一些需求,如實時運作性能,服務品質等。網絡管理常簡稱為網管。

網絡程式設計必備:深入了解TCP/IP協定棧

含義:

  • 網絡管理協定簡稱為網管協定。
  • 需要注意的是,并不是網管協定本身來管理網絡。網管協定是管理程式和代理程式之間進行通信的規則。

CS模式:

  • 管理程式和代理程式按客戶伺服器方式工作。
  • 管理程式運作 SNMP 客戶程式,向某個代理程式送出請求(或指令),代理程式運作 SNMP 伺服器程式,傳回響應(或執行某個動作)。

功能:

  • SNMP 最重要的指導思想就是要盡可能簡單。
  • SNMP 的基本功能包括監視網絡性能、檢測分析網絡差錯和配置網絡裝置等。

過程:

  • 整個系統必須有一個管理站。
  • 管理程序和代理程序利用 SNMP 封包進行通信,而 SNMP 封包又使用 UDP 來傳送。
  • 若網絡元素使用的不是 SNMP 而是另一種網絡管理協定,SNMP 協定就無法控制該網絡元素。這時可使用委托代理 (proxy agent)。委托代理能提供如協定轉換和過濾操作等功能對被管對象進行管理。
  • SNMP 定義了管理站和代理之間所交換的分組格式。所交換的分組包含各代理中的對象(變量)名及其狀态(值)。
  • SNMP 負責讀取和改變這些數值。

3.6電子郵件協定SMTP、POP3、IMAP

SMTP是網際網路電子郵件中主要的應用層協定,隻用TCP可靠資料傳輸服務,SMTP的端口号是25号。網際網路電子郵件的主要組成部分:

  • 使用者代理(user agent)
  • 郵件伺服器(mail server)
  • 簡單郵件傳輸協定(Simple Mail Transfer Protocol )
網絡程式設計必備:深入了解TCP/IP協定棧

郵件發送過程:從發送的使用者代理開始,傳輸郵件到發送方的郵件伺服器,再傳輸到接收方的郵件伺服器,然後在這裡被分發到接收方的郵箱中。如果使用者要讀取該郵件時,使用使用者名和密碼來鑒别使用者。

POP3(第三版的郵局協定Post Office Protocol - Version 3):

  • POP3是一個極為簡單的郵件通路協定(由于其簡單,是以權限有限)
  • 當使用者打開了一個到郵件伺服器的端口110上的TCP連接配接後,POP3就開始工作了,按照三個階段:特許、事務處理以及更新

IMAP(網際網路郵件通路協定Internet Mail Access Protocol):

  • 允許使用者代理擷取封包某些部分的指令
  • IMAP協定為使用者提供了建立檔案夾及移動檔案的指令

注意:

  • 不要将郵件讀取協定 POP 或 IMAP 與郵件傳送協定 SMTP 弄混。
  • 發信人的使用者代理向源郵件伺服器發送郵件,以及源郵件伺服器向目的郵件伺服器發送郵件,都是使用 SMTP 協定。
  • 而 POP3 協定或 IMAP 協定則是使用者從目的郵件伺服器上讀取郵件所使用的協定。

四、網絡層協定

IP協定屬于網絡層協定,所有的TCP, UDP, ICMP, IGMP資料都通過IP資料報傳輸。IP提供了一種不可靠,無連接配接的資料包傳遞服務。依賴其他層的協定進行差錯控制。 不可靠: IP資料報不保證能成功的到達目的地,如果出現錯誤則選擇丢棄該資料,然後發送ICMP消息報給信源端 無連接配接: IP不提供任何後續資料報的狀态資訊,每個資料報處理都是獨立的。如果一個信源發送了連續的兩個資料報,每個資料報選擇獨立的路由,兩個資料可能不同時到達。IP通信雙方都不長久地維持對方的任何資訊。這樣上層協定每次發送資料的時候,都必須明确指定對方的IP位址。

4.1ipv4資料報

網絡程式設計必備:深入了解TCP/IP協定棧

1.版本号:占四位,就是IP協定的版本,通信雙方的IP協定必須要達到一緻,IPv4的版本就是4.

2.首部長度:占四位,因為長度為四比特,是以首部長度的最大值為1111,15,又因為首部長度代表的機關長度為32個字(也就是4個位元組),是以首部長度的最小值就是0101,當然,也确實如此,大部分的ip頭部中首部位元組都是0101.也就是5*4=20個位元組,如果是最大值15的話,ip首部的最大值就是60個位元組,是以記好了,ipv4首部長度的最大值就是60,當然當中我們又能發現,IPv4的首段長度一定是4位元組的整數倍,要是不是怎麼辦呢?别急,後面的填充字段會自動填充補齊到4位元組的整數倍的。

3.區分服務:這個沒有什麼用處,也沒有什麼好講的了,隻要自動這玩意占八位,一個位元組就可以了。

4.總長度:占16位,這個的意思就是ip資料報中首部和資料的總和的長度,因為占16位,是以很好了解,總長度的最大值就是2的16次方減一,65535,這玩意也對應着還有一個很簡單的概念,最大傳輸單元mtu,意味着一個IP資料報的最大長度就隻能裝下65535個位元組,要是傳輸的長度超過這個怎麼辦,很簡單,分片。

5.辨別:占16位,辨別這玩意很好了解,IP在存儲器中維持一個計數器,每産生一個 資料報,計數器就加1,并将此值賦給辨別字段。但這個辨別并不是平常的序号,因為IP是 無連接配接服務,資料報不存在按序接收的問題。當資料報由于長度超過網絡的MTU而必須分 片時,這個辨別字段的值就被複制到所有的資料報片的辨別字段中,等到重組的時候,相同辨別符的值的資料報就會被重新組裝成一個資料報。

6.标志:占三位,一般有用的是前兩位, 最低位叫做MF,MF=1表示後面還有若幹個資料報,MF=0表示這已經是最後一個資料報了。 中間位叫做DF,DF表示不能進行分片,DF=0才可以進行分片操作。

7.片偏移:占13位,片偏移就是,在原來的資料報分片以後,該片在原分組中的相對位置,片偏移中的基本機關是8位元組,是以,也就是說,隻要是分片,每個分片的長度都是8位元組的整數倍,最後一個分片不夠八位元組的一樣是填充。

8.生存時間ttl:占8位,(time to live),表明資料報在網絡中的壽命,這個值被設定成跳數,顧名思義,就是這個資料報可以經過多少個路由器的數量,每經過一個路由器,該值就減一,減到為零的時候就被抛棄,顯而易見,這個跳數的最大值就是2的8次方減一,255.

9.協定:就是用來指明資料報攜帶了哪種協定,占8位。

10.首部效驗和:占16位,這個字段用來效驗資料報首段,下面給出簡單的計算方法:

首先在發送端的時候,将效驗和全部置為0,然後把資料報首段資料全部進行反碼相加,得到的值為效驗和,放入首段效驗和裡面,然後接收端将資料報首段資料和效驗和一起全部反碼相加,最後若是得到零,則保留,若是不為零,則說明資料報在傳輸的過程中發生了改變,則丢棄該資料報。

11.IP源位址:占32位,将IP位址看作是32位數值則需要将網絡位元組順序轉化位主機位元組順序。轉化的方法是:将每4個位元組首尾互換,将2、3位元組互換。

12.目的位址:也占32位,轉換方法和來源IP位址一樣。

13.選項:可變長的可選資訊,最多包含40位元組。選項字段很少被使用。可用的IP可選項有: a. 記錄路由: 記錄資料包途徑的所有路由的IP,這樣可以追蹤資料包的傳遞路徑 b. 時間戳: 記錄每個路由器資料報被轉發的時間或者時間與IP位址對,這樣就可以測量途徑路由之間資料報的傳輸的時間 c. 松散路由選擇: 指定路由器的IP位址清單資料發送過程中必須經過所有的路由器 d. 嚴格路由選擇: 資料包隻能經過被指定的IP位址清單的路由器 e. 上層協定(如TCP/UDP)的頭部資訊

13.到了可變部分IPv4的頭部基本上就已經講完了,增加頭部的可變選項實際上就是增加了資料報的功能,可變選項在實際上是很少用到的。

4.2分片

當IP資料報的長度超過幀的MTU時,它将被分片傳輸。分片可能發生在發送端,也可能發生在中轉路由器上,而且可能在傳輸過程中多次分片,但隻有在最終的目标機器上,這些分片才會被核心中的IP子產品重新組裝。 IP頭部中的如下三個字段給IP的分片和重組提供了足夠的資訊:資料報辨別、标志和片偏移。一個IP資料報的每個分片都具有自己的IP頭部,它們具有相同的辨別值,但具有不同的片偏移。并且除了最後一個分片外,其他分片都将設定MF标志。此外,每個分片的IP頭部的總長度字段将被設定位該分片的長度。

4.3IP路由

路由是什麼: 我們知道,IP位址是網絡世界裡的門牌号。你可以通過IP位址通路遠在天邊的網站,那麼資料是如何到達網站的呢?靠的就是路徑上每個節點的路由。 路由,簡單的說就是指導IP封包該去哪的訓示牌。

一般說來,主機會在以下兩個時機進行路由查詢

  • 1.收到封包時,查詢路由決定是上送本機(LOCAL IN),或者從哪個出接口轉發(FORWARD)
  • 2.本機發送封包時,查詢封包出接口 注意,轉發需要開啟 net/ipv4/ip_forward

路由表長什麼樣 以一個典型的主機為例,tristan有一個外部網卡enp1s0和一個内部還回網卡lo。

網絡程式設計必備:深入了解TCP/IP協定棧

通過route -n我們可以看到主機上簡要的路由表資訊(當然通過ip route也可以),那麼上面的路由資訊中的每一表項代表什麼意思呢?

  • 如果封包的目的IP位址在164.69.136.0/24這個網段,那麼它應該從enp1s0進行轉發。
  • 如果封包的目的IP位址在169.254.0.0/8這個網段,那麼它應該從enp1s0進行轉發。
  • 其他情況下(0.0.0.0/0),封包從enp1s0轉發,下一跳IP位址是192.168.99.254

4.4IP轉發

當主機收到一個資料報時,首先檢查目的位址:

  • 如果是自己(自己某一個接口所配置的IP位址或IP廣播或者多點傳播位址),則交給協定字段或者IPv6頭部的下一個頭部字段指定的協定子產品處理。
  • 如果不是:
    • 如果IP層被配置為路由器,則轉發該資料報。
    • 否則默默丢棄,必要時生成ICMP封包給發送者。

轉發不會改變資料報的IP位址,隻是通過設定鍊路層位址來完成傳遞的過程:

  • 發送者定義好源IP和目的IP,如果目的IP不在本地,則将鍊路層的目的MAC位址設定為路由器,由路由器代為轉發。
  • 每一跳路由器在轉發時,都會将源MAC位址設定為自己,目的MAC位址設定為下一跳路由器。

4.5IP位址介紹

ip位址組成 : IP位址由4部分數字組成,每部分數字對應于8位二進制數字,各部分之間用小數點分開 這是點分2進制 如果換算為10進制我們稱為點分10進制.每個ip位址由兩部分組成網絡位址(NetID)和主機位址(HostID).網絡位址表示其屬于網際網路中的哪一個網絡,而主機位址則表示其屬于該網絡中的哪一台主機。

網絡程式設計必備:深入了解TCP/IP協定棧

A類位址:範圍從0-127,0是保留的并且表示所有IP位址,而127也是保留的位址,并且是用于測試環回用的。是以 A類位址的範圍其實是從1-126之間。   如:10.0.0.1,第一段号碼為網絡号碼,剩下的三段号碼為本地計算機的号碼。轉換為2進制來說,一個A類IP位址由1位元組的網絡位址和3位元組主機位址組成,網絡位址的最高位必須是“0”, 位址範圍從1.0.0.1 到126.0.0.0。可用的A類網絡有126個,每個網絡能容納1千多萬個主機(2的24次方的-2主機數目)。 以子網路遮罩來進行差別::255.0.0.0 127.0.0.0到127.255.255.255是保留位址,用做循環測試用的

B類位址:範圍從128-191,如172.168.1.1,第一和第二段号碼為網絡号碼,剩下的2段号碼為本地計算機的号碼。轉換為2進制來說,一個B類IP位址由2個位元組的網絡位址和2個位元組的主機位址組成,網絡位址的最高位必須是“10”,位址範圍從128.0.0.0到191.255.255.255。可用的B類網絡有16382個,每個網絡能容納6萬多個主機 。(2的16次方-2) 以子網路遮罩來進行差別:255.255.0.0 169.254.0.0到169.254.255.255是保留位址。如果你的IP位址是自動擷取IP位址,而你在網絡上又沒有找到可用的DHCP伺服器,這時你将會從169.254.0.0到169.254.255.255中臨時獲得一個IP位址。

C類位址:範圍從192-223,如192.168.1.1,第一,第二,第三段号碼為網絡号碼,剩下的最後一段号碼為本地計算機的号碼。轉換為2進制來說,一個C類IP位址由3位元組的網絡位址和1位元組的主機位址組成,網絡位址的最高位必須是“110”。範圍從192.0.0.0到223.255.255.255。C類網絡可達209萬餘個,每個網絡能容納254個主機。(2的8次方-2) 以子網路遮罩來進行差別: 255.255.255.0

D類位址:範圍從224-239,D類IP位址第一個位元組以“1110”開始,它是一個專門保留的位址。它并不指向特定的網絡,目前這一類位址被用在多點廣播(Multicast)中。多點廣播位址用來一次尋址一組計算機,它辨別共享同一協定的一組計算機。 224.0.0.0-239.255.255.255 多點傳播位址

E類位址:範圍從240-254,以“11110”開始,為将來使用保留。 全零(“0.0.0.0”)位址對應于目前主機。全“1”的IP位址(“255.255.255.255”)是目前子網的廣播位址。 240.0.0.0-255.255.255.254 保留位址

子網路遮罩就是為了區分ip位址的中的網絡号和主機号的。

私有位址 所謂的私有位址就是在網際網路上不使用,而被用在區域網路絡中的位址 在A類位址中,10.0.0.0到10.255.255.255是私有位址 在B類位址中,172.16.0.0到172.31.255.255是私有位址。 在C類位址中,192.168.0.0到192.168.255.255是私有位址。

五、手寫TCP/IP使用者态協定棧(純C語言)QQ群:1106675687

5.1DPDK基礎知識

  • 1、dpdk環境搭建與多隊列網卡
  • 2、dpdk網卡綁定與arp
  • 3、dpdk發送過程的實作
  • 4、dpdk發送過程調試
  • 5、dpdk-arp實作
  • 6、arp 調試流程
  • 7、dpdk-icmp實作
  • 8、dpdk-icmp流程 調試與checksum實作
  • 9、arp-table的實作

5.2協定棧之udp/tcp的實作

  • 1、arp request實作
  • 2、arp調試流程
  • 3、協定棧架構設計優化
  • 4、udp實作之udp系統api的設計
  • 5、udp實作之sbuf與rbuf的環形隊列
  • 6、udp實作之發送流程與并發解耦
  • 7、udp實作之架構設計與調試
  • 8、tcp 三次握手實作之dpdk tcp流程架構設計
  • 9、tcp三次握手實作之dpdk tcp11個狀态實作
  • 10、tcp三次握手實作之dpdk代碼調試

5.3協定棧之tcp的實作

  • 1、tcp資料傳輸之ack與seqnum的确認代碼實作以及滑動視窗
  • 2、tcp資料傳輸之ack與seqnum代碼實作以及滑動視窗
  • 3、tcp協定api實 現之bind, listen的實作
  • 4、tcp協定api實作之accept的實作
  • 5、tcp協定api實作之send, recv的實作
  • 6、tcp協定api實 現之close的實作
  • 7、tcp協定棧調試之段錯誤與邏輯流程
  • 8、tcp協定棧調試之ringbuffer記憶體錯誤.
  • 9、dpdk kni的原理與kni啟動
  • 10、重構網絡協定分發的流程

5.4協定棧的元件功能

  • 1、kni抓包調試tcpdump
  • 2、dpdk kni mempool錯誤與記憶體洩漏
  • 3、基于熵的ddos檢測的數學理論
  • 4、dpdk ddos熵計算代碼實作
  • 5、dpdkddosattach檢測準确度調試
  • 6、ddos attack測試工具hping3
  • 7、dpdk布谷鳥hash原理與使用

5.5協定棧之tcp并發實作

  • 1、tcp并發連接配接的設計
  • 2、tcp并發epoll的實作
  • 3、tcp并 發協定棧與epoll的回調與并發測試
  • 4、bpf與bpftrace系統,網絡挂載實作
  • 5、bpf與 bpftrace應用程式ntyco的挂載監控

5.6DPDK網絡基礎元件

  • 1、mempool與mbuf的源碼分析講解
  • 2、dpdk-ringbuffer源碼分 析
  • 3、dpdk-igb_ uio源碼分 析
  • 4、dpdk-kni源碼分析
  • 5、rcu的實作與互斥鎖,自旋鎖,讀寫鎖

解決問題

  • 1、苦讀網絡書籍沒有實際項目運用
  • 2、履歷沒有合适的網絡項目可寫
  • 3、有C基礎,純興趣愛好

手寫3000行代碼,讓你掌握網絡通信核心技術。

最後:

給校招的小夥伴一句話:第一份工作不亞于一次聯考,珍惜校招,社招的競争是你目前想象不到的。能去大廠覺不妥協,IT行業第一份工作背景越好,起點越高,後續發展空間越好!

給那些1-3年的安于現狀的夥伴一句話:

不要抱怨市場,不要安于現狀,在低端,往中端領域看,在中端往高端領域看。認知以及對自身的要求,都會有所改變。

給那些擔心35歲的夥伴一句話:

決定上限的不是年紀,而是技術。最後:希望學習路線對你有所幫助,希望碼農的我們越來越好!