-
當前位置:首頁 > 創(chuàng)意學院 > 技術(shù) > 專題列表 > 正文
tcp建立連接需要幾個rtt(tcp建立連接需要幾個端口)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關(guān)于tcp建立連接需要幾個rtt的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com
本文目錄:
一、【網(wǎng)絡(luò)】TCP的連接建立
TCP是面向連接的協(xié)議。運輸連接是用來傳送TCP報文的。TCP運輸連接的建立和釋放是每一次連接通信過程中必不可少的。
因此,運輸連接就有三個階段: 連接建立 , 數(shù)據(jù)傳送 和 連接釋放 。
需要解決以下3個問題:
連接建立 這個過程,需要在客戶端和服務(wù)器之間,交換3個TCP報文段,也就是 三次握手 🤝x3。
📌請注意,在本例中, A主動打開連接,B被動打開連接
一開始,B就在準備接受客戶進程的連接請求,然后服務(wù)器進程就處于 LISTEN (收聽)狀態(tài),等待客戶的連接請求。如有,即作出響應。
A的TCP客戶進程像B發(fā)出連接請求報文段,這時,首部中的同步位SYN = 1,同時選擇一個初始序號 seq = x 。
TCP規(guī)定📝,SYN報文段不能攜帶數(shù)據(jù), 但要消耗掉一個序號 。這時,TCP客戶進程進入 SYN-SENT (同步已發(fā)送)狀態(tài)。
B收到連接請求的報文段后,如同意建立連接,則向A發(fā)送確認。在確認報文段中,應把SYN位和ASK位都置1,確認號是 ack = x + 1 ,同時也為自己選擇一個初始序號 seq = y 。
請注意,這個報文段也不能攜帶數(shù)據(jù)。但同樣 要消耗掉一個序號 。這時,TCP服務(wù)器進程進入 SYN-RCVD (同步收到)狀態(tài)。
TCP客戶進程收到B的確認后,還要向B給出確認。確認報文段的ACK置1,確認號 ack = y + 1 ,而自己的序號 seq = x + 1 。
TCP的標準規(guī)定📝,ACK報文段可以攜帶數(shù)據(jù)。但如果不攜帶數(shù)據(jù)則不消耗序號,在這種情況下,下一個數(shù)據(jù)報文段的序號仍是 seq = x +1 。
這時,TCP連接已經(jīng)建立🖇,A進入 ESTABLISHED (已建立連接)狀態(tài)。當B收到A的確認后,也進入 ESTABLISHED (已建立連接)
🔍 Q: 為什么A最后還有發(fā)送一次確認呢?
📗 A: 主要是為了 防止已失效的連接請求報文段突然又傳送到B,因而產(chǎn)生錯誤。
所謂 “已失效的連接請求報文段” 是這樣產(chǎn)生的。
📝考慮一種正常情況,
A 發(fā)出連接請求📲,但因連接請求報文丟失而未收到確認。于是A再重傳一次連接請求。后來收到了確認,建立了連接。數(shù)據(jù)傳輸完畢后,就釋放了連接。
A共發(fā)出了兩個連接請求的報文段,其中第一個丟失💔,第二個到達了B💚,沒有“已失效的連接請求報文段”。
📝現(xiàn)假定出現(xiàn)一種異常情況,
即A發(fā)出的第一個連接請求報文段并沒有丟失,而是在某個網(wǎng)絡(luò)節(jié)點長時間的滯留🛑,以至延誤到連接釋放以后的某個時間才到達B。
本來這是一個 早已失效的報文段 ,但是B收到此時小的連接請求的報文段之后,誤以為是A又發(fā)出一次新的連接請求。
于是向A發(fā)出確認報文段,同意建立連接。假定不采用報文握手。那么只要B發(fā)出確認之后,新的連接就建立了。
由于現(xiàn)在A并沒有發(fā)出建立連接的請求,因此不會理睬B的確認🙉,也不會向B發(fā)送數(shù)據(jù),但B確以為新的運輸連接已經(jīng)建立,并一直等待A發(fā)來的數(shù)據(jù)。
B的許多資源就這樣白白浪費了。
二、TCP協(xié)議詳解及實戰(zhàn)解析【精心整理收藏】
TCP協(xié)議是在TCP/IP協(xié)議模型中的運輸層中很重要的一個協(xié)議、負責處理主機端口層面之間的數(shù)據(jù)傳輸。主要有以下特點:
1.TCP是面向鏈接的協(xié)議,在數(shù)據(jù)傳輸之前需要通過三次握手建立TCP鏈接,當數(shù)據(jù)傳遞完成之后,需要通過四次揮手進行連接釋放。
2.每一條TCP通信都是兩臺主機和主機之間的,是點對點傳輸?shù)膮f(xié)議。
3.TCP提供可靠的、無差錯、不丟失、不重復,按序到達的服務(wù)。
4.TCP的通信雙方在連接建立的任何時候都可以發(fā)送數(shù)據(jù)。TCP連接的兩端都設(shè)有發(fā)送緩存和接收緩存,用來臨時存放雙向通信的數(shù)據(jù)。
5.面向字節(jié)流。在數(shù)據(jù)傳輸?shù)倪^程中如果報文比較長的話TCP會進行數(shù)據(jù)分段傳輸,每一條分段的TCP傳輸信息都帶有分段的序號,每一段都包含一部分字節(jié)流。接收方根據(jù)每段攜帶的的序號信息進行數(shù)據(jù)拼接,最終拼接出來初始的傳輸數(shù)據(jù)。但是在整個傳輸?shù)倪^程中每一段TCP攜帶的都是被切割的字節(jié)流數(shù)據(jù)。所以說TCP是面向字節(jié)流的。
a.TCP和UDP在發(fā)送報文時所采用的方式完全不同。TCP并不關(guān)心應用程序一次把多長的報文發(fā)送到TCP緩存中,而是根據(jù)對方給出的窗口值和當前網(wǎng)絡(luò)擁塞的程度來決定一個報文段應包含多少個字節(jié)(UDP發(fā)送的報文長度是應用程序給出的)。
b.如果應用程序傳送到TCP緩存的數(shù)據(jù)塊太大,TCP就可以把它劃分短一些再傳。TCP也可以等待積累有足夠多的字節(jié)后再構(gòu)建成報文段發(fā)送出去。
各字段含義:
源端口:發(fā)送端的端口號
目的端口:接收端的端口號
序號:TCP將發(fā)送報文分段傳輸?shù)臅r候會給每一段加上序號,接收端也可以根據(jù)這個序號來判斷數(shù)據(jù)拼接的順序,主要用來解決網(wǎng)絡(luò)報亂序的問題
確認號:確認號為接收端收到數(shù)據(jù)之后進行排序確認以及發(fā)送下一次期待接收到的序號,數(shù)值 = 接收到的發(fā)送號 + 1
數(shù)據(jù)偏移:占4比特,表示數(shù)據(jù)開始的地方離TCP段的起始處有多遠。實際上就是TCP段首部的長度。由于首部長度不固定,因此數(shù)據(jù)偏移字段是必要的。數(shù)據(jù)偏移以32位為長度單位,因此TCP首部的最大長度是60(15*4)個字節(jié)。
控制位:
URG:此標志表示TCP包的緊急指針域有效,用來保證TCP連接不被中斷,并且督促 中間層設(shè)備要盡快處理這些數(shù)據(jù);
ACK:此標志表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP數(shù)據(jù)包中;有兩個取值:0和1, 為1的時候表示應答域有效,反之為0;
PSH:這個標志位表示Push操作。所謂Push操作就是指在數(shù)據(jù)包到達接收端以后,立即傳送給應用程序, 而不是在緩沖區(qū)中排隊;
RST:這個標志表示連接復位請求。用來復位那些產(chǎn)生錯誤的連接,也被用來拒絕錯誤和非法的數(shù)據(jù)包;
SYN:表示同步序號,用來建立連接。SYN標志位和ACK標志位搭配使用,當連接請求的時候,SYN=1, ACK=0;連接被響應的時候,SYN=1,ACK=1;這個標志的數(shù)據(jù)包經(jīng)常被用來進行端口掃描。掃描者發(fā)送 一個只有SYN的數(shù)據(jù)包,如果對方主機響應了一個數(shù)據(jù)包回來 ,就表明這臺主機存在這個端口;但是由于這 種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描的成功表示被掃描的機器不很安全,一臺安全 的主機將會強制要求一個連接嚴格的進行TCP的三次握手;
FIN: 表示發(fā)送端已經(jīng)達到數(shù)據(jù)末尾,也就是說雙方的數(shù)據(jù)傳送完成,沒有數(shù)據(jù)可以傳送了,發(fā)送FIN標志 位的TCP數(shù)據(jù)包后,連接將被斷開。這個標志的數(shù)據(jù)包也經(jīng)常被用于進行端口掃描。
窗口:TCP里很重要的一個機制,占2字節(jié),表示報文段發(fā)送方期望接收的字節(jié)數(shù),可接收的序號范圍是從接收方的確認號開始到確認號加上窗口大小之間的數(shù)據(jù)。后面會有實例講解。
校驗和:校驗和包含了偽首部、TCP首部和數(shù)據(jù),校驗和是TCP強制要求的,由發(fā)送方計算,接收方驗證
緊急指針:URG標志為1時,緊急指針有效,表示數(shù)據(jù)需要優(yōu)先處理。緊急指針指出在TCP段中的緊急數(shù)據(jù)的最后一個字節(jié)的序號,使接收方可以知道緊急數(shù)據(jù)共有多長。
選項:最常用的選項是最大段大?。∕aximum Segment Size,MSS),向?qū)Ψ酵ㄖ緳C可以接收的最大TCP段長度。MSS選項只在建立連接的請求中發(fā)送。
放在以太網(wǎng)幀里看TCP的位置
TCP 數(shù)據(jù)包在 IP 數(shù)據(jù)包的負載里面。它的頭信息最少也需要20字節(jié),因此 TCP 數(shù)據(jù)包的最大負載是 1480 - 20 = 1460 字節(jié)。由于 IP 和 TCP 協(xié)議往往有額外的頭信息,所以 TCP 負載實際為1400字節(jié)左右。
因此,一條1500字節(jié)的信息需要兩個 TCP 數(shù)據(jù)包。HTTP/2 協(xié)議的一大改進, 就是壓縮 HTTP 協(xié)議的頭信息,使得一個 HTTP 請求可以放在一個 TCP 數(shù)據(jù)包里面,而不是分成多個,這樣就提高了速度。
以太網(wǎng)數(shù)據(jù)包的負載是1500字節(jié),TCP 數(shù)據(jù)包的負載在1400字節(jié)左右
一個包1400字節(jié),那么一次性發(fā)送大量數(shù)據(jù),就必須分成多個包。比如,一個 10MB 的文件,需要發(fā)送7100多個包。
發(fā)送的時候,TCP 協(xié)議為每個包編號(sequence number,簡稱 SEQ),以便接收的一方按照順序還原。萬一發(fā)生丟包,也可以知道丟失的是哪一個包。
第一個包的編號是一個隨機數(shù)。為了便于理解,這里就把它稱為1號包。假定這個包的負載長度是100字節(jié),那么可以推算出下一個包的編號應該是101。這就是說,每個數(shù)據(jù)包都可以得到兩個編號:自身的編號,以及下一個包的編號。接收方由此知道,應該按照什么順序?qū)⑺鼈冞€原成原始文件。
收到 TCP 數(shù)據(jù)包以后,組裝還原是操作系統(tǒng)完成的。應用程序不會直接處理 TCP 數(shù)據(jù)包。
對于應用程序來說,不用關(guān)心數(shù)據(jù)通信的細節(jié)。除非線路異常,否則收到的總是完整的數(shù)據(jù)。應用程序需要的數(shù)據(jù)放在 TCP 數(shù)據(jù)包里面,有自己的格式(比如 HTTP 協(xié)議)。
TCP 并沒有提供任何機制,表示原始文件的大小,這由應用層的協(xié)議來規(guī)定。比如,HTTP 協(xié)議就有一個頭信息Content-Length,表示信息體的大小。對于操作系統(tǒng)來說,就是持續(xù)地接收 TCP 數(shù)據(jù)包,將它們按照順序組裝好,一個包都不少。
操作系統(tǒng)不會去處理 TCP 數(shù)據(jù)包里面的數(shù)據(jù)。一旦組裝好 TCP 數(shù)據(jù)包,就把它們轉(zhuǎn)交給應用程序。TCP 數(shù)據(jù)包里面有一個端口(port)參數(shù),就是用來指定轉(zhuǎn)交給監(jiān)聽該端口的應用程序。
應用程序收到組裝好的原始數(shù)據(jù),以瀏覽器為例,就會根據(jù) HTTP 協(xié)議的Content-Length字段正確讀出一段段的數(shù)據(jù)。這也意味著,一次 TCP 通信可以包括多個 HTTP 通信。
服務(wù)器發(fā)送數(shù)據(jù)包,當然越快越好,最好一次性全發(fā)出去。但是,發(fā)得太快,就有可能丟包。帶寬小、路由器過熱、緩存溢出等許多因素都會導致丟包。線路不好的話,發(fā)得越快,丟得越多。
最理想的狀態(tài)是,在線路允許的情況下,達到最高速率。但是我們怎么知道,對方線路的理想速率是多少呢?答案就是慢慢試。
TCP 協(xié)議為了做到效率與可靠性的統(tǒng)一,設(shè)計了一個慢啟動(slow start)機制。開始的時候,發(fā)送得較慢,然后根據(jù)丟包的情況,調(diào)整速率:如果不丟包,就加快發(fā)送速度;如果丟包,就降低發(fā)送速度。
Linux 內(nèi)核里面 設(shè)定 了(常量TCP_INIT_CWND),剛開始通信的時候,發(fā)送方一次性發(fā)送10個數(shù)據(jù)包,即"發(fā)送窗口"的大小為10。然后停下來,等待接收方的確認,再繼續(xù)發(fā)送。
默認情況下,接收方每收到 兩個 TCP 數(shù)據(jù)包,就要 發(fā)送 一個確認消息。"確認"的英語是 acknowledgement,所以這個確認消息就簡稱 ACK。
ACK 攜帶兩個信息。
發(fā)送方有了這兩個信息,再加上自己已經(jīng)發(fā)出的數(shù)據(jù)包的最新編號,就會推測出接收方大概的接收速度,從而降低或增加發(fā)送速率。這被稱為"發(fā)送窗口",這個窗口的大小是可變的。
注意,由于 TCP 通信是雙向的,所以雙方都需要發(fā)送 ACK。兩方的窗口大小,很可能是不一樣的。而且 ACK 只是很簡單的幾個字段,通常與數(shù)據(jù)合并在一個數(shù)據(jù)包里面發(fā)送。
即使對于帶寬很大、線路很好的連接,TCP 也總是從10個數(shù)據(jù)包開始慢慢試,過了一段時間以后,才達到最高的傳輸速率。這就是 TCP 的慢啟動。
TCP 協(xié)議可以保證數(shù)據(jù)通信的完整性,這是怎么做到的?
前面說過,每一個數(shù)據(jù)包都帶有下一個數(shù)據(jù)包的編號。如果下一個數(shù)據(jù)包沒有收到,那么 ACK 的編號就不會發(fā)生變化。
舉例來說,現(xiàn)在收到了4號包,但是沒有收到5號包。ACK 就會記錄,期待收到5號包。過了一段時間,5號包收到了,那么下一輪 ACK 會更新編號。如果5號包還是沒收到,但是收到了6號包或7號包,那么 ACK 里面的編號不會變化,總是顯示5號包。這會導致大量重復內(nèi)容的 ACK。
如果發(fā)送方發(fā)現(xiàn)收到 三個 連續(xù)的重復 ACK,或者超時了還沒有收到任何 ACK,就會確認丟包,即5號包遺失了,從而再次發(fā)送這個包。通過這種機制,TCP 保證了不會有數(shù)據(jù)包丟失。
TCP是一個滑動窗口協(xié)議,即一個TCP連接的發(fā)送端在某個時刻能發(fā)多少數(shù)據(jù)是由滑動窗口控制的,而滑動窗口的大小實際上是由兩個窗口共同決定的,一個是接收端的通告窗口,這個窗口值在TCP協(xié)議頭部信息中有,會隨著數(shù)據(jù)的ACK包發(fā)送給發(fā)送端,這個值表示的是在接收端的TCP協(xié)議緩存中還有多少剩余空間,發(fā)送端必須保證發(fā)送的數(shù)據(jù)不超過這個剩余空間以免造成緩沖區(qū)溢出,這個窗口是接收端用來進行流量限制的,在傳輸過程中,通告窗口大小與接收端的進程取出數(shù)據(jù)的快慢有關(guān)。另一個窗口是發(fā)送端的擁塞窗口(Congestion window),由發(fā)送端維護這個值,在協(xié)議頭部信息中沒有,滑動窗口的大小就是通告窗口和擁塞窗口的較小值,所以擁塞窗口也看做是發(fā)送端用來進行流量控制的窗口?;瑒哟翱诘淖筮呇叵蛴乙苿臃Q為窗口合攏,發(fā)生在發(fā)送的數(shù)據(jù)被確認時(此時,表明數(shù)據(jù)已被接收端收到,不會再被需要重傳,可以從發(fā)送端的發(fā)送緩存中清除了),滑動窗口的右邊沿向右移動稱為窗口張開,發(fā)生在接收進程從接收端協(xié)議緩存中取出數(shù)據(jù)時。隨著發(fā)送端不斷收到的被發(fā)送數(shù)據(jù)的ACK包,根據(jù)ACK包中的確認序號和通告窗口大小使滑動窗口得以不斷的合攏和張開,形成滑動窗口的向前滑動。如果接收進程一直不取數(shù)據(jù),則會出現(xiàn)0窗口現(xiàn)象,即滑動窗口左邊沿與右邊沿重合,此時窗口大小為0,就無法再發(fā)送數(shù)據(jù)。
在TCP里,接收端(B)會給發(fā)送端(A)報一個窗口的大小,叫Advertised window。
1.在沒有收到B的確認情況下,A可以連續(xù)把窗口內(nèi)的數(shù)據(jù)都發(fā)送出去。凡是已經(jīng)發(fā)送過的數(shù)據(jù),在
未收到確認之前都必須暫時保留,以便在超時重傳時使用。
2.發(fā)送窗口里面的序號表示允許發(fā)送的序號。顯然,窗口越大,發(fā)送方就可以在收到對方確認之前連續(xù)
發(fā)送更多數(shù)據(jù),因而可能獲得更高的傳輸效率。但接收方必須來得及處理這些收到的數(shù)據(jù)。
3.發(fā)送窗口后沿的后面部分表示已發(fā)送且已收到確認。這些數(shù)據(jù)顯然不需要再保留了。
4.發(fā)送窗口前沿的前面部分表示不允許發(fā)送的,應為接收方都沒有為這部分數(shù)據(jù)保留臨時存放的緩存空間。
5.發(fā)送窗口后沿的變化情況有兩種:不動(沒有收到新的確認)和前移(收到了新的確認)
6.發(fā)送窗口前沿的變化情況有兩種:不斷向前移或可能不動(沒收到新的確認)
TCP的發(fā)送方在規(guī)定時間內(nèi)沒有收到確認就要重傳已發(fā)送的報文段。這種重傳的概念很簡單,但重傳時間的選擇確是TCP最復雜的問題之一。TCP采用了一種自適應算法,它記錄一個報文段發(fā)出的時間,以及收到響應的確認的時間
這兩個時間之差就是報文段的往返時間RTT。TCP保留了RTT的一個加權(quán)平均往返時間。超時重傳時間RTO略大于加權(quán)平均往返時間
RTT:
即Round Trip Time,表示從發(fā)送端到接收端的一去一回需要的時間,tcp在數(shù)據(jù)傳輸過程中會對RTT進行采樣(即對發(fā)送的數(shù)據(jù)包及其ACK的時間差進行測量,并根據(jù)測量值更新RTT值,具體的算法TCPIP詳解里面有),TCP根據(jù)得到的RTT值更新RTO值,即Retransmission TimeOut,就是重傳間隔,發(fā)送端對每個發(fā)出的數(shù)據(jù)包進行計時,如果在RTO時間內(nèi)沒有收到所發(fā)出的數(shù)據(jù)包的對應ACK,則任務(wù)數(shù)據(jù)包丟失,將重傳數(shù)據(jù)。一般RTO值都比采樣得到的RTT值要大。
如果收到的報文段無差錯,只是未按序號,中間還缺少一些序號的數(shù)據(jù),那么能否設(shè)法只傳送缺少的數(shù)據(jù)而不重傳已經(jīng)正確到達接收方的數(shù)據(jù)?
答案是可以的,選擇確認就是一種可行的處理方法。
如果要使用選項確認SACK,那么在建立TCP連接時,就要在TCP首部的選項中加上“允許SACK”的選項,而雙方必須都事先商定好。如果使用選擇確認,
那么原來首部中的“確認號字段”的用法仍然不變。SACK文檔并沒有明確發(fā)送方應當怎么響應SACK.因此大多數(shù)的實現(xiàn)還是重傳所有未被確認的數(shù)據(jù)塊。
一般說來,我們總是希望數(shù)據(jù)傳輸?shù)母煲恍?,但如果發(fā)送方把數(shù)據(jù)發(fā)送的過快,接收方就可能來不及接收,這會造成數(shù)據(jù)的丟失。所謂流量控制就是讓發(fā)送方的發(fā)送速率不要太快,要讓接收方來得及接收。
在計算機網(wǎng)絡(luò)中的鏈路容量,交換節(jié)點中的緩存和處理機等,都是網(wǎng)絡(luò)的資源。在某段時間,若對網(wǎng)絡(luò)中某一資源的需求超過了該資源所能提供的可用部分,網(wǎng)絡(luò)的性能就要變壞。這種情況就叫做擁塞。
擁塞控制方法:
1.慢開始和擁塞避免
2.快重傳和快恢復
3.隨機早期檢測
1.一開始,客戶端和服務(wù)端都處于CLOSED狀態(tài)
2.先是服務(wù)端主動監(jiān)聽某個端口,處于LISTEN狀態(tài)(比如服務(wù)端啟動,開始監(jiān)聽)。
3.客戶端主動發(fā)起連接SYN,之后處于SYN-SENT狀態(tài)(第一次握手,發(fā)送 SYN = 1 ACK = 0 seq = x ack = 0)。
4.服務(wù)端收到發(fā)起的連接,返回SYN,并且ACK客戶端的SYN,之后處于SYN-RCVD狀態(tài)(第二次握手,發(fā)送 SYN = 1 ACK = 1 seq = y ack = x + 1)。
5.客戶端收到服務(wù)端發(fā)送的SYN和ACK之后,發(fā)送ACK的ACK,之后處于ESTABLISHED狀態(tài)(第三次握手,發(fā)送 SYN = 0 ACK = 1 seq = x + 1 ack = y + 1)。
6.服務(wù)端收到客戶端的ACK之后,處于ESTABLISHED狀態(tài)。
(需要注意的是,有可能X和Y是相等的,可能都是0,因為他們代表了各自發(fā)送報文段的序號。)
TCP連接釋放四次揮手
1.當前A和B都處于ESTAB-LISHED狀態(tài)。
2.A的應用進程先向其TCP發(fā)出連接釋放報文段,并停止再發(fā)送數(shù)據(jù),主動關(guān)閉TCP連接。
3.B收到連接釋放報文段后即發(fā)出確認,然后B進入CLOSE-WAIT(關(guān)閉等待)狀態(tài)。TCP服務(wù)器進程這時應通知高層應用進程,因而從A到B這個方向的連接就釋放了,這時TCP連接處于半關(guān)閉狀態(tài),即A已經(jīng)沒有數(shù)據(jù)發(fā)送了。
從B到A這個方向的連接并未關(guān)閉,這個狀態(tài)可能會持續(xù)一些時間。
4.A收到來自B的確認后,就進入FIN-WAIT-2(終止等待2)狀態(tài),等待B發(fā)出的連接釋放報文端。
5.若B已經(jīng)沒有向A發(fā)送的數(shù)據(jù),B發(fā)出連接釋放信號,這時B進入LAST-ACK(最后確認)狀態(tài)等待A的確認。
6.A再收到B的連接釋放消息后,必須對此發(fā)出確認,然后進入TIME-WAIT(時間等待)狀態(tài)。請注意,現(xiàn)在TCP連接還沒有釋放掉,必須經(jīng)過時間等待計時器(TIME-WAIT timer)設(shè)置的時間2MSL后,A才進入CLOSED狀態(tài)。
7。B收到A發(fā)出的確認消息后,進入CLOSED狀態(tài)。
以請求百度為例,看一下三次握手真實數(shù)據(jù)的TCP連接建立過程
我們再來看四次揮手。TCP斷開連接時,會有四次揮手過程,標志位是FIN,我們在封包列表中找到對應位置,理論上應該找到4個數(shù)據(jù)包,但我試了好幾次,實際只抓到3個數(shù)據(jù)包。查了相關(guān)資料,說是因為服務(wù)器端在給客戶端傳回的過程中,將兩個連續(xù)發(fā)送的包進行了合并。因此下面會按照合并后的三次揮手解釋,若有錯誤之處請指出。
第一步,當主機A的應用程序通知TCP數(shù)據(jù)已經(jīng)發(fā)送完畢時,TCP向主機B發(fā)送一個帶有FIN附加標記的報文段(FIN表示英文finish)。
第二步,主機B收到這個FIN報文段之后,并不立即用FIN報文段回復主機A,而是先向主機A發(fā)送一個確認序號ACK,同時通知自己相應的應用程序:對方要求關(guān)閉連接(先發(fā)送ACK的目的是為了防止在這段時間內(nèi),對方重傳FIN報文段)。
第三步,主機B的應用程序告訴TCP:我要徹底的關(guān)閉連接,TCP向主機A送一個FIN報文段。
第四步,主機A收到這個FIN報文段后,向主機B發(fā)送一個ACK表示連接徹底釋放。
這是因為服務(wù)端在LISTEN狀態(tài)下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發(fā)送給客戶端。而關(guān)閉連接時,當收到對方的FIN報文時,僅僅表示對方不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),己方也未必全部數(shù)據(jù)都發(fā)送給對方了,所以己方可以立即close,也可以發(fā)送一些數(shù)據(jù)給對方后,再發(fā)送FIN報文給對方來表示同意現(xiàn)在關(guān)閉連接,因此,己方ACK和FIN一般都會分開發(fā)送。
原因有二:
一、保證TCP協(xié)議的全雙工連接能夠可靠關(guān)閉
二、保證這次連接的重復數(shù)據(jù)段從網(wǎng)絡(luò)中消失
先說第一點,如果Client直接CLOSED了,那么由于IP協(xié)議的不可靠性或者是其它網(wǎng)絡(luò)原因,導致Server沒有收到Client最后回復的ACK。那么Server就會在超時之后繼續(xù)發(fā)送FIN,此時由于Client已經(jīng)CLOSED了,就找不到與重發(fā)的FIN對應的連接,最后Server就會收到RST而不是ACK,Server就會以為是連接錯誤把問題報告給高層。這樣的情況雖然不會造成數(shù)據(jù)丟失,但是卻導致TCP協(xié)議不符合可靠連接的要求。所以,Client不是直接進入CLOSED,而是要保持TIME_WAIT,當再次收到FIN的時候,能夠保證對方收到ACK,最后正確的關(guān)閉連接。
再說第二點,如果Client直接CLOSED,然后又再向Server發(fā)起一個新連接,我們不能保證這個新連接與剛關(guān)閉的連接的端口號是不同的。也就是說有可能新連接和老連接的端口號是相同的。一般來說不會發(fā)生什么問題,但是還是有特殊情況出現(xiàn):假設(shè)新連接和已經(jīng)關(guān)閉的老連接端口號是一樣的,如果前一次連接的某些數(shù)據(jù)仍然滯留在網(wǎng)絡(luò)中,這些延遲數(shù)據(jù)在建立新連接之后才到達Server,由于新連接和老連接的端口號是一樣的,又因為TCP協(xié)議判斷不同連接的依據(jù)是socket pair,于是,TCP協(xié)議就認為那個延遲的數(shù)據(jù)是屬于新連接的,這樣就和真正的新連接的數(shù)據(jù)包發(fā)生混淆了。所以TCP連接還要在TIME_WAIT狀態(tài)等待2倍MSL,這樣可以保證本次連接的所有數(shù)據(jù)都從網(wǎng)絡(luò)中消失。
硬件速度
網(wǎng)絡(luò)和服務(wù)器的負載
請求和響應報文的尺寸
客戶端和服務(wù)器之間的距離
TCP 協(xié)議的技術(shù)復雜性
TCP 連接建立握手;
TCP 慢啟動擁塞控制;
數(shù)據(jù)聚集的 Nagle 算法;
用于捎帶確認的 TCP 延遲確認算法;
TIME_WAIT 時延和端口耗盡。
介紹完畢,就這?
是的,就這。
補充:
大部分內(nèi)容為網(wǎng)絡(luò)整理,方便自己學習回顧,參考文章:
TCP 協(xié)議簡介
TCP協(xié)議圖文詳解
什么是TCP協(xié)議?
wireshark抓包分析——TCP/IP協(xié)議
TCP協(xié)議的三次握手和四次揮手
TCP協(xié)議詳解
TCP帶寬和時延的研究(1)
三、創(chuàng)建TCP連接的限制
1. 端口號限制?
首先, 不存在 由于端口號限制 65535 個的說法,因為目標端的ip和端口是無限的。
當然, Linux 對可使用的端口范圍是有具體限制的,具體可以用如下命令查看:
這個限制可以 vim /etc/sysctl.conf 這個文件進行修改,我們在這個文件里添加一行記錄:
保存好后執(zhí)行 sysctl -p /etc/sysctl.conf 使其生效。
2. 文件描述符的限制?
修改單個進程可打開的最大文件描述符限制為100,可以這樣:
理論上文件描述符可以設(shè)置的足夠大。
3. 線程數(shù)的限制?
每建一個TCP連接就創(chuàng)建一個線程的方式,是最傳統(tǒng)的多線程并發(fā)模型,早期的操作系統(tǒng)也只支持這種方式。
C10K 問題: 當服務(wù)器連接數(shù)達到 1 萬且每個連接都需要消耗一個線程資源時,操作系統(tǒng)就會不停地忙于線程的上下文切換,最終導致系統(tǒng)崩潰。
但是:
現(xiàn)在的操作系統(tǒng)都支持 IO 多路復用的方式,簡單說就是一個線程可以管理多個 TCP 連接的資源,這樣就可以用少量的線程來管理大量的 TCP 連接了。
4. 內(nèi)存的限制?
這個錯誤叫內(nèi)存溢出,每個TCP連接本身,以及這個連接所用到的緩沖區(qū),都是需要占用一定內(nèi)存的
5. CPU的限制?
6. 總結(jié)一下,創(chuàng)建tcp連接需要的資源:
四、TCP建立連接時,(1)發(fā)送方第一次發(fā)送數(shù)據(jù)到收到對方確認的RTT樣本值為4s,試計算超時重傳時間?
數(shù)據(jù)傳輸舉例 TCP數(shù)據(jù)傳輸發(fā)送方首先發(fā)送第一個包含序列號為1(可變化)和1460字節(jié)數(shù)據(jù)的TCP報文段給接收方。接收方以一個沒有數(shù)據(jù)的TCP報文段來回復(只含報頭)...
以上就是關(guān)于tcp建立連接需要幾個rtt相關(guān)問題的回答。希望能幫到你,如有更多相關(guān)問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀:
手機UU加速器搜不到twitch(手機uu加速器搜不到steam)