<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          深入淺出TCP三次握手 (多圖詳解)

          共 4528字,需瀏覽 10分鐘

           ·

          2021-11-14 16:52

          前言

          TCP三次握手和四次揮手是面試題的熱門考點,它們分別對應(yīng)TCP的連接和釋放過程,今天我們先來認識一下TCP三次握手過程,以及是否可以使用“兩報文握手”建立連接?。

          1、TCP是什么?

          TCP是面向連接的協(xié)議,它基于運輸連接來傳送TCP報文段,TCP運輸連接的建立和釋放,是每一次面向連接的通信中必不可少的過程。

          TCP運輸連接有以下三個階段:

          • 建立TCP連接,也就是通過三報文握手來建立TCP連接。

          • 數(shù)據(jù)傳送,也就是基于已建立的TCP連接進行可靠的數(shù)據(jù)傳輸。

          • 釋放連接,也就是在數(shù)據(jù)傳輸結(jié)束后,還要通過四報文揮手來釋放TCP連接。?

          TCP的運輸連接管理就是使運輸連接的建立和釋放都能正常的進行。

          2、TCP首部格式

          源端口: ? 占16比特,寫入源端口號,用來 標識發(fā)送該TCP報文段的應(yīng)用進程。目的端口: 占16比特,寫入目的端口號,用來標識接收該TCP報文段的應(yīng)用進程。

          序號: 占32比特,取值范圍[0,2^32-1],序號增加到最后一個后,下一個序號就又回到0。指出本TCP報文段數(shù)據(jù)載荷的第一個字節(jié)的序號。

          確認號: 占32比特,取值范圍[0,2^32-1],確認號增加到最后一個后,下一個確認號就又回到0。指出期望收到對方下一個TCP報文段的數(shù)據(jù)載荷的第一個字節(jié)的序號,同時也是對之前收到的所有數(shù)據(jù)的確認。若確認號=n,則表明到序號n-1為止的所有數(shù)據(jù)都已正確接收,期望接收序號為n的數(shù)據(jù)。

          確認標志位ACK: 取值為1時確認號字段才有效;取值為0時確認號字段無效。TCP規(guī)定,在連接建立后所有傳送的TCP報文段都必須把ACK置1。

          數(shù)據(jù)偏移: 占4比特,并以4字節(jié)為單位。用來指出TCP報文段的數(shù)據(jù)載荷部分的起始處距離TCP報文段的起始處有多遠。這個字段實際上是指出了TCP報文段的首部長度。

          窗口: 占16比特,以字節(jié)為單位。指出發(fā)送本報文段的一方的接收窗。

          同步標志位SYN: 在TCP連接建立時用來同步序號。終止標志位FIN: 用來釋放TCP連接。復(fù)位標志位RST: 用來復(fù)位TCP連接。

          推送標志位PSH: 接收方的TCP收到該標志位為1的報文段會盡快上交應(yīng)用進程,而不必等到接收緩存都填滿后再向上交付。

          校驗和: 占16比特,檢查范圍包括TCP報文段的首部和數(shù)據(jù)載荷兩部分。在計算校驗和時,要在TCP報文段的前面加上12字節(jié)的偽首部。

          緊急指針: 占16比特,以字節(jié)為單位,用來指明緊急數(shù)據(jù)的長度。

          填充: 由于選項的長度可變,因此使用填充來 確保報文段首部能被4整除,(因為數(shù)據(jù)偏移字段,也就是首部長度字段,是以4字節(jié)為單位的)。

          3、TCP的連接建立

          TCP 建立連接的過程叫做握手,握手需要在客戶和服務(wù)器之間交換三個TCP 報文段,稱之為三報文握手,采用三報文握手主要是為了防止已失效的連接請求報文段突然又傳送到了,因而產(chǎn)生錯誤。

          TCP的連接建立要解決以下三個問題:

          • 1、使TCP雙方能夠確知對方的存在 。

          • 2、使TCP雙方能夠協(xié)商一些參數(shù)( 最大窗口值是否使用窗口擴大選項和時間戳選項,以及服務(wù)質(zhì)量等)。

          • 3、使TCP雙方能夠?qū)\輸實體資源(例如緩存大小連接表中的項目等)進行分配。

          4、三次握手圖文詳解

          這是兩臺要基于TCP進行通信的主機:

          • 主動發(fā)起TCP連接建立稱為TCP客戶(client)。

          • 被動等待TCP連接建立的應(yīng)用進程稱為TCP服務(wù)器(server)。

          我們可以將TCP建立連接的過程比喻為”握手“,“握手”需要在TCP客戶端和服務(wù)器之間交換三個TCP報文段。

          最初兩端的TCP進程都處于關(guān)閉狀態(tài)。

          一開始,TCP服務(wù)器進程首先創(chuàng)建傳輸控制塊,用來存儲TCP連接中的一些重要信息。 例如TCP連接表、指向發(fā)送和接收緩存的指針、指向重傳隊列的指針,當(dāng)前的發(fā)送和接收序號等。之后就準備接受TCP客戶進程的連接請求, 此時TCP服務(wù)器進程就要進入監(jiān)聽狀態(tài)等待TCP客戶進程的連接請求。

          TCP客戶進程也是首先創(chuàng)建傳輸控制塊,然后再打算建立。 ?TCP服務(wù)器進程是被動等待來自TCP客戶端進程的連接請求,因此稱為被動打開連接。

          TCP連接時向TCP服務(wù)器進程發(fā)送TCP連接請求報文段,并進入同步已發(fā)送狀態(tài)。

          • TCP 連接請求報文段首部中的同步位SYN被設(shè)置為1,,表明這是一個tcp連接請求報文段。

          • 序號字段seq被設(shè)置了一個初始值x作為TCP客戶進程所選擇的初始序號。

          由于TCP連接建立是由TCP客戶進程主動發(fā)起的,因此稱為主動打開連接。 請注意TCP規(guī)定SYN被設(shè)置為1的報文段不能攜帶數(shù)據(jù)但要消耗掉一個序號。

          TCP服務(wù)器進程收到TCP連接請求報文段后,如果同意建立連接,則向TCP客戶進程發(fā)送TCP連接請求確認報文段,并進入同步已接收狀態(tài)。

          • 該報文段首部中的同步位SYN和確認位ACK 都設(shè)置為1,表明這是一個TCP連接請求。

          • 序號字段seq被設(shè)置了一個初始值y,作為TCP服務(wù)器進程所選擇的初始序號。

          • 確認號字段ack的值被設(shè)置成了x+1,這是對TCP客戶進程所選擇的初始序號seq的確認。

          請注意這個報文段也不能攜帶數(shù)據(jù),因為它是SYN被設(shè)置為一的報文段但同樣要消耗掉一個序號。

          TCP客戶進程收到TCP連接請求確認報文段后,還要向TCP服務(wù)器進程發(fā)送一個普通的TCP 確認報文段并進入連接已建立狀態(tài)。

          • 該報文段首部中的確認位ACK被設(shè)置為1,表明這是一個普通的TCP確認報文段 。

          • 序號字段seq 被設(shè)置為x+1,這是因為TCP客戶進程發(fā)送的第一個TCP報文段的序號為x,并且不攜帶數(shù)據(jù),因此第二個報文段的序號為x +1。

          • 確認號字段ack被設(shè)置為y + 1,這是對TCP服務(wù)器進程所選擇的初始序號的確認。

          請注意TCP規(guī)定,普通的TCP確認報文段可以攜帶數(shù)據(jù)。但如果不攜帶數(shù)據(jù)則不消耗序號,在這種情況下所發(fā)送的下一個數(shù)據(jù)報文段的序號仍是x + 1。

          TCP服務(wù)器進程收到該確認報文段后也進入連接已建立狀態(tài),現(xiàn)在TCP雙方都進入了連接已建立狀態(tài),他們可以基于已建立好的TCP連接進行可靠的數(shù)據(jù)傳輸了。

          5、三次握手文字總結(jié)

          三次握手是 TCP 連接的建立過程。在握手之前,主動打開連接的客戶端結(jié)束 CLOSE 階段,被動打開的服務(wù)器也結(jié)束 CLOSE 階段,并進入 LISTEN 階段。隨后進入三次握手階段:

          ① 首先客戶端向服務(wù)器發(fā)送一個 SYN 包,并等待服務(wù)器確認,其中:

          • 標志位為 SYN,表示請求建立連接;

          • 序號為 Seq = x(x 一般取隨機數(shù));

          • 隨后客戶端進入 SYN-SENT 階段。

          ② 服務(wù)器接收到客戶端發(fā)來的 SYN 包后,對該包進行確認后結(jié)束 LISTEN 階段,并返回一段 TCP 報文,其中:

          • 標志位為 SYN 和 ACK,表示確認客戶端的報文 Seq 序號有效,服務(wù)器能正常接收客戶端發(fā)送的數(shù)據(jù),并同意創(chuàng)建新連接;

          • 序號為 Seq = y;

          • 確認號為 Ack = x + 1,表示收到客戶端的序號 Seq 并將其值加 1 作為自己確認號 Ack 的值,隨后服務(wù)器端進入 SYN-RECV 階段。

          ③ 客戶端接收到發(fā)送的 SYN + ACK 包后,明確了從客戶端到服務(wù)器的數(shù)據(jù)傳輸是正常的,從而結(jié)束 SYN-SENT 階段。并返回最后一段報文。其中:

          • 標志位為 ACK,表示確認收到服務(wù)器端同意連接的信號;

          • 序號為 Seq = x + 1,表示收到服務(wù)器端的確認號 Ack,并將其值作為自己的序號值;

          • 確認號為 Ack= y + 1,表示收到服務(wù)器端序號 seq,并將其值加 1 作為自己的確認號 Ack 的值。

          • 隨后客戶端進入 ESTABLISHED。

          當(dāng)服務(wù)器端收到來自客戶端確認收到服務(wù)器數(shù)據(jù)的報文后,得知從服務(wù)器到客戶端的數(shù)據(jù)傳輸是正常的,從而結(jié)束 SYN-RECV 階段,進入 ESTABLISHED 階段,從而完成三次握手。

          5、是否可以使用“兩報文握手”建立連接?

          為什么TCP客戶進程最后還要發(fā)送一個普通的TCP確認報文段?

          考慮這樣一種情況,TCP客戶進程發(fā)出一個TCP連接請求報文段,但該報文段在某些網(wǎng)絡(luò)節(jié)點長時間滯留了,這必然會造成該報文段的超時重傳。

          假設(shè)重傳的報文段被TCP服務(wù)器進程正常接收,TCP服務(wù)器進程給TCP客戶進程發(fā)送一個TCP連接請求確認報文段,并進入連接已建立狀態(tài)。

          請注意,由于我們改為兩報文握手,因此TCP服務(wù)器進程發(fā)送完TCP連接請求確認報文段后,進入的是連接已建立狀態(tài),而不像三報文握手那樣進入同步已接收狀態(tài),TCP服務(wù)器進程并等待TCP客戶進程發(fā)來針對TCP連接請求確認報文段的普通確認報文段。TCP客戶進程收到TCP連接請求確認報文段后進入TCP連接已建立狀態(tài),但不會給TCP服務(wù)器進程發(fā)送針對該報文段的普通確認報文段。

          現(xiàn)在,TCP雙方都處于連接已建立狀態(tài),他們可以相互傳輸數(shù)據(jù),之后可以通過四報文揮手來釋放連接,TCP雙方都進入了關(guān)閉狀態(tài)。

          一段時間后,之前滯留在網(wǎng)絡(luò)中的那個失效的TCP連接請求報文段到達了TCP服務(wù)器進程,TCP 服務(wù)器進程會誤認為這是TCP客戶進程又發(fā)起了一個新的TCP連接請求,于是給TCP客戶進程發(fā)送TCP連接請求確認報文段并進入連接已建立狀態(tài)。

          該報文段到達TCP客戶進程,由于TCP客戶進程并沒有發(fā)起新的TCP連接請求,并且處于關(guān)閉狀態(tài),因此不會理會該報文段。

          但TCP服務(wù)器進程已進入了連接已建立狀態(tài),他認為新的TCP連接已建立好了,并一直等待TCP客戶進程發(fā)來數(shù)據(jù)。這將白白浪費TCP服務(wù)器進程所在主機的很多資源。

          綜上所述,采用三報文握手,而不是兩報文握手來建立TCP連接,是為了防止已失效的連接請求報文段突然又傳送到了TCP服務(wù)器進程因而導(dǎo)致錯誤。


          6、兩次握手文字總結(jié)

          三次握手的主要目的是確認自己和對方的發(fā)送和接收都是正常的,從而保證了雙方能夠進行可靠通信。若采用兩次握手,當(dāng)?shù)诙挝帐趾缶徒⑦B接的話,此時客戶端知道服務(wù)器能夠正常接收到自己發(fā)送的數(shù)據(jù),而服務(wù)器并不知道客戶端是否能夠收到自己發(fā)送的數(shù)據(jù)。

          我們知道網(wǎng)絡(luò)往往是非理想狀態(tài)的(存在丟包和延遲),當(dāng)客戶端發(fā)起創(chuàng)建連接的請求時,如果服務(wù)器直接創(chuàng)建了這個連接并返回包含 SYN、ACK 和 Seq 等內(nèi)容的數(shù)據(jù)包給客戶端,這個數(shù)據(jù)包因為網(wǎng)絡(luò)傳輸?shù)脑騺G失了,丟失之后客戶端就一直接收不到返回的數(shù)據(jù)包。由于客戶端可能設(shè)置了一個超時時間,一段時間后就關(guān)閉了連接建立的請求,再重新發(fā)起新的請求,而服務(wù)器端是不知道的,如果沒有第三次握手告訴服務(wù)器客戶端能否收到服務(wù)器傳輸?shù)臄?shù)據(jù)的話,服務(wù)器端的端口就會一直開著,等到客戶端因超時重新發(fā)出請求時,服務(wù)器就會重新開啟一個端口連接。長此以往, 這樣的端口越來越多,就會造成服務(wù)器開銷的浪費。


          作者:林深時不見鹿
          鏈接:https://juejin.cn/post/7028003193502040072
          來源:稀土掘金
          著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。



          瀏覽 34
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  午夜精品一区二区三区国产静华液 | 在线观看黄色片 | 国产婷婷精品视频 | 国产日韩欧美色图 | 欧美淫淫 |