天天看點

用大白話講什麼是tcp三次握手

什麼是tcp的三次握手,我們先以大白話形象來解釋下,以生活中最常見的例子來來講講三次握手:

打電話的生活執行個體:

我:老王,你是不是在隔壁呀?

老王:你怎麼知道我在隔壁呀?

我:老王,你除了能在隔壁,你還能在哪?
           

從上面這段對話,我們能确定,老王聽到了我說的話,我也聽到了老王說的話,那麼要确定我和老王之間的對話是否能夠被對方所聽到,就需要經過三次連接配接,這就是三次握手。

那麼三次握手是發生是tcp通訊的什麼時候呢?

每一次TCP連接配接都需要經過三個階段:連接配接建立、資料傳送和連接配接釋放。三次握手就發生在連接配接建立階段。
           

我們可以看看百度百科是如何解釋三次握手的過程:

用大白話講什麼是tcp三次握手

從百度百科的内容我們可以看到,用戶端需要發送内容給伺服器,伺服器也要發送給用戶端,那麼這些資訊是什麼?從哪裡開始發出的呢?

我們一起來看下TCP封包段的首部格式:

用大白話講什麼是tcp三次握手

在三次握手的整個過程中,我們會用到兩個序号和三個标志位

(1)序号:seq序号,占32位,用來辨別從TCP源端向目的端發送的位元組流,發起方發送資料時對此進行标記。
  (2)确認序号:ack序号,占32位,隻有ACK标志位為1時,确認序号字段才有效,ack=seq+1。
  (3)标志位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:
  (A)URG:緊急指針(urgent pointer)有效。
  (B)ACK:确認序号有效。
  (C)PSH:接收方應該盡快将這個封包交給應用層。
  (D)RST:重置連接配接。
  (E)SYN:發起一個新連接配接。
  (F)FIN:釋放一個連接配接。
           

了解了,TCP資料報的資料部分,我們再看看百度百科的解釋:

第一次握手:用戶端發送syn包給伺服器,這個時候syn=j,這個時候,用戶端的狀态進入SYN_SENT狀态,需要等待伺服器确認。(大白話說就是用戶端發了個包給伺服器,我用戶端就處在發送狀态了,但是不知道伺服器有沒有收到,我就需要服務就确認有沒有收到,這個時候用戶端處在SYN_SENT狀态,sent是)

第二次握手:伺服器收到syn包,确認了用戶端的syn,ack=j+1,,同時伺服器也給用戶端發送一個syn包(syn=k),注意,伺服器發給用戶端的是SYN+ACK包,此時伺服器進入SYN_RECV狀态(大白話說就是,我伺服器收到了你用戶端發來的資訊了,收到之後,ack值就要變為j+1,為了讓你用戶端知道我伺服器收到了你的資訊,我先回複你的SYN,然後我再加上我自己想對你說的話一起發送給你ACK,是以發送的是SYN_ACK包,然後我伺服器就等着你用戶端給我回應,就處在SYN_RECV狀态)

第三次握手:用戶端收到伺服器的SYN+ACK包,向伺服器發送确認包ACK(ack=k+1),此包發送完畢,用戶端和伺服器進入ESTABLISHED(established中文意思是已建立))

至于為什麼是三次握手,不是四次握手?

三次握手,是确定用戶端與伺服器是否确定連接配接的最小值,還不明白為什麼是最小值得話,可以再琢磨琢磨我和老王的對話。

本文純小白瞎寫,經驗不足,還需各位批評指正,博文内容後續還将繼續更新維護。