1. 程式人生 > >《TCP/IP詳解》

《TCP/IP詳解》

限制 測量 新的 簡寫 tcp/ip協議 當前時間 設備 註意 ip首部

TCP/IP概述

Transmission Control Protocol/Internet Protocol的簡寫,中譯名為傳輸控制協議/因特網互聯協議,又名網絡通訊協議,是Internet最基本的協議、Internet國際互聯網絡的基礎,由網絡層的IP協議和傳輸層的TCP協議組成。TCP/IP 定義了電子設備如何連入因特網,以及數據如何在它們之間傳輸的標準。協議采用了4層的層級結構,每一層都呼叫它的下一層所提供的協議來完成自己的需求。通俗而言:TCP負責發現傳輸的問題,一有問題就發出信號,要求重新傳輸,直到所有數據安全正確地傳輸到目的地。而IP是給因特網的每一臺聯網設備規定一個地址。

TCP/IP通常被認為是一個四層協議:

技術分享

  1. 鏈路層。也稱數據鏈路層或網絡接口層,包括設備驅動程序和網絡接口卡,它們一起處理與電纜的物理接口細節。
  2. 網絡層。處理分組在網絡中的活動,如分組的選路;網絡層的協議包括IP協議、ICMP協議(Internet互聯網控制報文協議)、IGMP協議(Internet組管理協議)。
  3. 傳輸層。主要為兩臺主機上的應用程序提供端到端的通信,包括TCP(傳輸控制協議)和UDP(用戶數據報協議)。
  4. 應用層。處理特定的應用程序細節。

TCP/IP協議族中不同層次的協議如下:

技術分享

互聯網上的每個接口必須有唯一的IP地址,5類不同的IP地址格式和返回如下:

技術分享技術分享

當應用程序用TCP傳送數據時,數據被送入協議棧,然後逐個通過每一層直到被當作一串比特流送入網絡,其中每一層對收到的數據都要增加一些首部信息。

技術分享

鏈路層

鏈路層主要有三個目的:

  1. 為IP模塊發送和接受IP數據;
  2. 為ARP模塊發送ARP請求和接受ARP應答;
  3. 外RARP發送RARP請求和接受RARP應答。

環回接口

環回接口允許運行在同一臺主機上的客戶程序和服務器程序通過TCP/IP進行通信,IP地址127.0.0.1被分配給這個接口,並命名為localhost。

目的地址的環回地址時,照樣還是傳輸層和網絡層的所有過程,只是當IP數據報離開網絡層時把它返回給自己,這樣做簡化了設計,因為環回接口可以看作是網絡層下面的一個鏈路層。網絡層把一份數據報傳送給環回接口,就像傳送給其它鏈路層一樣,只不過環回接口把它返回到IP的輸入隊列中。

MTU

以太網對數據幀的長度有一個限制,最大值是1500。鏈路層的這個特性稱作MTU(最大傳輸單元)。如果IP層數據報的長度比鏈路層的MTU還要大,那麽IP層就需要進行分片,每一片都要小於MTU。

如果兩臺主機之間的通信要通過多個網絡,那麽每個網絡的鏈路層就可能有不同的MTU。兩臺通信主機路徑中的最小MTU,被稱為路徑MTU。兩個方向上的選路不一定對稱,因此路徑MTU在兩個方向上不一定是一致的。

IP協議

IP是TCP/IP協議族中最為核心的協議。所有的TCP、UDP、ICMP及IGMP數據都以IP數據報格式傳輸。

IP提供不可靠、無連接的數據服務。不可靠的是指它不能保證IP數據報能成功地到達目的地;無連接是指IP並不維護任何關於後續數據報的狀態信息,每個數據報的處理是相互獨立的。

IP數據報格式

IP數據報格式如下圖所示,普通的IP首部長為20字節,除非含有選項字段。

技術分享

總長度字段是指整個IP數據報的長度,該字段長16位,所以IP數據報的最大長度為65535字節。

最後一個字段是任選項,是數據報中的一個可變長的可選信息,如記錄路徑、時間戳等,這些選項一般很少使用。

IP路由選擇

IP路由選擇是簡單的,對於主機來說,如果目的主機與源主機直接相連或都在一個共享網絡上,那麽IP數據報就直接送到目的主機上;否則主機九堡數據報發往一默認的路由器上,由路由器來轉發該數據報。

IP層既可以配置成路由器的功能,也可以配置成主機的功能。IP層在內存中有一個路由表,當收到一份數據報並進行發送時,它都要對該表搜索一次。當數據報來自某個網絡接口時,IP首先檢查目的IP地址是否為本機的IP地址之一或者IP廣播地址。如果是的話,數據報就被送到由IP首部協議字段所指定的協議模塊進行處理。如果數據報的目的不是這些地址,如果IP層被設置為路由器的功能,那麽就對數據報進行轉發,否則數據報被丟棄。

IP路由選擇是逐跳進行的,IP並不知道到達任何目的的完整路徑,所有IP路由選擇只為數據報傳輸提供下一站路由器的IP地址。IP路由選擇主要完成這些功能:

  1. 搜索路由表,尋找能與目的IP地址完全匹配的表目。
  2. 搜索路由表,尋找能與目的網絡號相匹配的表目。
  3. 搜索路由表,尋找標為"默認"的表目。

如果上面的步驟都沒有成功,數據報就不能被傳送。

子網尋址

現在所有主機都要求支持子網編址。不是把IP地址看成單純的一個網絡號和一個主機號組成,而是吧主機號再分成一個子網號和一個主機號。

主機通過子網掩碼來確定IP地址多少位用於子網號,多少位用於主機號。子網掩碼是一個32位的值,值為1的位留給網絡號和子網號,為0的位留給主機號。

給定IP地址和子網掩碼以後,主機就可以確定IP數據報的目的是:(1)本子網上的主機;(2)本網絡中其它子網的主機;(3)其它網絡上的主機。

ICMP

ICMP(Internet控制報文協議)是IP層一個組成部分,它傳遞差錯報文以及其他需要註意的信息,ICMP報文通常被IP層或更高層協議(TCP或UDP)使用,一些ICMP報文把差錯報文返回給用戶進程。ICMP是在IP數據報內部被傳輸的。

技術分享

ICMP的一個規則是,ICMP差錯報文必須包括生成該差錯報文的數據報IP首部,還必須至少包括跟在該IP首部後面的前8個字節。這樣就包含了UDP的首部,接收ICMP的系統就可以根據源端口號來把差錯報文與某個特定的用戶進程相關聯。

Ping

Ping程序目的是為了測試另一臺主機是否可達。該程序發送一份ICMP回顯請求報文給主機,並等待返回ICMP回顯應答。Ping程序還能測出到這臺主機的往返時間。大多數的TCP/IP實現都在內核中直接支持Ping服務,這種服務器不是一個用戶進程。

Ping程序通過在ICMP報文數據中存放請求的時間值來計算往返時間。當應答返回時,用當前時間減去存放在ICMP報文中的時間值,既是往返時間。

Traceroute

Traceroute程序可以讓我們看到IP數據報從一臺主機傳到另一臺主機所經過的路由,Traceroute程序還可以讓我們使用IP源路由選項。

Traceroute程序的操作過程是,它發送一份TTL字段為1的IP數據報給目的主機。處理這份數據報的第一個路由器將TTL值減1,丟棄改數據報,並發回一份超時ICMP報文。這樣就得到了該路徑的第一個路由器地址。然後Traceroute程序發送一份TTL為2的數據報,這樣我們就可以得到第二個路由器的地址。繼續這個過程直至該數據報到達目的主機。

Traceroute程序發送一份UDP數據報給目的主機,但它選擇一個不可能的值作為UDP端口號,將使目的主機的UDP模塊產生一份"端口不可達"錯誤的ICMP報文,這樣就可以區分接收到的ICMP報文是超時還是端口不可達,以判斷什麽時候結束。

UDP

UDP是一個簡單的面向數據報的傳輸層協議。應用程序必須關心IP數據報的長度,如果它超過了MTU,就要對IP數據報進行分片。

UDP首部

UDP首部的各字段如下圖:

技術分享

端口號表示發送進程和接收進程,TCP端口號由TCP來查看,而UDP端口號由UDP來查看,TCP端口號和UDP端口號是相互獨立的。

IP數據報的最大長度時65535字節,這是由IP首部16比特總長度字段所限制的。除去20字節的IP首部和8字節的UDP首部,UDP數據報中用戶數據的最長長度為65507字節。

IP分片

IP把MTU與數據報長度進行比較,如果需要則進行分片。分片可以發生在原始發送端主機上,也可以發生在中間路由器上。把一份IP數據報分片以後,只有到達目的地才進行重新組裝。重新組裝由目的端的IP層來完成,其目的是使分片和重新組裝過程對傳輸層透明。

IP數據報中的標識字段包含一個唯一值,該值在數據報分片時被復制到每個片中。標誌字段用其中一個比特來表示"更多的片",除最後一片外,其它每個組成數據報的片都要報該比特置1。片偏移字段指的是該片偏移原始數據報開始處的位置。

由於IP層本身沒有超時重傳的機制,即使只丟失一片數據也要重傳整個數據報。如果對數據報分片的是中間路由器,而不是起始端系統,那麽起始端系統就無法知道數據報是如何被分片的。所以要避免分片。

需要註意的是,任何傳輸層首部只出現在第1片數據中。

技術分享

TCP

TCP提供一種面向連接的、可靠的字節流服務。TCP通過以下方式來提供可靠性:

  • 應用數據被分割成TCP認為最合適發送的數據塊。
  • TCP發送一個段後,它啟動一個定時器,如果不能及時收到一個確認,將重發這個報文段。
  • TCP收到發自TCP連接另一端的數據時,將發送一個確認。
  • TCP將保持它首部和數據的校驗和。
  • TCP對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層。
  • TCP的接收端會丟棄重復的數據。
  • TCP還能提供流量控制。

TCP首部

TCP首部的數據格式如下圖:

技術分享

序號用來標識從TCP發送端想TCP接收端發送的數據字節流,它表示在這個報文段中的第一個數據字節,TCP用需要對每個字節進行計數。確認序號包含發送確認的一端所期望收到的下一個序號,確認序號是上次已成功收到的數據字節序號加1。

TCP的流量控制由連接的每一端通過聲明的窗口大小來提供,這個值是接收端正期望接收的字節。窗口大小是一個16位的字段,所以窗口大小最大是65535字節,新的窗口擴大選項允許這個值按比例變化以提供更大的窗口。

流量控制

TCP使用滑動窗口協議的形式進行流量控制。該協議允許發送方在停止並等待確認前可以連續發送多個分組,可以加速數據的傳輸。

使用TCP的滑動窗口協議時,接收方不必確認每一個收到的分組,ACK是累積的,它們表示接收方已經正確收到了一直到確認序號減1的所有字節。

在應用程序讀取了TCP緩沖區的數據後,TCP在需要的時候會發送一個ACK,它並不確認任何新數據,只是用來增加窗口的右邊沿,因此被稱為窗口更新。

滑動窗口的動態性總結如下:

  1. 發送方不必範松一個全窗口大小的數據。
  2. 來自接收方的一個報文段確認數據並把窗口向右邊滑動。
  3. 窗口的大小可以減小,但是窗口的右邊沿卻不能想做移動。
  4. 接收方在發送一個ACK前不必等待窗口被填滿。

TCP需要支持一種被稱為慢啟動的算法,該算法通過觀察到新分組進入網絡的速率應該與另一端返回確認的速率相同而進行工作。慢啟動為發送方的TCP增加了另一個窗口:擁塞窗口,擁塞窗口被初始化為1個報文段,每收到一個ACK,擁塞窗口就增加一個報文段。發送方取擁塞窗口與通告窗口中的最小值作為發送上限。擁塞窗口是發送方使用的流量控制,而通告窗口則是接收方使用的流量控制。

超時與重傳

對每個連接,TCP管理4個不同的定時器:

  1. 重傳定時器用於當希望收到另一端的確認。
  2. 堅持定時器使窗口大小信息保持不斷流動。
  3. 保活定時器可以檢測到一個空閑連接的另一端何時崩潰或重啟。
  4. 2MSL定時器測量一個連接處於TIME_WAIT狀態的時間。

TCP在對端ACK超時後按照一定的時間間隔進行重試,在多次重試仍超時後最終會放棄並發送一個復位信號。每次重試的時間間隔是一種被稱為指數退避的倍乘關系,直至一個最大值,如重傳間隔每次重傳時增加1倍直至64秒。

TCP超時與重傳中最重要的部分就是對一個給定連接的往返時間(RRT)的測量。由於路由器和網絡流量均會變化,因此我們認為這個時間可能經常會發生變化,TCP應該跟蹤這些變化並相應地改變其超時時間。

TCP在收到一個失序的報文段時,立即需要產生一個ACK,這個重復的ACK目的在於讓對方知道收到一個失序的報文段。發送端端不知道的ACK是由一個丟失的報文段引起的,還是由於僅僅出現了幾個報文段的重新排序,如果一連串收到3個或3個以上重復ACK,就非常可能是一個報文段丟失了,於是發送端就重傳丟失的數據報文段,而無需等待超時定時器溢出,這就是快速重傳算法。

《TCP/IP詳解》