1. 程式人生 > >計算機網路基礎學習總結

計算機網路基礎學習總結

這部分內容主要是基於一些關於計算機網路基礎的學習總結,內容不全面,只講述了其中的一小部分,後續會再補充,如有錯誤,還請見諒。

計算機網路常見概念

網絡卡和路由器

網絡卡是一個有mac地址的物理裝置,通過mac地址與區域網內的交換機通訊,交換機可以識別mac地址。

而單純的中繼器,集線器,雙絞線等裝置只識別物理層裝置。

路由器則工作在3層ip層,必須要有ip才能工作,所以路由器每一個介面都對應一個ip,維護一個可以識別ip的路由表,進行ip資料報轉發。

交換機

交換機具有自學習能力,學習的是交換表的內容。交換表中儲存著 MAC 地址到介面的對映。

乙太網

乙太網是一種星型拓撲結構區域網。

早期使用集線器進行連線,它是一種物理層裝置,作用於位元而不是幀,當一個位元到達介面時,集線器重新生成這個位元,並將其能量強度放大,從而擴大網路的傳輸距離。之後再將這個位元向其它所有介面。特別是,如果集線器同時收到同時從兩個不同介面的幀,那麼就發生了碰撞。

目前乙太網使用交換機替代了集線器,它不會發生碰撞,能根據 MAC 地址進行儲存轉發。

虛擬區域網VLAN

正常情況下,區域網中的鏈路層廣播在整個區域網可達,而vlan可以在物理區域網中劃分虛擬區域網,使廣播幀只有在vlan當中的主機才能收到。

虛擬區域網可以建立與物理位置無關的邏輯組,只有在同一個虛擬區域網中的成員才會收到鏈路層廣播資訊,例如下圖中 (A1, A2, A3, A4) 屬於一個虛擬區域網,A1 傳送的廣播會被 A2、A3、A4 收到,而其它站點收不到。

DHCP協議(動態主機配置協議)

首先DHCP是為了讓主機獲得一個ip地址,所以主機會發一個0.0.0.0為傳送方,255.255.255.255為接收方的ip資料報,也就是廣播資料報,並且廣播資料包只在區域網中有效,然後鏈路層解析為資料幀,傳送給區域網內的DHCP伺服器。

ARP協議

arp負責把ip地址解析成區域網內的一個mac地址,只在區域網中有效。逆arp則把mac地址解析成ip地址。

網路層實現主機之間的通訊,而鏈路層實現具體每段鏈路之間的通訊。因此在通訊過程中,IP 資料報的源地址和目的地址始終不變,而 MAC 地址隨著鏈路的改變而改變。

ARP 實現由 IP 地址得到 MAC 地址。

每個主機都有一個 ARP 快取記憶體,裡面有本區域網上的各主機和路由器的 IP 地址到硬體地址的對映表。

如果主機 A 知道主機 B 的 IP 地址,但是 ARP 快取記憶體中沒有該 IP 地址到 MAC 地址的對映,此時主機 A 通過廣播的方式傳送 ARP 請求分組,主機 B 收到該請求後會傳送 ARP 響應分組給主機 A 告知其 MAC 地址,隨後主機 A 向其快取記憶體中寫入主機 B 的 IP 地址到 MAC 地址的對映。

閘道器和NAT

當需要和外部區域網訪問時,需要經過閘道器伺服器以便相容不同協議棧。區域網內部使用內網ip,經過閘道器時要轉成外網ip,閘道器會幫你完成改寫操作,當收到資料報時,閘道器又會幫你把ip改為內網ip。這種修改ip隱藏內部網路的方式叫做NAT。

nat穿透的方式是主機和閘道器伺服器協定一個ip地址作為主機服務的ip,所以主機可以通過這個ip和外網交流。

DNS協議和http請求過程

訪問一個域名時,會發送dns報文請求(應用層)給本地的DNS伺服器,解析出域名對應的ip,然後三次握手建立連線,(當然TCP資料報由本地區域網經過閘道器轉給外網,再經過多次路由才到達目標主機),然後傳送http請求獲得響應報文

ICMP

ICMP 是為了更有效地轉發 IP 資料報和提高交付成功的機會。它封裝在 IP 資料報中,但是不屬於高層協議。

ICMP 報文分為差錯報告報文和詢問報文。

1. Ping
Ping 是 ICMP 的一個重要應用,主要用來測試兩臺主機之間的連通性。

Ping 傳送的 IP 資料報封裝的是無法交付的 UDP 使用者資料報。

2. Traceroute
Traceroute 是 ICMP 的另一個應用,用來跟蹤一個分組從源點到終點的路徑,事實上,traceroute也封裝著無法交付的udp,和ping類似。。

源主機向目的主機發送一連串的 IP 資料報,每個資料包的ttl時間不同,所以可以跟蹤每一跳路由的資訊。

==但是因為資料報封裝的是無法交付的UDP報文,因此目的主機要向源主機發送 ICMP終點不可達差錯報告報文。之後源主機知道了到達目的主機所經過的路由器 IP地址以及到達每個路由器的往返時間。==

虛擬專用網VPN和內網ip

由於 IP 地址的緊缺,一個機構能申請到的 IP 地址數往往遠小於本機構所擁有的主機數。並且一個機構並不需要把所有的主機接入到外部的網際網路中,機構內的計算機可以使用僅在本機構有效的 IP 地址(專用地址)。

有三個專用地址塊:

  • 10.0.0.0 ~ 10.255.255.255
  • 172.16.0.0 ~ 172.31.255.255
  • 192.168.0.0 ~ 192.168.255.255

這些ip也稱為內網ip,用於區域網間的通訊,只能通過閘道器抵達公網。

使用隧道技術實現vpn。

原理是;普通的內網ip無法被訪問到,一般可以使用nat技術讓閘道器作為中轉人,而ip資料報也會改寫成閘道器伺服器的地址。

如果想讓資料報保留內網地址,並且實現跨公網訪問,那麼只能通過隧道技術,把內網資料報加密包裝在公網ip資料報中,然後通過公網ip抵達對方的專用網路,進行拆包和傳送。

為什麼vpn能翻牆呢,因為我們通過對vpn伺服器的連線,可以將內網ip資料報裝在裡面,傳送給vpn,vpn解析後再發送給真正的伺服器。

由於本地閘道器阻攔了某些網站的請求,所以我們要把這個請求加密封裝,然後通過隧道把資料發給一個海外伺服器,讓他真正完成請求。

應用層

應用層的協議主要是http,ftp這類協議,http訪問超文字html,而ftp訪問檔案系統。

http

通過瀏覽器可以方便地進行dns解析,建立tcp連線,傳送http請求,得到http響應,這些工作都是瀏覽器完成的。

http1.0 1.1和2.0

1.0和1.1的主要變化

1 http1.0經過多年發展,在1.1提出了改進。
首先是提出了長連線,http請求可以在一次tcp連線中不斷髮送。

2 然後是http1.1支援只發送header而不傳送body。原因是先用header判斷能否成功,再發資料,節約頻寬,事實上,post請求預設就是這樣做的。

3 http1.1的host欄位。由於虛擬主機可以支援多個域名,所以一般將域名解析後得到host。

http1.0和http2.0的區別。

http2.0變化巨大。

1 http支援多路複用,同一個連線可以併發處理多個請求,方法是把http資料包拆為多個幀,併發有序的傳送,根據序號在另一端進行重組,而不需要一個個http請求順序到達。

2 http2.0支援服務端推送,就是服務端在http請求到達後,除了返回資料之外,還推送了額外的內容給客戶端。

3HTTP2.0壓縮了請求頭,同時基本單位是二進位制幀流,這樣的資料佔用空間更少。

4http2.0只適用於https場景,因為其在http和tcp中間加了一層ssl層。

get和post

get和post本質都是http請求,只不過對他們的作用做了界定和適配,並且讓他們適應各自的場景。

1本質區別是get只是一次http請求,post先發請求體再發請求體,實際上是兩次請求

2表面區別:

get可以cache而post不能,因為瀏覽器是這麼安排的

一般設計get是冪等的而post不是

get的引數放在url傳遞,而post放在請求體裡,因為get沒有請求體。
所以get請求不安全,並且有長度限制(url不能太長),而post幾乎沒有限制,請求體可以很大。

session和cookie

並且瀏覽器還維護了cookie以便記錄用於對網站的一些資訊,下次請求時在http報文中帶上這些資料,伺服器接收以後根據cookie中的sessionid獲取對應的session即可

token

session一般維護在記憶體中,有時候也會持久化到資料庫,但是如果session由單點維護可能出現宕機等情況,於是一般會採用分散式的方案。

session存放的幾種方案。
0 存在記憶體中。用sessionid標識使用者。
這樣的session十分依賴於cookie。如果瀏覽器禁用了cookie則session無用武之地。

當然也可以把內容存在資料庫裡,缺點是資料庫訪問壓力較大。

1有做法會將session內容存在cookie中,但前提是經過了加密,然後下次伺服器對其進行解密,但是這樣瀏覽器需要維護太多內容了。

2當用戶登入或者執行某些操作,則使用使用者的一部分欄位資訊進行加密演算法得到一串字串成為token,用於唯一標識使用者,或者是某些操作,比如登入,支付,服務端生成該token返回給使用者,使用者提交請求時必須帶上這個token,就可以確認使用者資訊以及操作是否合法了。

這樣我們不需要存session,只需要在想得到使用者資訊時解密token即可。

token還有一個好處就是可以在移動端和pc端相容,因為移動端不支援cookie。

3token和oauth。經常有第三方授權登入的例子,本質就是使用token。首先我們開啟授權登入頁,登陸後服務端返回token,我們提交第三方的請求時,帶上這個token,第三方不知道他是啥意思,並且token過段時間就過期了。

cas單點登入

單點登入是為了多個平臺之間公用一個授權系統,做法是,所有登入都要指向統一登入服務,登陸成功以後在認證中心建立session,並且得到ticket,然後重定向頁面,此時頁面也會向認證中心確認ticket是否合法,然後就可以訪問其他系統的頁面了。

從而訪問其他系統時,由於已經有了認證中心的cookie,所以直接帶上ticket訪問即可。

每次訪問新系統時需要在認證中心註冊session,然後單點退出時再把這些session退出,才能實現使用者登出。

web安全和https

密碼加密

MD5等加密方法可以用來對密碼進行加密。一般還會加鹽

xss跨站指令碼攻擊

利用有輸入功能網站的輸入框來注入JavaScript指令碼程式碼,使用者訪問該頁面時會自動執行某些指令碼程式碼,導致cookie等個人資訊洩露,可能會被轉發到其他網站。

解決辦法是對輸入進行檢驗,利用一個些工具類就可以做到。

跨站點請求偽造csrf

首先使用者訪問了一個網站並登陸,會把cookie保留在瀏覽器,
然後某些網站用一些隱性連結誘導使用者點選,點選時傳送請求會攜帶瀏覽器中的cookie,比如支付寶的賬號密碼,通過該cookie再去偽造一個支付寶支付請求,達到偽造請求的目的。

解決這個問題的辦法就是禁止js請求跨域名。但是他為ajax提供了特殊定製。

SQL 注入攻擊

  1. 概念
    伺服器上的資料庫執行非法的 SQL 語句,主要通過拼接來完成。

  2. 防範手段
    (一)使用引數化查詢

以下以 Java 中的 PreparedStatement 為例,它是預先編譯的 SQL 語句,可以傳入適當引數並且多次執行。由於沒有拼接的過程,因此可以防止 SQL 注入的發生。

(二)單引號轉換

將傳入的引數中的單引號轉換為連續兩個單引號,PHP 中的 Magic quote 可以完成這個功能。

拒絕服務攻擊

拒絕服務攻擊(denial-of-service attack,DoS),亦稱洪水攻擊,其目的在於使目標電腦的網路或系統資源耗盡,使服務暫時中斷或停止,導致其正常使用者無法訪問。

分散式拒絕服務攻擊(distributed denial-of-service attack,DDoS),指攻擊者使用網路上兩個或以上被攻陷的電腦作為“殭屍”向特定的目標發動“拒絕服務”式攻擊。

DDoS攻擊通過大量合法的請求佔用大量網路資源,以達到癱瘓網路的目的。

這種攻擊方式可分為以下幾種:

通過使網路過載來干擾甚至阻斷正常的網路通訊;
通過向伺服器提交大量請求,使伺服器超負荷;
阻斷某一使用者訪問伺服器;
阻斷某服務與特定系統或個人的通訊。

攻擊現象

被攻擊主機上有大量等待的TCP連線;
網路中充斥著大量的無用的資料包;
源地址為假 製造高流量無用資料,造成網路擁塞,使受害主機無法正常和外界通訊;
利用受害主機提供的傳輸協議上的缺陷反覆高速的發出特定的服務請求,使主機無法處理所有正常請求;
嚴重時會造成系統宕機。

總體來說,對DoS和DDoS的防範主要從下面幾個方面考慮:

儘可能對系統載入最新補丁,並採取有效的合規性配置,降低漏洞利用風險;

採取合適的安全域劃分,配置防火牆、入侵檢測和防範系統,減緩攻擊。

採用分散式組網、負載均衡、提升系統容量等可靠性措施,增強總體服務能力。

https

https博大精深,首先先來看看他的基礎知識

1對稱加密和非對稱加密

對稱加密兩方使用同一把金鑰加密和解密,傳輸金鑰時如果丟失就會被破解。

2非對稱加密兩方各有一把私鑰,而公鑰公開,A用私鑰加密,把公鑰和資料傳給B,B用公鑰解密。同理,B用私鑰對資料進行加密,返回給A,A也用公鑰進行解密。

3非對稱加密只要私鑰不丟就很安全,但是效率比較低,所以一般使用非對稱加密傳輸對稱加密的金鑰,使用對稱加密完成資料傳輸。

4數字簽名,為了避免資料在傳輸過程中被替換,比如黑客修改了你的報文內容,但是你並不知道,所以我們讓傳送端做一個數字簽名,把資料的摘要訊息進行一個加密,比如MD5,得到一個簽名,和資料一起傳送。然後接收端把資料摘要進行md5加密,如果和簽名一樣,則說明資料確實是真的。

5數字證書,對稱加密中,雙方使用公鑰進行解密。雖然數字簽名可以保證資料不被替換,但是資料是由公鑰加密的,如果公鑰也被替換,則仍然可以偽造資料,因為使用者不知道對方提供的公鑰其實是假的。

所以為了保證傳送方的公鑰是真的,CA證書機構會負責頒發一個證書,裡面的公鑰保證是真的,使用者請求伺服器時,伺服器將證書發給使用者,這個證書是經由系統內建證書的備案的。



6 https過程

使用者傳送請求,伺服器返回一個數字證書。

使用者在瀏覽器端生成一個隨機數,使用證書中的公鑰加密,傳送給服務端。

服務端使用公鑰解密該密文,得到隨機數。

往後兩者使用該隨機數作為公鑰進行對稱加密。


番外:關於公鑰加密私鑰解密與私鑰加密公鑰解密說明
第一種是簽名,使用私鑰加密,公鑰解密,用於讓所有公鑰所有者驗證私鑰所有者的身份並且用來防止私鑰所有者釋出的內容被篡改.但是不用來保證內容不被他人獲得. 

第二種是加密,用公鑰加密,私鑰解密,用於向公鑰所有者釋出資訊,這個資訊可能被他人篡改,但是無法被他人獲得.搜尋 

傳輸層

UDP 和 TCP 的特點
使用者資料報協議 UDP(User Datagram Protocol)是無連線的,盡最大可能交付,沒有擁塞控制,面向報文(對於應用程式傳下來的報文不合並也不拆分,只是新增 UDP 首部),支援一對一、一對多、多對一和多對多的互動通訊。

傳輸控制協議 TCP(Transmission Control Protocol)是面向連線的,提供可靠交付,有流量控制,擁塞控制,提供全雙工通訊,面向位元組流(把應用層傳下來的報文看成位元組流,把位元組流組織成大小不等的資料塊),每一條 TCP 連線只能是點對點的(一對一)。

TCP是傳輸層最重要的協議。

由於網路層只提供最大交付的服務,儘可能地完成路由轉發,以及把鏈路層報文傳送給任意一臺主機。他做的工作很專注,所以不會提供其他的可靠性保證。

但是真實網路環境下隨時會發生丟包,亂序,資料內容出錯等情況,這些情況必須得到處理,於是我們使用傳輸層tcp來解決這些問題。

UDP報文

偽首部的意義:偽首部並非TCP&UDP資料報中實際的有效成分。偽首部是一個虛擬的資料結構,其中的資訊是從資料報所在IP分組頭的分組頭中提取的,既不向下傳送也不向上遞交,而僅僅是為計算校驗和。

image

首部欄位只有 8 個位元組,包括源埠、目的埠、長度、檢驗和。12 位元組的偽首部是為了計算檢驗和臨時新增的。

TCP 首部格式

  • 序號 :用於對位元組流進行編號,例如序號為 301,表示第一個位元組的編號為 301,如果攜帶的資料長度為 100 位元組,那麼下一個報文段的序號應為 401。

  • 確認號 :期望收到的下一個報文段的序號。例如 B 正確收到 A 傳送來的一個報文段,序號為 501,攜帶的資料長度為 200 位元組,因此 B 期望下一個報文段的序號為 701,B 傳送給 A 的確認報文段中確認號就為 701。

  • 資料偏移 :指的是資料部分距離報文段起始處的偏移量,實際上指的是首部的長度。

  • 確認 ACK :當 ACK=1 時確認號欄位有效,否則無效。TCP 規定,在連線建立後所有傳送的報文段都必須把 ACK 置 1。

  • 同步 SYN :在連線建立時用來同步序號。當 SYN=1,ACK=0 時表示這是一個連線請求報文段。若對方同意建立連線,則響應報文中 SYN=1,ACK=1。

  • 終止 FIN :用來釋放一個連線,當 FIN=1 時,表示此報文段的傳送方的資料已傳送完畢,並要求釋放連線。

  • 視窗 :視窗值作為接收方讓傳送方設定其傳送視窗的依據。之所以要有這個限制,是因為接收方的資料快取空間是有限的。

三次握手和四次揮手

為了保證tcp的可靠傳輸,需要建立起一條通路,也就是所謂連線。這條通路必須保證有效並且能正確結束。

三次握手

1 首先客戶端傳送連線請求syn,攜帶隨機數x。
2 服務端返回請求ack,x + 1,說明服務端對x進行了回覆。
3 客戶端返回請求ack,y,說明接受到了資訊並且開始傳輸資料,起始資料為y。

客戶端狀態時syn_send和establish
服務端則是從listen到syn_rcvd,再到establish

四次揮手

1 首先客戶端請求斷開連線,傳送fin請求,服務端返回fin的ack,繼續處理斷開前需要處理完的資料。

2 過了一會,服務端處理完資料傳送給客戶端ack,表明已經關閉,客戶端最後再發一個ack給服務端,如果服務端已關閉則無反應,客戶端經過兩個ttl後揮手完畢,確認服務端斷開。這兩個ttl成為time wait狀態,用於確定服務端真的關閉。

3 客戶端發完fin後的狀態從establish變為fin1——wait,服務端發完ack後的狀態從establish變為closewait。

4 客戶端收到第一個ack後進入fin_2wait狀態,服務端過了一會發送last——ack給客戶端,說明關閉好了,客戶端收到ack後進入timewait,然後傳送ack。雙方都closed。

半連線syn和洪泛法攻擊

黑客開啟大量的syn請求而不傳送ack,服務端開啟半連線等待ack,直到資源耗盡,所以必須檢測來訪ip

為什麼要三次握手

三次握手的原因

第三次握手是為了防止失效的連線請求到達伺服器,讓伺服器錯誤開啟連線。

也就是說,如果只有兩次握手,服務端返回ack後直接通訊,那麼如果客戶端因為網路問題沒有收到ack,可能會再次請求連線,但時服務端不知道這其實是同一個請求,於是又打開了一個連線,相當於維護了很多的無用連線。

time wait的作用

1 需要服務端可靠地終止連線,如果處於time_wait客戶端發給服務端的ack報文丟失,則服務端會再發一次fin,此時客戶端不應該關閉。

2 保證遲來的tcp報文有時間被丟棄,因為2msl裡超時抵達的報文都會被丟棄。

可靠傳輸協議

TCP協議有三個重要屬性。

可靠傳輸,主要通過有序接收,確認後傳送,以及超時重傳來實現,並且使用分片來提高發送效率,通過檢驗和避免錯誤。

流量控制,主要通過視窗限制接收和傳送速率。

擁塞控制,主要通過不同擁塞狀態的演算法來處理擁塞,一開始發的比較慢,然後指數增加,當丟包時再降低速度,重新開始第一階段,避免擁塞。

總結以下就是幾個特點:

TCP 可靠傳輸

TCP 使用超時重傳來實現可靠傳輸:

1 如果一個已經發送的報文段在超時時間內沒有收到確認,那麼就重傳這個報文段。


2 滑動視窗可以連續傳送多個數據再統一進行確認。

   因為傳送端希望在收到確認前,繼續傳送其它報文段。比如說在收到0號報文的確認前還發出了1-3號的報文,這樣提高了通道的利用率。

3 滑動視窗只重傳丟失的資料報

但可以想想,0-4發出去後可能要重傳,所以需要一個緩衝區維護這些報文,所以就有了視窗。

4每當完成一個確認視窗往前滑動一格,可以傳新的一個數據,因此可以順序傳送順序確認

TCP 流量控制

流量控制是為了控制傳送方傳送速率,保證接收方來得及接收。

接收方傳送的確認報文中的視窗欄位可以用來控制傳送方視窗大小,從而影響傳送方的傳送速率。將視窗欄位設定為 0,則傳送方不能傳送資料。

TCP 擁塞控制

如果網路出現擁塞,分組將會丟失,此時傳送方會繼續重傳,從而導致網路擁塞程度更高。因此當出現擁塞時,應當控制傳送方的速率。這一點和流量控制很像,但是出發點不同。流量控制是為了讓接收方能來得及接受,而擁塞控制是為了降低整個網路的擁塞程度。

TCP 主要通過四種演算法來進行擁塞控制:慢開始、擁塞避免、快重傳、快恢復。

一般剛開始時慢開始,然後擁塞避免,出現個別丟包時(連續三個包序號不對),

則執行快重傳,然後進入快恢復階段,接著繼續擁塞避免。如果發生多次超時也就是擁塞時,直接進入慢開始。

這種情況下,只是丟失個別報文段,而不是網路擁塞,因此執行快恢復,令 ssthresh = cwnd/2 ,cwnd = ssthresh,注意到此時直接進入擁塞避免。慢開始和快恢復的快慢指的是 cwnd 的設定值,而不是 cwnd 的增長速率。慢開始 cwnd 設定為 1,而快恢復 cwnd 設定為 ssthresh。

==傳送方需要維護一個叫做擁塞視窗(cwnd)的狀態變數,注意擁塞視窗與傳送方視窗的區別:擁塞視窗只是一個狀態變數,實際決定傳送方能傳送多少資料的是傳送方視窗==。

滑動視窗協議綜合實現了上述這一些內容:

為什麼要使用滑動視窗,因為滑動視窗可以實現可靠傳輸,流量控制和擁塞控制(擁塞控制用的是擁塞視窗變數)

tcp的粘包拆包

tcp報文是流式的資料,沒有標識資料結束,只有序號等欄位,tcp協議自動完成資料報的切分。由於tcp使用緩衝區傳送,又沒有標識結束,當緩衝區的資料沒清空又有新資料進來,就會發生粘包,如果資料太大存裝不下,就會被拆包。

網路層

IP 資料報格式

  • 版本 : 有 4(IPv4)和 6(IPv6)兩個值;

  • 首部長度 : 佔 4 位,因此最大值為 15。

  • 總長度 : 包括首部長度和資料部分長度。

  • 生存時間 :TTL,它的存在是為了防止無法交付的資料報在網際網路中不斷兜圈子。以路由器跳數為單位,當 TTL 為 0 時就丟棄資料報。

==* 協議 :指出攜帶的資料應該上交給哪個協議進行處理,例如 ICMP、TCP、UDP 等。==

  • 首部檢驗和 :因為資料報每經過一個路由器,都要重新計算檢驗和,因此檢驗和不包含資料部分可以減少計算的工作量。

  • 片偏移 : 和識別符號一起,用於發生分片的情況。片偏移的單位為 8 位元組。

總結:

ip層只保證盡最大努力交付,他所承載的一切都是對路由,轉發,已經網路傳輸最友好的設計。

路由器負責記錄路由表和轉發ip資料報,路由表記錄著ip地址和下一跳路由的埠的對應關係。

由於路由聚合的緣故,一般用170.177.233.0/24就可以標識好幾個網路了。

以前會使用A,B,C類地址,和子網,現在直接使用地址聚合,前24位是網路號,後面8位是主機號。

## 某個聚合路由地址劃分網路給n臺機器,是否符合要求。。

要看這個網路中的主機號能否達到n個。

IP 地址編址方式

IP 地址的編址方式經歷了三個歷史階段:

  • 分類
  • 子網劃分
  • 無分類

1. 分類

由兩部分組成,網路號和主機號,其中不同分類具有不同的網路號長度,並且是固定的。

IP 地址 ::= {< 網路號 >, < 主機號 >}

  1. 子網劃分

    通過在主機號欄位中拿一部分作為子網號,把兩級 IP 地址劃分為三級 IP 地址。注意,外部網路看不到子網的存在。

    IP 地址 ::= {< 網路號 >, < 子網號 >, < 主機號 >}

    要使用子網,必須配置子網掩碼。一個 B 類地址的預設子網掩碼為 255.255.0.0,如果 B 類地址的子網佔兩個位元,那麼子網掩碼為 11111111 11111111 11000000 00000000,也就是 255.255.192.0。

  2. 無分類

    無分類編址 CIDR 消除了傳統 A 類、B 類和 C 類地址以及劃分子網的概念,使用網路字首和主機號來對 IP 地址進行編碼,網路字首的長度可以根據需要變化。

    IP 地址 ::= {< 網路字首號 >, < 主機號 >}

    CIDR 的記法上採用在 IP 地址後面加上網路字首長度的方法,例如 128.14.35.7/20 表示前 20 位為網路字首。

    CIDR 的地址掩碼可以繼續稱為子網掩碼,子網掩碼首 1 長度為網路字首的長度。

一個 CIDR 地址塊中有很多地址,一個 CIDR 表示的網路就可以表示原來的很多個網路,並且在路由表中只需要一個路由就可以代替原來的多個路由,減少了路由表項的數量。

把這種通過使用網路字首來減少路由表項的方式稱為路由聚合,也稱為 構成超網 。

在路由表中的專案由“網路字首”和“下一跳地址”組成,在查詢時可能會得到不止一個匹配結果,應當採用最長字首匹配來確定應該匹配哪一個。

總結

使用分類法的ip必須標識是哪一類地址,比較麻煩,而且一旦設定為某類地址它就只能使用那一部分地址空間了。

使用子網掩碼可以避免使用分類並且更靈活地決定網路號和主機號的劃分。但是需要配置子網掩碼,比較複雜。

CIDR 138.1.2.11/24
使用CIDR避免了子網劃分,直接使用後n位作為網路號,簡化了子網的配置(實際上用n代替了子網掩碼)。並且在路由器中可以使用地址聚合,一個ip可以聚合多個網路號。

ip分片詳談

在TCP/IP分層中,資料鏈路層用MTU(Maximum Transmission Unit,最大傳輸單元)來限制所能傳輸的資料包大小,MTU是指一次傳送的資料最大長度,不包括資料鏈路層資料幀的幀頭,如乙太網的MTU為1500位元組,實際上資料幀的最大長度為1512位元組,其中乙太網資料幀的幀頭為12位元組。

當傳送的IP資料報的大小超過了MTU時,IP層就需要對資料進行分片,否則資料將無法傳送成功。

IP分片的實現

IP分片發生在IP層,不僅源端主機會進行分片,中間的路由器也有可能分片,因為不同的網路的MTU是不一樣的,如果傳輸路徑上的某個網路的MTU比源端網路的MTU要小,路由器就可能對IP資料報再次進行分片。而分片資料的重組只會發生在目的端的IP層。

==避免IP分片==

在網路程式設計中,我們要避免出現IP分片,那麼為什麼要避免呢?原因是IP層是沒有超時重傳機制的,如果IP層對一個數據包進行了分片,只要有一個分片丟失了,只能依賴於傳輸層進行重傳,結果是所有的分片都要重傳一遍,這個代價有點大。由此可見,IP分片會大大降低傳輸層傳送資料的成功率,所以我們要避免IP分片。

對於UDP包,我們需要在應用層去限制每個包的大小,一般不要超過1472位元組,即乙太網MTU(1500)—UDP首部(8)—IP首部(20)。

對於TCP資料,應用層就不需要考慮這個問題了,因為傳輸層已經幫我們做了。

在建立連線的三次握手的過程中,連線雙方會相互通告MSS(Maximum Segment =Size,最大報文段長度),MSS一般是MTU—IP首部(20)—TCP首部(20),每次傳送的TCP資料都不會超過雙方MSS的最小值,所以就保證了IP資料報不會超過MTU,避免了IP分片。

  1. 外部閘道器協議 BGP

    BGP(Border Gateway Protocol,邊界閘道器協議)

    AS 之間的路由選擇很困難,主要是因為網際網路規模很大。並且各個 AS 內部使用不同的路由選擇協議,就無法準確定義路徑的度量。並且 AS 之間的路由選擇必須考慮有關的策略,比如有些 AS 不願意讓其它 AS 經過。

    BGP 只能尋找一條比較好的路由,而不是最佳路由。

    每個 AS 都必須配置 BGP 發言人,通過在兩個相鄰 BGP 發言人之間建立 TCP 連線來交換路由資訊。

路由選擇協議和演算法

路由選擇協議
路由選擇協議都是自適應的,能隨著網路通訊量和拓撲結構的變化而自適應地進行調整。

網際網路可以劃分為許多較小的自治系統 AS,一個 AS 可以使用一種和別的 AS 不同的路由選擇協議。

可以把路由選擇協議劃分為兩大類:

自治系統內部的路由選擇:RIP 和 OSPF
自治系統間的路由選擇:BGP

總結:

1. 內部閘道器協議 RIP
RIP 是一種基於距離向量的路由選擇協議。距離是指跳數,直接相連的路由器跳數為 1,跳數最多為 15,超過 15 表示不可達。

RIP 按固定的時間間隔僅和相鄰路由器交換自己的路由表,經過若干次交換之後,所有路由器最終會知道到達本自治系統中任何一個網路的最短距離和下一跳路由器地址。

2. 內部閘道器協議 OSPF
開放最短路徑優先 OSPF,是為了克服 RIP 的缺點而開發出來的。

開放表示 OSPF 不受某一家廠商控制,而是公開發表的;最短路徑優先表示使用了 Dijkstra 提出的最短路徑演算法 SPF。

OSPF 具有以下特點:

計算出最短路徑,然後向本自治系統中的所有路由器傳送資訊,這種方法是洪泛法。

傳送的資訊就是與相鄰路由器的鏈路狀態,鏈路狀態包括與哪些路由器相連以及鏈路的度量,度量用費用、距離、時延、頻寬等來表示。

變化時,路由器才會傳送資訊。

所有路由器都具有全網的拓撲結構圖,並且是一致的。相比於 RIP,OSPF 的更新過程收斂的很快。

總結:

AS是一個自治域,一般是指相似度很大公用一個協議的路由器族,比如同一個運營商的網路。

因特網中AS之間的路由選擇協議是BGP。

AS內的路由選擇協議有RIP和OSPF。

RIP兩兩交換,最後大家都同步。

OSPF找到最短路徑。告訴大家。

鏈路層

鏈路層最主要是指區域網內的網路互動了,使用mac地址通過交換機進行通訊,其中用得最多的區域網協議就是乙太網。

鏈路層使用MTU表示最大傳輸幀長度,報文長度不能超過MTU,否則會進行分片,比如比較大的IP資料報就會被分片,為了避免被分片。一般要控制IP報文長度。

廣播:

要理解什麼是廣播風暴,就必須先理解網路通訊技術。 網路上的一個節點,它傳送一個數據幀或包,被傳輸到由廣播域定義的本地網段上的每個節點就是廣播。

網路廣播分為第2層廣播和第3層廣播。第2層廣播也稱硬體廣播,用於在區域網內向所有的結點發送資料,通常不會穿過區域網的邊界(路由器),除非它變成一個單播。廣播將是一個二進位制的全1或者十六進位制全F的地址。而第3層廣播用於在這個網路內向所有的結點發送資料。

幀的傳輸方式,即單播幀(Unicast Frame)、多播幀(Multicast Frame)和廣播幀(Broadcast Frame)。

1、單播幀
單播幀也稱“點對點”通訊。此時幀的接收和傳遞只在兩個節點之間進行,幀的目的MAC地址就是對方的MAC地址,網路裝置(指交換機和路由器)根據幀中的目的MAC地址,將幀轉發出去。

2、多播幀
多播幀可以理解為一個人向多個人(但不是在場的所有人)說話,這樣能夠提高通話的效率。多播佔網絡中的比重並不多,主要應用於網路裝置內部通訊、網上視訊會議、網上視訊點播等。

3、廣播幀
廣播幀可以理解為一個人對在場的所有人說話,這樣做的好處是通話效率高,資訊一下子就可以傳遞到全體。在廣播幀中,幀頭中的目的MAC地址是“FF.FF.FF.FF.FF.FF”,代表網路上所有主機網絡卡的MAC地址。

廣播幀在網路中是必不可少的,如客戶機通過DHCP自動獲得IP地址的過程就是通過廣播幀來實現的。而且,由於裝置之間也需要相互通訊,因此在網路中即使沒有使用者人為地傳送廣播幀,網路上也會出現一定數量的廣播幀。

同單播和多播相比,廣播幾乎佔用了子網內網路的所有頻寬。網路中不能長時間出現大量的廣播幀,否則就會出現所謂的“廣播風暴”(每秒的廣播幀數在1000以上)。拿開會打一個比方,在會場上只能有一個人發言,如果所有人都同時發言的話,會場上就會亂成一鍋粥。廣播風暴就是網路長時間被大量的廣播資料包所佔用,使正常的點對點通訊無法正常進行,其外在表現為網路速度奇慢無比。出現廣播風暴的原因有很多,一塊故障網絡卡就可能長時間地在網路上傳送廣播包而導致廣播風暴。

使用路由器或三層交換機能夠實現在不同子網間隔離廣播風暴的作用。當路由器或三層交換機收到廣播幀時並不處理它,使它無法再傳遞到其他子網中,從而達到隔離廣播風暴的目的。因此在由幾百臺甚至上千臺電腦構成的大中型區域網中,為了隔離廣播風暴,都要進行子網劃分。
使用vlan完全可以隔離廣播風暴。

在交換乙太網上執行TCP/IP環境下:
二層廣播是在資料鏈路層的廣播,它 的廣播範圍是二層交換機連線的所有埠;二層廣播不能通過路由器。

三層廣播就是在網路層的廣播,它的範圍是同一IP子網內的裝置,子網廣播也不能通過路由器。

第三層的資料必須通過第二層的封裝再發送,所以三層廣播必然通過二層廣播來實現。

設想在同一臺二層交換機上連線2個ip子網的裝置,所有的裝置都可以接收到二層廣播,但三層廣播只對本子網裝置有效,非本子網的裝置也會接收到廣播包,但會被丟棄。

廣播風暴(broadcast storm)

簡單的講是指當廣播資料充斥網路無法處理,並佔用大量網路頻寬,導致正常業務不能執行,甚至徹底癱瘓,這就發生了“廣播風暴”

。一個數據幀或包被傳輸到本地網段 (由廣播域定義)上的每個節點就是廣播;由於網路拓撲的設計和連線問題,或其他原因導致廣播在網段內大量複製,傳播資料幀,導致網路效能下降,甚至網路癱瘓,這就是廣播風暴。

要避免廣播風暴,可以採用恰當劃分VLAN、縮小廣播域、隔離廣播風暴,還可在千兆乙太網口上啟用廣播風暴控制,最大限度地避免網路再次陷入癱瘓。