天天看點

計算機網絡多層協定

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

常識:

網際網路位址:也就是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)發起域名解析請求。

繼續閱讀