1. 程式人生 > >【搞定網路協議】之計算機網路基礎知識總結

【搞定網路協議】之計算機網路基礎知識總結

本文按照五層網路模型進行基礎知識點的總結:

目   錄:

各層網路協議總覽:

1、各層的協議單元

2、各層的主要協議

3 、網絡卡、路由器、交換機

一  應用層

1、HTTP協議

2、DHCP協議

3、DNS協議和HTTP請求過程

二  運輸層

2.1  UDP和TCP的特點

2.2  UDP

2.3  TCP

2.3.1  TCP報文段的首部格式

2.3.2  TCP的三次握手和四次揮手

2.3.3  可靠傳輸協議

2.3.4  TCP的粘包拆包

三  網路層

3.1  IP資料報格式

3.2  IP資料報的分片

3.3  IP地址的編址方式

3.4  路由選擇協議

3.5  ARP協議

3.6  ICMP協議

3.7  閘道器和NAT

3.8  虛擬專用網VPN和內網IP

四  資料鏈路層

4.1  廣播

4.2  幀的傳輸方式

4.3  乙太網

4.4  虛擬區域網VLAN

五  物理層

六、OSI七層模型


各層網路協議總覽:

1、各層的協議單元

協議單元PDU(Protocol  Data  Unit)是指對等層次之間傳遞的資料單位。

物理層的PDU是:資料位(Bit);

資料鏈路層的PDU是:資料幀(Frame);

網路層的PDU是:資料報(Packet);

傳輸層的PDU是:資料段(Segment);

其他更高層次的PDU是:報文(Message);

2、各層的主要協議

2.1  應用層

典型裝置:應用程式,如:HTTP、FTP、SMTP 。資料傳輸單元:資料位(Bit)。

1、HTTP(Hypertext  Transfer  Protocol):超文字傳輸協議、埠號:80、面向事務的應用層協議;

2、FTP(File  Transfer  Protocol):檔案傳輸協議、埠號:21、較少或者消除不同作業系統下處理檔案的不相容性;

3、TFTP(Trivial  File  Transfer  Protocol):簡單檔案傳輸協議、很小但容易實現的檔案傳輸協議、支援UDP、程式碼佔用記憶體小;

4、SMTP(Simple  Mail  Transfer  Protocol):簡單郵件傳輸協議、埠號:25、用於傳送郵件;

5、POP3(Post  Office  Protocol  3):郵局協議的第3個版本,用於接收郵件;

6、IMAP(Internet  Message  Access Protocol):網際報文讀取協議、聯機協議、用於接收郵件;

7、DHCP(Dynamic  Host  Configuration  Protocol):動態主機配置協議、使用UDP協議工作、埠號:67/68、主要的兩個用途:給內部網路或網路服務供應商自動分配IP地址和給使用者或者內部網路管理員作為對所有計算機中央管理的手段、實現即插即用連網;

8、DNS(Domain  Name  System):域名解析,將域名解析為IP地址、埠號:53;

9、TELNET:遠端終端協議、使用TCP連線註冊到遠端計算機。

2.2  傳輸層

典型裝置:程序和埠。資料傳輸單元:資料段(Segment)。

1、TCP(Transmission  Control  Protocol):傳輸控制協議,提供可靠的面向連線的服務、傳輸資料前必須先建立連線,結束後再釋放。可靠的全雙工通道。可靠、有序、無丟失、不重複;

2、UDP(User  Datagram  Protocol):使用者資料報協議,傳送資料前無需建立連線、不使用擁塞控制、不保證可靠交付、盡最大努力交付。


在保證TCP可靠傳輸中還有一些協議:【其中停止等待協議和連續ARQ協議屬於資料鏈路層協議】

1、停止等待協議:每傳送完一個分組就停止傳送。等待對方確認,在收到確認後再發送下一個分組;

2、連續ARQ協議:傳送方每收到一個確認,就把傳送視窗向前滑動一個分組的位置。改進:累積確認;

3、滑動視窗協議:位元組為單位,該協議允許傳送方在停止並等待確認前傳送多個數據分組。由於傳送方不必每發一個分組就停下來等待確認,因此該協議可以加速資料的傳輸。

2.3  網路層

典型裝置:路由器、防火牆、多層交換機。資料傳輸單元:資料報(Packet)。

1、IP協議(Internet  Protocol):網路之間互聯的協議,分為IPv4和IPv6;

2、ARP(Address  Resolution  Protocol):地址解析協議,通過IP地址解析出實體地址,即MAC地址;

3、RARP(Reverse  Address  Resolution  Protocol):反向地址解析協議,允許區域網的物理機從閘道器伺服器的ARP表或者快取上請求其IP地址;

4、ICMP(Internet  Control  Message  Protocol):網際控制報文協議,允許主機或路由器報告差錯情況和提供有關異常情況報告,從而更有效地轉發IP資料報和提高交付成功的機會、種類:ICMP差錯報告報文和ICMP詢問報文、應用:PING;

5、IGMP(Internet  Group  Management  Protocol):網際組管理協議,是一個組播協議、用於IP主機向任一個直接相鄰的路由器報告它們的組成員情況;

6、RIP(Router  Information  Protocol):路由資訊協議,屬於內部閘道器協議,分散式的基於距離向量的路由選擇協議、是一種在閘道器和主機之間交換路由選擇資訊的標註、單位是:跳數。

7、OSPF(Open  Shortest  Path  First):開放最短路徑優先,也是內部閘道器協議、使用分散式的鏈路狀態協議;

8、BGP(Border  Gateway  Protocol):邊界閘道器協議,是一種外部閘道器協議、用來連線Internet 上獨立系統的路由選擇協議、採用路徑向量路由選擇協議。

2.4  資料鏈路層

典型裝置:網絡卡、網橋、交換機。資料傳輸單元:幀(Frame)。

1、ARQ(Automatic  Repeat-reQuest)自動重傳協議,錯誤糾正協議之一、包括停止等待ARQ協議和連續ARQ協議、錯誤糾正、正面確認、逾時重傳與負面確認重傳等機制;

2、停止等待協議:每傳送完一個分組就停止傳送。等待對方確認,在收到確認後再發送下一個分組;

3、CSMA/CD(Carrrier Sense Multiple Access with Collision Detection):載波監聽多點接入/碰撞檢測協議、匯流排型網路,協議的實質是載波監聽和碰撞檢測。載波監聽即發資料前先檢測總線上是否有其他計算機在傳送資料,如有暫時不發資料,避免碰撞。碰撞檢測為計算機邊傳送資料邊檢測通道上的訊號電壓大小;

4、PPP(Point-to-Point  Protocol)點到點協議,面向位元組、由三部分組成:(1)一個將IP資料報封裝到序列鏈路的方法 ;(2)一個用於建立、配置和測試資料鏈路連線的鏈路控制協議LCP;(3)一套網路控制協議NCP;

5、HDLC (High-Level Data Link Control )高階資料鏈路控制同步網上傳輸資料、面向位元的資料鏈路層協議。

6、ATM (Asynchronous Transfer Mode )非同步傳遞方式,建立在電路交換和分組交換的基礎上的一種面向連線的快速分組交換技術。 “非同步”是指將ATM 信元“非同步插入”到同步的 SDH 位元流中。如同步插入則使用者在每幀中所佔的時隙相對位置固定不變。“同步”是指網路中各鏈路上的位元流都是受同一非常精確的主時鐘的控制。Wi-Fi 、WiMAX 、DTM 、令牌環、乙太網、FDDI 、幀中繼、 GPRS 、 EVDO 、HSPA 、L2TP 、ISDN

2.5  物理層

典型裝置:中繼器、集線器。資料單元:位元(Bit)。

光纖、同軸電纜、雙絞線........

3、網絡卡、路由器、交換機

1、網絡卡是一個有MAC地址的物理裝置,通過MAC地址與區域網內的交換機通訊,交換機可以識別MAC地址。而單純的中繼器,集線器,雙絞線等裝置只識別物理層裝置。

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

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


下面將對各層中在面試中常問的知識點做詳細總結:

一  應用層

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

1、HTTP協議

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

HTTP的狀態碼:

1、1xx 表示通知資訊,如請求收到了或者正在處理;

2、2xx 表示成功,如接受或知道了;

3、3xx 表示重定向,如要完成請求還必須採取進一步的行動;

4、4xx 表示客戶的差錯,如請求中有錯誤的語法或不能完成;

5、5xx 表示伺服器的差錯,如伺服器失效無法完成請求。

1.1  http1.0、1.1和2.0

http1.0和http1.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、http2.0支援多路複用,同一個連線可以併發處理多個請求,方法是把http資料包拆為多個幀,併發有序的傳送,根據序號在另一端進行重組,而不需要一個個http請求順序到達;

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

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

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

https:

1、對稱加密和非對稱加密:

  • 對稱加密兩方使用同一把金鑰加密和解密,傳輸金鑰時如果丟失就會被破解。
  • 非對稱加密兩方各有一把私鑰,而公鑰公開,A用私鑰加密,把公鑰和資料傳給B,B用公鑰解密。同理,B用私鑰對資料進行加密,返回給A,A也用公鑰進行解密。
  • 非對稱加密只要私鑰不丟就很安全,但是效率比較低,所以一般使用非對稱加密傳輸對稱加密的金鑰,使用對稱加密完成資料傳輸。

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

3、數字證書:對稱加密中,雙方使用公鑰進行解密。雖然數字簽名可以保證資料不被替換,但是資料是由公鑰加密的,如果公鑰也被替換,則仍然可以偽造資料,因為使用者不知道對方提供的公鑰其實是假的。所以為了保證傳送方的公鑰是真的,CA證書機構會負責頒發一個證書,裡面的公鑰保證是真的,使用者請求伺服器時,伺服器將證書發給使用者,這個證書是經由系統內建證書的備案的。

4、 https過程

  • 使用者傳送請求,伺服器返回一個數字證書。
  • 使用者在瀏覽器端生成一個隨機數,使用證書中的公鑰加密,傳送給服務端。
  • 服務端使用公鑰解密該密文,得到隨機數。
  • 往後兩者使用該隨機數作為公鑰進行對稱加密。


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

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

http與https的區別:

1、https協議需要到ca申請證書,一般免費證書很少,需要交費;

2、http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議;

3、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443;

4、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。

1.2  Get和Post

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

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

2、表面區別:get可以cache而post不能,因為瀏覽器是這麼安排的、一般設計get是冪等的而post不是、get的引數放在url傳遞,而post放在請求體裡,因為get沒有請求體。所以get請求不安全,並且有長度限制(url不能太長),而post幾乎沒有限制,請求體可以很大。

1.3  Session和Cookie

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

1.4  Token

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

session存放的幾種方案:

1、存在記憶體中。用sessionid標識使用者,這樣的session十分依賴於cookie。如果瀏覽器禁用了cookie,則session無用武之地。當然也可以把內容存在資料庫裡,缺點是資料庫訪問壓力較大。

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

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

這樣我們不需要存session,只需要在想得到使用者資訊時解密token即可。token還有一個好處就是可以在移動端和pc端相容,因為移動端不支援cookie。

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

1.5  CAS單點登陸

單點登入是為了多個平臺之間公用一個授權系統,做法是:所有登入都要指向統一登入服務,登陸成功以後在認證中心建立session,並且得到ticket,然後重定向頁面,此時頁面也會向認證中心確認ticket是否合法,然後就可以訪問其他系統的頁面了。從而訪問其他系統時,由於已經有了認證中心的cookie,所以直接帶上ticket訪問即可。每次訪問新系統時需要在認證中心註冊session,然後單點退出時再把這些session退出,才能實現使用者登出。

1.6  Web安全

(1)XSS跨站指令碼攻擊

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

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

(2)跨站點請求偽造CSRF(Cross-site request forgery)

【ps:推薦閱讀:CSRF攻擊與防禦(寫得非常好)

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

解決辦法:禁止js請求跨域名。但是他為ajax提供了特殊定製。

(3)SQL注入攻擊

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

防範手段 :
1、使用引數化查詢:以 Java 中的 PreparedStatement 為例,它是預先編譯的 SQL 語句,可以傳入適當引數並且多次執行。由於沒有拼接的過程,因此可以防止 SQL 注入的發生。

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

(4)拒絕服務攻擊DoS

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

分散式拒絕服務攻擊(distributed denial-of-service attack,DDoS),指攻擊者使用網路上兩個或以上被攻陷的電腦作為“殭屍”向特定的目標發動“拒絕服務”式攻擊。DDoS攻擊通過大量合法的請求佔用大量網路資源,以達到癱瘓網路的目的。

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

1、通過使網路過載來干擾甚至阻斷正常的網路通訊;

2、通過向伺服器提交大量請求,使伺服器超負荷;

3、阻斷某一使用者訪問伺服器;

4、阻斷某服務與特定系統或個人的通訊。

攻擊現象:

1、被攻擊主機上有大量等待的TCP連線;

2、網路中充斥著大量的無用的資料包;

3、源地址為假,製造高流量無用資料,造成網路擁塞,使受害主機無法正常和外界通訊;

4、利用受害主機提供的傳輸協議上的缺陷反覆高速的發出特定的服務請求,使主機無法處理所有正常請求;

5、嚴重時會造成系統宕機。

對DoS和DDoS的防範措施:

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

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

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

2、DHCP協議

DHCP協議,即動態主機配置協議。

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

3、DNS協議和HTTP請求過程

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

說明:應用層最重要的就是HTTP協議,其次就是Web安全相關的內容,至於和郵件協議(SMTP、POP3和IMAP)、動態主機配置協議、域名系統DNS協議可以參考:《計算機網路—謝希仁第7版》---- 第6章 應用層


二  運輸層

運輸層最重要的就是TCP和UDP這兩個協議。當然最最重要的還是TCP。

2.1  UDP和TCP的特點

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

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

2.2  UDP

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

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

2.3  TCP

2.3.1  TCP報文段的首部格式

下面對TCP報文段中的幾個重要欄位做下講解:

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

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

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

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

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

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

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

2.3.2  TCP的三次握手和四次揮手

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

三次握手:

三次握手過程:

最初客戶端和服務端都處於CLOSED(關閉)狀態。本例中A主動開啟連線,B被動開啟連線。

一開始,B的TCP伺服器程序首先建立傳輸控制塊TCB,準備接受客戶端程序的連線請求。然後服務端程序就處於LISTEN(監聽)狀態,等待客戶端的連線請求。如有,立即作出響應。

1、A的TCP客戶端程序也是首先建立傳輸控制塊TCB。然後,在打算建立TCP連線時,向B發出連線請求報文段,這時首部中的同步位SYN=1,同時選擇一個初始序號seq=x。TCP規定,SYN報文段(即SYN=1的報文段)不能攜帶資料,但要消耗掉一個序號。這時,TCP客戶程序進入SYN-SENT(同步已傳送)狀態。

2、B收到連線請求報文後,如果同意建立連線,則向A傳送確認。在確認報文段中應把SYN位和ACK位都置1,確認號是ack = x + 1,同時也為自己選擇一個初始序號seq = y。請注意,這個報文段也不能攜帶資料,但同樣要消耗掉一個序號。這時TCP服務端程序進入SYN-RCVD(同步收到)狀態。

3、TCP客戶程序收到B的確認後,還要向B給出確認。確認報文段的ACK置1,確認號ack = y +  1,而自己的序號seq = x + 1。這時ACK報文段可以攜帶資料。但如果不攜帶資料則不消耗序號,這種情況下,下一個資料報文段的序號仍是seq = x + 1。這時,TCP連線已經建立,A進入ESTABLISHED(已建立連線)狀態。

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

為什麼是三次握手,而不是兩次握手或者四次握手呢?

簡單回答為什麼是三次握手的答案:

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

詳細回答:

不可以兩次握手的原因:

為了防止已經失效的連結請求報文段突然又傳送到了B,因而產生錯誤。比如下面這種情況:A發出的第一個連線請求報文段並沒有丟失,而是在網路結點長時間滯留了,以致於延誤到連線釋放以後的某個時間段才到達B。本來這是一個早已失效的報文段。但是B收到此失效的連結請求報文段後,就誤認為A又發出一次新的連線請求。於是就向A發出確認報文段,同意建立連線。

對於上面這種情況,如果不進行第三次握手,B發出確認後就認為新的運輸連線已經建立了,並一直等待A發來資料。B的許多資源就這樣白白浪費了。

如果採用了三次握手,由於A實際上並沒有發出建立連線請求,所以不會理睬B的確認,也不會向B傳送資料。B由於收不到確認,就知道A並沒有要求建立連線。

不需要四次握手的原因:

有人可能會說A發出第三次握手的資訊後在沒有接收到B的請求就已經進入了連線狀態,那如果A的這個確認包丟失或者滯留了怎麼辦?

我們需要明白一點,完全可靠的通訊協議是不存在的。在經過三次握手之後,客戶端和服務端已經可以確認之前的通訊狀況,都收到了確認資訊。所以即便再增加握手次數也不能保證後面的通訊完全可靠,所以是沒有必要的。

四次揮手:

四次揮手過程:

資料傳輸結束後,通訊的雙方都可以釋放連線。現在A和B都處於ESTABLISHED狀態。

1、A的應用程序先向其TCP發出連線釋放報文段,並停止再發送資料,主動關閉TCP連線。A把連線釋放報文段首部的終止控制位FIN置1,其序號aeq = u(等於前面已傳送過的資料的最後一個位元組的序號加1),這時A進入FIN-WAIT-1(終止等待1)狀態,等待B的確認。請注意:TCP規定,FIN報文段即使不攜帶資料,也將消耗掉一個序號。

2、B收到連線釋放報文段後立即發出確認,確認號是ack = u + 1,而這個報文段自己的序號是v(等於B前面已經傳送過的資料的最後一個位元組的序號加1).然後B就進入CLOSE-WAIT(關閉等待)狀態。TCP服務端程序這時應通知高層應用程序,這時的TCP連線處於半關閉(half-close)狀態,即A已經沒有資料要傳送了,但B若傳送資料,A仍要接收。也就是說,從B到A這個方向的連線並未關閉,這個狀態可能會持續一段時間。

A收到來自B的確認後,就進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連線釋放報文段。

3、若B已經沒有要向A傳送的資料,其應用程序就通知TCP釋放連線。這時B發出的連線釋放報文段必須使FIN=1。假定B的序號為w(在半關閉狀態,B可能又傳送了一些資料)。B還必須重複上次已傳送過的確認號ack = u + 1。這時B就進入LAST-ACK(最後確認)狀態,等待A的確認。

4、A在收到B的連線釋放報文後,必須對此發出確認。在確認報文段中把ACK置1,確認號ack = w + 1,而自己的序號seq = u + 1(前面傳送的FIN報文段要消耗一個序號)。然後進入TIME-WAIT(時間等待)狀態。請注意,現在TCP連線還沒有釋放掉。必須經過時間等待計時器設定的時間2MSL(MSL:最長報文段壽命)後,A才能進入到CLOSED狀態,然後撤銷傳輸控制塊,結束這次TCP連線。當然如果B一收到A的確認就進入CLOSED狀態,然後撤銷傳輸控制塊。所以在釋放連線時,B結束TCP連線的時間要早於A。

為什麼A在TIME-WAIT狀態必須等待2MSL的時間呢?

簡單回答:

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

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

詳細回答:

1、為了保證A傳送的最後一個ACK報文段能夠到達B。這個ACK報文段有可能丟失,因而使處在LAST-ACK狀態的B收不到對已傳送的FIN+ACK報文段的確認。B會超時重傳這個FIN+ACK報文段,而A就能在2MSL時間內收到這個重傳的FIN+ACK報文段。接著A重傳一次確認,重新啟動2MSL計時器。最後,A和B都正常進入到CLOSED狀態。如果A在TIME-WAIT狀態不等待一段時間,而是在傳送完ACK報文段後立即釋放連線,那麼就無法收到B重傳的FIN+ACK報文段,因而也不會再發送一次確認報文段,這樣,B就無法按照正常步驟進入CLOSED狀態。

2、防止已失效的連線請求報文段出現在本連線中。A在傳送完最後一個ACK報文段後,再經過時間2MSL,就可以使本連線持續的時間內所產生的所有報文段都從網路中消失。這樣就可以使下一個連線中不會出現這種舊的連線請求報文段。

保活計時器:

除時間等待計時器外,TCP還有一個保活計時器(keepalive  timer)。設想這樣的場景:客戶已主動與伺服器建立了TCP連線。但後來客戶端的主機突然發生故障。顯然,伺服器以後就不能再收到客戶端發來的資料。因此,應當有措施使伺服器不要再白白等待下去。這就需要使用保活計時器了。

伺服器每收到一次客戶的資料,就重新設定保活計時器,時間的設定通常是兩個小時。若兩個小時都沒有收到客戶端的資料,服務端就傳送一個探測報文段,以後則每隔75秒鐘傳送一次。若連續傳送10個探測報文段後仍然無客戶端的響應,服務端就認為客戶端出了故障,接著就關閉這個連線。

2.3.3  可靠傳輸協議

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)的狀態變數,注意擁塞視窗與傳送方視窗的區別:擁塞視窗只是一個狀態變數,實際決定傳送方能傳送多少資料的是傳送方視窗。

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

2.3.4  TCP的粘包拆包

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

具體的運輸層講解請參考:運輸層


三  網路層

3.1  IP資料報格式

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

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

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

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

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

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

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

3.2  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分片。

  1. 對於UDP包,我們需要在應用層去限制每個包的大小,一般不要超過1472位元組,即乙太網MTU(1500)—UDP首部(8)—IP首部(20)。
  2. 對於TCP資料,應用層就不需要考慮這個問題了,因為傳輸層已經幫我們做了。
  3. 在建立連線的三次握手的過程中,連線雙方會相互通告MSS(Maximum Segment =Size,最大報文段長度),MSS一般是MTU—IP首部(20)—TCP首部(20),每次傳送的TCP資料都不會超過雙方MSS的最小值,所以就保證了IP資料報不會超過MTU,避免了IP分片。

3.3  IP地址的編址方式

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

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

3.3.1. 分類

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

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

3.3.2  子網劃分

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

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

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

3.3.3  無分類

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

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

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

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

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

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

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

3.3.4  總結

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

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

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

幾個需要注意的點:

  • 路由器負責記錄路由表和轉發IP資料報,路由表記錄著IP地址和下一跳路由的埠的對應關係。
  • 由於路由聚合的緣故,一般用170.177.233.0/24就可以標識好幾個網路了。
  • 以前會使用A,B,C類地址,和子網,現在直接使用地址聚合,前24位是網路號,後面8位是主機號。
  • 某個聚合路由地址劃分網路給n臺機器,是否符合要求-->要看這個網路中的主機號能否達到n個。

3.4  路由選擇協議

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

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

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

1、自治系統內部的路由選擇:RIP 和 OSPF 

2、自治系統間的路由選擇:BGP

3.4.1  RIP協議

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

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

3.4.2  OSPF協議

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

OSPF 具有以下特點:

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

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

3、變化時,路由器才會傳送資訊;

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

3.4.3  BGP協議

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

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

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

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

3.4.4  總結

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

2、因特網中AS之間的路由選擇協議是BGP、AS內的路由選擇協議有RIP和OSPF;

3、RIP兩兩交換,最後大家都同步;

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

3.5  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 地址的對映。

3.6