<p id="p7rr7"><ruby id="p7rr7"><b id="p7rr7"></b></ruby></p><noframes id="p7rr7">

      <address id="p7rr7"></address>

      <track id="p7rr7"><strike id="p7rr7"><rp id="p7rr7"></rp></strike></track>
      <pre id="p7rr7"><strike id="p7rr7"><b id="p7rr7"></b></strike></pre>

        <track id="p7rr7"><strike id="p7rr7"><span id="p7rr7"></span></strike></track><address id="p7rr7"><pre id="p7rr7"><span id="p7rr7"></span></pre></address>

              tcp三次握手報文(tcp三次握手報文分析)

            最后更新:6天前 手機定位技術交流文章

            TCP 為什么是三次握手,而不是兩次或四次?

            三次握手的目的:是為了確認雙方都有收發數據的能力。第一次:A->B,證明A有發消息的能力。第二次:->B&&B->A,證明B有收消息,并且有發消息的能力。第三次:A->B,證明A有收消息的能力。二次握手達不到目的,四次多余。當應用層向TCP層發送用于網間傳輸的、用8位字節表示的數據流,TCP則把數據流分割成適當長度的報文段,最大傳輸段大?。∕SS)通常受該計算機連接的網絡的數據鏈路層的最大傳送單元(MTU)限制。之后TCP把數據包傳給IP層,由它來通過網絡將包傳送給接收端實體的TCP層。TCP為了保證報文傳輸的可靠,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然后接收端實體對已成功收到的字節發回一個相應的確認(ACK);如果發送端實體在合理的往返時延(RTT)內未收到確認,那么對應的數據(假設丟失了)將會被重傳。
            TCP 為什么是三次握手,而不是兩次或四次?

            TCP三次握手原理

            本文主要內容1、TCP數據包格式TCP數據包格式如下:注意到中間還有幾個標志位:數據包格式當中,最重要的是理解序號和確認序號。TCP為什么是穩定可靠的,與序號與確認序號這套機制緊密相關,這也是TCP的精髓。2、TCP的三次握手眾所周知,TCP協議是可靠的,而UDP協議是不可靠的。在一些場景中必須用TCP,比如說用戶登錄,必須給出明確答復是否登錄成功等。而有些場景中,用戶是否接收到數據則不那么關鍵,比如網絡游戲當中,玩家射出一顆子彈,另外的玩家是否看到,完全取決于當前網絡環境,如果網絡卡頓,就會有玩家已經被射殺,但界面仍然刷新不出來的情況。這種情形適合UDP。為了保證TCP協議可靠,在建立連接之時就要得到保證。最初兩端的TCP進程都處于CLOSED關閉狀態,A主動打開連接,而B被動打開連接。(A、B關閉狀態CLOSED——B收聽狀態LISTEN——A同步已發送狀態SYN-SENT——B同步收到狀態SYN-RCVD——A、B連接已建立狀態ESTABLISHED)B服務器進程就處于LISTEN(收聽)狀態,等待客戶的連接請求。若有,則作出響應。3、TCP的傳輸和確認TCP 傳輸的可靠性,可以用一句話歸結:每收到對方數據,就發送 ACK 進行確定,發送方發送后沒有收到 ACK 就隔一段時間重發。就是 A 向 B 發送消息(下面將 TCP 的報文直接看做是消息,消息一詞跟 TCP 報文混用),B 收到消息后需要向 A 發送 ACK。這個 ACK 相當于返回結果,沒有返回結果,A 就重新發送消息。歸納起來,A 有 3 種消息需要確認。另外 A 也可以發送 RST 消息,代表出錯了。出錯消息不需要確認。RST 也可以當成返回接口,替代正常的 ACK。返回 ACK,表示消息發送并處理成功,返回 RST 表示消息處理失敗。因為通過網絡傳輸,還有第三種結果,就是不確定成功失敗。這樣歸納起來。就有三種返回結果。這兩種具體情況,A 根本識別不了,都只能重發。4、TCP的序號和確認序號A 向 B 發送消息,假如同時發送 a、b、c、d 消息,因為通過網絡,這些消息的順序并非固定的。而 B 返回 ACK 結果,這樣就有一個問題,這個結果到底對應了哪個消息?另外當 A 超時重發后,原來的消息延時一段時候,又重新到達了 B,這樣 B 就收到兩條相同的消息,那么 B 怎么確定這兩條消息是相同的呢?為了解決這個對應問題,每一條消息都需要有一個編號,返回結果也應該有一個編號。TCP 的序號可以看成是發送消息的編號,確認序號可以看成是返回結果的編號。有了編號,重復的消息才可以忽略,返回結果(ACK)才可以跟消息對應起來。當建立連接的時候,TCP 選定一個初始序號,之后每發送一個數據包(消息),就將序號遞增,保證每發送不同的數據包,數據包的序號都是不同的。TCP 是這樣處理的:SYN、FIN 也需要遞增序號。不然 A 向 B 重發多個 SYN 或者 FIN, B 根本判斷不了 SYN 是否相同,這樣就不可以忽略重復的數據包了。當 TCP 發送 ACK 時,相當于返回結果,需要帶有確認序號,以便跟發送的消息對應起來。當發送包編號為 a,遞增長度為 len。其中 SYN 和 FIN 可以看成是遞增長度為 1。這條消息可以這樣表示為:現在來回顧三次握手過程。 A 發送序列號x給 B , B 回復 A 確認號 x+ 1,同時發送序列號 y, A 接收到 B 的回復后,再回復確認號 y+1,同時發送序列號 x+1。給對方的回復一定是接收到的序號加1(或者是數據長度),這樣對方才能知道我已經收到了,這樣才能保證TCP是可靠的。
            TCP三次握手原理

            動畫圖解TCP三次握手

            TCP 三次握手過程不管是對于本科計算機網絡學習還是考研考計網的同學來說都是必考的一個,所以要掌握 TCP 整個握手的過程顯得尤為重要。 一、TCP 是什么?TCP是Transmission Control Protocol(傳輸控制協議) 的簡稱,它提供一種面向連接的、可靠的、基于字節流的傳輸層通信協議。在學習 TCP 握手過程之前,我們首先要了解 TCP 報文頭部的一些標志信息,因為在 TCP 握手的過程中,要用到TCP報文頭部的一些信息。TCP頭部1.1 源端口和目的端口對于端口,我們可以這么理解:我們可以想象發送方很多的窗戶,接收方也有很多的窗戶,這些窗口都標有不同的端口號,源端口號和目的端口號就分別代表從哪個規定的串口發送到對方接收的窗口。不同的應用程序都有著不同的端口,比如HTTP端口80,SMTP端口25等。1.2 序號TCP是面向字節流的,在一個TCP連接中傳送的字節流中的每一個字節都按順序編號。接收端根據這個編號進行確認,保證分割的數據段在原始數據包的位置。通俗一點的講,每個字段在傳送中用序列號來標記自己位置的,而這個字段就是用來完成雙方傳輸中確保字段原始位置是按照傳輸順序的。(發送方是數據是怎樣一個順序,到了接受方也要確保是這個順序)1.3 確認號確認號是期望收到對方下一個報文段的第一個字節的序號。確認號 = N,則表示到序號N-1為止的所有數據都已經正確收到。例如:B正確收到了A發送過來的一個報文段,其序號字段值為500,而數據字段長度是200字節(序號501~700),這表明B正確收到了A發送的到序號700為止的數據,因此B期望收到A的下一個數據序號是701,于是B在發送給A的確認報文段中把確認號置為701。1.4 標志位TCP首部中有 6 個標志比特,它們中的多個可同時被設置為?1,主要是用于操控?TCP?的狀態機的,依次為URG,ACK,PSH,RST,SYN,FIN。今天我們只介紹我們用到的三個。1.4.1 確認ACK這個標志位可以理解為發送端發送數據到接收端,發送的時候 ACK置 為 0,一旦接收端接收數據之后,就將 ACK 置為 1,發送端接收到之后,就知道了接收端已經接收了數據。需要注意的一點是:當且僅當ACK = 1時,確認號字段才有效。TCP規定,在連接建立后,所有傳送的報文段 都將ACK置為1。1.4.2 同步SYNSYN是同步序列號,在建立TCP連接時用來同步序號。當SYN=1,ACK=0時,表明這是一個連接請求報文段。若對方同意建立連接,則應在響應的報文段中使SYN=1,ACK=1。因此,SYN置為1就表示這是一個連接請求或連接接受報文。1.4.3 終止FIN當發送端已經達到數據末尾,也就是說雙方的數據傳送完成,沒有數據可以傳送了,發送方FIN標志位置為1后,表示此報文段的發送方數據發送完畢,請求釋放連接。二 T CP三次握手過程TCP 三次握手的過程解決以下三個問題1.要是每一方都能確知對方的存在2.要允許雙方協商一些參數(如窗口最大值,是否使用窗口擴大選項以及時間戳選項等)3.能夠對運輸實體資源(如緩沖大小、連接表中的項目等)進行分配掌握了這些,TCP 的三次握手就簡單多了。下面我們就以動畫形式進行拆解三次握手過程。初始狀態 :客戶端處于closed(關閉)狀態,服務器處于listen(監聽)狀態第一次握手 :客戶端發送請求報文將SYN = 1同步序列號和初始化序列號seq = x發送給服務端,發送完之后客戶端處于SYN_Send狀態。第二次握手 :服務端受到SYN請求報文之后,如果同意連接,會以自己的同步序列號SYN(服務端) = 1、初始化序列號seq = y和確認序列號(期望下次收到的數據包)ack = x+ 1以及確認號ACK = 1報文作為應答,服務器為SYN_Receive狀態。第三次握手 : 客戶端接收到服務端的SYN + ACK之后,知道可以下次可以發送了下一序列的數據包了,然后發送同步序列號ack = y + 1和數據包的序列號seq = x + 1以及確認號ACK = 1確認包作為應答,客戶端轉為established狀態。三、為什么不能是一次、二次握手,而必須是三次握手?為了防止已失效的連接請求報文段突然又傳送到了服務端,因而產生錯誤。所謂“已失效的連接請求報文段”是這樣產生的??紤]一種正常情況:A發出連接請求,但因連接請求報文丟失而未收到確認。于是A在重傳一次連接請求,后來收到了確認,建立了連接。數據傳輸完畢后,就釋放了連接。在此過程中,A一共發送了兩個連接請求報文段,其中一個丟失,第二個到達了B。沒有已經失效的報文段。但現在出現一種異常情況,即A發出的第一個連接請求報文段并沒有丟失,而是在某些網絡結點長時間滯留了,以至延誤到連接釋放以后的某個時間才到達B。本來這是一個早已經失效的報文段,但B收到此失效的連接請求報文段后,就誤認為是A又發出一次新的連接請求。于是就向A發出確認報文段,同意建立連接。假定不采用三次握手,那么只要B發出確認,新的連接就建立了。由于現在A并沒有發出建立連接的請求,因此不會理睬B的確認,也不會向B發送數據,但B卻以為新的運輸連接已經建立了,并一直等待A發來數據。B的許多資源就這樣白白浪費了。 采用三次握手的辦法可以防止上述現象的發生,例如在剛才的情況下,A不會向B的確認發出確認。B由于收不到確認,就知道A并沒有要求建立連接。
            動畫圖解TCP三次握手

            為什么用三次握手建立TCP連接時要傳送三次報文

            第一個報文是客戶端發出的syn報文,表示客戶端要發起通信 第二個報文是服務器發出的syn/ack報文,這個報文中的ack表示對客戶端的syn報文的確認,這個報文中syn表示服務器也發起對客戶端的請求第三個報文是客戶端發出的ack報文,表示對服務器syn報文的確認 如此一來,通過三個報文就可以讓雙方彼此對通信做出確認了。
            奇石又歷數劫,但每次都化險為夷。邢云飛八十九歲壽終,以石陪葬,但不久石頭又被盜墓賊竊走。
            為什么用三次握手建立TCP連接時要傳送三次報文

            TCP三次握手和四次揮手是什么意思?

            1、建立連接協議(三次握手) (1)客戶端發送一個帶SYN標志的TCP報文到服務器。這是三次握手過程中的報文1。(2) 服務器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ACK標志和SYN標志。因此它表示對剛才客戶端SYN報文的回應;同時又標志SYN給客戶端,詢問客戶端是否準備好進行數據通訊。(3) 客戶必須再次回應服務段一個ACK報文,這是報文段3?! ?、連接終止協議(四次揮手)由于TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務后就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味著這一方向上沒有數據流動,一個TCP連接在收到一個FIN后仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。(1) TCP客戶端發送一個FIN,用來關閉客戶到服務器的數據傳送(報文段4)。(2) 服務器收到這個FIN,它發回一個ACK,確認序號為收到的序號加1(報文段5)。和SYN一樣,一個FIN將占用一個序號。(3) 服務器關閉客戶端的連接,發送一個FIN給客戶端(報文段6)。(4) 客戶段發回ACK報文確認,并將確認序號設置為收到序號加1(報文段7)?! LOSED:這個沒什么好說的了,表示初始狀態?! ISTEN:這個也是非常容易理解的一個狀態,表示服務器端的某個SOCKET處于監聽狀態,可以接受連接了?! YN_RCVD:這個狀態表示接受到了SYN報文,在正常情況下,這個狀態是服務器端的SOCKET在建立TCP連接時的三次握手會話過程中的一個中間狀態,很短暫,基本上用netstat你是很難看到這種狀態的,除非你特意寫了一個客戶端測試程序,故意將三次TCP握手過程中最后一個ACK報文不予發送。因此這種狀態時,當收到客戶端的ACK報文后,它會進入到ESTABLISHED狀態?! YN_SENT:這個狀態與SYN_RCVD遙想呼應,當客戶端SOCKET執行CONNECT連接時,它首先發送SYN報文,因此也隨即它會進入到了SYN_SENT狀態,并等待服務端的發送三次握手中的第2個報文。SYN_SENT狀態表示客戶端已發送SYN報文?! STABLISHED:這個容易理解了,表示連接已經建立了?! IN_WAIT_1:這個狀態要好好解釋一下,其實FIN_WAIT_1和FIN_WAIT_2狀態的真正含義都是表示等待對方的FIN報文。而這兩種狀態的區別是:FIN_WAIT_1狀態實際上是當SOCKET在ESTABLISHED狀態時,它想主動關閉連接,向對方發送了FIN報文,此時該SOCKET即進入到FIN_WAIT_1狀態。而當對方回應ACK報文后,則進入到FIN_WAIT_2狀態,當然在實際的正常情況下,無論對方何種情況下,都應該馬上回應ACK報文,所以FIN_WAIT_1狀態一般是比較難見到的,而FIN_WAIT_2狀態還有時常??梢杂胣etstat看到?! IN_WAIT_2:上面已經詳細解釋了這種狀態,實際上FIN_WAIT_2狀態下的SOCKET,表示半連接,也即有一方要求close連接,但另外還告訴對方,我暫時還有點數據需要傳送給你,稍后再關閉連接?! IME_WAIT:表示收到了對方的FIN報文,并發送出了ACK報文,就等2MSL后即可回到CLOSED可用狀態了。如果FIN_WAIT_1狀態下,收到了對方同時帶FIN標志和ACK標志的報文時,可以直接進入到TIME_WAIT狀態,而無須經過FIN_WAIT_2狀態?! LOSING:這種狀態比較特殊,實際情況中應該是很少見,屬于一種比較罕見的例外狀態。正常情況下,當你發送FIN報文后,按理來說是應該先收到(或同時收到)對方的ACK報文,再收到對方的FIN報文。但是CLOSING狀態表示你發送FIN報文后,并沒有收到對方的ACK報文,反而卻也收到了對方的FIN報文。什么情況下會出現此種情況呢?其實細想一下,也不難得出結論:那就是如果雙方幾乎在同時close一個SOCKET的話,那么就出現了雙方同時發送FIN報文的情況,也即會出現CLOSING狀態,表示雙方都正在關閉SOCKET連接?! LOSE_WAIT: 這種狀態的含義其實是表示在等待關閉。怎么理解呢?當對方close一個SOCKET后發送FIN報文給自己,你系統毫無疑問地會回應一個ACK報文給對方,此時則進入到CLOSE_WAIT狀態。接下來呢,實際上你真正需要考慮的事情是察看你是否還有數據發送給對方,如果沒有的話,那么你也就可以close這個SOCKET,發送FIN報文給對方,也即關閉連接。所以你在CLOSE_WAIT狀態下,需要完成的事情是等待你去關閉連接?! AST_ACK:這個狀態還是比較容易好理解的,它是被動關閉一方在發送FIN報文后,最后等待對方的ACK報文。
            TCP三次握手和四次揮手是什么意思?

            本文由 在線網速測試 整理編輯,轉載請注明出處,原文鏈接:http://www.mestier.com/news/44749.html。

                熱門文章

                文章分類

            欧美熟妇A片在线A片视频

            <p id="p7rr7"><ruby id="p7rr7"><b id="p7rr7"></b></ruby></p><noframes id="p7rr7">

                <address id="p7rr7"></address>

                <track id="p7rr7"><strike id="p7rr7"><rp id="p7rr7"></rp></strike></track>
                <pre id="p7rr7"><strike id="p7rr7"><b id="p7rr7"></b></strike></pre>

                  <track id="p7rr7"><strike id="p7rr7"><span id="p7rr7"></span></strike></track><address id="p7rr7"><pre id="p7rr7"><span id="p7rr7"></span></pre></address>