自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

美團一面:TCP的第三次握手沒有回復,會有什么問題?

開發(fā) 前端
在后端服務中,重試機制和超時處理也非常重要。例如在調(diào)用第三方API時,如果網(wǎng)絡波動導致請求失敗,系統(tǒng)可以通過配置合理的重試策略(如指數(shù)退避、限流等)來提高成功率,同時避免過載。實例:HTTP請求的重試機制、消息隊列的重發(fā)策略等。?

前言

大家好,我是田螺。

有位朋友去美團面試,問了這么一道面試題:TCP的第三次握手沒有回復,會有什么問題?服務器會出現(xiàn)什么現(xiàn)象?

對于這道題,我們?nèi)绾稳セ卮?,才更好呢?如果是我,我會按照這幾個維度:

  • TCP的三次握手過程
  • 第三次握手沒有回復,連接建立不了,講解為什么需要三次握手
  • 第三次握手沒有回復,服務器會出現(xiàn)什么現(xiàn)象?超時重傳機制
  • 第三次握手沒有回復,講解半連接隊列(SYN隊列)和SYN Flood 攻擊
  • TCP 握手,在后端思想的一些相似應用

1. TCP的三次握手過程

圖片圖片

開始客戶端和服務器都處于CLOSED狀態(tài),然后服務端開始監(jiān)聽某個端口,進入LISTEN狀態(tài)

  • 第一次握手(SYN=1, seq=x),發(fā)送完畢后,客戶端進入SYN_SEND狀態(tài)
  • 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1), 發(fā)送完畢后,服務器端進入 SYN_RCVD 狀態(tài)。
  • 第三次握手(ACK=1,ACKnum=y+1),發(fā)送完畢后,客戶端進入 ESTABLISHED 狀態(tài),當服務器端接收到這個包時,也進入 ESTABLISHED 狀態(tài),TCP 握手,即可以開始數(shù)據(jù)傳輸。

2. 第三次握手沒有回復,連接建立不了.

上個小節(jié),我們梳理完TCP三次握手流程,也就是TCP需要三次握手,才能真正建立連接。

如果服務器沒有收到客戶端發(fā)送的第三次握手的ACK確認包,那么從服務器的角度看,這個連接仍處于未完全建立的狀態(tài),不能正式用于數(shù)據(jù)傳輸。

也就是如果沒有第三次握手回復,只有兩次握手,那是不行的。TCP連接,為什么需要三次握手,為什么兩次不行,為什么四次不行?

為了方便理解,我們以談戀愛為例子:兩個人能走到一起,最重要的事情就是相愛,就是我愛你,并且我知道,你也愛我,接下來我們以此來模擬三次握手的過程:

圖片圖片

為什么握手不能是兩次呢?

如果只有兩次握手,女孩子可能就不知道,她的那句我也愛你,男孩子是否收到,戀愛關系就不能愉快展開。

為什么握手不能是四次呢?

因為握手不能是四次呢?因為三次已經(jīng)夠了,三次已經(jīng)能讓雙方都知道:你愛我,我也愛你。而四次就多余了。

3. 第三次握手沒有回復,服務器會出現(xiàn)什么現(xiàn)象?

TCP三次握手:

服務器在收到客戶端的 SYN 報文后,會發(fā)送一個 SYN-ACK 報文并進入 SYN-RECEIVED 狀態(tài)。此時,它正在等待客戶端發(fā)送的 ACK 報文。如果客戶端的 ACK 報文沒有到達服務器,服務器會在 SYN-RECEIVED 狀態(tài)中停留一段時間(通常稱為超時重傳時間)。

也就是說,第三次握手沒有ACK回復,服務器會在 SYN-RECEIVED 狀態(tài)中停留一段時間。然后超時重傳。

然后如果沒有收到客戶端的 ACK 報文,它會重新發(fā)送 SYN-ACK 報文。

當然,重試肯定有次數(shù)限制的,如果在重傳了多次之后,服務器仍然沒有收到客戶端的 ACK 報文,服務器會認為連接失敗,并放棄這次連接。此時,服務器會進入 CLOSED 狀態(tài),釋放資源。

超時重傳

TCP 為了實現(xiàn)可靠傳輸,實現(xiàn)了重傳機制。最基本的重傳機制,就是超時重傳,即在發(fā)送數(shù)據(jù)報文時,設定一個定時器,每間隔一段時間,沒有收到對方的ACK確認應答報文,就會重發(fā)該報文。

這個間隔時間,一般設置為多少呢?我們先來看下什么叫RTT(Round-Trip Time,往返時間)。

圖片圖片

RTT就是,一個數(shù)據(jù)包從發(fā)出去到回來的時間,即數(shù)據(jù)包的一次往返時間。超時重傳時間,就是Retransmission Timeout ,簡稱RTO。

RTO設置多久呢?

  • 如果RTO比較小,那很可能數(shù)據(jù)都沒有丟失,就重發(fā)了,這會導致網(wǎng)絡阻塞,會導致更多的超時出現(xiàn)。
  • 如果RTO比較大,等到花兒都謝了還是沒有重發(fā),那效果就不好了。

一般情況下,RTO略大于RTT,效果是最好的。一些小伙伴會問,超時時間有沒有計算公式呢?有的!有個標準方法算RTO的公式,也叫Jacobson / Karels 算法。我們一起來看下計算RTO的公式

  1. 先計算SRTT(計算平滑的RTT)
SRTT = (1 - α) * SRTT + α * RTT  //求 SRTT 的加權平均
  1. 再計算RTTVAR (round-trip time variation)
RTTVAR = (1 - β) * RTTVAR + β * (|RTT - SRTT|) //計算 SRTT 與真實值的差距
  1. 最終的RTO
RTO = μ * SRTT + ? * RTTVAR  =  SRTT + 4·RTTVAR

其中,α = 0.125,β = 0.25, μ = 1,? = 4,這些參數(shù)都是大量結果得出的最優(yōu)參數(shù)。

4. 半連接隊列和SYN Flood 攻擊

在TCP的三次握手中,服務器發(fā)送SYN+ACK包之后,會等待客戶端的ACK。如果ACK沒有按時到達,可能是因為網(wǎng)絡丟包或是惡意攻擊(如SYN Flood攻擊)

如果是網(wǎng)絡不穩(wěn)定,導致的網(wǎng)絡丟包,一般我們重試都會成功的。還有個可能的原因,就是SYN Flood攻擊。

SYN Flood是一種典型的DoS (Denial of Service,拒絕服務) 攻擊,它在短時間內(nèi),偽造不存在的IP地址,向服務器大量發(fā)起SYN報文。當服務器回復SYN+ACK報文后,不會收到ACK回應報文,導致服務器上建立大量的半連接隊列,半連接隊列滿了,這就無法處理正常的TCP請求啦。

5. TCP 三次握手的一些后端思想應用

TCP三次握手,背后蘊含的一些思想是可以應用到后端系統(tǒng)設計中的。

5.1 狀態(tài)確認思想

比如,TCP三次握手確保雙方都知道對方準備好進行通信,并且雙方都能確認自己的消息被對方收到。這個機制本質(zhì)上是一種狀態(tài)同步和確認機制。

這種機制可以應用于分布式系統(tǒng)的節(jié)點間通信或客戶端與服務端的連接建立。例如,在微服務之間的通信中,可以在建立連接前,進行雙方的狀態(tài)確認或健康檢查,確保后續(xù)的通信是可靠的。

5.2 超時重試機制

再比如,TCP三次握手中,服務端會等待客戶端的ACK確認包,如果沒有收到,會根據(jù)一定策略進行重試,這背后是重試與超時的機制。

在后端服務中,重試機制和超時處理也非常重要。例如在調(diào)用第三方API時,如果網(wǎng)絡波動導致請求失敗,系統(tǒng)可以通過配置合理的重試策略(如指數(shù)退避、限流等)來提高成功率,同時避免過載。實例:HTTP請求的重試機制、消息隊列的重發(fā)策略等。

責任編輯:武曉燕 來源: 撿田螺的小男孩
相關推薦

2022-10-19 14:08:42

SYNTCP報文

2023-09-07 16:46:54

TCP數(shù)據(jù)傳遞

2022-08-27 13:50:44

TCP服務端函數(shù)

2022-09-12 15:55:57

TCP函數(shù)程序

2022-10-10 07:34:36

TCP三次握手區(qū)塊鏈

2014-07-24 10:16:11

高教華為

2022-07-25 07:07:35

TCP客戶端服務器

2019-12-12 10:36:43

TCPSYNIP

2020-12-08 06:34:16

TCP握手SYN 報文

2015-10-13 09:42:52

TCP網(wǎng)絡協(xié)議

2024-01-12 08:23:11

TCPACK服務器

2024-07-10 12:00:42

2021-12-13 06:23:14

TCP三次握手網(wǎng)絡

2023-10-24 15:22:09

TCPUDP

2021-04-30 13:32:17

TCP三次握手網(wǎng)絡協(xié)議

2024-10-16 08:38:37

TCP編號信息

2024-10-09 20:54:16

2022-07-07 09:00:17

TCP 連接HTTP 協(xié)議

2021-01-29 06:11:08

TCP通信三次握手

2021-05-18 12:27:40

TCP控制協(xié)議
點贊
收藏

51CTO技術棧公眾號