計算機網絡基礎知識整理(慢慢補全。)

計算機網絡

第一章 網絡基礎知識

1.1 協議

協議是計算機與計算機之間通過網絡實現通信時事先達成的一種約定。這種約定使那些由不同廠商的設備、不同的CPU以及不同的操作系統組成的計算機之間,只要遵循相同的協議就能夠實現通信。

1.2 服務

服務指下層爲緊鄰的上層提供的功能調用。有以下分類:

1.2.1 面向連接服務與無連接服務

  • 面向連接服務:通信前雙方必須先建立連接,分配相應的資源,保證通信能夠正常完成。
  • 無連接服務:通信前雙方不需要建立連接,需要發送數據時直接發送。

1.2.2 可靠服務與不可靠服務

  • 可靠服務:網絡具有糾錯、檢錯、應答機制,能保證數據正確、可靠地傳達到目的地;
  • 不可靠服務:網絡只是儘量正確、可靠地傳送,但不能保證數據正確、可靠地傳送到目的地。

1.2.3 有應答服務與無應答服務

  • 有應答服務:接收方在收到數據後向發送方給出相應的應答,該應答由傳輸系統內部自動實現,而不是由用戶實現。
  • 無應答服務:接收方收到數據後不自動給出應答,若需要應答則由高層實現。

1.3 傳輸

傳輸指將數據從一處傳遞到另一處的過程。

1.3.1 按傳輸方式分類

  • 電路交換:在源節點與目標節點直接建立一條專用的通路用於傳輸數據。
  • 報文交換:將用戶數據加上源地址、目的地址、校驗碼等輔助信息,然後封裝成報文,發送至相鄰節點,等待全部存儲完畢後再轉發至下一個節點。
  • 分組交換:將數據分成固定長度的數據塊,在每個數據塊中加上目的地址、源地址等輔助信息組成分組(包),以存儲/轉發方式傳輸。

1.3.2 按接收端數量分類

單播(Unicast):一對一通信;
廣播(Broadcast):將消息從一臺主機發送到與之相連的所有其他主機;
多播(Multicast):將消息發給某一組主機;
任播(Anycast):從目標主機羣中選擇一臺最符合網絡條件的主機作爲目標主機。

1.4 地址

1.4.1 地址的唯一性

一個地址必須明確地表示一個主體對象,在同一個通信網絡中不允許有兩個相同地址的通信主體存在。

1.4.2 地址的層次性

將地址的組成分爲幾個層次,用於在查找時快速定位到某個地址。

1.4.3 不同的協議層使用不同的地址

數據鏈路層:MAC地址;
網絡層:IP地址;
傳輸層:端口號;
應用層:電子郵箱地址等。

1.5 OSI參考模型

1.5.1 應用層

直接與用戶進行交互,爲用戶提供各種網絡服務。

1.5.2 表示層

將數據從某種特定的數據格式轉換爲網絡通用的標準數據格式。

1.5.3 會話層

控制何時建立連接、何時發送數據、使用哪一種連接方式等。

1.5.4 傳輸層

實現兩臺計算機之間點對點的傳輸。

1.5.5 網絡層

將數據從發送端主機發送到接收端主機。

1.5.6 數據鏈路層

實現相互直連的設備之間的傳輸。

1.5.7 物理層

傳輸透明比特流。

1.6 TCP/IP協議分層模型

1.6.1 應用層

對應OSI模型的會話層、表示層以及應用層。

1.6.2 傳輸層

對應OSI模型中的傳輸層。

1.6.3 網絡層

對應OSI模型中的網絡層。

1.6.4 網絡接口層

對應OSI模型中的數據鏈路層。

1.6.5 物理層

對應OSI模型中的物理層。

第二章 物理層

第三章 數據鏈路層

3.1 MAC地址

MAC(Media Access Control,介質訪問控制)地址是數據鏈路層中使用的地址類型,用於識別數據鏈路中互聯的節點。
MAC地址長48bit,格式如下:

  • 第1位:單播地址(0)/多播地址(1);
  • 第2位:全局地址(0)/本地地址(1);
  • 第3~24位:由IEEE管理並保證各廠家之間不重複;
  • 第25~48位:由廠家管理並保證產品之間不重複。

由於其組成的原因,可以保證每塊網卡(NIC,Network Interface Card)的MAC地址在全世界是唯一的。
MAC地址一般用6組十六進制數表示,如00-0F-1F-52-EF-F6。

3.2 以太網

3.2.1 以太網幀格式

以太網幀格式

  • 前導碼(Preamble):由1和0交替組合而成,表示一個以太網幀的開始。末尾是一個叫SFD(Start Frame Delimiter,幀開始符)的域,值爲11。前導碼與SFD共計8個字節;
  • 目標MAC地址:接收方的MAC地址;
  • 源MAC地址:發送方的MAC地址;
  • 類型:表示上層協議的類型;
  • 數據:以太網幀的數據部分,範圍爲46~1500字節。
  • 幀校驗碼(Frame Check Sequence):用於檢查幀是否有所損壞。

第四章 網絡層

4.1 IP地址

4.1.1 IP地址的定義

IP地址(IPv4地址)在計算機中由32位二進制數表示,在人類社會中一般將其等分爲4組,每組用“.”隔開,並將每組數轉換爲十進制數。

4.1.2 網絡地址與主機地址

IP地址由網絡地址與主機地址(網絡號與主機號)組成,它們之間的分界點由網絡類型與子網掩碼確定。

4.1.3 IP地址的分類

IP地址分爲五個級別,分別爲A類、B類、C類、D類、E類,它們根據IP地址中從第1位到第4位的比特列進行區分。
A類:首位以“0”開頭的地址,前8位爲網絡地址,後24位爲主機地址。網絡地址範圍:0.0.0.0~126.0.0.0(127.x.x.x爲回送地址);
B類:前兩位爲“10”的地址。前16位爲網絡地址,後16位爲主機地址。網絡地址範圍:128.0.0.0~191.255.0.0;
C類:前三位爲“110”的地址。前24位爲網絡地址,後8位爲主機地址。網絡地址範圍:192.0.0.0~223.255.255.0;
D類:前四位爲“1110”的地址。32位均爲網絡地址,沒有主機地址,常被用於多播。網絡地址範圍:224.0.0.0~239.255.255.255。
E類:前四位爲“1111”的地址,32位均爲網絡地址,沒有主機地址,保留作將來使用。網絡地址範圍:240.0.0.0~255.255.255.255.

4.1.4 特殊IP地址

主機地址全0的IP地址:代表當前子網的網絡地址;
主機地址全1的IP地址:代表當前子網的廣播地址;
127.x.x.x:環路回送地址,主要用於網絡軟件測試以及本地機進程間通信;
A類私有地址:10.0.0.0~10.255.255.255(1個A類)
B類私有地址:172.16.0.0~172.31.255.255(16個B類)
C類私有地址:192.168.0.0~192.168.255.255(256個C類)

4.2 子網掩碼與CIDR

4.2.1 子網掩碼

子網掩碼是一個與IP地址相對應的長32bit的二進制串,它由一串1與跟隨的一串0組成。1對應IP地址中的網絡號與子網號,0對應主機號。計算機只需將IP地址和其對應的子網掩碼逐位相與就可得出相應子網的網絡地址。

4.2.2 CIDR

CIDR(Classless Inter-Domain Routing,無類別域間路由)是在變長子網掩碼的基礎上提出的一種消除傳統A、B、C類網絡劃分,並且可以在軟件支持下實現超網構造的一種IP地址劃分方法。
CIDR使用網絡前綴的概念代替子網絡的概念,將IP地址劃分成(網絡前綴,主機號)兩部分。網絡前綴相同的連續IP地址組成CIDR地址塊,這種地址的聚合稱爲路由聚合。
注意,雖然CIDR不適用子網,但仍使用“掩碼”這一名詞。“CIDR不使用子網”指的是CIDR沒有在32位中指明哪些是子網地址,但分配到一個CIDR地址塊的組織,依然可以根據自己的需要在主機號中借用若干位來劃分子網。

4.3 IP數據包首部

IP數據包首部

  • 版本(Version):長度爲4比特,表示IP首部的版本號。IPv4的版本號即爲4。
  • 首部長度(IHL,Internet Header Length):長度爲4比特,表示IP首部的大小,單位爲4字節(32比特)。對於沒有選項的IP包,首部長度字段爲“5”,即表示首部長度爲5*4=20字節。
  • 區分服務(TOS,Type Of Service):長度爲8比特,用於表明服務質量。
  • 總長度(Total Length):長度爲16比特,表示IP首部與數據部分合起來的總字節數。因此,IP包的最大長度爲65535字節(2161 )。
  • 標識(Identification):長度爲16比特,用於分片重組時確認哪些包原屬同一個包。通常,每發送一個IP包,它的值就遞增1。
  • 標誌(Flags):長度爲3比特,表示與分片相關的信息。第一位目前未使用,必須爲0;第二位(DF)指示是否進行分片,0表示可以分片,1表示不能分片;第三位(MF)指示在包被分片的情況下,該包是否是最後一個包,0表示是最後一個包,1表示不是最後一個包。
  • 片偏移(FO,Fragment Offset):長度爲13比特,用來標識被分片的每一個分段的數據部分相對於原始數據部分的位置,單位爲8字節(64比特)。第一個分片對應的值爲0。
  • 生存時間(TTL,Time To Live):長度爲8比特,表示還可以中轉多少個路由器。每經過一個路由器,TTL減少1,變成0則丟棄該包。
  • 協議(Protocol):長度爲8比特,表示IP包傳輸層的上層協議編號。常用:4(IP)、6(TCP)、17(UDP)。
  • 首部校驗和(Header Checksum):長度爲16比特,用於確保IP數據包沒有被破壞。
  • 源地址(Source Address):長度爲32比特,表示發送端IP地址。
  • 目的地址(Destination):長度爲32比特,表示接收端IP地址。
  • 可選項(Options):長度可變,一般在實驗或診斷時使用。可包含以下信息:安全級別、原路徑、路徑記錄、時間戳。
  • 填充(Padding):在有可選項的情況下,首部長度可能不是32比特的整數倍,爲此需要向字段填充0,將其長度調整爲32比特的整數倍。
  • 數據(Data):(不屬於首部部分)數據部分,包括上層協議的首部。

在無可選項的情況下,IP數據包首部長20字節。

4.4 IP協議相關技術

4.4.1 DNS

全稱:Domain Name System,域名系統。
作用:實現域名到IP地址的轉換。
層次:DNS工作在應用層,使用UDP。
組成:

  • 域名:域名指爲了識別主機名稱和組織機構名稱的一種具有分層的名稱,分爲頂級域名(com、cn、jp、us)、二級域名(ac、co)、三級域名(baidu、google)。
  • 域名服務器:管理域名的主機和相應的軟件,用於管理其所在分層的域的相關信息。按層次高低分爲以下四種:
    1. 根域名服務器。知道所有頂級域名服務器的域名與IP地址。不管是哪一個本地域名服務器,若要對因特網上任何一個域名進行解析,只要自己無法解析,就首先求助根域名服務器。根域名服務器一般並不直接把待查詢的域名直接解析出IP地址,而是告訴本地域名服務器下一步應當找哪一個頂級域名服務器進行查詢。
    2. 頂級域名服務器。負責管理在該頂級域名服務器註冊的二級域名。
    3. 權限域名服務器。負責管理一個區。
    4. 本地域名服務器。不屬於域名服務器的層次結構中,一般主機要進行DNS解析時,會給本地域名服務器發送請求報文,請求它進行DNS解析。
  • 解析器:進行DNS查詢的主機和軟件。

DNS解析原理:
以解析www.qq.com爲例:

  1. 主機向本地域名服務器發起DNS解析請求;
  2. 本地域名服務器向根域名服務器發起解析請求;
  3. 根域名服務器返回負責.com域的頂級域名服務器的IP地址;
  4. 本地域名服務器向負責.com域的頂級域名服務器發起解析請求;
  5. 負責.com域的頂級域名服務器返回負責qq.com域的權限域名服務器的IP地址;
  6. 本地域名服務器向負責qq.com域的權限域名服務器的地址發起解析請求;
  7. 負責qq.com域的權限域名服務器返回www.qq.com的IP地址;
  8. 本地域名服務器向主機返回結果。

共使用8個UDP報文。事實上,大多數的域名服務器具有緩存功能,在收到解析請求時,如果能夠在緩存中找到域名對應的IP地址,則會直接返回結果,不進行查詢。

4.4.2 ARP

全稱:Address Resolution Protocal,地址解析協議。
作用:以目標IP地址爲線索,定位下一個應該接收數據包的網絡設備的MAC地址。
層次:ARP工作在數據鏈路層(存疑,也有說是網絡層的)。
原理:
假設主機A需要向主機B發送IP數據包,並且主機A的ARP緩存表中沒有主機B的MAC地址。此時,主機A就必須利用ARP提供的服務,過程如下:

  1. 主機A通過廣播(目標MAC地址FF-FF-FF-FF-FF-FF)發送一個ARP請求包,裏面包含了主機A的地址;
  2. 如果主機A與主機B屬於同一個網絡,主機B會收到該請求包,並向主機A返回一個ARP響應包,裏面包含了主機B的MAC的地址。主機A收到該響應包後就獲得了主機B的MAC地址,即完成了目標IP地址到目標MAC地址的轉換。
  3. 如果主機A與主機B不屬於同一個網絡,那麼主機A就需要將數據包先發送至默認網關上,由默認網關轉發至下個節點。同樣地,如果主機A不知道默認網關的MAC地址,需要再次使用ARP提供的服務來獲取。

4.4.3 ICMP

全稱:Internet Control Message Protocol,網際控制報文協議。
作用:在主機和路由器之間傳遞控制信息。
層次:ICMP工作在網絡層。
主要的ICMP消息:

  • ICMP目標不可達消息(類型3):路由器無法將IP數據包發送給目標地址時,會給發送端主機返回一個目標不可達(Destination Unreachable Message)的ICMP消息,並附上不可達的具體原因,用錯誤號表示。
  • ICMP原點抑制消息(類型4):當路由器由於網絡擁堵而無法發送數據包時,會向發送端主機發送一個ICMP原點抑制消息(Source Quench Message)。
  • ICMP重定向消息(類型5):如果路由器發現發送端主機使用了次優的路徑發送數據,那麼它會返回一個ICMP重定向消息(Redirect Message)給這個主機,並附上最合適的路由信息。
  • ICMP超時消息(類型11):當有IP數據包因爲TTL歸零而被丟棄時,路由器會給發送端主機發送一個ICMP超時消息(Time Exceeded Message)。
  • ICMP回送應答(類型0)與ICMP回送請求(類型8)消息:用於進行通信的主機或路由器之間,判斷所發送的數據包是否已經成功到達對端。可以向對端主機發送ICMP回送請求消息(Echo Request Message),也可以接收對端主機發回來的回送應答消息(Echo Reply Message)。這也是ping命令的實現原理。

4.4.4 DHCP

全稱:Dynamic Host Configuration Protocal,動態主機配置協議。
作用:實現自動設置IP地址、統一管理IP地址分配。
層次:DHCP工作在應用層,使用UDP。
工作原理:假設已有一臺配置好的DHCP服務器,現在有一臺新主機要求分配IP地址,過程如下:

  1. DHCP Client以廣播的方式發出DHCP Discover報文;
  2. 所有的DHCP Server都能夠接收到DHCP Client發送的DHCP Discover報文,所有的DHCP Server都會給出響應,向DHCP Client發送一個DHCP Offer報文;DHCP Offer報文中“Your(Client) IP Address”字段就是DHCP Server能夠提供給DHCP Client使用的IP地址,且DHCP Server會將自己的IP地址放在“option”字段中以便DHCP Client區分不同的DHCP Server。DHCP Server在發出此報文後會存在一個已分配IP地址的紀錄
  3. DHCP Client只能處理其中的一個DHCP Offer報文,一般的原則是DHCP Client處理最先收到的DHCP Offer報文。DHCP Client會發出一個廣播的DHCP Request報文,在選項字段中會加入選中的DHCP Server的IP地址和需要的IP地址;
  4. DHCP Server收到DHCP Request報文後,判斷選項字段中的IP地址是否與自己的地址相同。如果不相同,DHCP Server不做任何處理只清除相應IP地址分配記錄;如果相同,DHCP Server就會向DHCP Client響應一個DHCP ACK報文,並在選項字段中增加IP地址的使用租期信息。
  5. DHCP Client接收到DHCP ACK報文後,檢查DHCP Server分配的IP地址是否能夠使用。如果可以使用,則DHCP Client成功獲得IP地址並根據IP地址使用租期自動啓動續延過程;如果DHCP Client發現分配的IP地址已經被使用,則DHCP Client向DHCPServer發出DHCP Decline報文,通知DHCP Server禁用這個IP地址,然後DHCP Client開始新的地址申請過程。
  6. DHCP Client在成功獲取IP地址後,隨時可以通過發送DHCP Release報文釋放自己的IP地址,DHCP Server收到DHCP Release報文後,會回收相應的IP地址並重新分配。
  7. 在使用租期超過50%時刻處,DHCP Client會以單播形式向DHCP Server發送DHCPRequest報文來續租IP地址。如果DHCP Client成功收到DHCP Server發送的DHCP ACK報文,則按相應時間延長IP地址租期;如果沒有收到DHCP Server發送的DHCP ACK報文,則DHCP Client繼續使用這個IP地址。
  8. 在使用租期超過87.5%時刻處,DHCP Client會以廣播形式向DHCP Server發送DHCPRequest報文來續租IP地址。如果DHCP Client成功收到DHCP Server發送的DHCP ACK報文,則按相應時間延長IP地址租期;如果沒有收到DHCP Server發送的DHCP ACK報文,則DHCP Client繼續使用這個IP地址,直到IP地址使用租期到期時,DHCP Client纔會向DHCP Server發送DHCP Release報文來釋放這個IP地址,並開始新的IP地址申請過程。

4.4.5 NAT(NAPT)

全稱:Network Address Translator,網絡地址轉換。實際使用的多爲NAPT(Network Address Port Translator,網絡端口地址轉換)。
作用:實現在本地網絡使用私有地址,在連接互聯網時使用全局IP地址。
層次:難以定義,可認爲是傳輸層或是網絡層。
原理:NAT(NAPT)路由器中維護一張用於轉換的表,用於將內部地址(iAddr:port1)映射到外部地址(eAddr:port2),也就是所有來自(iAddr:port1)的包都會被轉換成來自(eAddr:port2)的包。同樣地,所有發送至(eAddr:port2)的包都會被髮送至(iAddr:port1)。

4.4.6 IP隧道

作用:解決兩個IPv6網絡中夾着一個IPv4網絡導致無法通信的問題。
原理:將IPv6數據包當做一個數據,爲其再加上一個IPv4首部後再發送。

4.4.7 移動IP(Mobile IP)

作用:解決智能手機或是筆記本電腦當連接的子網改變時,由於IP地址的改變導致TCP連接斷開的問題。
原理:每臺主機註冊一個歸屬代理,歸屬代理會給主機分配一個歸屬地址。這個歸屬地址無論主機移動到哪裏都不會改變,主機始終使用歸屬地址進行通信。當主機未移動時連接的網絡叫做歸屬網絡,當主機移動後連接的網絡叫做外部網絡,提供網絡服務的叫做外部代理。

  1. 當主機處於歸屬網絡下時,數據包按照正常方式發送(由路由器轉交);
  2. 當主機移動之後,發送至主機的數據包首先發送到歸屬代理,由歸屬代理通過IP隧道轉發至主機的外部代理,由外部代理還原後再轉發至主機。主機發送數據包時按照常規方法發送。

4.5 路由協議

4.5.1 路由控制的定義

互聯網是由路由器連接的網絡組合而成的。爲了能讓數據包正確地到達目標主機,路由器必須在途中進行正確的轉發。這種向正確的方向轉發數據所進行的處理就叫路由控制或路由。

4.5.2 自治系統與路由協議

制定自己的路由策略,並以此爲準在一個或多個網絡羣體中採用的小型單位叫做自治系統(Autonomous System,AS)。
自治系統內部使用的路由協議叫做IGP(Interior Gateway Protocol,內部網關協議),自治系統之間使用的路由協議叫做BGP(Border Gateway Protocol)。

4.5.3 靜態路由與動態路由

靜態路由:由管理者手工添加路由信息;
動態路由:由管理者設置好路由協議,具體的路由表由路由器在工作中動態生成。

4.5.3 RIP協議

全稱:Routing Information Protocol,路由信息協議。
層次:RIP是應用層協議,使用UDP傳輸。
規定:

  1. 網絡中的每一個路由器都要維護從它自己到其他每一個目的網絡的距離記錄。
  2. 距離也稱爲跳數(Hop Count),規定從一路由器到與其直接連接的路由器的距離爲1。
  3. 優先選擇跳數少的路徑。
  4. 一條路徑最多隻能包含15個路由器,因此距離等於16時代表網絡不可到達。
  5. 僅和相鄰路由器交換信息,交換的信息是自己的整個路由表。
  6. 使用距離向量算法維護路由表,路由表項由目的網絡、距離、下一跳路由器三項組成。
    距離向量算法:
    假設當前路由器爲S,現收到路由器X發來的RIP包(包內爲路由器X的路由表),則進行以下操作:(1)將路由器X的路由表中所有的下一跳地址改爲X(2)將表中的每一項與自己的路由表進行比較。假設某一項的目的網絡爲N,如果自己的路由表中沒有目的網絡爲N的表項,則將該項加入;如果自己的路由表中有目的網絡爲N的表項,且下一跳爲X,則進行替換;如果自己的路由表中有目的網絡爲N的表項,且下一跳不爲X,則比較兩個表項的距離,如果通過X的距離更短則進行替換。

4.5.4 OSPF協議

全稱:Open Shortest Path First,開放最短路徑優先。
層次:OSPF是網絡層協議,直接使用IP數據包傳輸。
規定:

  1. OSPF向本自治系統中所有路由器發送信息,使用的是洪泛法。
  2. 發送的信息是與本路由器直接相鄰的所有路由器的鏈路狀態,即說明本路由器與哪些路由器相鄰,以及該鏈路的“代價”。
  3. 只有當鏈路狀態變化時才向所有路由器廣播信息。
  4. 由於路由器之間頻繁地交換鏈路狀態信息,每個路由器最終都能建立一個鏈路裝填數據庫,實質上是全網的拓撲結構圖。之後就可以使用Dijkstra算法計算出到每個路由器的最短路徑。
  5. 路由表中只保留下一跳地址,不存儲完整路徑。

4.5.5 BGP協議

4.6 IPv6

4.7 IP組播

第五章 傳輸層

5.1 端口號

5.1.1 端口號的定義

端口號是傳輸層使用的地址,用來識別一臺計算機中進行通信的不同程序。

5.1.2 根據端口號識別應用與通信

端口號可以唯一確定正在通信的應用程序,但不足以確定一個通信。要確定一個通信需要5個信息:源IP地址、目標IP地址、協議號、源端口號、目標端口號。

5.1.3 端口號的分類

  1. 知名端口號(0~1023):HTTP、TELNET、FTP等廣爲使用的協議使用的端口號。如FTP使用端口號20與21,HTTP使用端口號80等。應用程序必須避免使用知名端口號進行既定目的以外的通信。
  2. 被註冊的端口號(1024~49151):一些被註冊的端口號,不過它們可用於任何通信用途。
  3. 動態(時序)分配的端口號(49152~65535,老系統中可能會依次使用1024以上空閒的端口號):在實際應用中,服務器有必要確定監聽的端口號,而客戶端不需要確定端口號。這種情況下可以由操作系統負責提供互不衝突的端口號。

5.2 UDP

5.2.1 UDP的特點

UDP全稱User Datagram Protocol,用戶數據包協議。有以下特點:

  1. UDP數據包發送時無需建立連接。
  2. 無連接狀態。
  3. 首部開銷小。TCP首部有20字節開銷,而UDP首部僅8字節。

5.2.2 UDP數據報格式

UDP數據報格式
UDP數據報包含以下內容:

  • 源端口:發送端端口號,不需要回信可用全0。
  • 目的端口號:接收端端口號,必須。
  • 長度:UDP數據報長度,包括首部和數據,最小爲8。
  • 校驗和:檢測UDP數據報在傳輸中是否有錯。可選,不計算可用全0。計算方法是使用二進制反碼求和再取反。注意:(1)UDP的校驗和是把首部和數據部分一起檢驗,不同於IP的只檢驗首部。(2)計算之前需要加上12字節的僞首部,如下:

UDP僞首部

5.3 TCP

5.3.1 TCP的特點

TCP全稱Transmission Control Protocol,傳輸控制協議,具有以下特點:

  1. TCP是面向連接的傳輸層協議。
  2. 每一條TCP連接只能有兩個端點,即TCP連接只能是點對點的。
  3. TCP提供可靠的交付服務,保證傳送的數據無差錯、不丟失、不重複且有序。
  4. TCP提供全雙工通信,即允許通信雙方的應用進程在任何時候都能發送數據,爲此TCP連接的兩端都設有發送緩存與接收緩存,用來臨時存放雙向通信的數據。

5.3.2 TCP報文段格式

TCP報文段既可以用來運載數據,也可以用來建立連接、釋放連接和應答。首部最短爲20字節,格式如下:
TCP報文段格式

  • 源端口和目的端口:各佔2字節。
  • 序號:佔4字節。TCP是面向字節流的,所以TCP連接中傳送的數據流中的每一個字節都編上一個序號。序號字段的值則指的是本報文段發送的數據的第一個字節的序號。
  • 確認號:佔4字節。確認號是期望收到對方的下一個報文段的數據的第一個字節的序號。若確認號=N,則表明到序號N-1爲止的所有數據都已正確收到。
  • 數據偏移(即首部長度):佔4位,表示TCP報文段的數據起始處距離報文段起始處的距離(也就是首部長度)。單位是32位(4字節)
  • 保留字段:佔6位,保留爲以後使用,目前應爲全0。
  • 緊急位URG:當URG=1時,表明緊急指針字段有效。它告訴系統此報文段中有緊急數據,應儘快傳送。URG需要和緊急指針配套使用。
  • 確認位ACK:只有當ACK=1時確認號字段纔有效。TCP規定在連接建立後所有傳送的報文段必須把ACK置爲1。
  • 推送位PSH:接收TCP收到PSH=1的報文段,就儘快地交付接收應用進程,而不是等到緩存滿了再交付。
  • 復位位RST:當RST=1時,表明TCP連接中出現嚴重差錯,必須釋放連接然後再重新建立運輸連接。
  • 同步位SYN:SYN=1表示這是一個連接請求或連接接收報文。當SYN=1,ACK=0時,表明這是一個連接請求報文,對方若同意建立連接,則在響應報文中使用SYN=1,ACK=1。
  • 終止位FIN:用來釋放一個連接。FIN=1表明此報文段的發送方的數據已經發送完畢,並要求釋放傳輸連接。
  • 窗口字段:佔2字節。它指出了現在允許對方發送的數據量,單位爲字節。例:確認號701,窗口字段1000表明接收方還能接收序號爲701~1700的數據。
  • 檢驗和:佔2字節。檢驗和字段檢驗的部分包括首部和數據兩部分。在計算檢驗和時,和UDP一樣要在前面加上12字節的僞首部(只需將UDP僞首部的第四個字段即協議字段從17改成6)。
  • 緊急指針字段:佔16位,指出在本報文段中緊急指針有多少個字節(緊急指針放在數據最前面)。
  • 選項字段:長度可變。最初只規定了一種選項,即最大報文段長度(Maximun Segment Size,MSS)。
  • 填充字段:用於保證首部長度爲4字節的整數倍。

5.3.3 TCP連接的建立

TCP連接的建立需要三個步驟,常被稱爲“三次握手”,如下:

  1. 客戶機的TCP首先向服務器的TCP發送一個連接請求報文段,這個報文段不含應用層數據,首部中的SYN=1。另外,客戶機會隨機選取一個初始序號seq=x(連接請求報文不含數據,但還是要消耗一個序號)。
  2. 服務器的TCP接收到連接請求報文段後,如果同意建立連接,就發回確認報文段,併爲該TCP連接分配TCP緩存與變量。確認報文段中SYN=1,ACK=1,確認號爲x+1,並且服務器隨機產生初始序號seq=y(確認報文不含數據,但還是要消耗一個序號)。
  3. 客戶機收到確認報文段後,還要向服務器發回確認,並且也要給該連接分配緩存與變量。這個報文的ACK=1,序號字段x+1,確認號y+1。

5.3.4 TCP連接的釋放

參與TCP連接的兩個進程中的任何一個都能終止該連接。終止TCP連接需要四個步驟,稱爲“四次揮手”,如下:

  1. 客戶機打算關閉連接,就發送一個連接釋放報文段,並停止發送數據。該報文段FIN=1,seq=u,它等於前面已傳送過的數據的最後一個字節序號+1。
  2. 服務器收到連接釋放報文段後發出確認,確認號ack=u+1,序號=v,等於前面已傳送過的數據的最後一個字節的序號+1。此時,從客戶機到服務器方向的連接就釋放了,TCP連接處於半關閉狀態。
  3. 若服務器沒有要向客戶機發送的數據,就通知TCP釋放連接,發出FIN=1的連接釋放報文段。
  4. 客戶機收到連接釋放報文段後,必鬚髮出確認。報文中確認號ack=v+1,序號seq=u+1。

注意:無論是連接還是釋放,用到確認號的話ACK就必然爲1。

5.3.5 TCP可靠傳輸

TCP使用了序號、確認、重傳等機制保證可靠傳輸。

  • 序號:TCP連接中傳送的數據流中的每一個字節都被編上一個序號。序號從0開始。
  • 確認:TCP首部的確認號是期望收到對方的下一個報文段的數據的第一個字節的序號。TCP默認使用累計確認。
  • 重傳:有兩種事件會導致TCP對報文段進行重傳:超時和冗餘ACK。(1)超時:TCP始終維護一個動態變化的RTT(Round-Trip Time)值,用於記錄報文段的往返時間。在RTT的基礎上,再計算一個RTO(Retransmission Time-Out,超時重傳時間)值。TCP每發送一個報文段就設置一個計時器,如果計時器時間超過RTO時還沒有收到確認則重傳。(2)冗餘ACK:冗餘ACK指再次確認某個報文段的ACK,即發送方先前已經收到過對該報文段的確認。TCP規定每當比期望序號大的失序報文段到達時,發送一個冗餘ACK,指明下一個期望收到的字節的序號。當發送方收到對同一個報文段的3個冗餘ACK時,即可認爲跟在這個報文段後面的報文段已經丟失,此時發送方可以立即重傳。這種技術也成爲快速重傳。

5.3.6 TCP流量控制

流量控制的目的是消除發送方使接收方的接收緩存溢出的可能性。TCP提供一種基於滑動窗口協議的流量控制機制。在通信過程中,接收方根據自己接收緩存的大小,動態地調整發送方的發送窗口大小,即接受窗口rwnd。同時,發送方根據其對當前網絡擁塞程度的估計確定一個擁塞窗口cwnd。發送方實際的發送窗口大小=min(rwnd,cwnd)。

5.3.7 TCP擁塞控制

擁塞控制的目的是防止過多的數據注入網絡中,使網絡中的路由器或鏈路不過載。主要通過以下四種算法:慢開始、擁塞避免、快重傳、快恢復。
(1)慢開始算法:在TCP剛連接好,開始發送TCP報文段時,先令擁塞窗口cwnd=1,即一個最大報文段長度MSS。每當收到一個對新的報文段的確認時,將cwnd值加1,即增大一個MSS。慢開始算法會產生以下效果:每經過一個傳輸輪次(即一個往返時延RTT),cwnd值就會加倍,即cwnd值會呈指數增長。cwnd值會一直增大到一個規定的慢開始門限ssthresh,然後改用擁塞避免算法。
(2)擁塞避免算法:發送端的cwnd每經過一個RTT就增加一個MSS,而不是加倍,使cwnd線性緩慢增長(加法增大)。當出現一次超時(網絡擁塞)時,令慢開始門限ssthresh等於當前cwnd的一半(乘法減小)。
當網絡出現擁塞時,無論在慢開始階段還是擁塞避免階段,只要發送方檢測到超時事件的發生(沒有按時收到確認),就把ssthresh設置爲出現擁塞時的cwnd值的一半(不能小於2),然後把cwnd值重新置爲1,執行慢開始算法。這樣就能迅速減少發送的數據量,緩解網絡擁塞。
快重傳與快恢復是對慢開始和擁塞避免的補充:
(1)快重傳:發送方收到三個冗餘ACK報文時,直接重傳對方尚未收到的報文段,而不必等待那個報文段的計時器超時。
(2)快恢復:發送端收到三個冗餘ACK報文時,執行“乘法減小”,把ssthresh設置爲出現擁塞時cwnd值的一半,並把cwnd值設爲ssthresh改變後的數值(慢開始直接設爲1)。

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