網絡層

一:ip數據報格式

 

具體來說首部(一共20字節)包含以下幾個字段

版本:指明是Ipv4還是ipv6。Ipv6是爲了緩解ipv4地址不足引入

總長度:16位,因此一個ip數據包的最大長度是65535字節。

標識:數據在整個網絡體系的傳輸流程是應用層的data到傳輸層的段,到網絡層的IP數據包,到鏈路層的幀,以及傳輸介質上的比特流。所以最終的數據都是要通過物理層進行傳輸,不同媒介的MTU不同,當數據大於MTU時,就需要進行分片。分片既可以發生在信源的網絡層也可以發生在中間的路由器。信宿主機會根據標識進行重組,同一數據的不同分片的標識是相同的。

標誌:3bit。最後一位是MF,爲0表示該分片是最後一個分片,爲1時表示還有更多分片。中間位是DF,爲0表示允許分片,爲1時表示不允許分片。與片偏移共同給數據重組提供依據。

TTL:由於ip層是一個無連接的不可靠傳輸,傳輸過程通過ICMP協議進行錯誤信息的反饋。它的存在是爲了防止無法交付的數據報在互聯網中不斷兜圈子。以路由器跳數爲單位,當 TTL 爲 0 時就丟棄數據報。


二:網際控制報文協議 ICMP  

爲了提高 IP 數據報交付成功的機會,在網際層使用了網際控制報文協議 ICMP (InternetControl Message Protocol)。 ICMP 允許主機或路由器報告差錯情況和提供有關異常情況的報告。ICMP 不是高層協議,而是 IP 層的協議。ICMP 報文作爲 IP 層數據報的數據,加上數據報的首部,組成 IP 數據報發送出去。

ICMP 報文的種類有兩種,即 ICMP 差錯報告報文和 ICMP 詢問報告報文。 

差錯報告報文含5中類型:

信宿不可達(即數據無法到達目的主機)

源點抑制:數據包集中到達某一路由器後,數據包來不及被處理

超時:與IP數據包首部的TTL字段息息相關,可能由於網絡拓撲的結構,導致數據在網絡上循環傳輸,而在規定的時間內無法到達。

參數錯誤:ip數據包首部的字段漏寫或者是錯寫

重定向:這其實不是一個錯誤,因爲網絡上主機的數量龐大,當網絡拓撲發生變化時,僅更新路由器的路由表,主機的路由表不更新。信源主機按照從前的路由表進行數據傳遞,路由器接收到後將更新後的路由信息返給信源主機,作用有2個,一是數據不可達,二是更新信源的路由表。

詢問報告報文包含2種

回送請求和回答報文 :主機或路由器向特定目的主機發出詢問,收到此報文的主機必須發送ICMP回送回答報文。可用於測試目的站是否可達以及瞭解其有關狀態。PING 用來測試兩個主機之間的連通性。PING 使用了 ICMP 回送請求與回送回答報文。PING 是應用層直接使用網絡層 ICMP 的例子,它沒有通過運輸層的 TCP 或UDP。

時間戳請求和回答報文 : 請求某臺主機或路由器回答當前的日期和時間,不同主機的系統時間會有差別,因此可用於時鐘同步和時間測量


三:IP路由

當數據從信源傳遞到信宿的過程中間會經過路由器,這個傳遞的路徑是ip路由相關知識。每個主機和路由器都會維護一張路由表,路由表是整個網絡傳遞的基礎。包括靜態路由和動態路由兩種。靜態路由是管理員以手工的方式寫進路由表,適用於小型網絡,拓撲不易發生的網絡體系結構中。動態路由是根據某種算法自動學習更新路由表。包括距離向量路由算法和鏈路狀態路由算法。

運行距離矢量路由協議的路由器,會將所有它知道的路由信息與鄰居共享,但是隻與直連鄰居共享!運行鏈路狀態路由協議的路由器,只將它所直連的鏈路狀態與鄰居共享,這個鄰居是指一個域內(domain),或一個區域內(area)的所有路由器!

距離量路由協議,更新的是“路由條目”!一條重要的鏈路如果發生變化,意味着需通告多條涉及到的路由條目!
鏈路狀態路由協議,更新的是“拓撲”!每臺路由器上都有完全相同的拓撲,他們各自分別進行SPF算法,計算出路由條目!一條重要鏈路的變化,不必再發送所有被波及的路由條目,只需發送一條鏈路通告,告知其它路由器本鏈路發生故障即可。其它路由器會根據鏈路狀態,改變自已的拓撲數據庫,重新計算路由條目。

距離矢量路由協議發送週期性更新、完整路由表更新(periodic & full)可能會出現迴環問題,解決的方法是:一是設置最大跳(超過最大跳,認爲出錯);二是水平分割。
而鏈路狀態路由協議更新是非週期性的(nonperiodic),部分的(partial


四:ARP協議

ARP首先會發起一個請求數據包,數據包的首部包含了目標主機的IP地址,然後這個數據包會在鏈路層進行再次包裝,生成以太網數據包最終由以太網廣播給子網內的所有主機,每一臺主機都會接收到這個數據包,並取出標頭裏的IP地址,然後和自己的IP地址進行比較,如果相同就返回自己的MAC地址,如果不同就丟棄該數據包。ARP接收返回消息,以此確定目標機的MAC地址;與此同時,ARP還會將返回的MAC地址與對應的IP地址存入本機ARP緩存中並保留一定時間,下次請求時直接查詢ARP緩存以節約資源。cmd輸入 arp -a 就可以查詢本機緩存的ARP數據。

通過ARP協議的工作原理可以發現,ARP的MAC尋址還是侷限在同一個子網中,因此網絡層引入了路由協議,首先通過IP協議來判斷兩臺主機是否在同一個子網中,如果在同一個子網,就通過ARP協議查詢對應的MAC地址,然後以廣播的形式向該子網內的主機發送數據包;如果不在同一個子網,以太網會將該數據包轉發給本子網的網關進行路由。網關是互聯網上子網與子網之間的橋樑,所以網關會進行多次轉發,最終將該數據包轉發到目標IP所在的子網中,然後再通過ARP獲取目標機MAC,最終也是通過廣播形式將數據包發送給接收方。

ARP欺騙原理:

假設主機 A 192.168.1.2,B 192.168.1.3,C 192.168.1.4; 網關 G 192.168.1.1; 在同一局域網,主機A和B通過網關G相互通信,就好比A和B兩個人寫信,由郵遞員G送信,C永遠都不會知道A和B之間說了些什麼話。但是並不是想象中的那麼安全,在ARP緩存表機制存在一個缺陷,就是當請求主機收到ARP應答包後,不會去驗證自己是否向對方主機發送過ARP請求包,就直接把這個返回包中的IP地址與MAC地址的對應關係保存進ARP緩存表中,如果原有相同IP對應關係,原有的則會被替換。

C假扮郵遞員,首先要告訴A說:“我就是郵遞員” (C主機向A發送構造好的返回包,源IP爲G 192.168.1.1,源MAC爲C自己的MAC地址),愚蠢的A很輕易的相信了,直接把“C是郵遞員”這個信息記在了腦子裏;

C再假扮A,告訴郵遞員:“我就是A” (C向網關G發送構造好的返回包,源IP爲A 192.168.1.2,源MAC地址爲自己的MAC地址),智商捉急的郵遞員想都沒想就相信了,以後就把B的來信送給了C,C當然就可以知道A和B之間聊了些什麼

  上面ABCG的故事就是ARP雙向欺騙的原理了

ARP單向欺騙就更好理解了,C只向A發送一個返回包,告訴A:G 192.168.1.1 的MAC地址爲 5c-63-bf-79-1d-fa(一個錯誤的mac地址),A把這個信息記錄在了緩存表中,而G的緩存表不變,也就是說,A把數據包給了C,而G的包還是給A,這樣就是ARP單向欺騙了。


五:路由協議

常見的路由routing協議:包括域內協議(rip,ospf)和域間協議(bgp)

RIP和OSPF的區別:

1:rip是基於距離向量,ospf是基於鏈路狀態

2:rip僅和直接相連即相鄰的路由器交換路由表信息,ospf是和本自治系統的所有路由器交換網絡拓撲

3:rip是定期交換,ospf是當鏈路狀態發生變化的時候用洪範法發送信息

4:rip不知道全網的拓撲結構,因此會產生“好消息傳得快,壞消息傳的慢”問題,不適應大型網絡,ospf每一個路由器有全網的拓撲圖,因此更新收斂速度快。


六:正向代理和反向代理

正向代理是一個位於客戶端和目標服務器之間的代理服務器(中間服務器)。爲了從原始服務器取得內容,客戶端向代理服務器發送一個請求,並且指定目標服務器,之後代理向目標服務器轉交併且將獲得的內容返回給客戶端。正向代理的情況下客戶端必須要進行一些特別的設置才能使用。

反向代理正好相反。對於客戶端來說,反向代理就好像目標服務器。並且客戶端不需要進行任何設置。客戶端向反向代理髮送請求,接着反向代理判斷請求走向哪個服務器,並將獲得內容轉交給客戶端,使得這些內容就好似他自己一樣,客戶端並不會感知到反向代理後面的服務,也因此不需要客戶端做任何設置,只需要把反向代理服務器當成真正的服務器就好了。

                     


七:socket套接字編程

1)套接字:

概念:

在網絡通信中全局的標識一個參與通信的進程需要採用三元組:協議,主機ip地址和端口號。而描述兩個應用進程之間端到端通信關聯則需要使用五元組:協議,信源主機ip,信源應用進程端口,信宿主機ip,信宿應用進程端口。套接字可以理解爲通信連接的一方(內容就是這一方的三元組),實現了對網絡層和傳輸層協議的封裝。

類型:

流套接字:用於提供面向連接,可靠的數據傳輸服務。原因在於採用的是TCP進行通信。這種方式的通信連接必須顯示建立

數據報套接字:用於提供無連接,不可靠的傳輸服務。採用的是UDP進行傳輸。這種方式的通信連接不需要顯示建立

原始套接字:上述的兩種套接字都是標準套接字的一種。流套接字只可以讀取TCP的數據,數據報套接字只能讀取UDP數據,原始套接字可以讀取內核沒有處理的ip數據報。使用原始套接字的目的是爲了避開TCP/IP的處理機制,將被傳送的數據包直接傳送給需要它的應用程序。主要是用來進行編寫自定義底層協議的應用程序。比如arp和ping。

2)客戶機服務器模型:

服務器:

一般啓動後就一直處於運行的狀態,以等待客戶機的進程請求

一般使用的都是熟知的端口號,便於客戶端進程連接請求

一般擁有較多的系統資源,以便及時響應各個客戶機進程請求

可以並行處理多個客戶進程請求,但數目是有一定限制的

在通信時一般處於被動的一方,不需要知道客戶端的ip地址和端口信息

客戶端:

在需要服務器進程的服務時將向服務器進程請求服務,並建立通信連接,得到滿足並完成處理後就終止通信

使用想系統申請的臨時端口號與服務進程進行通信,通信完成後將釋放該端口

擁有相對較少的系統資源

在通信時屬於主動的一方,需要事先知道服務器的ip地址和端口信息

3)服務程序工作模型:

面向連接:

                               

服務端五元組的建立:

Socket函數確定使用的協議

Bind函數實現與本地的ip和端口號的綁定,即確定本地ip和端口號

Accept函數實現與遠程ip和端口號的關聯,即確定遠程ip和端口號

 

客戶端五元組的建立:

Socket函數確定使用的協議

Bind函數實現與本地的ip和端口號的綁定,即確定本地ip和端口號

Connect函數實現與遠程ip和端口號的關聯,即確定遠程ip和端口號

無連接:

                                           

通信的一方可以不用bind函數綁定ip和端口號,而由系統自動分配,但是充當服務器的一方需要事先綁定ip地址和端口號

不綁定的一方充當客戶端進程,通信必須由這一方先發起。雖然不用建立連接,但是充當服務器的一方應用進程也必須先啓動,否則客戶端發起的請求到達不到服務器

在數據傳輸的過程,雖然不用事先建立連接,但是在發送數據的時候,發送方除了指定本地套接字地址外(ip和端口號),還需要指定接收方的套接字地址。即在數據的接收和發送過程中動態的建立通信雙方的通信連接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章