TCP/IP詳解

1 概述


以太網數據幀的物理特性是其長度必須在4 6~1 5 0 0字節之間。

U D P數據與T C P數據基本一致。唯一的不同是U D P傳給I P的信息單元稱作U D P數據報(UDP datagram),而且U D P的首部長爲8字節。

由於T C P、U D P、I C M P和I G M P都要向I P傳送數據,因此I P必須在生成的I P首部中加入某種標識,以表明數據屬於哪一層。爲此, I P在首部中存入一個長度爲8 b i t的數值,稱作協議域。1表示爲I C M P協議, 2表示爲I G M P協議, 6表示爲T C P協議, 1 7表示爲U D P協議。

類似地,許多應用程序都可以使用T C P或U D P來傳送數據。運輸層協議在生成報文首部時要存入一個應用程序的標識符。T C P和U D P都用一個1 6 b i t的端口號來表示不同的應用程序。T C P和U D P把源端口號和目的端口號分別存入報文首部中。

網絡接口分別要發送和接收I P、A R P和R A R P數據,因此也必須在以太網的幀首部中加入某種形式的標識,以指明生成數據的網絡層協議。爲此,以太網的幀首部也有一個16 bit的幀類型域。
一般來說, T C P服務器是併發的,而U D P服務器是重複的。

知名端口號介於1~1023之間。大多數T C P / I P實現給臨時端口分配1 0 2 4~5 0 0 0之間的端口號。大於5 0 0 0的端口號是爲其他服務器預留的( I n t e r n e t上並不常用的服務)。

常見的知名端口:

FTP(TCP,UDP) 21

TELNET             23

TFTP(UDP)       69



2 鏈路層

在第3章和第1 7章中,我們將看到I P首部和T C P首部及其數據始終都有校驗和。在第11章中,將看到U D P首部及其數據的檢驗和卻是可選的。

以太網的鏈路層對IP segment或RAP datagram或RARP datagram進行封裝。頭部加了14字節,尾部加入4個字節。頭部14個字節包括:目的主機的硬件地址(6個字節),源頭、主機的硬件地址(6個字節),用來指明數據類型的2個字節(是IP數據還是ARP數據還是RARP數據)。尾部的4個字節是CRC校驗。

SLIP跟串口通信差不多,僅僅是對IP數據前面和後面加了個END。

A類網絡號1 2 7就是爲環回接口預留的。根據慣例,大多數系統把I P地址1 2 7 . 0 . 0 . 1分配給這個接口,並命名爲l o c a l h o s t。一個傳給環回接口的I P數據報不能在任何網絡上出現。

MTU:以太網和8 0 2 . 3對數據幀的長度都有一個限制,其最大值分別是1 5 0 0和1 4 9 2字節。鏈路層的這個特性稱作M T U,最大傳輸單元。不同類型的網絡大多數都有一個上限。

如果I P層有一個數據報要傳,而且數據的長度比鏈路層的M T U還大,那麼I P層就需要進行分片( f r a g m e n t a t i o n),把數據報分成若干片,這樣每一片都小於M T U。

當在同一個網絡上的兩臺主機互相進行通信時,該網絡的M T U是非常重要的。但是如果兩臺主機之間的通信要通過多個網絡,那麼每個網絡的鏈路層就可能有不同的M T U。重要的不是兩臺主機所在網絡的M T U的值,重要的是兩臺通信主機路徑中的最小M T U。它被稱作路徑M T U。

兩臺主機之間的路徑M T U不一定是個常數。它取決於當時所選擇的路由。而選路不一定是對稱的(從A到B的路由可能與從B到A的路由不同),因此路徑M T U在兩個方向上不一定是一致的。


3 IP:網際協議

首部檢驗和字段是根據I P首部計算的檢驗和碼。它不對首部後面的數據進行計算。I C M P、I G M P、U D P和T C P在它們各自的首部中均含有同時覆蓋首部和數據檢驗和碼。

在一般的體制中,I P可以從T C P、U D P、I C M P和I G M P接收數據報(即在本地生成的數據報)並進行發送,或者從一個網絡接口接收數據報(待轉發的數據報)並進行發送。I P層在內存中有一個路由表。當收到一份數據報並進行發送時,它都要對該表搜索一次。當數據報來自某個網絡接口時, I P首先檢查目的I P地址是否爲本機的I P地址之一或者I P廣播地址。如果確實是這樣,數據報就被送到由I P首部協議字段所指定的協議模塊進行處理。如果數據報的目的不是這些地址,那麼( 1)如果I P層被設置爲路由器的功能,那麼就對數據報進行轉發(也就是說,像下面對待發出的數據報一樣處理);否則( 2)數據報被丟棄。



5 RARP:逆地址解析協議

對應於A R P,R A R P請求以廣播方式傳送,而R A R P應答一般是單播( u n i c a s t )傳送的。

在第3行中,我們可以看到,一旦s u n收到I P地址,它就發送一個T F T P讀請求( R R Q)給文件8 C F C 0 D 2 1 . S U N 4 C。

R A R P服務器的複雜性在於,服務器一般要爲多個主機(網絡上所有的無盤系統)提供硬件地址到I P地址的映射。該映射包含在一個磁盤文件中(在U n i x系統中一般位於/ e t c / e t h e r s目錄中)。由於內核一般不讀取和分析磁盤文件,因此R A R P服務器的功能就由用戶進程來提供,而不是作爲內核的T C P / I P實現的一部分。

由於發送和接收這些數據幀與系統有關,因此R A R P服務器的實現是與系統捆綁在一起的。


6 ICMP:Internet控制報文協議

下面各種情況都不會導致產生I C M P差錯報文:
1) ICMP差錯報文(但是,I C M P查詢報文可能會產生I C M P差錯報文)。
2) 目的地址是廣播地址(見圖3 - 9)或多播地址(D類地址,見圖1 - 5)的I P數據報。
3) 作爲鏈路層廣播的數據報。
4) 不是I P分片的第一片(將在11 . 5節介紹分片)。
5) 源地址不是單個主機的數據報。這就是說,源地址不能爲零地址、環回地址、廣播地址或多播地址。

這些規則是爲了防止過去允許I C M P差錯報文對廣播分組響應所帶來的廣播風暴。

I C M P地址掩碼請求用於無盤系統在引導過程中獲取自己的子網掩碼。

I C M P的一個規則是, I C M P差錯報文(參見圖6 - 3的最後一列)必須包括生成該差錯報文的數據報I P首部(包含任何選項),還必須至少包括跟在該I P首部後面的前8個字節。

當I C M P報文返回時,爲什麼T F T P客戶程序還要繼續重發請求呢?這是由於網絡編程中的一個因素,即B S D系統不把從插口( s o c k e t )接收到的I C M P報文中的U D P數據通知用戶進程,除非該進程已經發送了一個c o n n e c t命令給該插口。


7 Ping程序

當路由器(根據定義應該是多穴的)在清單中記錄I P地址時,它應該記錄哪個地址呢?是入口地址還是出口地址?爲此, RFC 791 [Postel 1981a]指定路由器記錄出口I P地址。當原始主機(運行p i n g程序的主機)收到帶有R R選項的I C M P回顯應答時,它也要把它的入口I P地址放入清單中。

利用Ping程序可以實現:IP的記錄路由選項和IP時間戳選項。


8 Traceroute程序

儘管不能保證從源端發往目的端的兩份連續的I P數據報具有相同的路由,但是大多數情況下是這樣的。

When a router gets an IP datagram whose TTL is either 0 or 1 it must not forward the datagram. (A destination host that receives a datagram like this can deliver it to the application, since the datagram does not have to be routed. Normally, however, no system should receive a datagram with a TTL of 0.) Instead the router throws away the datagramand sends back to the originating host an ICMP "time exceeded" message. The key to Traceroute is that the IP datagram containing this ICMP message has the router's IP address as the source address.

第三,返回的I C M P報文中的信源I P地址是U D P數據報到達的路由器接口的I P地址。這與I P記錄路由選項( 7 . 3節)不同,記錄的I P地址指的是發送接口地址。

源站選路(source routing)的思想是由發送者指定路由。它可以採用以下兩種形式:
• 嚴格的源路由選擇。發送端指明I P數據報所必須採用的確切路由。如果一個路由器發現源路由所指定的下一個路由器不在其直接連接的網絡上,那麼它就返回一個“源站路
由失敗”的I C M P差錯報文。
• 寬鬆的源站選路。發送端指明瞭一個數據報經過的I P地址清單,但是數據報在清單上指明的任意兩個地址之間可以通過其他路由器。

Tr a c e r o u t e程序提供了一個查看源站選路的方法,我們可以在選項中指明源站路由,然後檢查其運行情況。


9 IP選路

在本章中,我們主要的目的是瞭解單個I P層如何作出路由決策。

在3 . 3節中,我們列出了I P搜索路由表的幾個步驟:
1) 搜索匹配的主機地址;
2) 搜索匹配的網絡地址;
3) 搜索默認表項(默認表項一般在路由表中被指定爲一個網絡表項,其網絡號爲0)。
匹配主機地址步驟始終發生在匹配網絡地址步驟之前。

I P層進行的選路實際上是一種選路機制,它搜索路由表並決定向哪個網絡接口發送分組。這區別於選路策略,它只是一組決定把哪些路由放入路由表的規則。I P執行選路機制,而路由守護程序則一般提供選路策略。

對於一個給定的路由器,可以打印出五種不同的標誌( f l a g):
U 該路由可以使用。
G 該路由是到一個網關(路由器)。如果沒有設置該標誌,說明目的地是直接相連的。
H 該路由是到一個主機,也就是說,目的地址是一個完整的主機地址。如果沒有設置該標誌,說明該路由是到一個網絡,而目的地址是一個網絡地址:一個網絡號,或者網
絡號與子網號的組合。
D 該路由是由重定向報文創建的( 9 . 5節)。
M 該路由已被重定向報文修改( 9 . 5節)

標誌G是非常重要的,因爲由它區分了間接路由和直接路由(對於直接路由來說是不設置標誌G的)。其區別在於,發往直接路由的分組中不但具有指明目的端的I P地址,還具有其鏈路層地址(見圖3 - 3)。當分組被髮往一個間接路由時, I P地址指明的是最終的目的地,但是鏈路層地址指明的是網關(即下一站路由器)。

理解G和H標誌之間的區別是很重要的。G標誌區分了直接路由和間接路由,如上所述。但是H標誌表明,目的地址( n e t s t a t命令輸出第一行)是一個完整的主機地址。沒有設置H標誌說明目的地址是一個網絡地址(主機號部分爲0)。當爲某個目的I P地址搜索路由表時,主機地址項必須與目的地址完全匹配,而網絡地址項只需要匹配目的地址的網絡號和子網號就可以了。

當I P數據報應該被髮送到另一個路由器時,收到數據報的路由器就要發送I C M P重定向差錯報文給I P數據報的發送端。重定向一般用來讓具有很少選路信息的主機逐漸建立更完善的路由表。

關於I C M P重定向報文有很多規則。首先,重定向報文只能由路由器生成,而不能由主機生成。另外,重定向報文是爲主機而不是爲路由器使用的。

一般認爲,主機在引導以後要廣播或多播傳送一份路由器請求報文。一臺或更多臺路由器響應一份路由器通告報文。另外,路由器定期地廣播或多播傳送它們的路由器通告報文,允許每個正在監聽的主機相應地更新它們的路由表。

當路由器啓動時,它定期在所有廣播或多播傳送接口上發送通告報文。準確地說,這些通告報文不是定期發送的,而是隨機傳送的,以減小與子網上其他路由器發生衝突的概率。一般每兩次通告間隔4 5 0秒和6 0 0秒。一份給定的通告報文默認生命週期是3 0分鐘。

除了定期發送主動提供的通告報文以外,路由器還要監聽來自主機的請求報文,併發送路由器通告報文以響應這些請求報文。
如果子網上有多臺路由器,由系統管理員爲每個路由器設置優先等級。例如,主默認路由器就要比備份路由器具有更高的優先級。

路由器發現報文一般由用戶進程(守護程序)創建和處理。

系統產生的或轉發的每份I P數據報都要搜索路由表,它可以被路由守護程序或I C M P重定向報文修改。系統在默認情況下不轉發數據報,除非進行特殊的配置。用r o u t e命令可以進入靜態路由,可以利用新I C M P路由器發現報文來初始化默認表項,並進行動態修改。主機在啓動時只有一個簡單的路由表,它可以被來自默認路由器的I C M P重定向報文動態修改。


10 動態選路協議

當相鄰路由器之間進行通信,以告知對方每個路由器當前所連接的網絡,這時就出現了動態選路。路由器之間必須採用選路協議進行通信,這樣的選路協議有很多種。路由器上有一個進程稱爲路由守護程序( routing daemon),它運行選路協議,並與其相鄰的一些路由器進行通信。正如圖9 - 1所示,路由守護程序根據它從相鄰路由器接收到的信息,更新內核中的路由表。

動態選路並不改變我們在9 . 2節中所描述的內核在I P層的選路方式。這種選路方式稱爲選路機制( routing mechanism)。內核搜索路由表,查找主機路由、網絡路由以及默認路由的方式並沒有改變。僅僅是放置到路由表中的信息改變了—當路由隨時間變化時,路由是由路由守護程序動態地增加或刪除,而不是來自於自引導程序文件中的r o u t e命令。

每個自治系統可以選擇該自治系統中各個路由器之間的選路協議。這種協議我們稱之爲內部網關協議I G P(Interior Gateway Protocol)或域內選路協議(intradomain routing protocol)。最常用的I G P是選路信息協議R I P。一種新的I G P是開放最短路徑優先O S P F(Open Shortest Path First)協議。它意在取代R I P。外部網關協議E G P(Exterier Gateway Protocol)或域內選路協議的分隔選路協議用於不同自治系統之間的路由器。

RIP報文包含中在UDP數據報中。

跳數的最大值是1 5,這意味着R I P只能用在主機間最大跳數值爲1 5的A S內。度量爲1 6表示到無路由到達該I P地址。


11 UDP:用戶數據報協議

U D P是一個簡單的面向數據報的運輸層協議:進程的每個輸出操作都正好產生一個U D P數據報,並組裝成一份待發送的I P數據報。

U D P長度字段指的是U D P首部和U D P數據的字節長度。該字段的最小值爲8字節(發送一份0字節的U D P數據報是O K)。這個U D P長度是有冗餘的。I P數據報長度指的是數據報全長(圖3 - 1),因此U D P數據報長度是全長減去I P首部的長度。

U D P檢驗和覆蓋U D P首部和U D P數據。回想I P首部的檢驗和,它只覆蓋I P的首部—並不覆蓋I P數據報中的任何數據。U D P和T C P在首部中都有覆蓋它們首部和數據的檢驗和。U D P的檢驗和是可選的,而T C P的檢驗和是必需的。

其次, U D P數據報和T C P段都包含一個1 2字節長的僞首部,它是爲了計算檢驗和而設置的。僞首部包含I P首部一些字段。其目的是讓U D P兩次檢查數據是否已經正確到達目的地。

如果發送端沒有計算檢驗和而接收端檢測到檢驗和有差錯,那麼U D P數據報就要被悄悄地丟棄。不產生任何差錯報文(當I P層檢測到I P首部檢驗和有差錯時也這樣做)。

把一份I P數據報分片以後,只有到達目的地才進行重新組裝。重新組裝由目的端的I P層來完成,其目的是使分片和重新組裝過程對運輸層( T C P和U D P)是透明的,除了某些可能的越級操作外。已經分片過的數據報有可能會再次進行分片(可能不止一次)。I P首部中包含的數據爲分片和重新組裝提供了足夠的信息。

對於發送端發送的每份I P數據報來說,其標識字段都包含一個唯一值。該值在數據報分片時被複制到每個片中(我們現在已經看到這個字段的用途)。標誌字段用其中一個比特來表示“更多的片”。除了最後一片外,其他每個組成數據報的片都要把該比特置1。片偏移字段指的是該片偏移原始數據報開始處的位置。另外,當數據報被分片後,每個片的總長度值要改爲該片的長度值。

即使只丟失一片數據也要重傳整個數據報。使用U D P很容易導致I P分片。

IP在分片時,除最後一片外,其他每一片中的數據部分(除I P首部外的其餘部分)必須是8字節的整數倍。

另外需要解釋幾個術語: I P數據報是指I P層端到端的傳輸單元(在分片之前和重新組裝之後),分組是指在I P層和鏈路層之間傳送的數據單元。一個分組可以是一個完整的I P數據報,也可以是I P數據報的一個分片。

發生I C M P不可達差錯的另一種情況是,當路由器收到一份需要分片的數據報,而在I P首部又設置了不分片( D F)的標誌比特。

儘管大多數的系統不支持路徑M T U發現功能,但可以很容易地修改t r a c e r o u t e程序(第8章),用它來確定路徑M T U。要做的是發送分組,並設置“不分片”標誌比特。發送的第一個分組的長度正好與出口M T U相等,每次收到I C M P“不能分片”差錯時就減小分組的長度。如果路由器發送的I C M P差錯報文是新格式,包含出口的M T U,那麼就用該M T U值來發送,否則就用下一個最小的M T U值來發送。

理論上,I P數據報的最大長度是6 5 5 3 5字節,這是由I P首部(圖3 - 1)1 6比特總長度字段所限制的。去除2 0字節的I P首部和8個字節的U D P首部, U D P數據報中用戶數據的最長長度爲6 5 5 0 7字節。但是,大多數實現所提供的長度比這個最大值小。


12 廣播和多播

Broadcasting and multicasting only apply to UDP, where it makes sense for an application to send a single message to multiple recipients. TCP is a connection-oriented protocol that implies a connection between two hosts (specified by IP addresses) and one process on each host (specified by port numbers).

First, the interface card sees every frame that passes by on the cable and makes a decision whether to receive the frame and deliver it to the device driver.Normally the interface card receives only those frames whose destination address is either the hardware address of the interface or the broadcast address. Additionally, most interfaces can be placed into a promiscuous mode whereby they receive a copy of every frame.Today most interfaces can also be configured to receive frames whose destination address is a multicast address, or some subset of multicast addresses.

廣播的硬件地址是ff:ff:ff:ff:ff:ff!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

If the interface card receives the frame, it is passed to the device driver. (One reason the interface card might discard the frame is if the Ethernet checksum is incorrect.) Additional filtering is performed by the device driver. First, the frame type must specify a protocol that is supported (IP, ARP, etc.). Second, additional multicast filtering may be performed, to check whether the host belongs to the addressed multicast group.

The device driver then passes the frame to the next layer, such as IP, if the frame type specifies an IP datagram. IP performs more filtering, based on the source and destination IP addresses, and passes the datagram up to the next layer (such as TCP or UDP) if all is well.

Each time UDP receives a datagram from IP, it performs filtering based on the destination port number, and sometimes the source port number too. If no process is currently using the destination port number, the datagram is discarded and an ICMP port unreachable message is normally generated. (TCP performs similar filtering based on its port numbers.) If the UDP datagram has a checksum error, UDP silently discards it. 

目前,大多數的網卡經過配置都能接收目的地址爲多播地址或某些子網多播地址的幀。對於以太網,當地址中最高字節的最低位設置爲1時表示該地址是一個多播地址,用十六進制可表示爲0 1 : 0 0 : 0 0 : 0 0 : 0 0 : 0 0(以太網廣播地址ff : ff : ff : ff : ff : ff可看作是以太網多播地址的特例)。

在任何情況下,路由器都不轉發目的地址爲受限的廣播地址的數據報,這樣的數據報僅出現在本地網絡中。

一個路由器必須轉發指向網絡的廣播,但它也必須有一個不進行轉發的選擇。

爲了指明一個多播地址,任何一個以太網地址的首字節必須是0 1,這意味着與I P多播相對應的以太網地址範圍從0 1 : 0 0 : 5 e : 0 0 : 0 0 : 0 0到0 1 : 0 0 : 5 e : 7 f : ff : ff。這種地址分配將使以太網多播地址中的2 3 b i t與I P多播組號對應起來,通過將多播組號中的低位2 3 b i t映射到以太網地址中的低位2 3 b i t實現。由於多播組號中的最高5 bit在映射過程中被忽略,因此每個以太網多播地址對應的多播組是不唯一的。3 2 個不同的多播組號被映射爲一個以太網地址。

單個物理網絡的多播是簡單的。多播進程將目的I P地址指明爲多播地址,設備驅動程序將它轉換爲相應的以太網地址,然後把數據發送出去。這些接收進程必須通知它們的I P層,它們想接收的發往給定多播地址的數據報,並且設備驅動程序必須能夠接收這些多播幀。這個過程就是“加入一個多播組”(使用“接收進程”複數形式的原因在於對一確定的多播信息,在同一主機或多個主機上存在多個接收者,這也是爲什麼要首先使用多播的原因)。當一個主機收到多播數據報時,它必須向屬於那個多播組的每個進程均傳送一個複製。這和單個進程收到單播U D P數據報的U D P不同。使用多播,一個主機上可能存在多個屬於同一多播組的進程。


14 DNS:域名系統

域名系統( D N S)是一種用於T C P / I P應用程序的分佈式數據庫,它提供主機名字和I P地址之間的轉換及有關電子郵件的選路信息。這裏提到的分佈式是指在I n t e r n e t上的單個站點不能擁有所有的信息。每個站點(如大學中的系、校園、公司或公司中的部門)保留它自己的信息數據庫,並運行一個服務器程序供I n t e r n e t上的其他系統(客戶程序)查詢。D N S提供了允許服務器和客戶程序相互通信的協議。

以點“ .”結尾的域名稱爲絕對域名或完全合格的域名F Q D N(Full Qualified Domain N a m e),例如s u n . t u c . n o a o . e d u .。如果一個域名不以點結尾,則認爲該域名是不完全的。

一旦一個區域的授權機構被委派後,由它負責向該區域提供多個名字服務器。當一個新系統加入到一個區域中時,該區域的D N S管理者爲該新系統申請一個域名和一個I P地址,並將它們加到名字服務器的數據庫中。這就是授權機構存在的必要性。

一個名字服務器負責一個或多個區域。一個區域的管理者必須爲該區域提供一個主名字服務器和至少一個輔助名字服務器。主、輔名字服務器必須是獨立和冗餘的,以便當某個名字服務器發生故障時不會影響該區域的名字服務。

一個獨立管理的D N S子樹稱爲一個區域( z o n e )。一個常見的區域是一個二級域,如n o a o . e d u。許多二級域將它們的區域劃分成更小的區域。例如,大學可能根據不同的系來劃分區域,公司可能根據不同的部門來劃分區域。

當一個名字服務器沒有請求的信息時,它將如何處理?它必須與其他的名字服務器聯繫。(這正是D N S的分佈特性)。然而,並不是每個名字服務器都知道如何同其他名字服務器聯繫。相反,每個名字服務器必須知道如何同根的名字服務器聯繫。1 9 9 3年4月時有8個根名字服務器,所有的主名字服務器都必須知道根服務器的I P地址(這些I P地址在主名字服務器的配置文件中,主服務器必須知道根服務器的I P地址,而不是它們的域名)。根服務器則知道所有二級域中的每個授權名字服務器的名字和位置(即I P地址)。這意味着這樣一個反覆的過程:正在處理請求的名字服務器與根服務器聯繫,根服務器告訴它與另一個名字服務器聯繫。

當名字解析器發出一個查詢請求,並且返回響應中的T C(刪減標誌)比特被設置爲1時,它就意味着響應的長度超過了5 1 2個字節,而僅返回前5 1 2個字節。在遇到這種情況時,名字解析器通常使用T C P重發原來的查詢請求,它將允許返回的響應超過5 1 2個字節(回想在11 . 1 0節討論的U D P數據報的最大長度)。既然T C P能將用戶的數據流分爲一些報文段,它就能用多個報文段來傳送任意長度的用戶數據。

此外,當一個域的輔助名字服務器在啓動時,將從該域的主名字服務器執行區域傳送。我們也說過輔助服務器將定時(通常是3小時)向主服務器進行查詢以便了解主服務器數據是否發生變動。如果有變動,將執行一次區域傳送。區域傳送將使用T C P,因爲這裏傳送的數據遠比一個查詢或響應多得多。


17 TCP:傳輸控制協議

T C P將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯, T C P將丟棄這個報文段和不確認收到此報文段(希望發端超時並重發)。

既然每個傳輸的字節都被計數,確認序號包含發送確認的一端所期望收到的下一個序號。因此,確認序號應當是上次已成功收到數據字節序號加1。只有A C K標誌(下面介紹)爲1時確認序號字段纔有效。

我們說T C P缺少選擇確認是因爲T C P首部中的確認序號表示發方已成功收到字節,但還不包含確認序號所指的字節。當前還無法對數據流中選定的部分進行確認。例如,如果1~1 0 2 4字節已經成功收到,下一報文段中包含序號從2 0 4 9~3 0 7 2的字節,收端並不能確認這個新的報文段。它所能做的就是發回一個確認序號爲1 0 2 5的A C K。它也無法對一個報文段進行否認。例如,如果收到包含1 0 2 5~2 0 4 8字節的報文段,但它的檢驗和錯, T C P接收端所能做的就是發回一個確認序號爲1 0 2 5的A C K。

T C P報文段中的數據部分是可選的。我們將在1 8章中看到在一個連接建立和一個連接終止時,雙方交換的報文段僅有T C P首部。如果一方沒有數據要發送,也使用沒有任何數據的首部來確認收到的數據。在處理超時的許多情況中,也會發送不帶任何數據的報文段。


18 TCP連接的建立與終止

MSS是選項數據,只有在SYN位設置的時候纔會有,否則TCP head是不包括MSS。

最大報文段長度( M S S)表示T C P傳往另一端的最大塊數據的長度。當一個連接建立時,連接的雙方都要通告各自的M S S。

當建立一個連接時,每一方都有用於通告它期望接收的M S S選項(M S S選項只能出現在S Y N報文段中)。

一般說來,如果沒有分段發生, M S S還是越大越好(這也並不總是正確,參見圖2 4 - 3和圖2 4 - 4中的例子)。報文段越大允許每個報文段傳送的數據就越多,相對I P和T C P首部有更高的網絡利用率。當T C P發送一個S Y N時,或者是因爲一個本地應用進程想發起一個連接,或者是因爲另一端的主機收到了一個連接請求,它能將M S S值設置爲外出接口上的M T U長度減去固定的I P首部和T C P首部長度。對於一個以太網, M S S值可達1 4 6 0字節。使用IEEE 802.3的封裝(參見2 . 2節),它的M S S可達1 4 5 2字節。

T I M E WA I T狀態也稱爲2 M S L等待狀態。每個具體T C P實現必須選擇一個報文段最大生存時間M S L(Maximum Segment Lifetime)。它是任何報文段被丟棄前在網絡內的最長時間。

對一個具體實現所給定的M S L值,處理的原則是:當T C P執行一個主動關閉,併發回最後一個A C K,該連接必須在T I M E WA I T狀態停留的時間爲2倍的M S L。這樣可讓T C P再次發送最後的A C K以防這個A C K丟失(另一端超時並重發最後的F I N)。這種2 M S L等待的另一個結果是這個T C P連接在2 M S L等待期間,定義這個連接的插口(客戶的I P地址和端口號,服務器的I P地址和端口號)不能再被使用。這個連接只能在2 M S L結束後才能再被使用。

對於來自某個連接的較早替身的遲到報文段, 2 M S L等待可防止將它解釋成使用相同插口對的新連接的一部分。但這只有在處於2 M S L等待連接中的主機處於正常工作狀態時纔有效。如果使用處於2 M S L等待端口的主機出現故障,它會在M S L秒內重新啓動,並立即使用故障前仍處於2 M S L的插口對來建立一個新的連接嗎?如果是這樣,在故障前從這個連接發出而遲到的報文段會被錯誤地當作屬於重啓後新連接的報文段。無論如何選擇重啓後新連接的初始序號,都會發生這種情況。爲了防止這種情況,RFC 793指出T C P在重啓動後的M S L秒內不能建立任何連接。這就稱爲平靜時間(quiet time)。

對於U D P,當一個數據報到達目的端口時,該端口沒在使用,它將產生一個I C M P端口不可達的信息。而T C P則使用復位。

一個同時打開的連接需要交換4個報文段,比正常的三次握手多一個。此外,要注意的是我們沒有將任何一端稱爲客戶或服務器,因爲每一端既是客戶又是服務器。

同時關閉與正常關閉使用的段交換數目相同。兩端都同時進入TIME_WAIT狀態。

另外,在三個使用端口2 3的進程中,只有處於L I S T E N的進程能夠接收新的連接請求。處於E S TA B L I S H E D的進程將不能接收S Y N報文段,而處於L I S T E N的進程將不能接收數據報文段。


19 TCP的交互數據流

通常T C P在接收到數據時並不立即發送A C K;相反,它推遲發送,以便將A C K與需要沿該方向發送的數據一起發送(有時稱這種現象爲數據捎帶A C K)。絕大多數實現採用的時延爲200 ms,也就是說,T C P將以最大200 ms 的時延等待是否有數據一起發送。

Nagle算法要求一個T C P連接上最多只能有一個未被確認的未完成的小分組,在該分組的確認到達之前不能發送其他的小分組。相反, T C P收集這些少量的分組,並在確認到來時以一個分組的方式發出去。該算法的優越之處在於它是自適應的:確認到達得越快,數據也就發送得越快。


20 TCP的成塊數據流

本章我們將介紹T C P所使用的被稱爲滑動窗口協議的另一種形式的流量控制方法。該協議允許發送方在停止並等待確認前可以連續發送多個分組。由於發送方不必每發一個分組就停下來等待確認,因此該協議可以加速數據的傳輸。

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

發送方使用PUSH標誌通知接收方將所收到的數據全部提交給接收進程。這裏的數據包括與P U S H一起傳送的數據以及接收方T C P已經爲接收進程收到的其他數據。

當服務器的T C P接收到一個設置了P U S H標誌的報文段時,它需要立即將這些數據遞交給服務器進程而不能等待判斷是否還會有額外的數據到達。

然而,目前大多數的A P I沒有嚮應用程序提供通知其T C P設置P U S H標誌的方法。的確,許多實現程序認爲P U S H標誌已經過時,一個好的T C P實現能夠自行決定何時設置這個標誌。如果待發送數據將清空發送緩存,則大多數的源於伯克利的實現能夠自動設置P U S H標誌。

迄今爲止,在本章所有的例子中,發送方一開始便向網絡發送多個報文段,直至達到接收方通告的窗口大小爲止。當發送方和接收方處於同一個局域網時,這種方式是可以的。但是如果在發送方和接收方之間存在多個路由器和速率較慢的鏈路時,就有可能出現一些問題。一些中間路由器必須緩存分組,並有可能耗盡存儲器的空間。

慢啓動爲發送方的T C P增加了另一個窗口:擁塞窗口(congestion window),記爲c w n d。當與另一個網絡的主機建立T C P連接時,擁塞窗口被初始化爲1個報文段(即另一端通告的報文段大小)。每收到一個A C K,擁塞窗口就增加一個報文段( c w n d以字節爲單位,但是慢啓動以報文段大小爲單位進行增加)。發送方取擁塞窗口與通告窗口中的最小值作爲發送上限。擁塞窗口是發送方使用的流量控制,而通告窗口則是接收方使用的流量控制。


21 TCP的超時與重傳

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

首先T C P必須測量在發送一個帶有特別序號的字節和接收到包含該字節的確認之間的RT T。

當一個超時和重傳發生時,在重傳數據的確認最後到達之前,不能更新RT T估計器,因爲我們並不知道A C K對應哪次傳輸(也許第一次傳輸被延遲而並沒有被丟棄,也有可能第一次傳輸的A C K被延遲)。

在發送一個報文段時,如果給定連接的定時器已經被使用,則該報文段不被計時。

源於伯克利的T C P實現對收到的重複A C K進行計數,當收到第3個時,就假定一個報文段已經丟失並重傳自那個序號起的一個報文段。這就是J a c o b s o n的快速重傳算法,該算法通常與他的快速恢復算法一起配合使用。

擁塞避免算法假定由於分組受到損壞引起的丟失是非常少的(遠小於1 %),因此分組丟失就意味着在源主機和目的主機之間的某處網絡上發生了擁塞。有兩種分組丟失的指示:發生超時和接收到重複的確認。

擁塞避免算法和慢啓動算法是兩個目的不同、獨立的算法。但是當擁塞發生時,我們希望降低分組進入網絡的傳輸速率,於是可以調用慢啓動來作到這一點。在實際中這兩個算法通常在一起實現。

擁塞避免算法和慢啓動算法需要對每個連接維持兩個變量:一個擁塞窗口c w n d和一個慢啓動門限s s t h re s h。

擁塞避免算法要求每次收到一個確認時將c w n d增加1 /c w n d。與慢啓動的指數增加比起來,這是一種加性增長(additive increase)。我們希望在一個往返時間內最多爲c w n d增加1個報文段(不管在這個RT T中收到了多少個A C K),然而慢啓動將根據這個往返時間中所收到的確認的個數增加c w n d。

由於我們不知道一個重複的A C K是由一個丟失的報文段引起的,還是由於僅僅出現了幾個報文段的重新排序,因此我們等待少量重複的A C K到來。假如這只是一些報文段的重新排序,則在重新排序的報文段被處理併產生一個新的A C K之前,只可能產生1 ~ 2個重複的A C K。如果一連串收到3個或3個以上的重複A C K,就非常可能是一個報文段丟失了(我們在2 1 . 5節中見到過這種現象)。於是我們就重傳丟失的數據報文段,而無需等待超時定時器溢出。這就是快速重傳算法。接下來執行的不是慢啓動算法而是擁塞避免算法。這就是快速恢復算法。



22 TCP的堅持定時器

如果一個確認丟失了,則雙方就有可能因爲等待對方而使連接終止:接收方等待接收數據(因爲它已經向發送方通告了一個非0的窗口),而發送方在等待允許它繼續發送數據的窗口更新。爲防止這種死鎖情況的發生,發送方使用一個堅持定時器(persist timer)來週期性地向接收方查詢,以便發現窗口是否已增大。這些從發送方發出的報文段稱爲窗口探查( w i n d o w p r o b e )。

在報文段1 3中,服務器確認了前面4個數據報文段,然後通告窗口爲0,從而使客戶停止發送任何其他的數據。這就引起客戶設置其堅持定時器。如果在該定時器時間到時客戶還沒有接收到一個窗口更新,它就探查這個空的窗口以決定窗口更新是否丟失。由於服務器進程處於休眠狀態,所以T C P緩存9 2 1 6字節的數據並等待應用進程讀取。

堅持狀態與第2 1章中介紹的重傳超時之間一個不同的特點就是T C P從不放棄發送窗口探查。這些探查每隔6 0秒發送一次,這個過程將持續到或者窗口被打開,或者應用進程使用的連接被終止。

糊塗窗口綜合症現象可發生在兩端中的任何一端:接收方可以通告一個小的窗口(而不是一直等到有大的窗口時才通告),而發送方也可以發送少量的數據(而不是等待其他的數據以便發送一個大的報文段)。可以在任何一端採取措施避免出現糊塗窗口綜合症的現象。

1) 接收方不通告小窗口。通常的算法是接收方不通告一個比當前窗口大的窗口(可以爲0),除非窗口可以增加一個報文段大小(也就是將要接收的M S S)或者可以增加接收方緩存空間的一半,不論實際有多少。
2) 發送方避免出現糊塗窗口綜合症的措施是隻有以下條件之一滿足時才發送數據: ( a )可以發送一個滿長度的報文段; ( b )可以發送至少是接收方通告窗口大小一半的報文段; ( c )可以發送任何數據並且不希望接收A C K(也就是說,我們沒有還未被確認的數據)或者該連接上不能使用N a g l e算法(見第1 9 . 4節)。

在連接的一方需要發送數據但對方已通告窗口大小爲0時,就需要設置T C P的堅持定時器。發送方使用與第2 1章類似的重傳間隔時間,不斷地探查已關閉的窗口。這個探查過程將一直持續下去。


23 TCP的保活定時器

保活並不是T C P規範中的一部分。

如果一個給定的連接在兩個小時之內沒有任何動作,則服務器就向客戶發送一個探查報文段(我們將在隨後的例子中看到這個探查報文段看起來像什麼)。客戶主機必須處於以下4個狀態之一。
1) 客戶主機依然正常運行,並從服務器可達。客戶的T C P響應正常,而服務器也知道對方是正常工作的。服務器在兩小時以後將保活定時器復位。如果在兩個小時定時器到時間之前有應用程序的通信量通過此連接,則定時器在交換數據後的未來2小時再復位。
2) 客戶主機已經崩潰,並且關閉或者正在重新啓動。在任何一種情況下,客戶的T C P都沒有響應。服務器將不能夠收到對探查的響應,並在7 5秒後超時。服務器總共發送1 0個這樣的探查,每個間隔7 5秒。如果服務器沒有收到一個響應,它就認爲客戶主機已經關閉並終止連接。
3) 客戶主機崩潰並已經重新啓動。這時服務器將收到一個對其保活探查的響應,但是這個響應是一個復位,使得服務器終止這個連接。
4) 客戶主機正常運行,但是從服務器不可達。這與狀態2相同,因爲T C P不能夠區分狀態4與狀態2之間的區別,它所能發現的就是沒有收到探查的響應。

服務器不用關注客戶主機被關閉和重新啓動的情況(這指的是一個操作員的關閉,而不是主機崩潰)。當系統被操作員關閉時,所有的應用進程也被終止(也就是客戶進程),這會使客戶的T C P在連接上發出一個F I N。接收到F I N將使服務器的T C P向服務器進程報告文件結束,使服務器可以檢測到這個情況。
在第1種情況下,服務器的應用程序沒有感覺到保活探查的發生。T C P層負責一切。這個過程對應用程序都是透明的,直至第2、3或4種情況發生。在這三種情況下,服務器應用程序將收到來自它的T C P的差錯報告。



TCP和UDP的接收端如果發現校驗和錯誤,會丟棄該datagram,且不返回任何錯誤報告,TCP也不會發送該數據表的確認信息,希望發送端發生超時並重新發送。

UDP的接收端如果發現端口不存在,會返回一個端口不可到達的ICMP錯誤數據,而TCP會設置RST位,使對方reset。

如果接收方通告窗口爲0,然後沒有發送通告窗口更新,發送方會在堅持定時器的節拍下發送窗口探查,詢問對方窗口是否有變化。

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