1. 程式人生 > >計算機網路多層協議

計算機網路多層協議

為了能夠在面試的時候被面試官問道關於計算機網路的知識時,不至於啞口無言,我就默默的在這裡多計算機網路的基礎知識進行了一個大致的複習。陸續還會繼續更新。。。

常識:

網際網路地址:也就是IP地址,一般為網路號+子網號+主機號

  • Message報文:應用層資訊分組。

  • Segment報文段:傳輸層分組。

  • Datagram資料報:網路層分組。

  • Frame幀:鏈路層分組。

  • 物理層傳輸位元。


首先在面試的時候面試官,當想要提問你有關計算機網路知識的時候,肯定脫口而出的是三次握手四次揮手。基於此 首先去分析和了解三次握手和四次握手的整體流程和機制。

TCP/IP協議三次握手與四次握手流程解析

一、TCP報文格式

下面是TCP報文格式圖:

                                            

圖1 TCP報文格式

  上圖中有幾個欄位需要重點介紹下:

  (1)序號:Seq序號,佔32位,用來標識從TCP源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。

  (2)確認序號:Ack序號,佔32位,只有ACK標誌位為1時,確認序號欄位才有效,ack=Seq+1。

  (3)標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:

  (A)URG:緊急指標(urgentpointer)有效。

  (B)ACK:確認序號有效。

  (C)PSH:接收方應該儘快將這個報文交給應用層。

  (D)RST:重置連線。

  (E)SYN:發起一個新連線。

  (F)FIN:釋放一個連線。

 需要注意的是:

  (A)不要將確認序號ack與標誌位中的ACK搞混了。

  (B)確認方Ack=發起方Req+1,兩端配對。

二、三次握手

  所謂三次握手(Three-WayHandshake)即建立TCP連線,就是指建立一個TCP連線時,需要客戶端和服務端總共傳送3個包以確認連線的建立,整個流程如下圖所示:

                              

圖2 TCP三次握手

  (1)第一次握手:Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該資料包傳送給Server,Client進入SYN_SENT狀態,等待Server確認。

  (2)第二次握手:Server收到資料包後由標誌位SYN=1知道Client請求建立連線,Server將標誌位SYN和ACK都置為1(注意這裡其實有種合二為一的效果),ack=J+1,隨機產生一個值seq=K,並將該資料包傳送給Client以確認連線請求,Server進入SYN_RCVD狀態。

  (3)第三次握手:Client收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,並將該資料包傳送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連線建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸資料了。

  SYN攻擊:

  在三次握手過程中,Server傳送SYN-ACK之後,收到Client的ACK之前的TCP連線稱為半連線(half-openconnect),此時Server處於SYN_RCVD狀態,當收到ACK後,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短時間內偽造大量不存在的IP地址,並向Server不斷地傳送SYN包,Server回覆確認包,並等待Client的確認,由於源地址是不存在的,因此,Server需要不斷重發直至超時,這些偽造的SYN包將產時間佔用未連線佇列,導致正常的SYN請求因為佇列滿而被丟棄,從而引起網路堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連線狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行:

三、四次揮手

     所謂四次揮手(Four-Way Wavehand)即終止TCP連線,就是指斷開一個TCP連線時,需要客戶端和服務端總共傳送4個包以確認連線的斷開。在socket程式設計中,這一過程由客戶端或服務端任一方執行close來觸發,整個流程如下圖所示:

                                 

圖3 TCP四次揮手

  由於TCP連線時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成資料傳送任務後,傳送一個FIN來終止這一方向的連線,收到一個FIN只是意味著這一方向上沒有資料流動了,即不會再收到資料了,但是在這個TCP連線上仍然能夠傳送資料,直到這一方向也傳送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。

 (1)第一次揮手:Client傳送一個FIN,用來關閉Client到Server的資料傳送,Client進入FIN_WAIT_1狀態。

  (2)第二次揮手:Server收到FIN後,傳送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。

 (3)第三次揮手:Server傳送一個FIN,用來關閉Server到Client的資料傳送,Server進入LAST_ACK狀態。

  (4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接著傳送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。

同時開啟連線

        同時開啟連線是指通訊的雙方在接收到對方的SYN包之前,都進行了主動開啟的操作併發出了自己的SYN包。如之前所說一個四元組標識一個TCP連線,因此如果一個TCP連線要同時開啟需要通訊的雙方知曉對方的IP和埠資訊才行,這種場景在實際情況中很少發生(NAT穿透中可能會多一些)。同時開啟的流程如下圖


        具體流程我們不在逐條訊息進行介紹。注意上圖中,TCP連線同時開啟的時候與三次握手的主要區別如下

  • 我們同時稱呼A和B為Client,他們都執行主動開啟的操作(Active Opener)。
  • 同時兩端的狀態變化都是由CLOSED->SYN_SENT->SYN_RCVD->ESTABLISHED
  • 建立連線的時候需要四個資料包的交換,並且每個資料包中都攜帶有SYN標識,直到收到SYN的ACK為止

二、同時關閉連線

        同時關閉相對於我們講過的四次握手過程基本類似,注意兩者狀態轉換的區別,同時關閉是由ESTABLISHED->FIN_WAIT_1->CLOSING->TIME_WAIT->CLOSED。同時關閉的流程如下,不在做額外的講解。

如果面試官不問這個問題的話 可以自己解釋給他聽!

  為什麼建立連線是三次握手,而關閉連線卻是四次揮手呢?

  這是因為服務端在LISTEN狀態下,收到建立連線請求的SYN報文後,把ACK和SYN放在一個報文裡傳送給客戶端。而關閉連線時,當收到對方的FIN報文時,僅僅表示對方不再發送資料了但是還能接收資料,己方也未必全部資料都發送給對方了,所以己方可以立即close,也可以傳送一些資料給對方後,再發送FIN報文給對方來表示同意現在關閉連線,因此,己方ACK和FIN一般都會分開發送。

 

基本名詞含義:

MTU: Maxitum Transmission Unit 最大傳輸單元

MSS: Maxitum Segment Size 最大分段大小

 

由於乙太網EthernetII最大的資料幀是1518Bytes這樣,刨去乙太網幀的幀頭(DMAC目的地址MAC48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗部分4Bytes(這個部門有時候大家也把它叫做FCS),那麼剩下承載上層協議的地方也就是Data域最大就只能有1500Bytes. 這個值我們就把它稱之為MTU。

MSS就是TCP資料包每次能夠傳輸的最大資料分段。為了達到最佳的傳輸效能。TCP協議在建立連線的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時候往往用MTU值代替(需要減去IP資料包包頭的大小20Bytes和TCP資料段的包頭20Bytes)所以往往MSS為1460。通訊雙方會根據雙方提供的MSS值得最小值確定為這次連線的最大MSS值。

 

當兩臺遠端PC互聯的時候,它們的資料需要穿過很多的路由器和各種各樣的網路媒介才能到達對端,網路中不同媒介的MTU各不相同,就好比一長段的水管,由不同粗細的水管組成(MTU不同 :))通過這段水管最大水量就要由中間最細的水管決定。

 

對於網路層的上層協議而言(我們以TCP/IP協議族為例)它們對水管粗細不在意它們認為這個是網路層的事情。網路層IP協議會檢查每個從上層協議下來的資料包的大小,並根據本機MTU的大小決定是否作“分片”處理。分片最大的壞處就是降低了傳輸效能,本來一次可以搞定的事情,分成多次搞定,所以在網路層更高一層(就是傳輸層)的實現中往往會對此加以注意!有些高層因為某些原因就會要求我這個麵包不能切片,我要完整地面包,所以會在IP資料包包頭裡面加上一個標籤:DF(Donot Fragment)。這樣當這個IP資料包在一大段網路(水管裡面)傳輸的時候,如果遇到MTU小於IP資料包的情況,轉發裝置就會根據要求丟棄這個資料包。然後返回一個錯誤資訊給傳送者。這樣往往會造成某些通訊上的問題,不過幸運的是大部分網路鏈路都是MTU1500或者大於1500。

對於UDP協議而言,這個協議本身是無連線的協議,對資料包的到達順序以及是否正確到達不甚關心,所以一般UDP應用對分片沒有特殊要求。

 

對於TCP協議而言就不一樣了,這個協議是面向連線的協議,對於TCP協議而言它非常在意資料包的到達順序以及是否傳輸中有錯誤發生。所以有些TCP應用對分片有要求---不能分片(DF)。

 注意: 分段是在傳輸成完成的 而分片是在網路層完成的。

                         

 一. TCP協議

TCP協議是面向連線、保證高可靠性(資料無丟失、資料無失序、資料無錯誤、資料無重複到達)傳輸層協議。

1.TCP頭分析

先來分析一下TCP頭的格式以及每一個欄位的含義:

                    

(1)埠號[16bit]

我們知道,網路實現的是不同主機的程序間通訊。在一個作業系統中,有很多程序,當資料到來時要提交給哪個程序進行處理呢?這就需要用到埠號。在TCP頭中,有源埠號(Source Port)和目標埠號(DestinationPort)。源埠號標識了傳送主機的程序,目標埠號標識接受方主機的程序。

(2)序號[32bit]

序號分為傳送序號(SequenceNumber)和確認序號(AcknowledgmentNumber)。

傳送序號:用來標識從TCP源端向 TCP目的端傳送的資料位元組流,它表示在這個報文段中的第一個資料位元組的順序號。如果將位元組流看作在兩個應用程式間的單向流動,則 TCP用順序號對每個位元組進行計數。序號是 32bit的無符號數,序號到達2  32- 1後又從 0開始。當建立一個新的連線時, SYN標誌變 1,順序號欄位包含由這個主機選擇的該連線的初始順序號 ISN( InitialSequence Number)。

確認序號:包含傳送確認的一端所期望收到的下一個順序號。因此,確認序號應當是上次已成功收到資料位元組順序號加 1。只有 ACK標誌為 1時確認序號欄位才有效。TCP為應用層提供全雙工服務,這意味資料能在兩個方向上獨立地進行傳輸。因此,連線的每一端必須保持每個方向上的傳輸資料順序號。

(3)偏移[4bit]

這裡的偏移實際指的是TCP首部的長度,它用來表明TCP首部中32 bit字的數目,通過它可以知道一個TCP包它的使用者資料是從哪裡開始的。這個欄位佔4bit,如4bit的值是0101,則說明TCP首部長度是5 * 4 = 20位元組。 所以TCP的首部長度最大為15 *4 = 60位元組。然而沒有可選欄位,正常長度為20位元組。

(4)Reserved[6bit]

目前沒有使用,它的值都為0

(5)標誌[6bit]

在TCP首部中有6個標誌位元。他們中的多個可同時被置為1 。

URG         緊急指標(urgent pointer)有效

ACK          確認序號有效

PSH          指示接收方應該儘快將這個報文段交給應用層而不用等待緩衝區裝滿

RST           一般表示斷開一個連線

(6)視窗大小(window)[16bit]

視窗的大小,表示源方法最多能接受的位元組數。。

(7)校驗和[16bit]

校驗和覆蓋了整個的TCP報文段:TCP首部和TCP資料。這是一個強制性的欄位,一定是由發端計算和儲存,並由收端進行驗證。

(8)緊急指標[16bit]

只有當URG標誌置為1時緊急指標才有效。緊急指標是一個正的偏移量,和序號欄位中的值相加表示緊急資料最後一個位元組的序號。TCP的緊急方式是傳送端向另一端傳送緊急資料的一種方式。

(9)TCP選項

是可選的,

MSS= MTU - IP頭 - TCP頭,MTU表示最大傳輸單元,我們在IP頭分析的時候會講到,它一般為1500個位元組。IP頭和TCP 頭部不帶可選選項的時候都是20個位元組。這樣的話MSS=1500- 20 -20 = 1460。

MSS限制了TCP包攜帶資料的大小,它的意思就是當應用層向傳輸層提交資料通過TCP協議進行傳輸時,如果應用層的資料>MSS就必須分段,分成多個段,逐個的發過去。

 TCP可靠性的保證

TCP採用一種名為“帶重傳功能的肯定確認(positive acknowledge with retransmission)”的技術作為提供可靠資料傳輸服務的基礎。這項技術要求接收方收到資料之後向源站回送確認資訊ACK。傳送方對發出的每個分組都儲存一份記錄,在傳送下一個分組之前等待確認資訊。

傳送方還在送出分組的同時啟動一個定時器,並在定時器的定時期滿而確認資訊還沒有到達的情況下,重發剛才發出的分組。圖3-5表示帶重傳功能的肯定確認協議傳輸資料的情況,圖3-6表示分組丟失引起超時和重傳。為了避免由於網路延遲引起遲到的確認和重複的確認,協議規定在確認資訊中稍帶一個分組的序號,使接收方能正確將分組與確認關聯起來。

                                      

從圖 3-5可以看出,雖然網路具有同時進行雙向通訊的能力,但由於在接到前一個分組的確認資訊之前必須推遲下一個分組的傳送,簡單的肯定確認協議浪費了大量寶貴的網路頻寬。為此, TCP使用滑動視窗的機制來提高網路吞吐量,同時解決端到端的流量控制。

(4)滑動視窗技術

滑動視窗技術是簡單的帶重傳的肯定確認機制的一個更復雜的變形,它允許傳送方在等待一個確認資訊之前可以傳送多個分組。如圖 3-7所示,傳送方要傳送一個分組序列,滑動視窗協議在分組序列中放置一個固定長度的視窗,然後將視窗內的所有分組都發送出去;當傳送方收到對視窗內第一個分組的確認資訊時,它可以向後滑動併發送下一個分組;隨著確認的不斷到達,視窗也在不斷的向後滑動。二、UDP協議

 二:UDP協議

UDP協議也是傳輸層協議,它是無連線,不保證可靠的傳輸層協議。它的協議頭比較簡單,如下:

這裡的埠號就不解釋了,和TCP的埠號是一樣的含義。

 

Length佔用2個位元組,標識UDP頭的長度。

Checksum: 校驗和,包含UDP頭和資料部分。

三、IP協議

I P是T C P / I P協議族中最為核心的協議。所有的T C P、U D P、I C M P及I G M P資料都以I P資料

報格式傳輸。它的特點如下:

 不可靠(u n r e l i a b l e)的意思是它不能保證 I P資料報能成功地到達目的地。 I P僅提供最好 的傳輸服務。如果發生某種錯誤時,如某個路由器暫時用完了緩衝區, I P有一個簡單的錯誤

處理演算法:丟棄該資料報,然後傳送 I C M P訊息報給信源端。任何要求的可靠性必須由上層來提供(如T C P)。

無連線(c o n n ec t i o n l e s s)這個術語的意思是I P並不維護任何關於後續資料報的狀態資訊。每個資料報的處理是相互獨立的。這也說明,I P資料報可以不按傳送順序接收。如果一信源 向相同的信宿傳送兩個連續的資料報(先是 A,然後是B),每個資料報都是獨立地進行路由 選擇,可能選擇不同的路線,因此B可能在A到達之前先到達。

1.IP頭格式


(1)版本 佔4位,指IP協議的版本。通訊雙方使用的IP協議版本必須一致。目前廣泛使用的IP協議版本號為4(即IPv4)。關於IPv6,目前還處於草案階段。

(2)首部長度 佔4位,可表示的最大十進位制數值是15。請注意,這個欄位所表示數的單位是32位字長(1個32位字長是4位元組),因此,當IP的首部長度為1111時(即十進位制的15),首部長度就達到60位元組。IP分組的首部長度不是4位元組的整數倍時,必須利用最後的填充欄位加以填充。因此資料部分永遠在4位元組的整數倍開始,這樣在實現IP協議時較為方便。首部長度限制為60位元組的缺點是有時可能不夠用。但這樣做是希望使用者儘量減少開銷。最常用的首部長度就是20位元組(即首部長度為0101),這時不使用任何選項。 

(3)區分服務 佔8位,用來獲得更好的服務。這個欄位在舊標準中叫做服務型別,但實際上一直沒有被使用過。1998年IETF把這個欄位改名為區分服務DS(Differentiated Services)。只有在使用區分服務時,這個欄位才起作用。 

(4)總長度 總長度指首部和資料之和的長度,單位為位元組。總長度欄位為16位,因此資料報的最大長度為216-1=65535位元組。 

在IP層下面的每一種資料鏈路層都有自己的幀格式,其中包括幀格式中的資料欄位的最大長度,這稱為最大傳送單元MTU(Maximum Transfer Unit)。當一個數據報封裝成鏈路層的幀時,此資料報的總長度(即首部加上資料部分)一定不能超過下面的資料鏈路層的MTU值。 

 

(5)標識(identification) 佔16位。IP軟體在儲存器中維持一個計數器,每產生一個數據報,計數器就加1,並將此值賦給標識欄位。但這個“標識”並不是序號,因為IP是無連線服務,資料報不存在按序接收的問題。當資料報由於長度超過網路的MTU而必須分片時,這個標識欄位的值就被複制到所有的資料報的標識欄位中。相同的標識欄位的值使分片後的各資料報片最後能正確地重灌成為原來的資料報。 

 

(6)標誌(flag) 佔3位,但目前只有2位有意義。 

● 標誌欄位中的最低位記為MF(More Fragment)。MF=1即表示後面“還有分片”的資料報。MF=0表示這已是若干資料報片中的最後一個 

● 標誌欄位中間的一位記為DF(Don’t Fragment),意思是“不能分片”。只有當DF=0時才允許分片。 

 

(7)片偏移 佔13位。片偏移指出:較長的分組在分片後,某片在原分組中的相對位置。也就是說,相對使用者資料欄位的起點,該片從何處開始。片偏移以8個位元組為偏移單位。這就是說,每個分片的長度一定是8位元組(64位)的整數倍。 

 

(8)生存時間 佔8位,生存時間欄位常用的的英文縮寫是TTL(Time To Live),表明是資料報在網路中的壽命。由發出資料報的源點設定這個欄位。其目的是防止無法交付的資料報無限制地在因特網中兜圈子,因而白白消耗網路資源。最初的設計是以秒作為TTL的單位。每經過一個路由器時,就把TTL減去資料報在路由器消耗掉的一段時間。若資料報在路由器消耗的時間小於1秒,就把TTL值減1。當TTL值為0時,就丟棄這個資料報。 

 

(9)協議 佔8位,協議欄位指出此資料報攜帶的資料是使用何種協議,以便使目的主機的IP層知道應將資料部分上交給哪個處理過程。 

 

(10)首部檢驗和 佔16位。這個欄位只檢驗資料報的首部,但不包括資料部分。這是因為資料報每經過一個路由器,路由器都要重新計算一下首部檢驗和(一些欄位,如生存時間、標誌、片偏移等都可能發生變化)。不檢驗資料部分可減少計算的工作量。 

 

(11)源IP地址 佔32位。 


(12)目的IP地址 佔32位。

2.分片解釋

分片指的是需要傳送的資料大於最大傳輸單元(MTU)的時候,就需要分成多個包,然後一個個傳送給對方。我們在說TCP的時候,說到MSS很多人不能區分它們。通過下面的圖,我想就可以完全區分它們了。


個人覺的如果通過TCP協議傳輸資料,到IP層的時候,可定不需要分片了。只有在通過UDP協議傳送大資料的時候,需要分片。

 

例如:用UDP協議傳送10240個位元組資料


可以看到,但資料提交到網路層的時候,由於資料超過了最大傳輸單元,就分片了。分成多個包通過IP協議傳送個對方。每個資料包最大的位元組為MTU - IP = 1500 - 20 = 1480


四 、乙太網頭

                

三部分組成 :源MAC Address | 目的 MACAddress | 所使用的協議.


所以在乙太網中,資料包的格式有一下幾種:

ARP協議是通過IP地址獲得對應的MAC地址,稱為地址解析協議

RARP協議是通過MAC地址來獲得對應的IP地址,稱為逆向地址解析協議


補充:DNS協議

  DNS在53埠上監聽請求並提供響應的服務。出於效能的考慮,DNS查詢請求用UDP協議互動並且每個請求的大小小於512位元組,但是如果返回的請求大小大於512位元組,互動雙方會協商使用TCP協議。

二、 DNS查詢

  DNS中的域名伺服器最主要的功能就是響應域名解析器的查詢請求(這個域名解析器可能是PC端的解析器,也可能是具有解析功能的另一臺域名伺服器)。域名解析器是安裝在PC端的軟體,它負責向本地DNS(local DNS)發起域名解析請求。