www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 公眾號精選 > 程序喵大人
[導(dǎo)讀]前言TCP協(xié)議是大廠面試必問的知識點。整理了15道非常經(jīng)典的TCP面試題,希望大家都找到理想的offer呀公眾號:撿田螺的小男孩1.?講下TCP三次握手流程開始客戶端和服務(wù)器都處于CLOSED狀態(tài),然后服務(wù)端開始監(jiān)聽某個端口,進入LISTEN狀態(tài)第一次握手(SYN=1,seq=x...

前言

TCP協(xié)議是大廠面試必問的知識點。整理了15道非常經(jīng)典的TCP面試題,希望大家都找到理想的offer呀

  • 公眾號:撿田螺的小男孩

1. ?講下TCP三次握手流程

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

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

2.TCP握手為什么是三次,不能是兩次?不能是四次?

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

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

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

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

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

3. 講下TCP四次揮手過程

  1. 第一次揮手(FIN=1,seq=u),發(fā)送完畢后,客戶端進入FIN_WAIT_1 狀態(tài)
  2. 第二次揮手(ACK=1,ack=u 1,seq =v),發(fā)送完畢后,服務(wù)器端進入CLOSE_WAIT 狀態(tài),客戶端接收到這個確認包之后,進入 FIN_WAIT_2 狀態(tài)
  3. 第三次揮手(FIN=1,ACK1,seq=w,ack=u 1),發(fā)送完畢后,服務(wù)器端進入LAST_ACK 狀態(tài),等待來自客戶端的最后一個ACK。
  4. 第四次揮手(ACK=1,seq=u 1,ack=w 1),客戶端接收到來自服務(wù)器端的關(guān)閉請求,發(fā)送一個確認包,并進入 TIME_WAIT狀態(tài),等待了某個固定時間(兩個最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,沒有收到服務(wù)器端的 ACK ,認為服務(wù)器端已經(jīng)正常關(guān)閉連接,于是自己也關(guān)閉連接,進入 CLOSED 狀態(tài)。服務(wù)器端接收到這個確認包之后,關(guān)閉連接,進入 CLOSED 狀態(tài)。

4. TCP揮手為什么需要四次呢?

舉個例子吧!

小明和小紅打電話聊天,通話差不多要結(jié)束時,小紅說“我沒啥要說的了”,小明回答“我知道了”。但是小明可能還會有要說的話,小紅不能要求小明跟著自己的節(jié)奏結(jié)束通話,于是小明可能又嘰嘰歪歪說了一通,最后小明說“我說完了”,小紅回答“知道了”,這樣通話才算結(jié)束。

5. TIME-WAIT 狀態(tài)為什么需要等待 2MSL

2MSL,2 Maximum Segment Lifetime,即兩個最大段生命周期

  • 1個 MSL 保證四次揮手中主動關(guān)閉方最后的 ACK 報文能最終到達對端
  • 1個 MSL 保證對端沒有收到 ACK 那么進行重傳的 FIN 報文能夠到達

6.TCP 和 UDP 的區(qū)別

  1. TCP面向連接((如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接。
  2. TCP要求安全性,提供可靠的服務(wù),通過TCP連接傳送的數(shù)據(jù),不丟失、不重復(fù)、安全可靠。而UDP盡最大努力交付,即不保證可靠交付。
  3. TCP是點對點連接的,UDP一對一,一對多,多對多都可以
  4. TCP傳輸效率相對較低,而UDP傳輸效率高,它適用于對高速傳輸和實時性有較高的通信或廣播通信。
  5. TCP適合用于網(wǎng)頁,郵件等;UDP適合用于視頻,語音廣播等
  6. TCP面向字節(jié)流,UDP面向報文

7. TCP報文首部有哪些字段,說說其作用

  • 16位端口號:源端口號,主機該報文段是來自哪里;目標端口號,要傳給哪個上層協(xié)議或應(yīng)用程序
  • 32位序號:一次TCP通信(從TCP連接建立到斷開)過程中某一個傳輸方向上的字節(jié)流的每個字節(jié)的編號。
  • 32位確認號:用作對另一方發(fā)送的tcp報文段的響應(yīng)。其值是收到的TCP報文段的序號值加1。
  • 4位頭部長度:表示tcp頭部有多少個32bit字(4字節(jié))。因為4位最大能標識15,所以TCP頭部最長是60字節(jié)。
  • 6位標志位:URG(緊急指針是否有效),ACk(表示確認號是否有效),PSH(緩沖區(qū)尚未填滿),RST(表示要求對方重新建立連接),SYN(建立連接消息標志接),F(xiàn)IN(表示告知對方本端要關(guān)閉連接了)
  • 16位窗口大小:是TCP流量控制的一個手段。這里說的窗口,指的是接收通告窗口。它告訴對方本端的TCP接收緩沖區(qū)還能容納多少字節(jié)的數(shù)據(jù),這樣對方就可以控制發(fā)送數(shù)據(jù)的速度。
  • 16位校驗和:由發(fā)送端填充,接收端對TCP報文段執(zhí)行CRC算法以檢驗TCP報文段在傳輸過程中是否損壞。注意,這個校驗不僅包括TCP頭部,也包括數(shù)據(jù)部分。這也是TCP可靠傳輸?shù)囊粋€重要保障。
  • 16位緊急指針:一個正的偏移量。它和序號字段的值相加表示最后一個緊急數(shù)據(jù)的下一字節(jié)的序號。因此,確切地說,這個字段是緊急指針相對當前序號的偏移,不妨稱之為緊急偏移。TCP的緊急指針是發(fā)送端向接收端發(fā)送緊急數(shù)據(jù)的方法。

8. TCP 是如何保證可靠性的

  • 首先,TCP的連接是基于三次握手,而斷開則是四次揮手。確保連接和斷開的可靠性。
  • 其次,TCP的可靠性,還體現(xiàn)在有狀態(tài);TCP會記錄哪些數(shù)據(jù)發(fā)送了,哪些數(shù)據(jù)被接受了,哪些沒有被接受,并且保證數(shù)據(jù)包按序到達,保證數(shù)據(jù)傳輸不出差錯。
  • 再次,TCP的可靠性,還體現(xiàn)在可控制。它有報文校驗、ACK應(yīng)答、超時重傳(發(fā)送方)、失序數(shù)據(jù)重傳(接收方)、丟棄重復(fù)數(shù)據(jù)、流量控制(滑動窗口)和擁塞控制等機制。

9. TCP 重傳機制

超時重傳

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

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

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

RTO設(shè)置多久呢?

  • 如果RTO比較小,那很可能數(shù)據(jù)都沒有丟失,就重發(fā)了,這會導(dǎo)致網(wǎng)絡(luò)阻塞,會導(dǎo)致更多的超時出現(xiàn)。
  • 如果RTO比較大,等到花兒都謝了還是沒有重發(fā),那效果就不好了。
一般情況下,RTO略大于RTT,效果是最好的。一些小伙伴會問,超時時間有沒有計算公式呢?有的!有個標準方法算RTO的公式,也叫Jacobson / Karels 算法。我們一起來看下計算RTO的公式

1. 先計算SRTT(計算平滑的RTT)

SRTT?=?(1?-?α)?*?SRTT? ?α?*?RTT??//求?SRTT?的加權(quán)平均
2. 再計算RTTVAR (round-trip time variation)

RTTVAR?=?(1?-?β)?*?RTTVAR? ?β?*?(|RTT?-?SRTT|)?//計算?SRTT?與真實值的差距
3. 最終的RTO

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

但是,超時重傳會有這些缺點:

  • 當一個報文段丟失時,會等待一定的超時周期然后才重傳分組,增加了端到端的時延。
  • 當一個報文段丟失時,在其等待超時的過程中,可能會出現(xiàn)這種情況:其后的報文段已經(jīng)被接收端接收但卻遲遲得不到確認,發(fā)送端會認為也丟失了,從而引起不必要的重傳,既浪費資源也浪費時間。
并且,TCP有個策略,就是超時時間間隔會加倍。超時重傳需要等待很長時間。因此,還可以使用快速重傳機制。

快速重傳

快速重傳機制,它不以時間驅(qū)動,而是以數(shù)據(jù)驅(qū)動。它基于接收端的反饋信息來引發(fā)重傳。

一起來看下快速重傳流程:

快速重傳流程
發(fā)送端發(fā)送了 1,2,3,4,5,6 份數(shù)據(jù):

  • 第一份 Seq=1 先送到了,于是就 Ack 回 2;
  • 第二份 Seq=2 也送到了,假設(shè)也正常,于是ACK 回 3;
  • 第三份 Seq=3 由于網(wǎng)絡(luò)等其他原因,沒送到;
  • 第四份 Seq=4 也送到了,但是因為Seq3沒收到。所以ACK回3;
  • 后面的 Seq=4,5的也送到了,但是ACK還是回復(fù)3,因為Seq=3沒收到。
  • 發(fā)送端連著收到三個重復(fù)冗余ACK=3的確認(實際上是4個,但是前面一個是正常的ACK,后面三個才是重復(fù)冗余的),便知道哪個報文段在傳輸過程中丟失了,于是在定時器過期之前,重傳該報文段。
  • 最后,接收到收到了 Seq3,此時因為 Seq=4,5,6都收到了,于是ACK回7.
快速重傳還可能會有個問題:ACK只向發(fā)送端告知最大的有序報文段,到底是哪個報文丟失了呢?并不確定!那到底該重傳多少個包呢?

是重傳 Seq3 呢?還是重傳 Seq3、Seq4、Seq5、Seq6 呢?因為發(fā)送端并不清楚這三個連續(xù)的 ACK3 是誰傳回來的。

帶選擇確認的重傳(SACK)

為了解決快速重傳的問題:應(yīng)該重傳多少個包? TCP提供了SACK方法(帶選擇確認的重傳,Selective Acknowledgment)。

SACK機制就是,在快速重傳的基礎(chǔ)上,接收端返回最近收到的報文段的序列號范圍,這樣發(fā)送端就知道接收端哪些數(shù)據(jù)包沒收到,醬紫就很清楚該重傳哪些數(shù)據(jù)包啦。SACK標記是加在TCP頭部選項字段里面的。

SACK機制
如上圖中,發(fā)送端收到了三次同樣的ACK=30的確認報文,于是就會觸發(fā)快速重發(fā)機制,通過SACK信息發(fā)現(xiàn)只有30~39這段數(shù)據(jù)丟失,于是重發(fā)時就只選擇了這個30~39的TCP報文段進行重發(fā)。

D-SACK

D-SACK,即Duplicate SACK(重復(fù)SACK),在SACK的基礎(chǔ)上做了一些擴展,,主要用來告訴發(fā)送方,有哪些數(shù)據(jù)包自己重復(fù)接受了。DSACK的目的是幫助發(fā)送方判斷,是否發(fā)生了包失序、ACK丟失、包重復(fù)或偽重傳。讓TCP可以更好的做網(wǎng)絡(luò)流控。來看個圖吧:

D-SACK簡要流程

10. 聊聊TCP的滑動窗口

TCP 發(fā)送一個數(shù)據(jù),需要收到確認應(yīng)答,才會發(fā)送下一個數(shù)據(jù)。這樣有個缺點,就是效率會比較低。

這就好像我們面對面聊天,你說完一句,我應(yīng)答后,你才會說下一句。那么,如果我在忙其他事情,沒有能夠及時回復(fù)你。你說完一句后,要等到我忙完回復(fù)你,你才說下句,這顯然很不現(xiàn)實。

為了解決這個問題,TCP引入了窗口,它是操作系統(tǒng)開辟的一個緩存空間。窗口大小值表示無需等待確認應(yīng)答,而可以繼續(xù)發(fā)送數(shù)據(jù)的最大值。

TCP頭部有個字段叫win,也即那個16位的窗口大小,它告訴對方本端的TCP接收緩沖區(qū)還能容納多少字節(jié)的數(shù)據(jù),這樣對方就可以控制發(fā)送數(shù)據(jù)的速度,從而達到流量控制的目的。

通俗點講,就是接受方每次收到數(shù)據(jù)包,在發(fā)送確認報文的時候,同時告訴發(fā)送方,自己的緩存區(qū)還有多少空余空間,緩沖區(qū)的空余空間,我們就稱之為接受窗口大小。這就是win。

TCP 滑動窗口分為兩種: 發(fā)送窗口和接收窗口。發(fā)送端的滑動窗口包含四大部分,如下:

  • 已發(fā)送且已收到ACK確認
  • 已發(fā)送但未收到ACK確認
  • 未發(fā)送但可以發(fā)送
  • 未發(fā)送也不可以發(fā)送
  • 虛線矩形框,就是發(fā)送窗口。
  • SND.WND: 表示發(fā)送窗口的大小,上圖虛線框的格子數(shù)就是14個。
  • SND.UNA: 一個絕對指針,它指向的是已發(fā)送但未確認的第一個字節(jié)的序列號。
  • SND.NXT:下一個發(fā)送的位置,它指向未發(fā)送但可以發(fā)送的第一個字節(jié)的序列號。
接收方的滑動窗口包含三大部分,如下:

  • 已成功接收并確認
  • 未收到數(shù)據(jù)但可以接收
  • 未收到數(shù)據(jù)并不可以接收的數(shù)據(jù)
  • 虛線矩形框,就是接收窗口。
  • REV.WND: 表示接收窗口的大小,上圖虛線框的格子就是9個。
  • REV.NXT:下一個接收的位置,它指向未收到但可以接收的第一個字節(jié)的序列號。

11. 聊聊TCP的流量控制

TCP三次握手,發(fā)送端和接收端進入到ESTABLISHED狀態(tài),它們即可以愉快地傳輸數(shù)據(jù)啦。

但是發(fā)送端不能瘋狂地向接收端發(fā)送數(shù)據(jù),因為接收端接收不過來的話,接收方只能把處理不過來的數(shù)據(jù)存在緩存區(qū)里。如果緩存區(qū)都滿了,發(fā)送方還在瘋狂發(fā)送數(shù)據(jù)的話,接收方只能把收到的數(shù)據(jù)包丟掉,這就浪費了網(wǎng)絡(luò)資源啦。

TCP 提供一種機制可以讓發(fā)送端根據(jù)接收端的實際接收能力控制發(fā)送的數(shù)據(jù)量,這就是流量控制。

TCP通過滑動窗口來控制流量,我們看下流量控制的簡要流程吧:

首先雙方三次握手,初始化各自的窗口大小,均為 400 個字節(jié)。

TCP的流量控制
  1. 假如當前發(fā)送方給接收方發(fā)送了200個字節(jié),那么,發(fā)送方的SND.NXT會右移200個字節(jié),也就是說當前的可用窗口減少了200 個字節(jié)。
  2. 接受方收到后,放到緩沖隊列里面,REV.WND =400-200=200字節(jié),所以win=200字節(jié)返回給發(fā)送方。接收方會在 ACK 的報文首部帶上縮小后的滑動窗口200字節(jié)
  3. 發(fā)送方又發(fā)送200字節(jié)過來,200字節(jié)到達,繼續(xù)放到緩沖隊列。不過這時候,由于大量負載的原因,接受方處理不了這么多字節(jié),只能處理100字節(jié),剩余的100字節(jié)繼續(xù)放到緩沖隊列。這時候,REV.WND = 400-200-100=100字節(jié),即win=100返回發(fā)送方。
  4. 發(fā)送方繼續(xù)干活,發(fā)送100字節(jié)過來,這時候,接受窗口win變?yōu)?。
  5. 發(fā)送方停止發(fā)送,開啟一個定時任務(wù),每隔一段時間,就去詢問接受方,直到win大于0,才繼續(xù)開始發(fā)送。

12. TCP的擁塞控制

擁塞控制是作用于網(wǎng)絡(luò)的,防止過多的數(shù)據(jù)包注入到網(wǎng)絡(luò)中,避免出現(xiàn)網(wǎng)絡(luò)負載過大的情況。它的目標主要是最大化利用網(wǎng)絡(luò)上瓶頸鏈路的帶寬。它跟流量控制又有什么區(qū)別呢?流量控制是作用于接收者的,根據(jù)接收端的實際接收能力控制發(fā)送速度,防止分組丟失的。

我們可以把網(wǎng)絡(luò)鏈路比喻成一根水管,如果我們想最大化利用網(wǎng)絡(luò)來傳輸數(shù)據(jù),那就是盡快讓水管達到最佳充滿狀態(tài)。

發(fā)送方維護一個擁塞窗口cwnd(congestion window) 的變量,用來估算在一段時間內(nèi)這條鏈路(水管)可以承載和運輸?shù)臄?shù)據(jù)(水)的數(shù)量。它大小代表著網(wǎng)絡(luò)的擁塞程度,并且是動態(tài)變化的,但是為了達到最大的傳輸效率,我們該如何知道這條水管的運送效率是多少呢?

一個比較簡單的方法就是不斷增加傳輸?shù)乃?,直到水管快要爆裂為止(對?yīng)到網(wǎng)絡(luò)上就是發(fā)生丟包),用 TCP 的描述就是:

只要網(wǎng)絡(luò)中沒有出現(xiàn)擁塞,擁塞窗口的值就可以再增大一些,以便把更多的數(shù)據(jù)包發(fā)送出去,但只要網(wǎng)絡(luò)出現(xiàn)擁塞,擁塞窗口的值就應(yīng)該減小一些,以減少注入到網(wǎng)絡(luò)中的數(shù)據(jù)包數(shù)。

實際上,擁塞控制主要有這幾種常用算法

  • 慢啟動
  • 擁塞避免
  • 擁塞發(fā)生
  • 快速恢復(fù)

慢啟動算法

慢啟動算法,表面意思就是,別急慢慢來。它表示TCP建立連接完成后,一開始不要發(fā)送大量的數(shù)據(jù),而是先探測一下網(wǎng)絡(luò)的擁塞程度。由小到大逐漸增加擁塞窗口的大小,如果沒有出現(xiàn)丟包,每收到一個ACK,就將擁塞窗口cwnd大小就加1(單位是MSS)每輪次發(fā)送窗口增加一倍,呈指數(shù)增長,如果出現(xiàn)丟包,擁塞窗口就減半,進入擁塞避免階段。

  • TCP連接完成,初始化cwnd = 1,表明可以傳一個MSS單位大小的數(shù)據(jù)。
  • 每當收到一個ACK,cwnd就加一;
  • 每當過了一個RTT,cwnd就增加一倍; 呈指數(shù)讓升
為了防止cwnd增長過大引起網(wǎng)絡(luò)擁塞,還需設(shè)置一個慢啟動閥值ssthresh(slow start threshold)狀態(tài)變量。當cwnd到達該閥值后,就好像水管被關(guān)小了水龍頭一樣,減少擁塞狀態(tài)。即當cwnd >ssthresh時,進入了擁塞避免算法。

擁塞避免算法

一般來說,慢啟動閥值ssthresh是65535字節(jié),cwnd到達慢啟動閥值

  • 每收到一個ACK時,cwnd = cwnd 1/cwnd
  • 當每過一個RTT時,cwnd = cwnd 1
顯然這是一個線性上升的算法,避免過快導(dǎo)致網(wǎng)絡(luò)擁塞問題。

擁塞發(fā)生

當網(wǎng)絡(luò)擁塞發(fā)生丟包時,會有兩種情況:

  • RTO超時重傳
  • 快速重傳
如果是發(fā)生了RTO超時重傳,就會使用擁塞發(fā)生算法

  • 慢啟動閥值sshthresh = ?cwnd /2
  • cwnd 重置為 1
  • 進入新的慢啟動過程
這真的是辛辛苦苦幾十年,一朝回到解放前。其實還有更好的處理方式,就是快速重傳。發(fā)送方收到3個連續(xù)重復(fù)的ACK時,就會快速地重傳,不必等待RTO超時再重傳。

image.png
慢啟動閥值ssthresh 和 cwnd 變化如下:

  • 擁塞窗口大小 cwnd = cwnd/2
  • 慢啟動閥值 ssthresh = cwnd
  • 進入快速恢復(fù)算法

快速恢復(fù)

快速重傳和快速恢復(fù)算法一般同時使用??焖倩謴?fù)算法認為,還有3個重復(fù)ACK收到,說明網(wǎng)絡(luò)也沒那么糟糕,所以沒有必要像RTO超時那么強烈。

正如前面所說,進入快速恢復(fù)之前,cwnd 和 sshthresh已被更新:

-?cwnd?=?cwnd?/2
-?sshthresh?=?cwnd
然后,真正的快速算法如下:

  • cwnd = sshthresh ? 3
  • 重傳重復(fù)的那幾個ACK(即丟失的那幾個數(shù)據(jù)包)
  • 如果再收到重復(fù)的 ACK,那么 cwnd = cwnd 1
  • 如果收到新數(shù)據(jù)的 ACK 后, cwnd = sshthresh。因為收到新數(shù)據(jù)的 ACK,表明恢復(fù)過程已經(jīng)結(jié)束,可以再次進入了擁塞避免的算法了。

13. 半連接隊列和 SYN Flood 攻擊的關(guān)系

TCP進入三次握手前,服務(wù)端會從CLOSED狀態(tài)變?yōu)?strong>LISTEN狀態(tài),同時在內(nèi)部創(chuàng)建了兩個隊列:半連接隊列(SYN隊列)和全連接隊列(ACCEPT隊列)。

什么是半連接隊列(SYN隊列) 呢? 什么是全連接隊列(ACCEPT隊列) 呢?回憶下TCP三次握手的圖:

三次握手
  • TCP三次握手時,客戶端發(fā)送SYN到服務(wù)端,服務(wù)端收到之后,便回復(fù)ACK和SYN,狀態(tài)由LISTEN變?yōu)镾YN_RCVD,此時這個連接就被推入了SYN隊列,即半連接隊列。
  • 當客戶端回復(fù)ACK, 服務(wù)端接收后,三次握手就完成了。這時連接會等待被具體的應(yīng)用取走,在被取走之前,它被推入ACCEPT隊列,即全連接隊列。
SYN Flood是一種典型的DoS (Denial of Service,拒絕服務(wù)) 攻擊,它在短時間內(nèi),偽造不存在的IP地址,向服務(wù)器大量發(fā)起SYN報文。當服務(wù)器回復(fù)SYN ACK報文后,不會收到ACK回應(yīng)報文,導(dǎo)致服務(wù)器上建立大量的半連接半連接隊列滿了,這就無法處理正常的TCP請求啦。

主要有 syn cookieSYN Proxy防火墻等方案應(yīng)對。

  • syn cookie:在收到SYN包后,服務(wù)器根據(jù)一定的方法,以數(shù)據(jù)包的源地址、端口等信息為參數(shù)計算出一個cookie值作為自己的SYNACK包的序列號,回復(fù)SYN ACK后,服務(wù)器并不立即分配資源進行處理,等收到發(fā)送方的ACK包后,重新根據(jù)數(shù)據(jù)包的源地址、端口計算該包中的確認序列號是否正確,如果正確則建立連接,否則丟棄該包。

  • SYN Proxy防火墻:服務(wù)器防火墻會對收到的每一個SYN報文進行代理和回應(yīng),并保持半連接。等發(fā)送方將ACK包返回后,再重新構(gòu)造SYN包發(fā)到服務(wù)器,建立真正的TCP連接。

14. Nagle 算法與延遲確認

Nagle算法

如果發(fā)送端瘋狂地向接收端發(fā)送很小的包,比如就1個字節(jié),那么親愛的小伙伴,你們覺得會有什么問題呢?

TCP/IP協(xié)議中,無論發(fā)送多少數(shù)據(jù),總是要在數(shù)據(jù)前面加上協(xié)議頭,同時,對方接收到數(shù)據(jù),也需要發(fā)送ACK表示確認。為了盡可能的利用網(wǎng)絡(luò)帶寬,TCP總是希望盡可能的發(fā)送足夠大的數(shù)據(jù)。Nagle算法就是為了盡可能發(fā)送大塊數(shù)據(jù),避免網(wǎng)絡(luò)中充斥著許多小數(shù)據(jù)塊。

Nagle算法的基本定義是:任意時刻,最多只能有一個未被確認的小段。所謂“小段”,指的是小于MSS尺寸的數(shù)據(jù)塊,所謂“未被確認”,是指一個數(shù)據(jù)塊發(fā)送出去后,沒有收到對方發(fā)送的ACK確認該數(shù)據(jù)已收到。

Nagle算法的實現(xiàn)規(guī)則:

  • 如果包長度達到MSS,則允許發(fā)送;
  • 如果該包含有FIN,則允許發(fā)送;
  • 設(shè)置了TCP_NODELAY選項,則允許發(fā)送;
  • 未設(shè)置TCP_CORK選項時,若所有發(fā)出去的小數(shù)據(jù)包(包長度小于MSS)均被確認,則允許發(fā)送;
  • 上述條件都未滿足,但發(fā)生了超時(一般為200ms),則立即發(fā)送。

延遲確認

如果接受方剛接收到發(fā)送方的數(shù)據(jù)包,在很短很短的時間內(nèi),又接收到第二個包。那么請問接收方是一個一個地回復(fù)好點,還是合并一起回復(fù)好呢?

接收方收到數(shù)據(jù)包后,如果暫時沒有數(shù)據(jù)要發(fā)給對端,它可以等一段時再確認(Linux上默認是40ms)。如果這段時間剛好有數(shù)據(jù)要傳給對端,ACK就隨著數(shù)據(jù)傳輸,而不需要單獨發(fā)送一次ACK。如果超過時間還沒有數(shù)據(jù)要發(fā)送,也發(fā)送ACK,避免對端以為丟包。

但是有些場景不能延遲確認,比如發(fā)現(xiàn)了亂序包、接收到了大于一個 frame 的報文,且需要調(diào)整窗口大小等。

一般情況下,Nagle算法和延遲確認不能一起使用,Nagle算法意味著延遲發(fā),延遲確認意味著延遲接收,醬紫就會造成更大的延遲,會產(chǎn)生性能問題。

15. TCP的粘包和拆包

TCP是面向流,沒有界限的一串數(shù)據(jù)。TCP底層并不了解上層業(yè)務(wù)數(shù)據(jù)的具體含義,它會根據(jù)TCP緩沖區(qū)的實際情況進行包的劃分,所以在業(yè)務(wù)上認為,一個完整的包可能會被TCP拆分成多個包進行發(fā)送,也有可能把多個小的包封裝成一個大的數(shù)據(jù)包發(fā)送,這就是所謂的TCP粘包和拆包問題。

TCP的粘包和拆包
為什么會產(chǎn)生粘包和拆包呢?

  • 要發(fā)送的數(shù)據(jù)小于TCP發(fā)送緩沖區(qū)的大小,TCP將多次寫入緩沖區(qū)的數(shù)據(jù)一次發(fā)送出去,將會發(fā)生粘包;
  • 接收數(shù)據(jù)端的應(yīng)用層沒有及時讀取接收緩沖區(qū)中的數(shù)據(jù),將發(fā)生粘包;
  • 要發(fā)送的數(shù)據(jù)大于TCP發(fā)送緩沖區(qū)剩余空間大小,將會發(fā)生拆包;
  • 待發(fā)送數(shù)據(jù)大于MSS(最大報文長度),TCP在傳輸前將進行拆包。即TCP報文長度-TCP頭部長度>MSS。
解決方案:

  • 發(fā)送端將每個數(shù)據(jù)包封裝為固定長度
  • 在數(shù)據(jù)尾部增加特殊字符進行分割
  • 將數(shù)據(jù)分為兩部分,一部分是頭部,一部分是內(nèi)容體;其中頭部結(jié)構(gòu)大小固定,且有一個字段聲明內(nèi)容體的大小。

參考資料

[1]TCP 的那些事兒(下): https://coolshell.cn/articles/11609.html

[2]面試頭條你需要懂的 TCP 擁塞控制原理: https://zhuanlan.zhihu.com/p/76023663

[3]30張圖解:TCP 重傳、滑動窗口、流量控制、擁塞控制發(fā)愁: https://zhuanlan.zhihu.com/p/133307545

[4]TCP協(xié)議靈魂之問,鞏固你的網(wǎng)路底層基礎(chǔ): https://juejin.cn/post/6844904070889603085

[5]TCP粘包和拆包: https://blog.csdn.net/ailunlee/article/details/95944377

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉