手冊tcpip詳解卷2實現(xiàn)_第1頁
手冊tcpip詳解卷2實現(xiàn)_第2頁
手冊tcpip詳解卷2實現(xiàn)_第3頁
手冊tcpip詳解卷2實現(xiàn)_第4頁
手冊tcpip詳解卷2實現(xiàn)_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第24章TCP:傳輸控制協(xié)議24.1引言傳輸控制協(xié)議,即TCP,是一種面向連接的傳輸協(xié)議,為兩端的應用程序提供可靠的端到端的數(shù)據(jù)流傳輸服務。它完全不同于無連接的、提供不可靠的數(shù)據(jù)報傳輸服務的 UDP協(xié)議。在第23章中詳細了UDP的實現(xiàn),有9個函數(shù)、約800行C代碼。要。的TCP實現(xiàn)包括28個函數(shù)、約4500行C代碼,因此,TCP的實現(xiàn)分成7章來這幾章中不包括對TCP概念的介紹,假定讀者已閱讀過卷 1的第17章第24章,熟悉TCP的操作。24.2代碼介紹TCP實現(xiàn)代碼包括7個頭文件,其中定義了大量的 TCP結構和常量和6個C文件,包含TCP函數(shù)的具體實現(xiàn)代碼。文件如圖 24-1所示。文件描述ne

2、tinet/tcp.h netinet/tcp_debug.h netinet/tcp_fsm.h netinet/tcp_seg.h netinet/tcp_timer.h netinet/tcp_var.hnetinet/tcpip.htcphdr結構定義 tcp_debug結構定義 TCP有限狀態(tài)機定義實現(xiàn)TCP序號比較的宏定義TCP定時器定義 tcpcb(控制塊)和tcps TCP+IP首部定義(統(tǒng)計)結構定義netinet/tcp_debug.c netinet/tcp_input.c netinet/tcp_output.c netinet/tcp_subr.c netinet/t

3、cp_etinet/tcp_usrreq.c支持SO_DEBUG協(xié)議端調試(第27.10節(jié))tcp_input及其輔助函數(shù)(第28和第29章)tcp_output及其輔助函數(shù)(第26章)各種TCP子函數(shù)(第27章) TCP定時器處理(第25章) PRU_ 請求處理(第30章)圖24-1TCP各章中將的文件圖24-2描述了各TCP函數(shù)與其他內核函數(shù)之間的關系。帶陰影的橢圓分別表示要討論的9個主要的TCP函數(shù),其中8個出現(xiàn)在protosw結構中(圖24-8),第9個是tcp_output。24.2.1 全局變量圖24-3列出了TCP函數(shù)中用到的全局變量。第24章 TCP:傳輸控制協(xié)議計計637圖2

4、4-2 TCP函數(shù)與其他內核函數(shù)間的關系圖24-3 后續(xù)章節(jié)中將介紹的全局變量24.2.2 統(tǒng)計量全局結構變量tcps在接下來的代碼分析過中保存了各種TCP統(tǒng)計量,圖24-4描述了各統(tǒng)計量的具體含義。,讀者會了解到這些計數(shù)器數(shù)值的變化過程。變量數(shù)據(jù)類型描述tcbtcp_last_ibstruct ibstruct ib *TCPernet P C表B表頭指向最后收到報文段的PCB的指針:“后面一個”高速緩存tcpsstruct tcps TCP統(tǒng)計數(shù)據(jù)(圖24-4)tcp_outflagsu_char輸出標志數(shù)組,索引為連接狀態(tài)(圖24-16)tcp_recvspacetcp_sendspac

5、eu_longu_long端口接收緩存大小默認值(8192字節(jié))端口發(fā)送緩存大小默認值(8192字節(jié))tcp_isstcp_seqTCP發(fā)送初始序號(ISS)tcprexmtthreshACK重復次數(shù)的門限值(3),觸發(fā)快速重傳tcp_mssdflttcp_rttdflt默認MSS值(512字節(jié))沒有數(shù)據(jù)時RTT的默認值(3秒)tcp_do_rfrc1323tcp_nowu_long如果為真(默認值),請求窗口大小和時間戳選項用于RFC 1323時間戳實現(xiàn)的500 ms計數(shù)器tcp_kedletcp_kentvl tcp_maxidle?;睿旱谝淮翁綔y前的空閑時間(2小時)?;睿簾o響應時兩次探

6、測的間隔時間(75秒)保活:探測之后、放棄之前的時間(10分鐘) 每200ms 每500ms 內核mbuf耗盡中斷系統(tǒng)初始化多種系統(tǒng)調用插口接收緩沖區(qū)638計計TCP/IP詳解卷2:實現(xiàn)圖24-4 tcps結構變量中保存的TCP統(tǒng)計量tcps成員描述SNMP使用tcps_accepts tcps_closed tcps_connattempt tcps_conndrops tcps_connects tcps_delack tcps_drops tcps_keepdrops tcps_keepprobe tcps_keeptimeo tcps_pawsdrop tcps_pcbcachemis

7、s tcps_persisttimeo tcps_predack tcps_preddat tcps_rcvackbyte tcps_rcvackpack tcps_rcvacktoomuch tcps_rcvafterclose tcps_rcvbadoff tcps_rcvbadsum tcps_rcvbyte tcps_rcvbyteafterwin tcps_rcvdupack tcps_rcvdupbyte tcps_rcvduppack tcps_rcvoobyte tcps_rcvoopack tcps_rcvpack tcps_rcvpackafterwin tcps_rcvp

8、artdupbyte tcps_rcvpartduppack tcps_rcvshort tcps_rcvtotal tcps_rcvwinprobe tcps_rcvwinupd tcps_rexmttimeo tcps_rttupdated tcps_segstimed tcps_sndacks tcps_sndbyte tcps_sndctrl tcps_sndpack tcps_sndprobe tcps_sndrexmitbyte tcps_sndrexmitpack tcps_sndtotal tcps_sndurg tcps_sndwinup tcps_timeoutdrop打開

9、的連接數(shù)關閉的連接數(shù)(包括意外丟失的連接)試圖建立連接的次數(shù)(調用connect)在連接建立階段失敗的連接次數(shù)(SYN收到之前)主動打開的連接次數(shù)(調用connect成功)延遲發(fā)送的ACK數(shù)意外丟失的連接數(shù)(收到SYN之后)在保活階段丟失的連接數(shù)(己建立或正等待SYN)?;钐綔y指針發(fā)送次數(shù)?;疃〞r器或連接建立定時器超時次數(shù)由于PSWS而丟失的報文段數(shù)PCB高速緩存匹配失敗次數(shù)持續(xù)定時器超時次數(shù)對ACK報文首部 的正確次數(shù)對數(shù)據(jù)報文首部的正確次數(shù)由收到的ACK報文確認的發(fā)送字節(jié)數(shù)收到的ACK報文數(shù)收到的對未發(fā)送數(shù)據(jù)進行確認的ACK報文數(shù)連接關閉后收到的報文數(shù)收到的首部長度無效的報文數(shù)收到的檢驗和

10、錯誤的報文數(shù) 連續(xù)收到的字節(jié)數(shù)在滑動窗口己滿時收到的字節(jié)數(shù)收到的重復ACK報文的次數(shù)在完全重復報文中收到的字節(jié)數(shù)內容完全一致的報文數(shù)收到失序的字節(jié)數(shù)收到失序的報文數(shù)順序接收的報文數(shù)攜帶數(shù)據(jù)超出滑動窗口通告值的報文數(shù)部分內容重復的報文中的重復字節(jié)數(shù) 部分數(shù)據(jù)重復的報文數(shù)長度過短的報文數(shù)收到的報文總數(shù)收到的窗口探測報文數(shù)收到的窗口更 文數(shù)重傳超時次數(shù)RTT估算值更新次數(shù)可用于RTT測算的報文數(shù)發(fā)送的純ACK報文數(shù)(數(shù)據(jù)長度=0)發(fā)送的字節(jié)數(shù)發(fā)送的控制(SYN、FIN、RST)報文數(shù)(數(shù)據(jù)長度=0)發(fā)送的數(shù)據(jù)報文數(shù)(數(shù)據(jù)長度0)發(fā)送的窗口探測次數(shù)(等待定時器強行加入1字節(jié)數(shù)據(jù))重傳的數(shù)據(jù)字節(jié)數(shù)重傳的

11、報文數(shù)發(fā)送的報文總數(shù)只攜帶URG標志的報文數(shù)(數(shù)據(jù)長度=0)只攜帶窗口更新信息的報文數(shù)(數(shù)據(jù)長度=0)由于重傳超時而丟失的連接數(shù)第24章 TCP:傳輸控制協(xié)議計計639在命令行輸入nets-s,系統(tǒng)將輸出當前TCP的統(tǒng)計值。圖24-5的例子顯示了主機連續(xù)運行30天后,各統(tǒng)計計數(shù)器的值。由于某些統(tǒng)計量互相關聯(lián) 一個保存數(shù)據(jù)分組數(shù)目,另一個保存相應的字節(jié)數(shù) 圖中做了一些簡化。例如,表中第二行tcps_snd(pack,byte)實際表示了兩個統(tǒng)計量, tcps_sndpack和tcps_sndbyte。tcps_sndbyte值應為3 722 884 824字節(jié),而不是-22 194 928字節(jié),

12、平均每個數(shù)據(jù)分組有450字節(jié)。類似的, tcps_rcvackbyte值應為3 738 811 552字節(jié),而不是-21 264 360字節(jié)(平均每個數(shù)據(jù)分組565字節(jié))。這些數(shù)據(jù)之所以被錯誤地顯示,是程序中調用prf語句時使用了%d(符號整型),而非%lu(無符號長因為nets整型)。所有統(tǒng)計量均定義為無符號長整型,上面兩個統(tǒng)計量的值己接近無符號長整型的上限(232-1=4 294 967 295)。32位輸出成員圖24-5 TCP統(tǒng)計量樣本640計計TCP/IP詳解 卷2:實現(xiàn)24.2.3 SNMP變量圖2 4 - 6列出了 SNMP TCP 組中定義的 1 4 個S N M P簡單變量,

13、以及與它們相對應的tcps結構中的統(tǒng)計量。前四項的常量值在 Net/3中定義,計數(shù)器tcpCurrEstab用于保存TCP PCB表中ernet PCB的數(shù)目。圖24-7列出了tcpTable,即TCP表(listener table )。圖24-6 tcp 組中的簡單SNMP變量index = .圖24-7 TCP表:tcpTable 中的變量SNMP變量PCB變量描述tcpConnSet_se連接狀態(tài): 1 = CLOSED, 2=LISTEN, 3 = SYN_SENT, 4 = SYN_RCVD, 5 = ESTABLISHED,6 = FIN_WAIT,7 = FIN_WAIT_2,

14、 8 = CLOSE_WAIT, 9 = LAST_ACK,10 = CLOSING, 11 = TIME_WAIT,12 = 刪除TCP控制塊tcpConnLocalAddressinp_laddr本地IP地址tcpConnLocalPortinp_lport本地端tcpConnRemAddressinp_faddr遠端IP地址tcpConnRemPortinp_fport遠端端SNMP變量tcps成員或常量描述tcpRtoAlgorithm4用于計算重傳定時時限的算法:1=其他;2=RTO為固定值;3=MIL-STD-1778附錄B;4=Van Jacobson的算法;tcpRtoMin1

15、000最小重傳定時時限,以毫秒為tcpRtoMax64000最大重傳定時時限,以毫秒為tcpMaxConn-1可支持的最大TCP連接數(shù)(-1表示動態(tài)設置)tcpActiveOpenstcps_connattempt從CLOSED轉換到SYN SENT的次數(shù)tcpPassiveOpenstcps_accepts從LISTEN轉換到SYN RCVD的次數(shù)tcpAttemptFailstcps_conndrops從SYN_SENT或SYN_RCVD轉換到CLOSED的次數(shù)+從SYN_RCVD轉換到LISTEN的次數(shù)tcpEstabResetstcps_drops從ESTABLISHED或CLOSE_

16、WAIT轉換到CLOSED的次數(shù)tcpCurrEstab(見正文)當前位于ESTABLISHED或CLOSE_WAIT狀態(tài)的連接數(shù)tcpInSegstcps_rcvtotal收到的報文總數(shù)tcpOutSegstcps_sndtotal-tcps_sndrexmitpack發(fā)送的報文總數(shù),減去重傳報文數(shù)tcpRetransSegstcps_sndrexmitpack重傳的報文總數(shù)tcpInErrstcps_rcvbadsum + tcps_rcvbadoff +tcps_rcvshort收到的出錯報文總數(shù)tcpOutRsts(未實現(xiàn))RST標志置位的發(fā)送報文數(shù)第24章 TCP:傳輸控制協(xié)議計計6

17、41第一個PCB變量(t_s (圖22-4)。e)來自TCP控制塊(圖24-13),其他四個變量來自ernet PCB24.3TCP 的protosw結構圖24-8列出了TCP protosw結構的成員變量,它定義了TCP協(xié)議與系統(tǒng)內其他協(xié)議間的交互接口。成員變量描述inetsw2pr_type pr_pr_ptotocol pr_flags pr_input pr_output pr_ctlinput pr_ctloutput pr_usrreg pr_init pr_fasttimo pr_slowtimo pr_dra pr_sysctlS O C K _ S T R E A M& i

18、n e tI P P R O T O _ T C P ( 6 )TCP提供字節(jié)流傳輸服務 TCP屬于 ernet協(xié)議族填充IP首部的ip_p字段P R _ C O N N R E Q U I R E D | P R _ W A N T R C V D 插口層標志,協(xié)議處理中忽略t c p _ i n p u t 0t c p _ c t l i n p u tt c p _ c t l o u t p u t t c p _ u s r r e qt c p _ i n i tt c p _ f a s t t i m o t c p _ s l o w t i m oc p _ d r a

19、i n0從IP層接收消息TCP協(xié)議忽略該成員變量處理ICMP錯誤的控制輸入函數(shù)在進在進響應管理請求響應通信請求TCP初始化快超時函數(shù),每200 ms 調用一次慢超時函數(shù),每500 ms 調用一次內核mbuf耗盡時調用TCP協(xié)議忽略該成員變量圖24-8TCP protosw 結構24.4TCP的首部tcphdr結構定義了TCP首部。圖24-9給出了tcphdr結構的定義,圖24-10描述了TCP首部。圖24-9 tcphdr 結構642計計TCP/IP詳解卷2:實現(xiàn)圖24-10TCP首部及可選數(shù)據(jù)大多數(shù)RFC文檔,相關書籍 (包括卷 1 )和接下來要的 TCP實現(xiàn)代碼,都把th_urp稱為“緊急

20、指針(urgent poer) ”。更準確的名稱應該是“緊急數(shù)據(jù)偏移量(urgent offset)”,因為這個字段給出的16 bit無符號整數(shù)值,與th_seg序號字段相加后,得到發(fā)送的緊急數(shù)據(jù)最后一個八位組的 32 bit序號(關于該序號應該是緊急數(shù)據(jù)最后一個字節(jié)的序號,或者是緊急數(shù)據(jù)結束后的第一個字節(jié)的序號,一直存在著爭議。目前的而言,這一點無關緊要 )。圖24-13中,TCP代碼把保存緊急數(shù)據(jù)但就最后一個八位組的 32 bit序號的snd_up正確地稱為“緊急數(shù)據(jù)發(fā)送指針”。如果將TCP首部的16 bit偏移量也稱為“指針”,容易引起誤解。在練習 26.6中, “緊急指針”和“緊急數(shù)據(jù)

21、偏移量”間的區(qū)別。TCP首部中4 bit的首部長度、接著的6 bit的保留字段和6 bit的碼元標志,在C結構中定義為兩個4 bit的比特字段,和緊跟的一個8 bit字節(jié)。為了處理兩個比特字段在 8 bit 字節(jié)中的存放重申了次序,C代碼根據(jù)不同的主機字節(jié)順序使用了 #ifdef語句。還請注意, TCP中稱4 bit的th_off為“首部長度”,而C代碼中稱之為“數(shù)據(jù)偏移量”。兩種名稱都正確,因為它表示 TCP首部的長度,包括可選項,以 32 bit為戶數(shù)據(jù)第一個字節(jié)的偏移量。,也就是指向用th_flags成員變量包括6個碼元標志比特,通過圖24-11中定義的名稱讀寫。Net/3中,TCP首部

22、通常意味著“ IP首部 + TCP首部”。tcp_input處理收到的IP數(shù)據(jù)報和tcp_output構造待發(fā)送的IP數(shù)據(jù)報時都采用了這一構的定義,形式化地描述了組合的IP/TCP首部。圖 24-12中給出了tcpiphdr結3 8 - 5 8圖23-19給出的ipovly結構定義了20字節(jié)長度的IP首部。通過前面章節(jié)的盡管長度相同(20字節(jié)),但這個結構并不是一個真正的IP首部??芍?6位源端16位目的端32位序號20字節(jié)32位確認序號4位保留16位窗口大小首部長度(6位)16位TCP檢驗和16位緊急數(shù)據(jù)偏移量選項(如果有)數(shù)據(jù)(如果有)第24章 TCP:傳輸控制協(xié)議計計643圖24-11

23、 th_flags 值圖24-12 tcpiphdr 結構定義:組合的IP/TCP首部24.5TCP的控制塊在圖22-1中看到,除了標準的ernet PCB外,TCP還有自己的控制塊, tcpcb結構,而UDP則不需要控制塊,它的全部控制信息都已包含在ernet PCB中。TCP控制塊較大,需占用140字節(jié)。從圖22-1中可看到,ernet PCB與TCP控制塊彼此對應,都帶有指方的指針。圖 24-13給出了TCP控制塊的定義。圖24-13 tcpcb 結構:TCP控制塊th_flags描述T H _ A C K T H _ F I N T H _ P U S H T H _ R S T T

24、H _ S Y N T H _ U R G確認序號(th_ack)有效發(fā)送方字節(jié)流結束接收方應該立即將數(shù)據(jù)提交給應用程序連接復位序號同步(建立連接)緊急數(shù)據(jù)偏移量(th_urp)有效644計計TCP/IP詳解卷2:實現(xiàn)圖24-13 (續(xù))第24章 TCP:傳輸控制協(xié)議計計645現(xiàn)在暫不上述成員變量的具體含義,在后續(xù)代碼中遇到時再詳細分析。圖24-14列出了t_flags變量的可選值。t_flags描述T F _ A C K N O WT F _ D E L A C K立即發(fā)送ACK延遲發(fā)送ACK立即發(fā)送用戶數(shù)據(jù),不等待形成最大報文段(不使用TCP選項(永不填充TCP選項字段) FIN已發(fā)送T

25、F _ NA YNagle算法)T F _ N O O P TT F _ S E N T F I NT F _ R C V D _ S C A L E 對端在SYN報文中發(fā)送窗口變化選項時置位T F _ R C V D _ T S T M P 對端在SYN報文中發(fā)送時間戳選項時置位T F _ R E Q _ S C A L ET F _ R E Q _ T S T M P已經(jīng)/將要在SYN報文中請求窗口變化選項已以/將要在SYN中請求時間戳選項圖24-14 t_flags 取值24.6TCP的狀態(tài)變遷圖TCP協(xié)議根據(jù)連接上到達報文的不同類型,采取相應動作,協(xié)議規(guī)程可抽象為圖 24-15所示的有

26、限狀態(tài)變遷圖。讀者在本書的扉頁前也可找到這,以便在閱讀有關TCP的章節(jié)時參考。圖中的各種狀態(tài)變遷組成了 TCP有限狀態(tài)機。盡管TCP協(xié)議允許從LISTEN狀態(tài)直接變遷到SYN_SENT狀態(tài),但使用SOCKET API編程時這種變遷不可實現(xiàn) (調用listen后不可以調用connect)。TCP控制塊的成員變量t_s接的當前狀態(tài),可選值如圖 24-16所示。e保存圖中還定義了tcp_outflags數(shù)組,保存了處于對應連接狀態(tài)時 tcp_output將使用的輸出標志。圖24-16還列出了與符號常量相對應的數(shù)值,因為在代碼中將利用它們之間的數(shù)值關系。例下面兩個宏定義:#define TCPS_HA

27、VERCVDSYN(s) (s)=TCPS_SYN_RECEIVED) #define TCPS_HAVERCVDFIN(s) (s)=TCPS_TIME_WAIT)類似地,連接未建立時,即t_sICMP差錯的方式也不同。e小于TCPS_ESTABLISHED時,tcp_notify處理TCPS_HAVERCVDSYN名是正確的,但TCPS_HAVERCVDFIN則可能引起誤解,因為在 CLOSE_WAIT、CLOSING和LAST_ACK狀態(tài)也會收到FIN。29章中遇到該宏。在第半關閉當進程調用shutdown且第二個參數(shù)設為1時,稱為“半關閉”。TCP發(fā)送FIN,但允許進同一端口上繼續(xù)接收

28、數(shù)據(jù)(卷1的18.5節(jié)中舉例介紹了TCP的半關閉)。例如,盡管圖 24-15中只在ESTABLISHED狀態(tài)標注了“數(shù)據(jù)傳輸”,但如果進程執(zhí)行了 “半關閉”,則連接變遷到FIN_WAIT_1狀態(tài)和其后的FIN_WAIT_2狀態(tài),在這兩個特定狀態(tài)中,進程仍然可以接收數(shù)據(jù)。646計計TCP/IP詳解卷2:實現(xiàn)圖24-15TCP狀態(tài)變遷圖24.7TCP的序號TCP連接上傳輸?shù)拿總€數(shù)據(jù)字節(jié),以及 SYN、FIN等控制報文都被賦予一個 32 bit的序號。 TCP首部的序號字段(圖24-10)填充了報文段第一個數(shù)據(jù)字節(jié)的 32 bit的序號,確認號字段填充起點打開 appl打開send: 第24章 TC

29、P:傳輸控制協(xié)議計計647了發(fā)送方希望接收的下一序號,確認已正確接收了所有序號小于等于確認號減 1的數(shù)據(jù)字節(jié)。換言之,確認號是ACK發(fā)送方等待接收的下一序號。只有當報文首部的 ACK標志置位時,確認序號才有效。讀者將看到,除了在主動打開首次發(fā)送 SYN時(SYN_SENT狀態(tài),參見圖24-16中的tcp_outflags2)或在某些RST報文段中, ACK標志總是被置位的。t_se值描述tcp_outflagsT C P S _ C L O S E D T C P S _ L I S T E NT C P S _ S Y N _ S E N TT C P S _ S Y N _ R E C E

30、 I V E D T C P S _ E S T A B L I S H E D T C P S _ C L O S E _ W A I TT C P S _ F I N _ W A I T _ 1 T C P S _ C L O S I N GT C P S _ L A S T _ A C KT C P S _ F I N _ W A I T _ 2 T C P S _ T I M E _ W A I T012345678910T H _ R S T| T H _ A C K 0T H _ S Y NT H _ S Y N| T H _ A C KT H _ A C K T H _ A C

31、KH _ F I N| T H _ A C K T H _ F I N| T H _ A C K T H _ F I N| T H _ A C KH _ A C KT H _ A C K關閉連接請求(打開)已發(fā)送SYN(主動打開)已發(fā)送并接收SYN;等待ACK連接建立(數(shù)據(jù)傳輸)已收到FIN,等待應用程序關閉已關閉,發(fā)送FIN;等待ACK和F同時關閉;等待ACK收到的FIN已關閉;等待ACK已關閉,等待F主動關閉后2MSL等待狀態(tài)圖24-16 t_se 取值由于TCP連接是全雙工的,每一端都必須為兩個方向上的數(shù)據(jù)流序號。 TCP控制塊中(圖24-13)有13個序號: 8個用于數(shù)據(jù)發(fā)送(發(fā)送序號

32、空間),5個用于數(shù)據(jù)接收(接收序號空間)。圖24-17給出了發(fā)送序號空間中 4個變量間的關系: snd_wnd、snd_una、snd_nxt和snd_max。這個例子列出了數(shù)據(jù)流的第 1第11字節(jié)。圖24-17 發(fā)送序號空間舉例一個有效的ACK序號必須滿足:snd_una 確認序號 = snd_max圖2 4 - 1 7 的例子中,一個有效 A C K的確認號必須是 5 、6或7 。如果確認號小于或等于 snd_una,則是一個重復的ACK。它確認了已確認過的八位組,否則snd_una不會遞增超過那些序號。提供的窗口(由接收方通告)可用窗口無法發(fā)送直發(fā)送尚未確認到窗口移動發(fā)送并已確認能夠發(fā)送

33、最早的未確認下一個發(fā)送序號過的序號最大發(fā)送序號648計計TCP/IP詳解 卷2:實現(xiàn)tcp_output中有多處用到下面的測試,如果正發(fā)送的是重傳數(shù)據(jù),則表達式為真:snd_nxt snd_max圖24-18給出了圖24-17中連接的另一端:接收序號空間,圖中假定還未收到序號為 4、5、 6的報文,標出了三個變量rcv_nxt、rcv_wnd和rcv_adv。圖24-18 接收序號空間舉例如果接收報文段中攜帶的數(shù)據(jù)落在接收窗口內,則該報文段是一個有效報文段。換言之,下面兩個不等式中至少要有一個為真。rcv_nxt = 報文段起始序號 rcv_nxt + rcv_wnd rcv_nxt =報文段

34、終止序號 rcv_nxt + rcv_wnd報文段起始序號就是TCP首部的序號字段, ti_seq。終止序號是序號字段加上 TCP數(shù)據(jù)長度后減1。例如,圖24-19中的TCP報文段,攜帶了圖24-17中發(fā)送的三個字節(jié),序號分別是 4、5和6。圖24-19 TCP報文段在IP數(shù)據(jù)報中傳輸假定IP數(shù)據(jù)報中有8字節(jié)的IP任選項和12字節(jié)的TCP任選項。圖12-20列出了各有關變量的取值。圖24-20 圖24-19中各變量的取值ti_len并非TCP首部的字段,而是在對接收到的首部計算檢驗和及完成驗證之后,根據(jù)圖24-20中的算式得到的結果,到外加的 IP結構中(圖24-12)。圖中最后一個值并不到變

35、量中,而是在需要時直接從其他值中通過計算得到。變量值描述ip_hl ip_len ti_off ti_seq76384IP首部+IP任選項長度,以32 bit 為(=28字節(jié)) IP數(shù)據(jù)報長度,以字節(jié)為(20+8 +20+12+3)TCP首部+TCP任選項長度,以32 bit為(=32字節(jié))用戶數(shù)據(jù)第一個字節(jié)的序號ti_len36TCP數(shù)據(jù)的字節(jié)數(shù): ip_len-(ip_hl4)-(ti_off4)用戶數(shù)據(jù)最后一個字節(jié)的序號: ti_seq+ti_len-163字節(jié)IP數(shù)據(jù)報IP首部IP選項TCP首部TCP選項20字節(jié)820121 1 1接收窗口(向發(fā)送方通告)TCP已確認的序號不允許接收的

36、序號下一個接收序號通告序號最大值加1第24章 TCP:傳輸控制協(xié)議計計6491. 序號取模運算TCP必須處理的一個問題是序號來自有限的 32位取值空間: 04 294 967 295。如果某個TCP連接傳輸?shù)臄?shù)據(jù)量超過232字節(jié),序號從4 294 967 295 回繞到0,將出現(xiàn)重復序號。即使傳輸數(shù)據(jù)量小于232字節(jié),仍可能遇到同樣,因為連接的初始序號并不一定從 0開始。各數(shù)據(jù)流方向上的初始序號可以是 04 294 967 295之間的任何值。這個問題使序號復雜化。例如,序號 可能大于序號。在tcp.h中,TCP序號定義為unsigned lo n:g typedef u_long tcp_s

37、eq;圖24-21定義了4個用于序號比較的宏。圖24-21 TCP序號比較宏2. 舉例序號比較下面這個例子說明了TCP序號的操作方式。假定序號只有 3 bit,07。圖24-22列出了全部 8個序號和相應的二進制補碼 (為求二進制補碼,將二進制碼中的所有 0變?yōu)?,所有1變?yōu)?,最后再加1)。給出補碼形式,是因為a-b =a+(b的補碼)。圖24-22 3 bit序號舉例表中最后三欄分別是 0-x、1-x和2-x。在這三欄中,如果定義計算結果是帶符號整數(shù) (注意圖 2 4 - 2 1 中的四個宏,計算結果全部強制轉換為) ,那么最為 1 表示值小于 0(SEQ_LT宏),最值和四個非負值。為0

38、且值不為0表示大于0 ( SEQ_GT宏)。最后三欄中以橫線分隔開四個負請注意圖24-22中的第四欄(標注“ 0-x”),可看出0小于1、2、3和4(最比特為1),而0大于5、6和7(最比特為0且結果非0)。圖24-23顯示了這種關系。圖24-23 3 bit的TCP序號的比較 0大于這些序號 0小于這些序號 二進制碼二進制補碼650計計TCP/IP詳解 卷2:實現(xiàn)圖24-22中的第五欄(1-x)也存在類似的關系,如圖24-24所示。圖24-24 3 bit的TCP序號的比較圖24-25是上面兩圖的另一種表示形式,使用圓環(huán)強調了序號的回繞現(xiàn)象。圖24-25 圖24-23和圖24-24的另一種表

39、示形式就TCP而言,通過序號比較來確定給定序號是新序號或重傳序號。例如,在圖 24-24的例子中,如果TCP正等待的序號為 1,但到達序號為 6,通過前面介紹的計算可知 6小于1,從而判定這是重傳的數(shù)據(jù),可予以丟棄。但如果到達序號為 5,因為5大于1,TCP判定這是新數(shù)據(jù),予以保存,并繼續(xù)等待序號為 2、3和4的八位組(假定序號為5的數(shù)據(jù)字節(jié)落在接收窗口內)。圖24-26擴展了圖24-25中左邊的圓環(huán),用TCP 32 bit的序號替代了3 bit 的序號。圖24-26 與序號0比較:采用32 bit序號圖24-26右邊的圓環(huán)強調了32 bit序號空間的一半有231個可用數(shù)字。24.8tcp_i

40、nit函數(shù)系統(tǒng)初始化時,1. 設定初始發(fā)送序號init函數(shù)調用TCP的初始化函數(shù): tcp_init (圖24-27)。初始發(fā)送序號(ISS),tcp_iss,被初始化為1。請注意,代碼注釋,這是錯誤的。后面TCP的“平靜時間(quite time)”時,將簡單介紹這一選擇的原因。請讀者自行與圖 7-23中IP標識符的初始化做比較,后者使用了當天的時鐘。小于0大于0小于1小于0大于0大于1 1大于這些序號 1小于這些序號 第24章 TCP:傳輸控制協(xié)議計計651圖24-27 tcp_init 函數(shù)2. TCPernet PCB鏈表初始化PCB首部(tcb)的previous指針和next指針都

41、指向自己,這是一個空的雙向鏈表。 tcb PCB的其余成員均初始化為 0(所有未明確初始化的全局變量均設為 0)。事實上,除鏈表外,在該PCB首部中只用了一個字段inp_lport:下一個分配的TCP臨時端臨時端應為1024,練習22.4的解答中給出了原因。3. 計算最大協(xié)議首部長度。TCP使用的第一個到目前為止, 過的協(xié)議首部的長度最大不超過 40字節(jié),max_protohdr設為40(組合的IP/TCP首部長度,不帶任何可選項 )。圖7-17定義了該變量。如果max_linkhdr (通常為 16)加40后大于放入單個mbuf中帶首部的數(shù)據(jù)報的數(shù)據(jù)長度 (100字節(jié),圖2-7中的MHLEN

42、),內核將告警。MSL和平靜時間的概念TCP協(xié)議要求如果主機,且沒能保存打開 TCP連接上最后使用的序號,則重啟后在一個MSL(2分鐘,平靜時間)內,不能發(fā)送任何TCP報文段。目前,基本沒有 TCP實現(xiàn)能夠在系統(tǒng)或操作員關機時保存這些信息。MSL是最大報文段生存時間(um segment lifetime),指任何報文段被丟棄前在網(wǎng)絡中能夠存在的最大時間。不同的實現(xiàn)可選擇不同的CLOSE_WAIT狀態(tài)等待2個MSL時間(圖24-15)。M S L 。連接主動關閉后,將在RFC 793(1981c) 建議MSL設定為2分鐘,但Net/3實現(xiàn)中MSL設為30秒(圖25-3中定義的常量TCPTV_MSL)。如果報文段

溫馨提示

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

評論

0/150

提交評論