1. 程式人生 > 其它 >【網路排查】TCP連線都是用TCP協議溝通的嗎?

【網路排查】TCP連線都是用TCP協議溝通的嗎?

TCP 連線都是用 TCP 協議溝通的嗎?

一般來說 TCP 連線是標準的 TCP 三次握手完成的:

  1. 客戶端傳送 SYN;
  2. 服務端收到 SYN 後,回覆 SYN+ACK;
  3. 客戶端收到 SYN+ACK 後,回覆 ACK。

這裡面 SYN 會在兩端各發送一次,表示“我準備好了,可以開始連線了”。ACK 也是兩端各發送了一次,表示“我知道你準備好了,我們開始通訊吧”。

這裡我們可以看到實際上是4個報文。但發了3次,顯然服務端的 SYN 和 ACK 是合併在一起傳送的,就節省了一次傳送。這個在英文裡叫 Piggybacking(搭順風車)。

如果服務端不想接受這次握手,它會怎麼做呢?可能會出現這麼幾種情況:

  1. 不搭理這次連線,就當什麼都沒收到,什麼都沒發生。這種行為,也可以說是“裝聾作啞”。
  2. 給予回覆,明確拒絕。相當於有人伸手過來想握手,你一巴掌拍掉,真的是非常剛了

第一種情況,因為服務端做了“靜默丟包”,也就是雖然收到了 SYN,但是它直接丟棄了,也不給客戶端回覆任何訊息。這也導致了一個問題,就是客戶端無法分清楚這個 SYN 到底是下面哪種情況:

  1. 在網路上丟失了,服務端收不到,自然不會有回覆;
  2. 對端收到了但沒回,就是剛才說的“靜默丟包”;
  3. 對端收到了也回了,但這個回包在網路中丟了。

那麼,從客戶端的角度,對於 SYN 包發出去之後遲遲沒有迴應的情況,它的策略是做重試,而且不止一次。

當不是靜默丟包的情況下,如果我們直接拒絕連線會發生什麼?

抓出來的資料包是這樣的

 

 很意外,居然對端回覆了一個 ICMP 訊息:Destination unreachable (Port unreachable)。這還不是最意外的,我們選中這個報文,進一步看它的詳情,可能會更驚訝:TCP 握手拒絕這個事,竟然可以是 ICMP 報文來達成的。“握手過程用 TCP 協議做溝通

TCP 握手拒絕這個事,竟然可以是 ICMP 報文來達成的。“握手過程用 TCP 協議做溝通

 

 

一般來說 TCP 連線是標準的 TCP 三次握手完成的:客戶端傳送 SYN;服務端收到 SYN 後,回覆 SYN+ACK;客戶端收到 SYN+ACK 後,回覆 ACK。