-
當(dāng)前位置:首頁 > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
tcp連接管理(TCP連接管理實(shí)驗(yàn)報(bào)告)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于tcp連接管理的問題,以下是小編對(duì)此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com
本文目錄:
一、TCP報(bào)文結(jié)構(gòu)和功能簡析
TCP:傳輸、 控制 、協(xié)議。
TCP與UDP最大卻別就在那個(gè) C 上面,它充分實(shí)現(xiàn)了數(shù)據(jù)傳輸時(shí)各種控制功能??梢赃M(jìn)行丟包 重發(fā)控制 ,還可以對(duì)次序亂掉的數(shù)據(jù)包進(jìn)行 順序控制 ,還能 控制傳輸流量 ,這些是UDP中沒有的。即T C P 提供一種面向連接的、可靠的字節(jié)流服務(wù)。
TCP是一中面向有鏈接的協(xié)議,只有在確認(rèn)對(duì)端存在的時(shí)候,才會(huì)發(fā)送分?jǐn)?shù)據(jù),從而也可以控制通信流量的浪費(fèi)。
什么是可靠的傳輸: 不丟包、不損壞、不亂序、不重復(fù)。
TCP通過 校驗(yàn)和 、 序列號(hào) 、 確認(rèn)應(yīng)答 、 重發(fā)控制 、 連接管理 以及 窗口控制 等機(jī)制來實(shí)現(xiàn)可靠傳輸。
接收端查詢就收數(shù)據(jù)TCP首部中的序號(hào)和數(shù)據(jù)長度。將自己下一步應(yīng)該接受的序列號(hào)作為確認(rèn)應(yīng)答返送回去。就這樣,通過序列號(hào)和確認(rèn)應(yīng)答,TCP實(shí)現(xiàn)可靠傳輸。
一般使用TCP首部用于控制的字段來管理連接。一個(gè)連接的建立和斷開,正常過程中,至少需要來回共7個(gè)包才能完成。
TCP首部的數(shù)據(jù)結(jié)構(gòu)如圖所示:
TCP包首部
為了便于理解,忽略選項(xiàng)部分,固定首部通常為20個(gè)字節(jié),將按作用分類分析。
前4個(gè)字節(jié) 來標(biāo)識(shí)了發(fā)送方的端口號(hào)和接收方的端口號(hào),即該數(shù)據(jù)包由誰發(fā)送,由誰接收。前2個(gè)字節(jié)標(biāo)識(shí)源端口號(hào),緊接著2個(gè)字節(jié)標(biāo)識(shí)目的端口號(hào)。
即發(fā)送方:(11111111,1111111) 2 = (65535) 10 ,除去0~1023.
即接收方:(11111111,1111111) 2 = (65535) 10 ,除去0~1023.
TCP是面向字節(jié)流的。 在一個(gè)TCP連接中傳送的字節(jié)流中的每一個(gè)字節(jié)都按順序編號(hào)。整個(gè)要傳送的字節(jié)流的起始序號(hào)必須在連接建立時(shí)設(shè)置。首部中的序號(hào)字段值則是指的是本報(bào)文段所發(fā)送的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)。長度為4字節(jié),序號(hào)是32bit的無符號(hào)數(shù),序號(hào)到達(dá)2 32 - 1后又從0開始。
ack :確認(rèn)序號(hào), <u style="box-sizing: border-box;">即確認(rèn)字節(jié)的序號(hào)</u> ,更確切地說,是 發(fā)送確認(rèn)的一端 所期望收到的下一個(gè)序號(hào)。
所謂的 發(fā)送確認(rèn)的一端 就是將確認(rèn)信息發(fā)出的一端。比如第二次握手的 S 端就是 發(fā)送確認(rèn)的一端 。
確認(rèn)序號(hào)為上次接收的最后一個(gè)字節(jié)序號(hào)加1.只有確認(rèn)標(biāo)志位( ACK )為1的時(shí)候,確認(rèn)序號(hào)才有效。
也叫首部長度,占4個(gè)bit,它指出TCP報(bào)文段的 數(shù)據(jù) 起始處距離TCP報(bào)文段的起始處有多遠(yuǎn)。
TCP報(bào)文結(jié)構(gòu)
由于首部中還有長度不確定的選項(xiàng)字段,因此數(shù)據(jù)偏移字段是必要的。
“首部長度”是4位二進(jìn)制數(shù),單位是 32位字 ,能表示的最大十進(jìn)制數(shù)字是15。
(1111) 2 =(15) 10 ,即是15個(gè)32位,一個(gè)32位是4個(gè)字節(jié),因此數(shù)據(jù)偏移的最大值是15 4=60個(gè)字節(jié),這也是TCP首部的最大字節(jié)。因?yàn)楣潭ㄊ撞康拇嬖冢瑪?shù)據(jù)偏移的值最小為 20個(gè)字節(jié) ,因此選項(xiàng)長度不能超過 40字節(jié) *(減去20個(gè)字節(jié)的固定首部)。
占6位,保留為今后使用,但目前應(yīng)置為0。
當(dāng)URG=1時(shí),表明緊急指針字段有效。
它告訴系統(tǒng)此報(bào)文段中有緊急數(shù)據(jù),應(yīng)盡快發(fā)送(相當(dāng)于高優(yōu)先級(jí)的數(shù)據(jù)),而不要按原來的排隊(duì)順序來傳送。
例如,已經(jīng)發(fā)送了很長的一個(gè)程序要在遠(yuǎn)地的主機(jī)上運(yùn)行。但后來發(fā)現(xiàn)了一些問題,需要取消該程序的運(yùn)行,因此用戶從鍵盤發(fā)出中斷命令。如果不使用緊急數(shù)據(jù),那么這兩個(gè)字符將存儲(chǔ)在接收TCP的緩存末尾。只有在所有的數(shù)據(jù)被處理完畢后這兩個(gè)字符才被交付接收方的應(yīng)用進(jìn)程。這樣做就浪費(fèi)了很多時(shí)間。
當(dāng)URG置為1時(shí),應(yīng)用進(jìn)程就告訴TCP有緊急數(shù)據(jù)要傳送。于是TCP就把緊急數(shù)據(jù)插入到本報(bào)文段數(shù)據(jù)的最前面,而在緊急數(shù)據(jù)后面的數(shù)據(jù)仍然是普通數(shù)據(jù)。這時(shí)要與首部中 緊急指針 (Urgent Pointer)字段配合使用。
僅當(dāng)ACK = 1時(shí)確認(rèn)號(hào)字段才有效,當(dāng)ACK = 0時(shí)確認(rèn)號(hào)無效。TCP規(guī)定,在連接建立后所有的傳送的報(bào)文段都必須把ACK置為1。
當(dāng)兩個(gè)應(yīng)用進(jìn)程進(jìn)行交互式的通信時(shí),有時(shí)在一端的應(yīng)用進(jìn)程希望在鍵入一個(gè)命令后立即就能收到對(duì)方的響應(yīng)。在這種情況下,TCP就可以使用推送(push)操作。發(fā)送方TCP把PSH置為1,并立即創(chuàng)建一個(gè)報(bào)文段發(fā)送出去。接收方TCP收到PSH=1的報(bào)文段,就盡快地(即“推送”向前)交付接收應(yīng)用進(jìn)程。而不用再等到整個(gè)緩存都填滿了后再向上交付。
當(dāng)RST=1時(shí),表明TCP連接中出現(xiàn)了嚴(yán)重錯(cuò)誤(如由于主機(jī)崩潰或其他原因),必須釋放連接,然后再重新建立傳輸連接。RST置為1還用來拒絕一個(gè)非法的報(bào)文段或拒絕打開一個(gè)連接。
在連接建立時(shí)用來同步序號(hào)。當(dāng) SYN=1 而 ACK=0 時(shí),表明這是一個(gè) 連接請(qǐng)求報(bào)文段 。對(duì)方若同意建立連接,則應(yīng)在響應(yīng)的報(bào)文段中使SYN=1和ACK=1。
因此 SYN=1 就表示這是一個(gè)連接請(qǐng)求或連接接受報(bào)文。
用來釋放一個(gè)連接。當(dāng)FIN=1時(shí),表明此報(bào)文段的發(fā)送發(fā)的數(shù)據(jù)已發(fā)送完畢,并要求釋放運(yùn)輸連接。
占2字節(jié)。窗口值是(0,2 16 -1)之間的整數(shù)。
窗口指的是發(fā)送本報(bào)文段的一方的接受窗口(而不是自己的發(fā)送窗口),窗口大小是給對(duì)方用的。
窗口值告訴對(duì)方:從本報(bào)文段首部中的確認(rèn)號(hào)算起,接收方目前允許對(duì)方一次發(fā)送的數(shù)據(jù)量(以字節(jié)為單位)。
之所以要有這個(gè)限制,是因?yàn)榻邮辗降臄?shù)據(jù)緩存空間是有限的。
總之,窗口值作為接收方讓發(fā)送方設(shè)置其發(fā)送窗口的依據(jù)。
例如,A發(fā)送了一個(gè)報(bào)文段,其確認(rèn)號(hào)是3000,窗口字段是1000.這就是告訴對(duì)方B:“從3000算起,A接收緩存空間還可接受1000個(gè)字節(jié)數(shù)據(jù),字節(jié)序號(hào)是3000-3999”,可以想象到河道的閥門。
總之:窗口字段明確指出了現(xiàn)在允許對(duì)方發(fā)送的數(shù)據(jù)量。窗口值經(jīng)常在動(dòng)態(tài)變化。
占2字節(jié)。檢驗(yàn)和字段檢驗(yàn)的范圍包括首部和數(shù)據(jù)這兩部分。和UDP用戶數(shù)據(jù)報(bào)一樣,在計(jì)算檢驗(yàn)和時(shí),要在TCP報(bào)文段的前面加上12字節(jié)的偽首部。偽首部的格式和UDP用戶數(shù)據(jù)報(bào)的偽首部一樣。但應(yīng)把偽首部第4個(gè)字段中的17改為6(TCP的協(xié)議號(hào)是6);把第5字段中的UDP中的長度改為TCP長度。接收方收到此報(bào)文段后,仍要加上這個(gè)偽首部來計(jì)算檢驗(yàn)和。若使用TPv6,則相應(yīng)的偽首部也要改變。
占2字節(jié)。緊急指針僅在URG=1時(shí)才有意義,它指出本報(bào)文段中的緊急數(shù)據(jù)的字節(jié)數(shù)(緊急數(shù)據(jù)結(jié)束后就是普通數(shù)據(jù)) 。因此,在緊急指針指出了緊急數(shù)據(jù)的末尾在報(bào)文段中的位置。當(dāng)所有緊急數(shù)據(jù)都處理完時(shí),TCP就告訴應(yīng)用程序恢復(fù)到正常操作。值得注意的是,即使窗口為0時(shí)也可以發(fā)送緊急數(shù)據(jù)。
長度可變,最長可達(dá)40個(gè)字節(jié)。當(dāng)沒有使用“選項(xiàng)”時(shí),TCP的首部長度是20字節(jié)。
最大報(bào)文段長度(MSS:Maximum Segment Size)表示TCP傳往另一端的最大塊數(shù)據(jù)的長度。當(dāng)一個(gè)連接建立時(shí),連接的雙方都要通告各自的MSS。
當(dāng)建立一個(gè)連接時(shí),每一方都有用于通告它期望接收的MSS選項(xiàng)(MSS選項(xiàng)只能出現(xiàn)在SYN報(bào)文段中),如果一方不接收來自另一方的MSS值,則MSS就定為默認(rèn)值536字節(jié)(這個(gè)默認(rèn)值允許20字節(jié)的IP首部和20字節(jié)的TCP首部以適合576字節(jié)IP數(shù)據(jù)報(bào)) 。
為什么要規(guī)定一個(gè)最大報(bào)文長度MSS呢?
這并不是考慮接受方的接收緩存可能存放不下TCP報(bào)文段中的數(shù)據(jù)。實(shí)際上,MSS與接收窗口值沒有關(guān)系。
我們知道,TCP報(bào)文段的數(shù)據(jù)部分,至少要加上40字節(jié)的首部( TCP首部20字節(jié) 和 IP首部20字節(jié) ,這里還沒有考慮首部中的可選部分)才能組裝成一個(gè) IP數(shù)據(jù)報(bào) 。
若選擇較小的MSS長度,網(wǎng)絡(luò)的利用率就降低。設(shè)想在極端情況下,當(dāng)TCP報(bào)文段只含有1字節(jié)的數(shù)據(jù)時(shí),在IP層傳輸?shù)臄?shù)據(jù)報(bào)的開銷至少有40字節(jié)(包括TCP報(bào)文段的首部和IP數(shù)據(jù)報(bào)的首部)。這樣,對(duì)網(wǎng)絡(luò)的利用率就不會(huì)超過1/41。到了數(shù)據(jù)鏈路層還要加上一些開銷。但反過來,若TCP報(bào)文段非常長,那么在IP層傳輸時(shí)就有可能要分解成多個(gè)短數(shù)據(jù)報(bào)片。在終點(diǎn)要把收到的各個(gè)短數(shù)據(jù)報(bào)片組成成原來的TCP報(bào)文段,當(dāng)傳輸出錯(cuò)時(shí)還要進(jìn)行重傳,這些也都會(huì)使開銷增大。
因此,MSS應(yīng)盡可能大些,只要在IP層傳輸時(shí)不需要分片就行。
由于IP數(shù)據(jù)報(bào)所經(jīng)歷的路徑是動(dòng)態(tài)變化的,因此在這條路徑上確定的不需要的分片的MSS,如果改走另一條路徑就可能需要進(jìn)行分片。因此最佳的MSS是很難確定的。在連接過程中,雙方都把自己能夠支持的MSS寫入這一字段,以后就按照這個(gè)數(shù)值傳輸數(shù)據(jù),兩個(gè)傳送方向可以有不同的MSS值。若主機(jī)未填寫這一項(xiàng),則MSS的默認(rèn)值是536字節(jié)長。因此,所有在互聯(lián)網(wǎng)上的主機(jī)都應(yīng)該接受的報(bào)文段長度是536+20(固定首部長度)=556字節(jié) 。
后來又增加了幾個(gè)選項(xiàng)如窗口擴(kuò)大選項(xiàng)、時(shí)間戳選項(xiàng)等。
窗口擴(kuò)大選項(xiàng)是為了擴(kuò)大窗口。
我們知道,TCP首部中窗口字段長度是16位,因此最大的窗口大小為64K字節(jié)。雖然這對(duì)早期的網(wǎng)絡(luò)是足夠用的,但對(duì)于包含衛(wèi)星信道的網(wǎng)絡(luò),傳播時(shí)延和寬帶都很大,要獲得高吞吐量需要更大的窗口大小。
窗口擴(kuò)大選項(xiàng)占3字節(jié),其中有一個(gè)字節(jié)表示移位值S。新的窗口值等于TCP首部中的窗口位數(shù)從16增大到(16+S)。移位值允許使用的最大值是14,相當(dāng)于窗口最大值增大到2 (16+14)-1=2 30-1。
窗口擴(kuò)大選項(xiàng)可以在雙方初始建立TCP連接時(shí)進(jìn)行協(xié)商。如果連接的某一端實(shí)現(xiàn)了窗口擴(kuò)大,當(dāng)它不再需要擴(kuò)大其窗口時(shí),可發(fā)送S=0選項(xiàng),使窗口大小回到16。
時(shí)間戳選項(xiàng)占10字節(jié),其中最主要的字段是時(shí)間戳字段(4字節(jié))和時(shí)間戳回送回答字段(4字節(jié))。時(shí)間戳選項(xiàng)有以下兩個(gè)概念:
第一、 用來計(jì)算往返時(shí)間RTT。發(fā)送方在發(fā)送報(bào)文段時(shí)把當(dāng)前時(shí)鐘的時(shí)間值放入時(shí)間戳字段,接收方在確認(rèn)該報(bào)文段時(shí)把時(shí)間戳字段復(fù)制到時(shí)間戳回送回答字段。因此,發(fā)送方在收到確認(rèn)報(bào)文后,可以準(zhǔn)確地計(jì)算出RTT來。
第二、 用于處理TCP序號(hào)超過2 32 的情況,這又稱為防止序號(hào)繞回PAWS。我們知道,TCP報(bào)文段的序號(hào)只有32位,而每增加2 32 個(gè)序號(hào)就會(huì)重復(fù)使用原來用過的序號(hào)。當(dāng)使用高速網(wǎng)絡(luò)時(shí),在一次TCP連接的數(shù)據(jù)傳送中序號(hào)很可能被重復(fù)使用。例如,當(dāng)使用1.5Mbit/s的速度發(fā)送報(bào)文段時(shí),序號(hào)重復(fù)要6小時(shí)以上。但若用2.5Gbit/s的速率發(fā)送報(bào)文段,則不到14秒鐘序號(hào)就會(huì)重復(fù)。為了使接收方能夠把新的報(bào)文段和遲到很久的報(bào)文段區(qū)分開,則可以在報(bào)文段中加上這種時(shí)間戳。
從 功能 和 性能 的角度去理解
三次握手建立連接
第一次:
C 向 S 發(fā)送一個(gè) 建立連接 的請(qǐng)求。此過程中攜帶一些報(bào)文屬性信息,這些信息,存在于報(bào)文首部,有初始化用的信息,比如,有用于認(rèn)證的信息。
初始化信息:如報(bào)文序列號(hào)、
SYN: TCP在數(shù)據(jù)通信之前,通過TCP首部發(fā)送的一個(gè) SYN 標(biāo)志位,作為建立連接的請(qǐng)求等待接收方確認(rèn)應(yīng)答。如果 S 發(fā)來確認(rèn)應(yīng)答,則認(rèn)為可以進(jìn)行數(shù)據(jù)通信,否則,就不能進(jìn)行通信。
TCP規(guī)定:****SYN=1 的報(bào)文段不能攜帶數(shù)據(jù),但是要 消耗掉一個(gè)序號(hào) :seq=x。
這個(gè)時(shí)候 C 進(jìn)入 SYN-SENT ( 同步已發(fā)送 )狀態(tài)。
第二次:
S 收到 C 請(qǐng)求后,如果同意建立連接,則向 C 返回確認(rèn)信息:將 SYN 、 ACK 都置 1 ,確認(rèn)號(hào)為 ack=seq+1 (seq來自客戶端),并攜帶自己的 初始化,同時(shí)用于認(rèn)證的信息S 。
同理: SYN=1 的報(bào)文段不能攜帶數(shù)據(jù),但是要 消耗掉一個(gè)序號(hào) :seq=y。
這個(gè)時(shí)候 S 進(jìn)入 SYN-RCVD ( 同步已接收 )狀態(tài)。 C 收到 S 返回的確認(rèn)信息后,進(jìn)入 ESTABLISHED (已建立連接)的狀態(tài),
第三次:
C 收到 S 返回的確認(rèn)信息后,向 S 再一次發(fā)送確認(rèn)報(bào)文。 ACK 置為 1 ,確認(rèn)號(hào) ack=seq+1 (seq來自 S ),自己的 seq=x+1 。
TCP規(guī)定: ACK報(bào)文可以攜帶數(shù)據(jù)。但是,如果不攜帶數(shù)據(jù),則不消耗序號(hào),這時(shí),下一數(shù)據(jù)報(bào)文段的序號(hào)仍是 seq=x+1 。 服務(wù)器 收到 客戶端 返回的確認(rèn)信息后,也進(jìn)入 ESTABLISHED (已建立連接)的狀態(tài),
從功能角度去考慮前兩次握手,從性能的角度去理解為什么需要第三次握手。
有第三次,是考慮到一種錯(cuò)誤情況: 假設(shè) C 發(fā)了一請(qǐng)求建立連接的報(bào)文,長時(shí)間未收到 S 的確認(rèn)報(bào)文,則 C 會(huì)重發(fā),這個(gè)時(shí)候 S 與之建立連接、完成數(shù)據(jù)通信、關(guān)閉了連接,這個(gè)時(shí)候 C 第一發(fā)出的請(qǐng)求建立連接的報(bào)文到達(dá)了 S , S 則會(huì)等待 C 發(fā)送數(shù)據(jù),實(shí)際上 C 已經(jīng) CLOSED 了, S 就一直在這等待,浪費(fèi)資源,
確切地說,應(yīng)該是至少四次數(shù)據(jù)交互才能實(shí)現(xiàn)一個(gè)連接的徹底關(guān)閉。關(guān)閉連接,需要四個(gè)報(bào)文來指示關(guān)閉。
TCP是全雙工通信的,所以在一端發(fā)送數(shù)據(jù)完畢后,還具有接收另一端的數(shù)據(jù)的能力,這就所謂的半關(guān)閉。
四次揮手
舉個(gè)例子 :如果 C 的數(shù)據(jù)已經(jīng)發(fā)送完畢, C 是不能立即關(guān)閉的,因?yàn)榻⑦B接的通信雙方是平等的。
C 首先告訴 S :“數(shù)據(jù)發(fā)送完畢“,這個(gè)消息在TCP報(bào)文的首部由 FIN 來標(biāo)識(shí),讓 S 知道 C 是準(zhǔn)備斷開連接了。這是第一次揮手。
S 收到 C 發(fā)來的 FIN 標(biāo)識(shí)的報(bào)文后,要給 C 端恢復(fù)一個(gè) 確認(rèn)FIN 的消息,告訴 C 說,知道你的數(shù)據(jù)發(fā)完了。這是第二次揮手。
這個(gè)時(shí)候,如果 S 端的數(shù)據(jù)也發(fā)送完畢了,就給 C 發(fā)一個(gè) FIN=1 報(bào)文。這是第三次揮手。
C 收到 S 發(fā)來的 FIN 標(biāo)識(shí)的報(bào)文后,要給 S 端恢復(fù)一個(gè) 確認(rèn)FIN 的消息,告訴 C 說,知道你的數(shù)據(jù)發(fā)完了。這是第四次揮手。
然后就徹底斷開連接了。
TCP的狀態(tài)變遷圖
二、如何查看tcp連接
在cmd運(yùn)行窗口中輸入DOS命令netstat,即可查看電腦的tcp連接。具體操作請(qǐng)參照以下步驟。
1、進(jìn)入電腦系統(tǒng)后,在鍵盤上同時(shí)按下“win+R”鍵,調(diào)出運(yùn)行窗口。
2、然后在出現(xiàn)的窗口中,輸入“cmd”字樣,點(diǎn)擊確定按鈕。
3、然后便會(huì)進(jìn)入到cmd的運(yùn)行界面中,如圖所示。
4、然后再輸入DOS命令【netstat】,再按鍵盤上的回車鍵。
5、完成以上設(shè)置后,即可查看電腦的tcp連接情況。
三、C#操作TCP連接以及管理連接斷開怎么實(shí)現(xiàn)
TcpListener類實(shí)現(xiàn)監(jiān)聽,斷開IP地址就是把TcpListener類的AcceptTcpClient方法返回的TcpClient類實(shí)例關(guān)閉。
四、計(jì)算機(jī)考研考什么
計(jì)算機(jī)歷年考研真題
鏈接:https://pan.baidu.com/s/1S0XYQQBxtaFkIAOpoymp9Q
提取碼:cugd
若資源有疑問歡迎追問
以上就是關(guān)于tcp連接管理相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
ChatGPT概念繼續(xù)大漲(chatcoin末來價(jià)格預(yù)測)
什么都不懂能去干運(yùn)營嗎(運(yùn)營適合什么性格的人做)