網(wǎng)絡(luò)協(xié)議第三講課件_第1頁(yè)
網(wǎng)絡(luò)協(xié)議第三講課件_第2頁(yè)
網(wǎng)絡(luò)協(xié)議第三講課件_第3頁(yè)
網(wǎng)絡(luò)協(xié)議第三講課件_第4頁(yè)
網(wǎng)絡(luò)協(xié)議第三講課件_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、傳輸層協(xié)議分析第三講 第10章 UDP:用戶數(shù)據(jù)報(bào) 第11章 TCP:數(shù)據(jù)結(jié)構(gòu)和輸入處理 第12章 TCP:有限狀態(tài)機(jī)的實(shí)現(xiàn)第13章 TCP:輸出處理 第14章 TCP:定時(shí)器管理第10章 UDP:用戶數(shù)據(jù)報(bào)10.1 引言 用戶數(shù)據(jù)報(bào)協(xié)議提供應(yīng)用程序之間的無(wú)連接通信。它允許某個(gè)機(jī)器上的一個(gè)程序向其他機(jī)器上的一個(gè)或多個(gè)程序發(fā)送數(shù)據(jù)報(bào)并接收響應(yīng)信息。本章討論UDP的實(shí)現(xiàn)過(guò)程,主要集中講述UDP如何利用協(xié)議端口號(hào)來(lái)識(shí)別通信的端點(diǎn)。它討論了兩種解決協(xié)議端口號(hào)綁定問(wèn)題的方法,并給出其中一種方法的實(shí)現(xiàn)細(xì)節(jié)。最后,本章描述了UDP偽首部,并詳述了計(jì)算UDP校驗(yàn)和的過(guò)程是如何使用偽首部的。10.2 UDP端口

2、和多路分解處理 理論上,使用UDP的通信非常簡(jiǎn)單。協(xié)議標(biāo)準(zhǔn)規(guī)定應(yīng)用程序使用一個(gè)稱為協(xié)議端口號(hào)的抽象模型來(lái)識(shí)別通信的端點(diǎn)。當(dāng)機(jī)器A中的應(yīng)用程序與機(jī)器B中的一個(gè)應(yīng)用程序通信時(shí),這兩個(gè)應(yīng)用程序都必須從自己的本地操作系統(tǒng)中獲取一個(gè)UDP端口號(hào)。兩端在通信時(shí)都必須使用協(xié)議端口號(hào)。使用協(xié)議端口號(hào)(而不是系統(tǒng)提供的標(biāo)識(shí)符,如進(jìn)程、任務(wù)或作業(yè)標(biāo)識(shí)符)的優(yōu)點(diǎn)是保持了協(xié)議與特定系統(tǒng)之間的獨(dú)立性,并允許不同類型的計(jì)算機(jī)系統(tǒng)應(yīng)用程序之間互相通信。 雖然UDP協(xié)議端口號(hào)的設(shè)計(jì)思想看起來(lái)直截了當(dāng),但在實(shí)現(xiàn)時(shí)有兩種基本的方法。兩種方法都與協(xié)議標(biāo)準(zhǔn)一致,但它們?yōu)閼?yīng)用程序提供的接口稍有不同。下一節(jié)將描述客戶和服務(wù)器如何使用UD

3、P,并說(shuō)明了兩種方法是如何互相兼容的。10.2.1 成對(duì)通信使用的端口 如圖所示,有些應(yīng)用程序使用UDP來(lái)進(jìn)行成對(duì)通信。要做到這一點(diǎn),兩個(gè)應(yīng)用程序各自從本地操作系統(tǒng)中獲取UDP端口號(hào),并且他們利用這對(duì)端口號(hào)交換UDP報(bào)文。在這種情況下,應(yīng)用程序和協(xié)議軟件之間的理想的接口,是將具體的地址操作從發(fā)送和接收數(shù)據(jù)報(bào)的操作中分離出來(lái)。這樣,接口允許一個(gè)應(yīng)用程序一次性指定本地的和遠(yuǎn)程的協(xié)議端口號(hào),然后多次發(fā)送和接收數(shù)據(jù)報(bào)。當(dāng)然,在指定另一個(gè)機(jī)器上的協(xié)議端口號(hào)時(shí),應(yīng)用程序必須同時(shí)指定該機(jī)器的IP地址。一旦協(xié)議端口號(hào)被指定,應(yīng)用程序就能發(fā)送和接收任意多的數(shù)據(jù)報(bào)。10.2.2 多對(duì)一通信使用的端口 絕大多數(shù)應(yīng)用

4、程序使用客戶服務(wù)器模式的交互形式,如圖所示。單一的服務(wù)器應(yīng)用程序接收來(lái)自多個(gè)客戶的UDP報(bào)文。當(dāng)服務(wù)器啟動(dòng)時(shí),它不會(huì)指定另一個(gè)機(jī)器上的一個(gè)IP地址或UDP端口,因?yàn)樗仨氃试S任意一個(gè)機(jī)器向其發(fā)送報(bào)文。事實(shí)上,它僅僅指定一個(gè)本地UDP端口號(hào)。由客戶送往服務(wù)器的每個(gè)報(bào)文必須給出客戶的UDP端口號(hào)及服務(wù)器的UDP端口號(hào)。服務(wù)器從輸入的UDP數(shù)據(jù)報(bào)中提取源端口號(hào),并在它發(fā)送應(yīng)答報(bào)文時(shí)將該端口號(hào)作為目的端口號(hào)。當(dāng)然服務(wù)器還必須在UDP數(shù)據(jù)報(bào)到達(dá)時(shí)獲取客戶的IP地址,這樣在發(fā)送應(yīng)答報(bào)文時(shí),它也能夠指定IP地址。 10.2.2 多對(duì)一通信使用的端口 因?yàn)榉?wù)器與多個(gè)客戶通信,所以不能設(shè)置一個(gè)永久的IP目的地

5、址或永久的UDP協(xié)議端口號(hào)。事實(shí)上,用于多對(duì)一通信的接口必須允許服務(wù)器在每次發(fā)送數(shù)據(jù)報(bào)時(shí)給出有關(guān)目的站的信息。這樣,與成對(duì)通信使用的理想型接口不同,服務(wù)器使用的理想型接口并沒(méi)有將地址標(biāo)識(shí)和數(shù)據(jù)報(bào)的傳送分開(kāi)。10.2.3 操作模式 為了與成對(duì)通信和多對(duì)一通信方式都兼容,大多數(shù)UDP接口利用參數(shù)來(lái)控制交互的模式。一種典型的采用成對(duì)交互作用的模式是客戶。它允許應(yīng)用程序一次性指定本地和對(duì)方的協(xié)議端口號(hào),然后發(fā)送及接收UDP數(shù)據(jù)報(bào),并且無(wú)需每次都給出端口號(hào)。另一種模式包含了服務(wù)器。它允許服務(wù)器僅僅指定本地端口,然后就可接收來(lái)自任意客戶的數(shù)據(jù)報(bào)。這種系統(tǒng)可能要求一個(gè)應(yīng)用程序明確地說(shuō)明交互模式,也可能從應(yīng)用

6、程序給出的端口綁定中推斷出其模式。10.2.4 多路分解處理中的細(xì)節(jié)問(wèn)題 除了要考慮交互模式之外,UDP實(shí)現(xiàn)方案還要提供對(duì)協(xié)議端口多路分解處理的解釋。這里有兩種可能性: 多路分解時(shí)僅使用目的站的協(xié)議端口號(hào)。 多路分解時(shí)同時(shí)使用源站和目的站的協(xié)議端口號(hào)。 不同的選擇會(huì)對(duì)應(yīng)用程序與協(xié)議軟件之間的交互作用產(chǎn)生微妙的影響。要理解其中詳情,考慮如圖所示的兩種多路分解形式。10.2.4 多路分解處理中的細(xì)節(jié)問(wèn)題10.2.4 多路分解處理中的細(xì)節(jié)問(wèn)題10.2.4 多路分解處理中的細(xì)節(jié)問(wèn)題 在第一種多路分解方式下,系統(tǒng)將發(fā)向特定目的站協(xié)議端口的所有數(shù)據(jù)報(bào)都送到同一隊(duì)列中。在第二種多路分解方式下,系統(tǒng)在為數(shù)據(jù)報(bào)

7、多路分解時(shí)要利用源地址(源站協(xié)議端口號(hào)和源IP地址)。因此在第二種方式下,每個(gè)隊(duì)列中的所有數(shù)據(jù)報(bào)都來(lái)自特定的某個(gè)源站。 這兩種方式各有利弊。例如,在第一種方式下,服務(wù)器發(fā)揮的作用很小,因?yàn)閼?yīng)用程序接收了所有發(fā)往給定協(xié)議端口號(hào)的數(shù)據(jù)報(bào),與它們的生成源無(wú)關(guān)。然而,由于系統(tǒng)對(duì)多個(gè)源站不加區(qū)分,所以系統(tǒng)不能過(guò)濾掉有地址錯(cuò)誤的數(shù)據(jù)報(bào)。只要是一個(gè)以該端口為目的站的數(shù)據(jù)報(bào)到達(dá),程序就會(huì)接收,哪怕它被錯(cuò)誤地發(fā)送了。在第二種方式下,客戶發(fā)揮的作用小,因?yàn)橐粋€(gè)給定的應(yīng)用程序有權(quán)選擇接收另一應(yīng)用程序發(fā)送來(lái)的數(shù)據(jù)報(bào)。然而,如果一個(gè)應(yīng)用程序需要與兩個(gè)遠(yuǎn)程應(yīng)用程序同時(shí)通信,它就必須分配兩個(gè)隊(duì)列,每個(gè)遠(yuǎn)程應(yīng)用程序?qū)?yīng)一個(gè)隊(duì)

8、列。再者,系統(tǒng)可能需要提供附加的機(jī)制,以允許一個(gè)程序在兩個(gè)隊(duì)列上等待I/O端口的事件。10.2.4 多路分解處理中的細(xì)節(jié)問(wèn)題 雖然看起來(lái)困難,但還是有可能同時(shí)使用兩種方式的多路分解處理,以同時(shí)適用于客戶和服務(wù)器。在第一種方式下,僅與一個(gè)遠(yuǎn)程應(yīng)用程序通信的客戶必須選擇一個(gè)未被其他任何本地程序使用的本地協(xié)議端口號(hào)。在第二種方式下,服務(wù)器必須使用一個(gè)通配符,如圖10.2所示。被標(biāo)志為ANY的源站代表一個(gè)與任意源匹配的通配符(任意源IP地址的源協(xié)議端口號(hào))。在某一特定時(shí)刻,系統(tǒng)最多允許為某個(gè)目的端口使用一個(gè)通配符:當(dāng)數(shù)據(jù)報(bào)到達(dá)時(shí),該實(shí)現(xiàn)方案在檢查通配符之前,先查看其源站和目的站是否與給出的源站目的站對(duì)

9、相匹配。因此,在例子中,如果一個(gè)目的端口號(hào)為200,源端口號(hào)為397,而源IP地址為的數(shù)據(jù)報(bào)到達(dá),系統(tǒng)將其放入應(yīng)用程序1對(duì)應(yīng)的隊(duì)列中。類似地,系統(tǒng)將目的端口號(hào)為200,源端口號(hào)為40,而源IP地址為6的數(shù)據(jù)報(bào)放入應(yīng)用程序2對(duì)應(yīng)的隊(duì)列中。系統(tǒng)使用通配符機(jī)制與其他目的端口號(hào)為200的數(shù)據(jù)報(bào)相匹配,并將它們放入應(yīng)用程序4對(duì)應(yīng)的隊(duì)列中。10.3 UDP的輸入處理 我們的范例程序使用的多路分解方式是為僅有目的協(xié)議端口號(hào)的輸入數(shù)據(jù)報(bào)選擇一個(gè)隊(duì)列。我們選用這種方式是因?yàn)樗饶苡行У剡M(jìn)行多路分解處理,又允許應(yīng)用程序與多個(gè)遠(yuǎn)程站點(diǎn)同時(shí)通信。 在介紹了UDP使用的數(shù)據(jù)結(jié)構(gòu)的定義之后,我們將敘述軟件如何處理輸入的數(shù)

10、據(jù)報(bào),以及如何發(fā)送外發(fā)數(shù)據(jù)報(bào)。 10.3.1 UDP數(shù)據(jù)結(jié)構(gòu)的說(shuō)明 在文件udp.h中說(shuō)明的結(jié)構(gòu)udp定義了UDP數(shù)據(jù)報(bào)的格式。除了16位的源站和目的站協(xié)議端口號(hào)外,UDP首部還包含了16位的數(shù)據(jù)報(bào)長(zhǎng)度字段和16位的校驗(yàn)和。 除UDP數(shù)據(jù)報(bào)格式的說(shuō)明之外,udp.h中還包含了一些符號(hào)常量,用于為最常用的UDP協(xié)議端口號(hào)賦值。例如,TFTP服務(wù)器總是在第69號(hào)端口上操作、而RIP使用的端口號(hào)為520。10.3.2 傳入數(shù)據(jù)報(bào)隊(duì)列的說(shuō)明 UDP軟件將存儲(chǔ)傳入數(shù)據(jù)報(bào)的數(shù)據(jù)結(jié)構(gòu)劃分為兩部分:第一部分由傳入數(shù)據(jù)報(bào)的隊(duì)列組成,而第二部分包含了UDP用來(lái)選擇隊(duì)列的映像信息。前者是UDP和用于提取傳入數(shù)據(jù)報(bào)的

11、應(yīng)用程序之間接口的一部分。后者是操作系統(tǒng)的一部分UDP軟件利用它來(lái)選擇一個(gè)隊(duì)列,但應(yīng)用程序不能訪問(wèn)此隊(duì)列。文件dgram.h中包含了對(duì)應(yīng)用程序使用的隊(duì)列的定義。 雖然這個(gè)文件中包含的許多細(xì)節(jié)超過(guò)了本章講述的范圍,但有兩個(gè)定義與我們此刻探討的內(nèi)容密切相關(guān)。用來(lái)存儲(chǔ)傳入數(shù)據(jù)報(bào)的基本數(shù)據(jù)結(jié)構(gòu)由一個(gè)數(shù)組dgtab組成,數(shù)組中的元素的類型是dgblk??梢园裠gtab看作是一組隊(duì)列,在dgtab中每個(gè)正在使用中的本地UDP協(xié)議端口對(duì)應(yīng)一個(gè)活動(dòng)的表項(xiàng)。字段dg_lport指定本地UDP協(xié)議端口號(hào),而字段dg_xport定義了以該端口為目的站的數(shù)據(jù)報(bào)所對(duì)應(yīng)的隊(duì)列。字段dg_state說(shuō)明了該表項(xiàng)是正在使用中

12、(DGS_INUSE)還是未分配(DGSFREE)的。10.3.2 傳入數(shù)據(jù)報(bào)隊(duì)列的說(shuō)明 除了為多路分解處理定義的結(jié)構(gòu)之外,dgram.h還定義了在應(yīng)用程序和UDP協(xié)議軟件之間傳輸?shù)臄?shù)據(jù)報(bào)的格式。范例軟件沒(méi)有將UDP數(shù)據(jù)報(bào)傳送給應(yīng)用程序,而是在結(jié)構(gòu)xgram里定義了一個(gè)新格式?;叵胍幌率褂玫亩嗦贩纸馓幚矸绞?,應(yīng)用程序打開(kāi)一個(gè)給定的協(xié)議端口號(hào),并接收發(fā)往該端口的所有數(shù)據(jù)報(bào)。系統(tǒng)以xgram格式向應(yīng)用程序傳送數(shù)據(jù)報(bào),這樣應(yīng)用程序就能夠同時(shí)確定發(fā)送者的IP地址和協(xié)議端口號(hào)。10.3.3 UDP端口號(hào)與隊(duì)列的映射 UDP利用傳入數(shù)據(jù)報(bào)中的目的端口號(hào)來(lái)選取dgtab中正確的表項(xiàng)。它在數(shù)組upqs中查找映

13、射地址。數(shù)組upqs在文件udp.h中說(shuō)明。過(guò)程udp_in(在10.3.6節(jié)給出)將目的站協(xié)議端口號(hào)與upqs數(shù)組的每個(gè)表項(xiàng)中的up_port字段相比較,直到它找到一個(gè)匹配表項(xiàng)為止。然后它利用字段up_xport來(lái)決定是否與用來(lái)將數(shù)據(jù)報(bào)置入隊(duì)列的unix端口一致。 將upqs中的端口映射從dgtab中的隊(duì)列中分離出去似乎有些多余,因?yàn)楫?dāng)前的實(shí)現(xiàn)方案在端口映射時(shí)使用的是線性查找。然而線性查找對(duì)只有少量活動(dòng)UDP端口的系統(tǒng)來(lái)說(shuō)是有效的。具有大量端口的系統(tǒng)應(yīng)使用更有效的查找策略,如散列表。將端口映射時(shí)使用的數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)報(bào)隊(duì)列使用的數(shù)據(jù)結(jié)構(gòu)分開(kāi),就有可能在改變映射算法時(shí)不用改變應(yīng)用程序接口的數(shù)據(jù)結(jié)

14、構(gòu)。它們兩者的分離還使操作系統(tǒng)有可能直接使用UDP,而無(wú)需依賴于應(yīng)用程序這樣的接口。10.3.4 分配空閑隊(duì)列 因?yàn)槲覀兊姆独a對(duì)upqs數(shù)組采用了線性查找法,所以分配一個(gè)表項(xiàng)是十分簡(jiǎn)單明了的 , 過(guò)程upalloc在數(shù)組中搜索,直到它找到一個(gè)當(dāng)前未被使用的表項(xiàng),然后它填寫(xiě)表項(xiàng)中的各個(gè)字段,創(chuàng)建一個(gè)用來(lái)傳入數(shù)據(jù)報(bào)隊(duì)列的Xinu端口,并向調(diào)用者返回此表項(xiàng)在數(shù)組中的索引值。10.3.5 網(wǎng)絡(luò)字節(jié)順序與本機(jī)字節(jié)順序之間的相互轉(zhuǎn)換 有兩個(gè)實(shí)用程序用于處理UDP首部字段在網(wǎng)絡(luò)字節(jié)順序和本機(jī)字節(jié)順序之間的轉(zhuǎn)換。過(guò)程udpnet2h為輸入數(shù)據(jù)報(bào)處理向本機(jī)字節(jié)順序的轉(zhuǎn)換,程序代碼自身有清楚的說(shuō)明。10.3.

15、6 處理一個(gè)己到達(dá)的數(shù)據(jù)報(bào) 當(dāng)有一個(gè)以本機(jī)為目的站的UDP數(shù)據(jù)報(bào)到達(dá)后,偽網(wǎng)絡(luò)接口中的一個(gè)過(guò)程就調(diào)用過(guò)程udp_in,它以參數(shù)的形式傳遞含有輸入分組的緩沖區(qū)地址以及網(wǎng)絡(luò)接口索引,分組通過(guò)該網(wǎng)絡(luò)接口到達(dá)。 udp_in首先查看發(fā)送方是否支持校驗(yàn)和選項(xiàng)。如果有校驗(yàn)和存在,udp_in調(diào)用udpcksum來(lái)驗(yàn)證該校驗(yàn)和。如果分組包含的校驗(yàn)和正確,調(diào)用返回0。如果校驗(yàn)和項(xiàng)不為0,但又不正確,udp_in不再做進(jìn)一步處理,直接丟棄該UDP數(shù)據(jù)報(bào)。udp_in還調(diào)用udpnet2h將所有首部字段轉(zhuǎn)換為本機(jī)字節(jié)順序。 在轉(zhuǎn)換了首部之后,udp_in將數(shù)據(jù)報(bào)多路分解,并搜索一組數(shù)據(jù)報(bào)隊(duì)列(數(shù)組upqs),直到

16、它為傳入數(shù)據(jù)報(bào)的目的UDP端口找到一個(gè)對(duì)應(yīng)的隊(duì)列。如果端口未滿,udp_in調(diào)用psend將數(shù)據(jù)報(bào)置入隊(duì)列,然后調(diào)用send向任何正在等待該數(shù)據(jù)報(bào)的進(jìn)程發(fā)送一個(gè)報(bào)文。如果隊(duì)列已滿,udp_in記錄溢出錯(cuò)誤并丟棄該數(shù)據(jù)報(bào)。 如果udp_in搜索了全部數(shù)據(jù)報(bào)隊(duì)列,卻沒(méi)有找到一個(gè)為傳入數(shù)據(jù)報(bào)中的目的端口而保留的隊(duì)列。則意味著沒(méi)有任何應(yīng)用程序同意接收此端口上的數(shù)據(jù)報(bào)。udp_in必須調(diào)用icmp向生成數(shù)據(jù)報(bào)的源站返回一個(gè)ICMP“目的站不可達(dá)”報(bào)文。10.3.7 UDP校驗(yàn)和的計(jì)算 過(guò)程udpcksum為一個(gè)UDP數(shù)據(jù)報(bào)計(jì)算其校驗(yàn)和。與以前描述的過(guò)程cksum類似,該過(guò)程可用來(lái)生成一個(gè)校驗(yàn)和(通過(guò)將校

17、驗(yàn)和的首部字段置0),或驗(yàn)證一個(gè)現(xiàn)有的校驗(yàn)和。然而,UDP校驗(yàn)和在一個(gè)重要的方面與以前提到的校驗(yàn)和不同: UDP校驗(yàn)和要包括整個(gè)UDP數(shù)據(jù)報(bào)及其偽首都,偽首部中包括IP源地址和目的地址、UDP長(zhǎng)度以及UDP協(xié)議標(biāo)識(shí)符等。 在為一個(gè)外發(fā)數(shù)據(jù)報(bào)計(jì)算校驗(yàn)和的時(shí)候,協(xié)議軟件必須找出在將UDP報(bào)文封裝到一個(gè)IP數(shù)據(jù)報(bào)時(shí)所需要用到的數(shù)值。在驗(yàn)證一個(gè)已到達(dá)的報(bào)文的校驗(yàn)和時(shí),UDP從攜帶該報(bào)文的IP數(shù)據(jù)報(bào)中提取各個(gè)值。在計(jì)算校驗(yàn)和時(shí),將IP源地址和目的地址都包含在內(nèi)的做法提供了某種保護(hù)措施,以免有路由錯(cuò)誤的數(shù)據(jù)報(bào)也能順利通過(guò)。 過(guò)程udpcksum不在內(nèi)存中組裝偽首部;事實(shí)上,它從IP首部中挑選出各個(gè)字段,然

18、后在計(jì)算校驗(yàn)和時(shí)將它們都包括在其中。例如,udpcksum給數(shù)據(jù)報(bào)中的IP源地址字段的地址sptr賦值,并將以該地址打頭的4個(gè)16比特存儲(chǔ)區(qū)中的二進(jìn)制數(shù)相加,這樣就包括了IP源地址和目的地址。10.4 UDP輸出的處理 在應(yīng)用程序能夠使用UDP通信之前,首先需要一個(gè)本地UDP端口號(hào)。使用熟知端口的服務(wù)器要求操作系統(tǒng)指定其中的一個(gè)端口。通常,客戶不需要指定端口,它們可使用任意端口號(hào):然而,由于我們的系統(tǒng)多路分解處理使用了僅有目的端口號(hào)的方式,所以必須為客戶指定一個(gè)由它獨(dú)自使用的端口號(hào)。過(guò)程udpnxtp生成一個(gè)當(dāng)前空閑的UDP端口號(hào): 為了產(chǎn)生一個(gè)空閑的端口號(hào),udpnxtp首先對(duì)全局計(jì)數(shù)器la

19、stport的值加1。然后它循環(huán)經(jīng)過(guò)所有UDP輸入隊(duì)列,查看是否有任何一個(gè)應(yīng)用程序?qū)?yīng)的端口號(hào)與當(dāng)前l(fā)astport的值相同。通常,在循環(huán)過(guò)程中不會(huì)發(fā)現(xiàn)相同的值,這時(shí)udpnxtp向調(diào)用者返回lastport的值。如果它真的發(fā)現(xiàn)了相同的值,則udpnxtp將lastport的值再次加1,并重新開(kāi)始循環(huán)查找。10.4.1 一個(gè)UDP數(shù)據(jù)報(bào)的發(fā)送 當(dāng)應(yīng)用程序生成UDP輸出之后,它將控制權(quán)移交給操作系統(tǒng),并最終調(diào)用過(guò)程udpsend來(lái)發(fā)送UDP數(shù)據(jù)報(bào)。 由于網(wǎng)關(guān)與多個(gè)網(wǎng)絡(luò)連接,因而它們有多個(gè)IP地址。在udpsend計(jì)算UDP校驗(yàn)和之前,它需要知道攜帶報(bào)文的IP數(shù)據(jù)報(bào)的源IP地址到底是其中的哪一個(gè)I

20、P地址。為了找到正確的源IP地址,udpsend調(diào)用過(guò)程rtget,將IP目的地址作為參數(shù)傳遞給rtget。一旦它選擇好了一條路由,udpsend提取網(wǎng)絡(luò)接口號(hào),從該接口上可獲取該數(shù)據(jù)報(bào)的IP源地址。 rtget為IP數(shù)據(jù)報(bào)計(jì)算出源地址之后,udpsend填寫(xiě)UDP首部中剩余未填寫(xiě)的字段,調(diào)用udpcksum來(lái)計(jì)算校驗(yàn)和,并調(diào)用ipsend將最后生成的IP數(shù)據(jù)報(bào)傳送給IP進(jìn)程,以便為其選擇路由和傳輸。10.5 小結(jié) UDP不但提供了對(duì)等程序之間的成對(duì)通信,還提供了客戶與服務(wù)器之間的多對(duì)一通信方式。兩種多路分解處理的基本方式都可支持客戶和服務(wù)器,且每種方式各有利弊。用于多路分解的范例程序代碼僅僅

21、使用了目的站協(xié)議端口號(hào),并且服務(wù)器在其中起的作用很?。簽榱擞兄谥С挚蛻?,系統(tǒng)包括了一個(gè)用于生成唯一的(空閑的)協(xié)議端口號(hào)的過(guò)程。 UDP的輸入和輸出都很簡(jiǎn)單。IP進(jìn)程執(zhí)行UDP輸入過(guò)程,該過(guò)程將數(shù)據(jù)報(bào)多路分解,且將各個(gè)數(shù)據(jù)報(bào)置入與它們目的協(xié)議端口對(duì)應(yīng)的隊(duì)列中。應(yīng)用程序申請(qǐng)用來(lái)傳輸?shù)亩丝?,然后調(diào)用輸出過(guò)程生成并發(fā)送UDP數(shù)據(jù)報(bào)。 UDP的校驗(yàn)和在計(jì)算時(shí)包括了偽首部中的字段,這樣就可驗(yàn)證在攜帶UDP的IP數(shù)據(jù)報(bào)中包含的IP源地址和目的地址都是準(zhǔn)確無(wú)誤的。對(duì)輸入來(lái)說(shuō),UDP可從攜帶UDP報(bào)文的IP輸入數(shù)據(jù)報(bào)中得到它的偽首部各個(gè)字段的值。對(duì)輸出來(lái)說(shuō),偽首部的處理使UDP校驗(yàn)和的計(jì)算復(fù)雜化,因?yàn)閁DP

22、不得不先確定IP將使用什么地址作為該數(shù)據(jù)報(bào)的源地址。第11章 TCP:數(shù)據(jù)結(jié)構(gòu)和輸入處理11.1 引言 TCP在互聯(lián)網(wǎng)協(xié)議族的所有協(xié)議中是最復(fù)雜的。它為兩個(gè)任意處理速率的、使用不可靠IP連接機(jī)制的機(jī)器之間的通信提供了可靠的、具有流量控制的、端到端的數(shù)據(jù)流服務(wù)。像大多數(shù)可靠的傳輸協(xié)議一樣,TCP使用“重傳超時(shí)機(jī)制”以實(shí)現(xiàn)其可靠性。然而,與大多數(shù)傳輸協(xié)議不同,TCP在構(gòu)造時(shí)必須非常仔細(xì),以保證其在數(shù)據(jù)報(bào)被延遲、復(fù)制、丟失、不按順序發(fā)送或在發(fā)送損壞、截?cái)嗟臄?shù)據(jù)時(shí)仍然能夠正確工作。更進(jìn)一步說(shuō),TCP允許正在通信中的機(jī)器在任何時(shí)刻都能夠重新啟動(dòng)或重新建立連接,而不會(huì)引起混亂,它能夠分清哪個(gè)連接正在使用,

23、哪個(gè)連接是新的。11.2 TCP軟件概覽 在第2章中,我們?cè)赥CP實(shí)現(xiàn)方案中使用了三個(gè)進(jìn)程。其中一個(gè)進(jìn)程處理傳入數(shù)據(jù),另一個(gè)管理外發(fā)數(shù)據(jù),第三個(gè)是管理諸如重發(fā)超時(shí)等延遲事件的定時(shí)器。從理論上講,使用各自獨(dú)立的進(jìn)程可以使輸入、輸出以及TCP的事件定時(shí)部分互不影響,并允許獨(dú)立地設(shè)計(jì)每個(gè)進(jìn)程部分。但事實(shí)上,這幾個(gè)進(jìn)程之間關(guān)系密切,相互作用。例如,在將傳入的確認(rèn)與外發(fā)數(shù)據(jù)相比較以看它們是否匹配時(shí),輸入和輸出進(jìn)程必須通力合作;在取消某個(gè)重發(fā)事件對(duì)應(yīng)的定時(shí)器時(shí)也是如此。類似地,當(dāng)輸出進(jìn)程為某個(gè)重發(fā)事件定時(shí)或定時(shí)器觸發(fā)重發(fā)事件時(shí),輸出進(jìn)程又必須與定時(shí)器進(jìn)程合作。11.3 傳輸控制塊 TCP通過(guò)一個(gè)數(shù)據(jù)結(jié)構(gòu)為

24、每個(gè)TCP連接協(xié)調(diào)傳送、接收和重發(fā)動(dòng)作,這個(gè)數(shù)據(jù)結(jié)構(gòu)被所有進(jìn)程共享。該數(shù)據(jù)結(jié)構(gòu)稱作傳輸控制塊或TCB。TCP為每個(gè)活動(dòng)的連接保留一個(gè)TCB。TCB中包含了有關(guān)TCP連接的所有信息,包括連接端點(diǎn)的地址和端口號(hào),當(dāng)前平均往返時(shí)間的估計(jì)值,發(fā)送或接收的數(shù)據(jù),是否需要確認(rèn)或重發(fā),以及一組有關(guān)該連接的使用情況的統(tǒng)計(jì)數(shù)據(jù)。 雖然協(xié)議標(biāo)準(zhǔn)定義了TCB的構(gòu)思,并對(duì)其中的一些內(nèi)容做了建議,但它沒(méi)有硬性規(guī)定TCB的所有細(xì)節(jié)。因此,設(shè)計(jì)者必須為T(mén)CB選擇明確的內(nèi)容。在范例實(shí)現(xiàn)中,信息保存在結(jié)構(gòu)tcb中。在絕大多數(shù)情況下,其中的字段名與協(xié)議標(biāo)準(zhǔn)中使用的名稱一致。11.3 傳輸控制塊 盡管在講解使用TCB各字段的過(guò)程之

25、前,很難完全理解TCB中所有字段的含義,但其中有些字段的含義還是顯而易見(jiàn)的。例如,除了指出該連接當(dāng)前輸入、輸出狀態(tài)的字段(tcb_state和tcb_ostate)之外,tcb結(jié)構(gòu)中還包括如下字段;一個(gè)互斥信號(hào)量(tcb_mutex)、本地和遠(yuǎn)程IP地址(tcb_lip和tcb_rip)、本地和遠(yuǎn)程端口號(hào)(tcb_lport和tcb_rport)以及使用的網(wǎng)絡(luò)接口(tcb_pni)。 當(dāng)然在tcb結(jié)構(gòu)中還包含了發(fā)送報(bào)文段時(shí)需要的信息:接收方當(dāng)前窗口大小(tcb_window),準(zhǔn)備發(fā)送的下一個(gè)報(bào)文段的序號(hào)(tcb_snext),在序列中還未收到確認(rèn)的報(bào)文的最低字節(jié)(tcb_suna),擁塞窗口

26、大小(tcb_cwnd),慢啟動(dòng)閥值(tcb_ssthresh)以及最大報(bào)文段長(zhǎng)度(tcb_smss)。 對(duì)重發(fā)來(lái)說(shuō),在tcb結(jié)構(gòu)中保存已平滑過(guò)的平均往返時(shí)延估值(tcb_srt),往返時(shí)延偏差估值(tcb_rtde),重發(fā)超時(shí)時(shí)間(tcb_rexmt),以及連續(xù)重發(fā)次數(shù)的計(jì)數(shù)器(tcb_rexmtcount)。 11.3 傳輸控制塊 另外,tcb中還有用于接收?qǐng)?bào)文段的字段。除接收緩沖區(qū)的地址(tcb_rcvbuf)外,tcb還包含了以下字段:用于指出有效數(shù)據(jù)的起點(diǎn)的字段(tcb_rbstart),計(jì)算接收緩沖區(qū)中字符數(shù)的計(jì)數(shù)器(rbcount),最大允許報(bào)文段長(zhǎng)度(tcb_rmss)和前一次

27、通告窗口的序號(hào)(tcb_cwin)。我們將在今后的章節(jié)中討論其余的字段。 由于報(bào)文段可能不按順序到達(dá),當(dāng)這些報(bào)文段抵達(dá)時(shí),TCP還必須保存有關(guān)數(shù)據(jù)塊的信息,直至這些數(shù)據(jù)塊能被重組成連續(xù)的數(shù)據(jù)流。TCP將該信息保存在一個(gè)使用tcpfrag結(jié)構(gòu)的鏈表中,在文件tcb.h中定義,用于保存起始序號(hào)以及每個(gè)數(shù)據(jù)塊的長(zhǎng)度。11.4 TCP報(bào)文段格式 結(jié)構(gòu)tcb定義了TCP報(bào)文段的格式。文件tcp.h中不但有對(duì)tcp的說(shuō)明,還有定義了字段tcp_code中各個(gè)比特含義的符號(hào)常量說(shuō)明。 在文件tcp.h中還定義了宏函數(shù)TCP_HLEN,它用于計(jì)算TCP報(bào)文段首部的長(zhǎng)度,以八位組為單位。以32比特字為單位的首部

28、長(zhǎng)度被保存在8比特偏移字段的高位4比特中。為了計(jì)算以字節(jié)為單位的首部長(zhǎng)度,宏TCP_HLEN必須把以32比特宇為單位的長(zhǎng)度值乘以4。要做到這一點(diǎn),它引用整個(gè)偏移字段,用邏輯“與”計(jì)算并提取其中表示長(zhǎng)度的4比持,然后將它們轉(zhuǎn)換成需要的值。11.5 序列空間中的比較 TCP為數(shù)據(jù)流中的每個(gè)八位組設(shè)定一個(gè)整數(shù),稱作“序號(hào)”(或“序列值”)。當(dāng)TCP以報(bào)文段的形式發(fā)送數(shù)據(jù)時(shí),它在每個(gè)報(bào)文段的首都填寫(xiě)該序號(hào)。TCP在接收數(shù)據(jù)時(shí)用序號(hào)來(lái)判斷抵達(dá)的報(bào)文段的順序是否混亂,并將它們重新按序排列成正確的線性順序數(shù)據(jù)流。TCP為每個(gè)連接隨機(jī)地選取起始的第一個(gè)序號(hào),以防止由于分組的延遲或重復(fù)而在其三次握手時(shí)導(dǎo)致混亂。

29、 這一組所有可能的整型序號(hào)被稱為T(mén)CP序列空間。由于TCP報(bào)文段首都的序號(hào)字段具有固定長(zhǎng)度(32比特),因而允許序號(hào)在達(dá)到序列空間的盡頭時(shí),繞回到0重新開(kāi)始。TCP軟件經(jīng)常需要比較兩個(gè)序號(hào),以決定一個(gè)報(bào)文段中的序號(hào)是大于還是小于另一個(gè)報(bào)文段的序號(hào)。如果使用常規(guī)的比較,則原“0”這樣的小數(shù)值永遠(yuǎn)小于其他大數(shù)值,雖然當(dāng)序號(hào)從序列空間的盡頭繞回到“0”時(shí),“0”是跟在最大的序號(hào)后面的。11.5 序列空間中的比較 出乎意料的是,常規(guī)的計(jì)算機(jī)算法可用來(lái)正確地建立兩個(gè)序號(hào)之間的關(guān)系,只要序列空間長(zhǎng)度等于該機(jī)器上整數(shù)值的范圍,并且要求兩個(gè)被比較的值之間的差距不大于整數(shù)空間的一半。在目前的計(jì)算機(jī)和網(wǎng)絡(luò)上,TC

30、P永遠(yuǎn)也不需要比較差距大于最大整數(shù)值一半的兩個(gè)數(shù)值,因?yàn)橛?jì)算機(jī)無(wú)法做到極快速地生成輸出數(shù)據(jù),而導(dǎo)致在數(shù)據(jù)報(bào)超時(shí)之前繞經(jīng)了整個(gè)序列空間。 如果兩個(gè)相差不大的序號(hào)相比較,簡(jiǎn)單的整數(shù)減法就可得到正確的結(jié)果。當(dāng)一個(gè)很小的數(shù)減去一個(gè)很大的數(shù)值時(shí),整數(shù)的下溢處理將正確對(duì)待這種情況。也就是說(shuō),如果a和b是差距不超過(guò)最大有效整數(shù)值一個(gè)的兩個(gè)序號(hào),則其比較結(jié)果如下:-a先于b0a等于b+a后于b11.5 序列空間中的比較 因此我們可以總結(jié)如下: TCP利用整數(shù)減法來(lái)比較兩個(gè)序列值的大小,因?yàn)樗梢约僭O(shè)兩個(gè)序列值之間的差距永遠(yuǎn)也不會(huì)大于序列空間值的一半。在這種情況下,當(dāng)一個(gè)很大的值與一個(gè)很小的值相比較時(shí),整數(shù)計(jì)算

31、時(shí)的下溢仍能產(chǎn)生正確結(jié)果。 文件tcp.h中的宏SEQCMP實(shí)現(xiàn)了序列空間中的比較。為了有助于讀者清楚地區(qū)分常規(guī)性減法操作還是序列空間中的比較操作,TCP程序代碼在做比較操作時(shí)使用SEQCMP。11.6 TCP有限狀態(tài)機(jī) 從理論上講,TCP使用有限狀態(tài)機(jī)制來(lái)控制所有進(jìn)程的交互作用。每個(gè)TCP連接的端點(diǎn)上都具有一份狀態(tài)機(jī)的副本,并利用它來(lái)控制報(bào)文段到達(dá)時(shí)發(fā)生的交互作用。圖11.2所示為T(mén)CP有限狀態(tài)機(jī)以及各狀態(tài)之間的變遷關(guān)系。 從理論上看,有限狀態(tài)機(jī)已經(jīng)完全體現(xiàn)了一臺(tái)機(jī)器上的TCP是如何與另一臺(tái)機(jī)器上的TCP交互作用的。但實(shí)際上,有限狀態(tài)機(jī)并沒(méi)有完整地描述各種交互作用。事實(shí)上,狀態(tài)機(jī)僅描述了TC

32、P的宏觀狀態(tài),而另外一些變量更進(jìn)一步地說(shuō)明了微觀狀態(tài)的細(xì)節(jié)。更重要的是,因?yàn)橛蔂顟B(tài)機(jī)規(guī)定的宏觀狀態(tài)之間的變遷并不能控制輸出或重發(fā)動(dòng)作,所以這一類的事件必須另行處理。我們總結(jié)如下: 有限狀機(jī)規(guī)定TCP在響應(yīng)一個(gè)輸入或用戶命令時(shí),如何在各個(gè)宏觀狀態(tài)之間互相變遷。一個(gè)具體的實(shí)現(xiàn)中還要包括另一個(gè)獨(dú)立機(jī)制、用來(lái)完成各個(gè)微觀狀態(tài)之間的相互變遷,以控制輸出和重發(fā)動(dòng)作。11.7 狀態(tài)變遷舉例 為了理解TCP有限狀態(tài)機(jī)制,讓我們來(lái)看一個(gè)例子,它是用于在客戶和服務(wù)器之間建立連接的三次握手操作。不論是客戶還是服務(wù)器,它們都要為通信創(chuàng)建一個(gè)端點(diǎn),并且都具有一份有限狀態(tài)機(jī)的副本。服務(wù)器首先發(fā)起一個(gè)“被動(dòng)打開(kāi)”的操作,這

33、將導(dǎo)致服務(wù)器的有限狀態(tài)機(jī)進(jìn)入“聽(tīng)”狀態(tài)。服務(wù)器在“聽(tīng)”狀態(tài)中等待,直到有一個(gè)客戶與它聯(lián)絡(luò)。當(dāng)有一個(gè)客戶發(fā)起“主動(dòng)打開(kāi)”操作時(shí),它導(dǎo)致該機(jī)器上的TCP軟件發(fā)送一個(gè)SYN報(bào)文段給服務(wù)器,并進(jìn)入“SYN已發(fā)出”(SYN_SENT)狀態(tài)。 當(dāng)正在“聽(tīng)”狀態(tài)中等待的服務(wù)器接收到SYN報(bào)文段后,它以一個(gè)SYN,外加一個(gè)ACK報(bào)文段作為應(yīng)答,并創(chuàng)建一個(gè)新的TCB,將新的TCB置于“SYN收到“狀態(tài)。當(dāng)SYN加上ACK的報(bào)文段到達(dá)客戶后,客戶的TCP以一個(gè)ACK作為應(yīng)答,并從“SYN已發(fā)出”狀態(tài)中變遷到“已經(jīng)建立”狀態(tài);最后,當(dāng)客戶的ACK報(bào)文段到達(dá)新創(chuàng)建的TCB后,該TCB也進(jìn)入“已經(jīng)建立”狀態(tài),這時(shí)就可以

34、進(jìn)行數(shù)據(jù)傳輸了。11.8 有限狀態(tài)機(jī)的說(shuō)明 文件tcpfsm.h中的內(nèi)容是對(duì)TCP有限狀態(tài)機(jī)中各狀態(tài)的符號(hào)常量的說(shuō)明。11.9 TCB的分配及初始化 在TCP建立一個(gè)連接時(shí),用于實(shí)現(xiàn)TCP有限狀態(tài)機(jī)的過(guò)程必須分配并初始化一個(gè)TCB;要做到這一點(diǎn),它調(diào)用過(guò)程tcballoc. tcballoc搜索數(shù)組tcbtab,直到它找到一個(gè)空閑表項(xiàng)(即,一個(gè)狀態(tài)為T(mén)CPS_FREE的表項(xiàng))。如果有空閑表項(xiàng)存在,tcballoc將狀態(tài)變?yōu)椤瓣P(guān)閉” (CLOSED,連接的初始狀態(tài)),同時(shí)為T(mén)CB生成一個(gè)互斥信號(hào)量,并向調(diào)用者返回新分配表項(xiàng)的地址。調(diào)用返回時(shí)持有tcb_mutex。也就是說(shuō),調(diào)用返回時(shí),已獲取了單

35、獨(dú)訪問(wèn)這個(gè)新TCB的權(quán)力。如果沒(méi)有空閑TCB存在,tcballoc返回一個(gè)SYSERR,指出有差錯(cuò)發(fā)生。11.9.2 釋放一個(gè)TCB 當(dāng)取消一個(gè)連接時(shí),TCP軟件調(diào)用過(guò)程tcbdealloc來(lái)釋放該連接的TCB,并允許它被其他連接再次使用。 因?yàn)橛袃煞N持殊情況的存在,使TCB的釋放稍有些復(fù)雜。如果一個(gè)連接已經(jīng)被使用,那么tcbdealloc必須首先調(diào)用tcbkilltimers刪除任何未完成的定時(shí)事件。然后,它還要?jiǎng)h除發(fā)送和接收信號(hào)量,以及用于存儲(chǔ)傳入和外發(fā)數(shù)據(jù)的緩沖存儲(chǔ)區(qū)。對(duì)一個(gè)服務(wù)器來(lái)說(shuō),tcbdealloc必須刪除傳入的連接請(qǐng)求的隊(duì)列。最后、無(wú)論在哪種情況下,tcbdealloc都必須刪

36、除互斥信號(hào)量。我們將會(huì)在今后的章節(jié)中看到TCP軟件是如何分配并使用信號(hào)量和緩沖區(qū)的。11.10 有限狀態(tài)機(jī)的實(shí)現(xiàn) 設(shè)計(jì)者在實(shí)現(xiàn)TCP有限狀態(tài)機(jī)時(shí)必須選取以下兩種基本方案中的一種:表驅(qū)動(dòng)過(guò)程驅(qū)動(dòng) 單純的表驅(qū)動(dòng)方案利用一個(gè)二維數(shù)組,其中每一行對(duì)應(yīng)一個(gè)狀態(tài),每一列對(duì)應(yīng)一種可能的輸入事件,或引起狀態(tài)變遷的操作。因此每個(gè)表項(xiàng)對(duì)應(yīng)一個(gè)處于某種狀態(tài)下的輸入事件。該表項(xiàng)中包含了被調(diào)用來(lái)處理該事件的過(guò)程的地址,同時(shí)還有狀態(tài)變遷后的整型狀態(tài)值。在TCB中的一個(gè)狀態(tài)字段指明當(dāng)前狀態(tài)。當(dāng)某個(gè)輸入事件發(fā)生后,TCP將其轉(zhuǎn)換到對(duì)應(yīng)的列表中,并利用引起變遷的輸入事件和當(dāng)前狀態(tài)來(lái)選取表中的一個(gè)表項(xiàng)。TCP選擇該表項(xiàng)并調(diào)用一個(gè)

37、過(guò)程,然后更新當(dāng)前狀態(tài)變量值。 過(guò)程驅(qū)動(dòng)方案為每個(gè)輸入狀態(tài)啟動(dòng)一個(gè)過(guò)程。當(dāng)某一事件發(fā)生時(shí),TCP利用當(dāng)前狀態(tài)來(lái)選取一個(gè)適當(dāng)?shù)倪^(guò)程。該過(guò)程處理輸入事件并更新當(dāng)前狀態(tài)變量值。11.10 有限狀態(tài)機(jī)的實(shí)現(xiàn) 在實(shí)現(xiàn)一個(gè)結(jié)構(gòu)整齊、語(yǔ)義簡(jiǎn)單且具有相對(duì)來(lái)說(shuō)較復(fù)雜的變遷圖的有限狀態(tài)機(jī)時(shí),表驅(qū)動(dòng)方案工作得更出色一些。而在實(shí)現(xiàn)一個(gè)變遷狀態(tài)少、但語(yǔ)義復(fù)雜的有限狀態(tài)機(jī)時(shí),過(guò)程驅(qū)動(dòng)方案工作得更出色。我們選擇了后者。 因?yàn)門(mén)CP狀態(tài)機(jī)包合少量的狀態(tài),規(guī)定的狀態(tài)間的變遷也不多;同時(shí)又提供了復(fù)雜的操作,并包括許多處理差錯(cuò)的特殊情況,所以我們的實(shí)現(xiàn)范例中使用過(guò)程驅(qū)動(dòng)方案。 因此在我們的實(shí)現(xiàn)方案中,每個(gè)狀態(tài)對(duì)應(yīng)一個(gè)過(guò)程,如圖11

38、.2所示,并在TCB中有一個(gè)字段指出當(dāng)前狀態(tài)。當(dāng)一個(gè)輸入報(bào)文段到達(dá)時(shí),TCP調(diào)用當(dāng)前狀態(tài)對(duì)應(yīng)的過(guò)程。另外,我們的實(shí)現(xiàn)方案還為每個(gè)本地操作提供一個(gè)對(duì)應(yīng)過(guò)程(例如,服務(wù)器利用一個(gè)獨(dú)立的過(guò)程發(fā)出“被動(dòng)打開(kāi)”的報(bào)文)。11.11 處理一個(gè)輸入報(bào)文段 當(dāng)IP接收到以本機(jī)為目的站的TCP報(bào)文段時(shí),它最終會(huì)調(diào)用tcp_in向TCP傳遞此報(bào)文段。 如程序代碼所示,tcp_in向TCP輸入端口發(fā)送傳入的報(bào)文段。TCP輸入進(jìn)程從該端口中提取報(bào)文段。TCP輸入進(jìn)程執(zhí)行過(guò)程tcpinp。 tcpinp不斷地從輸入端口中提取一個(gè)個(gè)報(bào)文段,然后調(diào)用tcpcksum來(lái)驗(yàn)證其校驗(yàn)和,并調(diào)用tcpnet2h將其首部字段的網(wǎng)絡(luò)字

39、節(jié)順序轉(zhuǎn)換成本地字節(jié)順序。它利用tcpdemux為該報(bào)文段找出正確的TCB(如果不存在這樣的TCB,則調(diào)用tcpreset來(lái)發(fā)送一個(gè)RESET),然后它調(diào)用tcpok驗(yàn)證對(duì)于當(dāng)前窗口該報(bào)文段是否可以接受,如果不能,則調(diào)用tcpackit來(lái)發(fā)送一個(gè)“確認(rèn)報(bào)文”。最后,tcpinp利用tcpopts處理報(bào)文段中的選項(xiàng),并利用數(shù)組tcpswitch為當(dāng)前輸入狀態(tài)選擇一個(gè)對(duì)應(yīng)的過(guò)程。從下一小節(jié)開(kāi)始,我們將看到tcpinp調(diào)用的各個(gè)過(guò)程。11.11.1 將TCP首部轉(zhuǎn)換為本地字節(jié)順序 過(guò)程tcpnet2h將TCP首部中的整數(shù)字段從網(wǎng)絡(luò)標(biāo)準(zhǔn)字節(jié)順序轉(zhuǎn)換為本地機(jī)器字節(jié)順序。11.11.2 計(jì)算TCP的校驗(yàn)和

40、 TCP與UDP的計(jì)算校驗(yàn)和的方法相同。開(kāi)始時(shí),tcpcksum計(jì)算偽首部的校驗(yàn)和,該偽首部中包括了IP源地址和目的地址、報(bào)文段長(zhǎng)度以及IP使用的協(xié)議類型值(在字段ip_proto中的值)。然后它將報(bào)文段看作一組16位的整數(shù),并將它們相加以得到校驗(yàn)和。最后,tcpcksum處理溢出并向調(diào)用者返回校驗(yàn)和的補(bǔ)碼。11.11.3 為報(bào)文段查找對(duì)應(yīng)的TCB 過(guò)程tcpdemux為一個(gè)輸入的報(bào)文段查找正確的TCB;程序代碼順序地搜索數(shù)組tcbtab。對(duì)于那些對(duì)應(yīng)于已建立連接的TCB來(lái)說(shuō),tcpdemux要進(jìn)行四次比較,以檢查連接的兩個(gè)端點(diǎn),除了將報(bào)文段中的源站和目的站協(xié)議端口號(hào)與表項(xiàng)中的兩個(gè)端口號(hào)相比較

41、外,它還要將IP數(shù)據(jù)報(bào)中的源站和目的站IP地址與表項(xiàng)中的兩個(gè)IP地址相比較。然而,由于服務(wù)器僅指定一個(gè)本地IP地址或協(xié)議端口號(hào),因此tcpdemux對(duì)這些表項(xiàng)中的源地址不進(jìn)行比較。這樣,對(duì)處于“聽(tīng)”狀態(tài)中的TCB來(lái)說(shuō),tcpdemux僅比較目的站協(xié)議端口號(hào)。 11.11.3 為報(bào)文段查找對(duì)應(yīng)的TCB 如果某個(gè)輸入報(bào)文段的連接已經(jīng)存在,tcpdemux在獲得互斥信號(hào)量之后為該報(bào)文段返回一個(gè)指針,指向?qū)?yīng)的表項(xiàng)。如果連接不存在,tcpdemux檢查報(bào)文段的類型。對(duì)大多數(shù)報(bào)文段類型來(lái)說(shuō),tcpdemux返回差錯(cuò)碼(“0”)。然而,如果輸入報(bào)文段中含有同步(SYN)請(qǐng)求,并且已經(jīng)有一個(gè)服務(wù)器發(fā)出了“被

42、動(dòng)打開(kāi)”的報(bào)文,tcpdemux為該服務(wù)器返回一個(gè)指針,指向TCB表項(xiàng)。當(dāng)然,如果并沒(méi)有服務(wù)器為這個(gè)特定的目的地址創(chuàng)建TCB,則tcpdemux為該SYN請(qǐng)求返回差錯(cuò)報(bào)文。 為了使搜索的效率更高,tcpdemux一次性搜索所有可能的連接。在搜索過(guò)程中,它查找一個(gè)精確的匹配項(xiàng)(即TCB中的兩端點(diǎn)與輸入報(bào)文段中兩端點(diǎn)都匹配的連接),而且還要記錄下非完全匹配的項(xiàng)(只需目的站匹配的服務(wù)器連接):在搜索完成后,它查看該報(bào)文段是否包含SYN請(qǐng)求。如果是,它返問(wèn)任何可能找到的非完全匹配項(xiàng)。11.11.4 檢查報(bào)文段的有效性 我們已經(jīng)知道tcpinp在為有限狀態(tài)機(jī)變遷狀態(tài)之前,先要調(diào)用函數(shù)tcpok來(lái)檢查報(bào)文

43、段的有效性。tcpok比較輸入的報(bào)文段中的信息和TCB中的信息,以判斷該報(bào)文段中的數(shù)據(jù)是否在接收窗口之內(nèi)。 在“未同步狀態(tài)”(CLOSED、LISTEN和SYNSENT)時(shí),tcpok不拒絕任何報(bào)文段。但對(duì)其他的狀態(tài),它計(jì)算報(bào)文段的長(zhǎng)度。從概念上講,SYN和FIN在序列空間中要占一個(gè)位置,因此無(wú)論是SYN還是FIN的值為1時(shí),tcpok要將該報(bào)文段的長(zhǎng)度值加1。一旦tcpok決定了報(bào)文段的長(zhǎng)度,它計(jì)算接收窗口大小(rwindow)以及窗口內(nèi)可接收的最大序號(hào)(wlast)。如果報(bào)文段中的數(shù)據(jù)位于可接受范圍內(nèi)(即在窗口以下或以內(nèi)),tcpok返回TRUE。即使窗口大小為0,仍會(huì)有一些報(bào)文段被處理。

44、因此,當(dāng)窗口大小為0時(shí),tcpok改變IP首部的長(zhǎng)度值,使該報(bào)文段看上去根本未攜帶數(shù)據(jù)。由于tcpinp已經(jīng)驗(yàn)證了校驗(yàn)和,因此不必再次計(jì)算。11.11.5 為當(dāng)前狀態(tài)選擇一個(gè)過(guò)程 一旦TCB為輸入報(bào)文段找到了TCB,并驗(yàn)證其中的數(shù)據(jù)在已通告的窗口之內(nèi),它利用當(dāng)前連接狀態(tài)(可在ptcb-tcb_state中找到)來(lái)選取處理該數(shù)據(jù)段的過(guò)程。數(shù)組tcpswitch中僅包含了各個(gè)過(guò)程的地址,而且這些過(guò)程與狀態(tài)一一對(duì)應(yīng)。每個(gè)過(guò)程有兩個(gè)入口參數(shù):一個(gè)指向TCB表項(xiàng)的指針以及一個(gè)指向傳入分組的指針。文件tcpswitch.c中包含了對(duì)tcpswitch數(shù)組的定義。11.12 小結(jié) TCP使用三個(gè)獨(dú)立的過(guò)程來(lái)

45、處理輸入、輸出及定時(shí)器功能。這些過(guò)程通過(guò)一個(gè)稱為“傳輸控制塊” (TCB) 的數(shù)據(jù)結(jié)構(gòu)來(lái)相互協(xié)作;TCP為每個(gè)活動(dòng)的連接保留一個(gè)獨(dú)立的TCP。 實(shí)現(xiàn)范例中利用過(guò)程驅(qū)動(dòng)方案實(shí)現(xiàn)了有限狀態(tài)機(jī),其中每個(gè)狀態(tài)對(duì)應(yīng)一個(gè)過(guò)程。本章講述了TCP輸入過(guò)程如何處理一個(gè)輸入的報(bào)文段,它利用連接的端點(diǎn)將該報(bào)文段在許多活動(dòng)的TCB中“多路分解”,并利用一張表來(lái)將其切換到適當(dāng)?shù)臓顟B(tài)過(guò)程。第12章 TCP:有限狀態(tài)機(jī)的實(shí)現(xiàn)12.1 引言 第11章討論了TCP軟件的總體構(gòu)成,其中每個(gè)過(guò)程對(duì)應(yīng)TCP有限狀態(tài)機(jī)中的一個(gè)狀態(tài)。我們也看到TCP輸入進(jìn)程如何將輸入報(bào)文段分配給各個(gè)TCB,如何使用TCB中的狀態(tài)變量來(lái)選取一個(gè)對(duì)應(yīng)于狀態(tài)

46、機(jī)狀態(tài)的過(guò)程。本章將詳述每個(gè)狀態(tài)過(guò)程。12.2 CLOSED狀態(tài)處理 CLOSED狀態(tài)(關(guān)閉狀態(tài))表示TCB已經(jīng)被分配,但還并沒(méi)有開(kāi)始使用。實(shí)際上,分配該TCB的應(yīng)用程序既沒(méi)有完成“主動(dòng)打開(kāi)”操作,也沒(méi)有完成“被動(dòng)打開(kāi)”操作。因此,其結(jié)果是任何輸入報(bào)文段都會(huì)生成一個(gè)TCP復(fù)位報(bào)文。過(guò)程tcpclosed實(shí)現(xiàn)CLOSED狀態(tài)。它調(diào)用輸出過(guò)程tcpreset來(lái)生成并發(fā)送復(fù)位報(bào)文。12.3 從容關(guān)閉 TCP使用修改的三次握手操作來(lái)釋放連接。譬如,連接的一方稱作A方,它通過(guò)發(fā)起“關(guān)閉”操作來(lái)啟動(dòng)拆鏈。A方的TCP發(fā)送一個(gè)FIN報(bào)文段,并轉(zhuǎn)換到FIN-WAIT-1狀態(tài)。另一方稱作B方,當(dāng)B方接收到該FI

47、N之后,回送一個(gè)ACK,并轉(zhuǎn)換到CLOSE-WAIT狀態(tài),等待應(yīng)用程序釋放連接。在A這一方,當(dāng)它接收到ACK后,就導(dǎo)致TCP轉(zhuǎn)換到FINWAIT2狀態(tài)。 當(dāng)B方應(yīng)用程序執(zhí)行“關(guān)閉”操作后,TCP發(fā)送FIN,并轉(zhuǎn)換到LASTACK狀態(tài)。 A方接收到B方發(fā)送的FIN之后,轉(zhuǎn)移到TIMEWAIT狀態(tài),并發(fā)送最后一個(gè)ACK,同時(shí)釋放連接:當(dāng)最后的ACK抵達(dá)B方后,B方也會(huì)釋放連接。后面幾節(jié)將講解處理從容關(guān)閉的過(guò)程。12.4 關(guān)閉后的延遲計(jì)時(shí) 因?yàn)榫W(wǎng)際協(xié)議是盡最大努力交付的傳輸系統(tǒng),所以它的數(shù)據(jù)報(bào)可能會(huì)重復(fù)、延遲或失序傳送:由于TCP允許應(yīng)用程序重復(fù)使用協(xié)議端口號(hào),因此數(shù)據(jù)報(bào)的重復(fù)和延遲,會(huì)給象TCP這

48、一類使用IP來(lái)傳送數(shù)據(jù)報(bào)的協(xié)議帶來(lái)一個(gè)潛在的問(wèn)題。特別是,一個(gè)丟失的確認(rèn)會(huì)導(dǎo)致發(fā)送RESET,并使發(fā)送方誤以為它的最后分組(包括FIN和數(shù)據(jù))未曾發(fā)送。另外,如果TCP允許在連接結(jié)束后立刻重新使用這些端口號(hào),那么在上次連接中生成的一個(gè)FIN請(qǐng)求的副本,可能會(huì)導(dǎo)致使用相同端口號(hào)的下一次連接也被終止。 為了防止復(fù)制的報(bào)文段干擾下一個(gè)連接,TCP并不會(huì)在關(guān)閉連接后立刻刪除TCB。事實(shí)上,它在短時(shí)間內(nèi)對(duì)該TCB不管不問(wèn)。協(xié)議標(biāo)準(zhǔn)規(guī)定TCP在刪除一個(gè)連接的記錄之前,應(yīng)該等待最大報(bào)文段壽命的兩倍時(shí)間長(zhǎng)度。在我們的實(shí)現(xiàn)方案中,過(guò)程tcpwait安排刪除一個(gè)TCB的延遲時(shí)間。與本章中大多數(shù)過(guò)程不同,tcpwa

49、it不對(duì)應(yīng)于任何輸入狀態(tài)。事實(shí)上,其他輸入狀態(tài)的過(guò)程會(huì)調(diào)用它來(lái)為刪除事件定時(shí)。 12.4 關(guān)閉后的延遲計(jì)時(shí) tcpwait利用第14章中描述的定時(shí)器進(jìn)程。它調(diào)用tcpkilltimers刪除任何與該TCB相關(guān)的正在進(jìn)行的事件(例如,重傳事件),同時(shí)tmset會(huì)創(chuàng)建一個(gè)“刪除事件”,并且在TCP_TWOMSL個(gè)單位時(shí)間后,該事件發(fā)生。當(dāng)刪除事件發(fā)生后,它將觸發(fā)定時(shí)進(jìn)程刪除TCB。12.5 TlMEWAIT狀態(tài)處理 TCP成功地完成了從容關(guān)閉后,將導(dǎo)致該連接近入TIMEWAIT狀態(tài)。過(guò)程tcptimerwait實(shí)現(xiàn)TIMEWAIT狀態(tài)的處理。 如果連接的一方收到一個(gè)RESET報(bào)文,則另一方必定己重

50、新初始化了。因此,tcptimerwait釋放該TCB。為防止延遲了的SYN請(qǐng)求再次建立連接,tcptimerwait在SYN報(bào)文段到達(dá)時(shí)也發(fā)送RESET報(bào)文。此時(shí),如果有任何其他的報(bào)文段到達(dá),則可能意味著某個(gè)確認(rèn)被丟失,因此TCP以正常方式響應(yīng)該報(bào)文段。它調(diào)用tcpacked處理確認(rèn)報(bào)文段,且調(diào)用tcpdata來(lái)處理該報(bào)文段中攜帶的數(shù)據(jù);最后,它調(diào)用tcpwait取消舊的刪除事件,并安排新的刪除事件;為每一個(gè)新報(bào)文段都重新啟動(dòng)定時(shí)器的結(jié)果可能會(huì)出乎意料之外。12.5 TlMEWAIT狀態(tài)處理 由于TCP在每個(gè)非SYN報(bào)文段之后都會(huì)重新啟動(dòng)TCB刪除超時(shí)定時(shí)器,因此,只要對(duì)方不斷地發(fā)送報(bào)文段,

51、TCB將永遠(yuǎn)不會(huì)超時(shí)。 在這種情況下,使TCB保持原狀的好處是使TCP能夠正確地處理延遲的報(bào)文。而這種實(shí)現(xiàn)方案也有缺點(diǎn),如果連接的一方總是不斷地發(fā)送報(bào)文段,將導(dǎo)致對(duì)方機(jī)器上的資源被無(wú)限期地占有。12.6 CLOSING狀態(tài)處理 TCP在接收到對(duì)方對(duì)它發(fā)出的FIN所響應(yīng)的FIN報(bào)文之后進(jìn)入CLOSING狀態(tài)。這就是說(shuō)雙方都同意關(guān)閉,且TCP已經(jīng)進(jìn)入CLOSING狀態(tài),等待對(duì)方返送對(duì)其FIN的確認(rèn)。過(guò)程tcpclosing實(shí)現(xiàn)CLOSING狀態(tài)。 如果tcpclosing收到一個(gè)RESET報(bào)文,它將釋放TCB。如果收到的是一個(gè)SYN請(qǐng)求,tcpclosing會(huì)通過(guò)發(fā)送一個(gè)RESET報(bào)文并釋放TCB

52、來(lái)做出響應(yīng)。對(duì)其他的報(bào)文段,tcpclosing會(huì)調(diào)用tcpacked來(lái)處理確認(rèn)。在TCB的代碼字段中,TCPFFIN比特記錄了對(duì)一個(gè)已被發(fā)送的FIN是否有確認(rèn)到達(dá)。當(dāng)用于確認(rèn)該FIN的報(bào)文段到達(dá)后,tcpacked會(huì)將該比特置0。因此,tcpclosing檢查該比持,如果它為0,則導(dǎo)致向TIMEWAIT狀態(tài)的變遷:當(dāng)tcpclosing變遷狀態(tài)時(shí),它將調(diào)用tcpwait刪除任何正在進(jìn)行的事件,并啟動(dòng)刪除TCB的定時(shí)器。12.7 FINWAIT2狀態(tài)處理 通常,當(dāng)連接的一方發(fā)送FIN之后,另一方會(huì)立即對(duì)其加以確認(rèn),并延遲發(fā)送第二個(gè)FIN的時(shí)間。狀態(tài)機(jī)處理狀態(tài)FINWAIT2中的時(shí)延,它由過(guò)程t

53、cpfin2實(shí)現(xiàn)。 如果tcpfin2收到一個(gè)RESET報(bào)文,則調(diào)用tcpsbort來(lái)終止連接并釋放TCB。對(duì)于到達(dá)的SYN報(bào)文,tcpfin2響應(yīng)一個(gè)RESET報(bào)文:如果對(duì)方在報(bào)文段中所攜帶的是數(shù)據(jù)或是一個(gè)FIN,tcpfin2則調(diào)用,tcpacked對(duì)此輸入加以確認(rèn),并調(diào)用tcpdata處理數(shù)據(jù)。 有限狀態(tài)機(jī)規(guī)定,TCP應(yīng)該在收到一個(gè)FIN時(shí),變遷到TIMEWAIT狀態(tài)。然而,應(yīng)該注意到,TCP并不僅僅因?yàn)槭盏揭粋€(gè)FIN比特為1的數(shù)據(jù)段,就會(huì)做出如上所述的狀態(tài)變遷。事實(shí)上,為了能正確地處理不按順序到達(dá)的數(shù)據(jù)報(bào),它要等到整個(gè)數(shù)據(jù)序列(包括FIN)全部接收之后,才能做出決定。也就是:12.7

54、FINWAIT2狀態(tài)處理 由于TCP必須處理失序的數(shù)據(jù)傳送,因而它并不立刻執(zhí)行所有的狀態(tài)變遷。實(shí)際上,它會(huì)延遲由FIN報(bào)文段而引起的狀態(tài)變遷,直到所有的數(shù)據(jù)都被接收,并全部加以確認(rèn)之后。 從實(shí)現(xiàn)的角度來(lái)看,如果TCP接收到了所有數(shù)據(jù)以及FIN,對(duì)tcpdata的調(diào)用將導(dǎo)致TCB中的TCBF-RDONE比持置1。因此,在檢查它是否應(yīng)該變遷到TIMEWAIT狀態(tài)時(shí),tcpfin2會(huì)檢查T(mén)CB中的TCBF-RDONE比特,而不是報(bào)文段中的FIN比特。在將狀態(tài)變遷到TIMEWAIT時(shí),tcpfin2調(diào)用tcpwait刪除定時(shí)器事件,并創(chuàng)立一個(gè)TCB刪除事件。12.8 FINWAlT1 狀態(tài)處理 當(dāng)用戶

55、發(fā)起一個(gè)“關(guān)閉”操作之后,TCP就進(jìn)入FINWAIT1狀態(tài),并導(dǎo)致TCP發(fā)送FIN。對(duì)方可對(duì)該FIN響應(yīng)一個(gè)ACK、或發(fā)送自己的FIN,或兩者兼?zhèn)?。如果只有一個(gè)FIN到達(dá),則說(shuō)明對(duì)方已經(jīng)開(kāi)始釋放連接,因此TCP用ACK響應(yīng),并進(jìn)入CLOSING狀態(tài)。如果只有一個(gè)ACK到達(dá),則TCP進(jìn)入FINWAIT2狀態(tài),以等待FIN的到達(dá);最后,如果既有FIN又有ACK到達(dá),則TCP進(jìn)入TIMEWAIT狀態(tài)。過(guò)程tcpfin1實(shí)現(xiàn)這些狀態(tài)變遷。12.8 FINWAlT1 狀態(tài)處理 如果tcpfinl接收到一個(gè)RESET報(bào)文,則立即終止連接,并且也發(fā)送一個(gè)RESET報(bào)文來(lái)響應(yīng)接收到的SYN。一般說(shuō)來(lái),TCP時(shí)

56、仍然應(yīng)當(dāng)處理正在輸入的數(shù)據(jù),因而它調(diào)用tcpacked處理接收到的確認(rèn),調(diào)用tcpdata處理報(bào)文段中的數(shù)據(jù),并且調(diào)用tcpwindow來(lái)調(diào)整自己的發(fā)送窗口大小。一旦輸入處理完畢,tcpfin1查看是否有必要變遷狀態(tài)。如果TCBF-RDONE比特的值為1且FIN也已到達(dá),那么表示所有發(fā)送序列中,F(xiàn)IN以前的數(shù)據(jù)已經(jīng)全部到達(dá);如果TCP-FIN比特為0,則表示對(duì)剛才發(fā)送的FIN,對(duì)方響應(yīng)的ACK已到達(dá)。tcpfinl利用這兩個(gè)比特來(lái)決定是否應(yīng)該變遷到CLOSING狀態(tài),還是進(jìn)入PIN-WAIT-2或TIME-WAIT狀態(tài)。在進(jìn)入TIME-WAIT狀態(tài)時(shí),它必須調(diào)用tcpwait為一個(gè)TCB刪除事

57、件定時(shí)。當(dāng)外發(fā)的FIN已被確認(rèn)后,tcpfinl釋放信號(hào)量ocsem,使得釋放該連接的應(yīng)用程序能夠完成關(guān)閉操作。如果已有多個(gè)應(yīng)用程序訪問(wèn)該TCB,則必須在最后一個(gè)應(yīng)用程序發(fā)出關(guān)閉操作后,才能刪除該TCB。12.9 CLOSEWAlT狀態(tài)處理 到目前為止,我們已經(jīng)看到了當(dāng)一個(gè)應(yīng)用程序通過(guò)發(fā)起“關(guān)閉”操作來(lái)啟動(dòng)關(guān)閉動(dòng)作時(shí)那些與釋放連接有關(guān)的狀態(tài)是如何變遷的。但是,如果在應(yīng)用程序發(fā)起“關(guān)閉”操作之前,有一個(gè)FIN到達(dá),則TCP進(jìn)入CLOSE-WAIT狀態(tài)。它利用文件結(jié)尾標(biāo)志來(lái)通知應(yīng)用程序,說(shuō)明對(duì)方已經(jīng)釋放連接,并在進(jìn)入LAST-ACK狀態(tài)之前等待應(yīng)用程序發(fā)起“關(guān)閉”操作。 當(dāng)TCP在CLOSEWAI

58、T狀態(tài)中等待時(shí),利用過(guò)程tcpclosewait來(lái)處理輸入的報(bào)文段。 如果到達(dá)的是一個(gè)RESET報(bào)文,tcpclosewait調(diào)用tcpabort終止這個(gè)連接,并刪除該TCB。如果是一個(gè)SYN到達(dá),tcpclosewait生成RESET報(bào)文并終止該連接。最后,它調(diào)用tcpacked來(lái)處理確認(rèn)報(bào)文并調(diào)用tcpwindow來(lái)更新發(fā)送窗口大小。12.10 LASTACK狀態(tài)處理 當(dāng)應(yīng)用程序發(fā)起“關(guān)閉”操作后,TCP從CLOSE-WAIT狀態(tài)變遷到LAST-ACK狀態(tài)。在此期間,TCP會(huì)安排一個(gè)待發(fā)送的FIN報(bào)文,并進(jìn)入LAST-ACK狀態(tài)以等待確認(rèn)。FIN將在發(fā)送完所有剩余數(shù)據(jù)后被發(fā)送,如果接收方已

59、經(jīng)關(guān)閉了自己的窗口,這些數(shù)據(jù)可能被延遲。一旦TCP發(fā)送了FIN,它將繼續(xù)為重發(fā)事件定時(shí)。如果在正常的重發(fā)超時(shí)時(shí)間內(nèi)沒(méi)有確認(rèn)報(bào)文到達(dá),則TCP將重發(fā)該FIN 。過(guò)程tcplastack實(shí)現(xiàn)LASTACK狀態(tài)的處理。 如果一個(gè)RESET到達(dá),tcplastack調(diào)用tcpabort終止該連接。如果一個(gè)SYN到達(dá),它發(fā)送RESET并終止連接。對(duì)于其他情況,tcplastack調(diào)用tcpacked來(lái)處理輸入的確認(rèn),并釋放打開(kāi)關(guān)閉信號(hào)量,以便一旦發(fā)出的FIN被確認(rèn)后應(yīng)用程序能夠完成它們的“關(guān)閉”操作。12.11 ESTABLlSHED狀態(tài)處理 一旦某個(gè)連接被建立,雙方在交換數(shù)據(jù)和確認(rèn)報(bào)文時(shí)都處于ESTA

60、BLlSHED狀態(tài)。TCP調(diào)用過(guò)程tcpestablished來(lái)處理在該狀態(tài)下到達(dá)的任何報(bào)文段。 如果接收到的是一個(gè)RESET,則意味著對(duì)方必定已經(jīng)重啟動(dòng),并且丟失了有關(guān)這條連接的信息。因此,Tcpestablished 調(diào)用tcpabort立即終止連接。如果一個(gè)SYN到達(dá),tcpestablished發(fā)送一個(gè)RESET,并終止該連接,否則,它調(diào)用tcpacked處理輸入的確認(rèn),調(diào)用tcpdata來(lái)檢查FIN比特,從報(bào)文段中提取數(shù)據(jù),并且,如果該報(bào)文段中含有一個(gè)新窗口通告,則調(diào)用tcpwindow來(lái)更新發(fā)送窗口大小。如果一個(gè)FIN到達(dá)且FIN之前的所有數(shù)據(jù)也已被接收,過(guò)程tcpdata的調(diào)用將

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論