久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区

熱議:字節一面:TCP 三次握手,問的好細!
來源:小林coding    時間:2022-10-19 15:58:49

大家好,我是小林。


【資料圖】

有位讀者在面試字節時,被問到這么個問題:

概括起來,是這兩個問題:

TCP 三次握手中,客戶端收到的第二次握手中 ack 確認號不是自己期望的,會發生什么?是直接丟棄 or 回 RST 報文?

什么情況下會收到不正確的 ack(第二次握手中的 ack) 呢?

問題解答

不賣關子,直接說這個問題,是回 RST 報文。過程如下圖:

三次握手避免歷史連接

當客戶端連續發送多次建立連接的 SYN 報文,然后在網絡擁堵的情況,就會發生客戶端收到不正確的 ack 的情況。具體過程如下:

客戶端先發送了 SYN(seq = 90) 報文,但是被網絡阻塞了,服務端并沒有收到,接著客戶端又重新發送了 SYN(seq = 100) 報文,注意不是重傳 SYN,重傳的 SYN 的序列號是一樣的?!概f SYN 報文」比「最新的 SYN 」 報文早到達了服務端,那么此時服務端就會回一個 SYN + ACK 報文給客戶端,此報文的確認號是 91(90+1)??蛻舳耸盏胶螅l行自己期望收到的確認號應該是 100+1,而不是 90 + 1,于是就會回 RST 報文。服務端收到 RST 報文后,就會中止連接。后續最新的 SYN 抵達了服務端后,客戶端與服務端就可以正常的完成三次握手了。

上述中的「舊 SYN 報文」稱為歷史連接,TCP 使用三次握手建立連接的最主要原因就是防止「歷史連接」初始化了連接。

我們也可以從 RFC 793 知道 TCP 連接使用三次握手的首要原因:

The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.

簡單來說,三次握手的首要原因是為了防止舊的重復連接初始化造成混亂。RFC 給出的三次握手防止歷史連接的案例圖如下:

RFC 793

如果是兩次握手連接,就無法阻止歷史連接,那為什么 TCP 兩次握手為什么無法阻止歷史連接呢?

我先直接說結論,主要是因為在兩次握手的情況下,「被動發起方」沒有中間狀態給「主動發起方」來阻止歷史連接,導致「被動發起方」可能建立一個歷史連接,造成資源浪費。

你想想,兩次握手的情況下,「被動發起方」在收到 SYN 報文后,就進入 ESTABLISHED 狀態,意味著這時可以給對方發送數據給,但是「主動發」起方此時還沒有進入 ESTABLISHED 狀態,假設這次是歷史連接,主動發起方判斷到此次連接為歷史連接,那么就會回 RST 報文來斷開連接,而「被動發起方」在第一次握手的時候就進入 ESTABLISHED 狀態,所以它可以發送數據的,但是它并不知道這個是歷史連接,它只有在收到 RST 報文后,才會斷開連接。

兩次握手無法阻止歷史連接

可以看到,上面這種場景下,「被動發起方」在向「主動發起方」發送數據前,并沒有阻止掉歷史連接,導致「被動發起方」建立了一個歷史連接,又白白發送了數據,妥妥地浪費了「被動發起方」的資源。

因此,要解決這種現象,最好就是在「被動發起方」發送數據前,也就是建立連接之前,要阻止掉歷史連接,這樣就不會造成資源浪費,而要實現這個功能,就需要三次握手。

源碼分析

我說回 RST 就回 RST 嗎?當然不是了,肯定得用源碼證明我說的這個結論。

聽到要源碼分析,可能有的同學就慫了。

其實要分析我們今天這個問題,只要懂 if else 就行了,我也會用中文來表述代碼的邏輯,所以單純看我的文字也是可以的。

這次我們重點分析的是,在 SYN_SENT 狀態下,收到不正確的確認號的 syn+ack 報文是如何處理的。

處于 SYN_SENT 狀態下的客戶端,在收到服務端的 syn+ack 報文后,最終會調用 tcp_rcv_state_process,在這里會根據 TCP 狀態做對應的處理,這里我們只關注 SYN_SENT 狀態。

// net/ipv4/tcp_ipv4.cint tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb){ ... int queued = 0; ... switch (sk->sk_state) { case TCP_CLOSE: ... case TCP_LISTEN: ... case TCP_SYN_SENT: .... queued = tcp_rcv_synsent_state_process(sk, skb, th); if (queued >= 0) return queued; ... }

可以看到,接下來,會繼續調用 tcp_rcv_synsent_state_process 函數。

static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb, const struct tcphdr *th){ .... if (th->ack) { /* rfc793: * "If the state is SYN-SENT then * first check the ACK bit * If the ACK bit is set * If SEG.ACK =< ISS, or SEG.ACK > SND.NXT, send * a reset (unless the RST bit is set, if so drop * the segment and return)" */ // ack 的確認號不是預期的 if (!after(TCP_SKB_CB(skb)->ack_seq, tp->snd_una) || after(TCP_SKB_CB(skb)->ack_seq, tp->snd_nxt)) //回 RST 報文 goto reset_and_undo; ...}

從上面的函數,就可以得知了,客戶端在 SYN_SENT 狀態下,收到不正確的確認號的 syn+ack 報文會回 RST 報文。

小結

TCP 三次握手中,客戶端收到的第二次握手中 ack 確認號不是自己期望的,會發生什么?是直接丟棄 or 回 RST 報文?

回 RST 報文。

什么情況下會收到不正確的 ack(第二次握手中的 ack) 呢?

當客戶端發起多次 SYN 報文,然后網絡擁堵的情況下,「舊的 SYN 報文」比「新的 SYN 報文」早抵達服務端,此時服務端就會按照收到的「舊的 SYN 報文」回復 syn+ack 報文,而此報文的確認號并不是客戶端期望收到的,于是客戶端就會回 RST 報文。

關鍵詞: 不正確的 第二次握手 發送數據 的情況下

上一篇:

下一篇:

X 關閉

X 關閉

久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区
亚洲一区二区少妇| 欧美日韩精品免费| 国产精品热久久久久夜色精品三区| 亚洲国产欧美一区二区三区久久| 极品日韩av| 国产精品综合av一区二区国产馆| 亚洲国产经典视频| 在线成人免费视频| 国产麻豆午夜三级精品| 国精品一区二区三区| 国产精品一区在线播放| 国产美女精品人人做人人爽| 日韩视频免费在线| 黑人一区二区三区四区五区| 亚洲亚洲精品在线观看| 激情小说亚洲一区| 一区二区三区我不卡| 国产精品黄视频| 国产精品乱人伦中文| 国产一区二区观看| 亚洲片国产一区一级在线观看| 亚洲午夜精品17c| 国产精品地址| 欧美高清不卡在线| 国产麻豆成人精品| 嫩草伊人久久精品少妇av杨幂| 国产欧美日韩在线| 欧美精品偷拍| 欧美日韩在线直播| 韩日欧美一区二区| 影音先锋久久资源网| 亚洲精品一区二区三区蜜桃久| 免费亚洲一区| 国产精品一区二区你懂的| 一区二区三区黄色| 欧美精品一区二区三区视频| 欧美日韩一区国产| 欧美成年人视频| 日韩视频在线一区二区三区| 国产日韩在线播放| 性欧美大战久久久久久久免费观看| 久久色在线观看| 免费亚洲一区二区| 亚洲夫妻自拍| 欧美jizzhd精品欧美巨大免费| 国产亚洲a∨片在线观看| 一本色道久久综合精品竹菊| 欧美精品国产一区二区| 国产欧美一二三区| 国产日韩欧美| 久久天堂成人| 一区视频在线看| 亚洲午夜影视影院在线观看| 黑人巨大精品欧美黑白配亚洲| 亚洲激情影院| 蜜臀91精品一区二区三区| 亚洲综合日韩在线| 日韩亚洲在线观看| 亚洲影视在线| 亚洲精品色图| 国语自产精品视频在线看抢先版结局| 国产精品乱码妇女bbbb| 欧美色图首页| 亚洲欧美成人一区二区三区| 国产精品99久久久久久久女警| 欧美精品videossex性护士| 国产日韩精品视频一区| 国产精品网站在线播放| 国产精品免费电影| 国产精品久久二区二区| 久久精品最新地址| 欧美日韩精品在线| 日韩视频在线观看国产| 雨宫琴音一区二区在线| 欧美日韩在线观看视频| 欧美午夜精品理论片a级按摩| 欧美激情在线狂野欧美精品| 国产精品视频区| 国产色产综合色产在线视频| 国产精品伦一区| 国产精品一区二区三区久久| 欧美午夜女人视频在线| 欧美尤物一区| 在线精品观看| 亚洲成人在线网站| 伊人夜夜躁av伊人久久| 亚洲午夜一区二区三区| 一区二区精品| 欧美成人免费在线观看| 一区二区激情视频| 欧美国产综合一区二区| 亚洲砖区区免费| 久久亚洲一区二区三区四区| 亚洲美洲欧洲综合国产一区| 一区二区三区在线观看视频| 国产日韩欧美中文在线播放| 欧美另类一区| 欧美一区二区免费观在线| 欧美女同在线视频| 国产精品视频一| 久久一区二区精品| 国产精品家庭影院| 国产精品影视天天线| 欧美三级欧美一级| 91久久黄色| 亚洲欧美日韩中文在线制服| 亚洲精品欧美日韩专区| 激情久久中文字幕| 欧美午夜一区二区福利视频| 欧美亚日韩国产aⅴ精品中极品| 亚洲第一精品在线| 亚洲精品乱码久久久久久久久| 欧美ab在线视频| 欧美精品一区二区精品网| 欧美精品1区2区| 欧美视频在线视频| 极品少妇一区二区三区精品视频| 久久这里只精品最新地址| 亚洲欧美色婷婷| 日韩写真在线| 国产在线一区二区三区四区| 伊人婷婷久久| 国产精品青草综合久久久久99| 国产精品国码视频| 欧美激情精品久久久久久大尺度| 亚洲日本欧美| 99精品国产热久久91蜜凸| 国产精品porn| 国内精品国语自产拍在线观看| 欧美天堂亚洲电影院在线播放| 久久全国免费视频| 久热综合在线亚洲精品| 久久久九九九九| 久久久久久久久伊人| 久久久精品网| 午夜亚洲激情| 国产视频丨精品|在线观看| 亚洲国产天堂网精品网站| 久久久人成影片一区二区三区观看| 日韩亚洲在线| 欧美日韩高清在线一区| 久久久久久国产精品mv| 久久综合色婷婷| 国产一区二三区| 红桃视频国产精品| 亚洲一区二区三区在线看| 伊人狠狠色j香婷婷综合| 欧美激情亚洲自拍| 激情久久久久| 国产一区 二区 三区一级| 一区二区欧美亚洲| 亚洲综合久久久久| 99热免费精品| 亚洲综合激情| 香蕉国产精品偷在线观看不卡| 亚洲午夜在线观看| 国产精品mv在线观看| 一区二区三区在线看| 欧美日韩精品免费观看视频| 欧美日韩精品一本二本三本| 一区二区三区毛片| 欧美日韩精品一区视频| 欧美午夜精品久久久久久久| 久久亚洲捆绑美女| 久久综合精品国产一区二区三区| 好吊一区二区三区| 99pao成人国产永久免费视频| 欧美日韩精品伦理作品在线免费观看| 国产婷婷色一区二区三区四区| 国产手机视频一区二区| 国产精品免费视频xxxx| 久久se精品一区二区| 国产日韩欧美视频在线| 亚洲青涩在线| 欧美色网在线| 国产精品福利在线| 亚洲图片欧洲图片av| 欧美日韩国产一区二区三区地区| 激情综合久久| 午夜在线成人av| 欧美在线日韩精品| 美女黄毛**国产精品啪啪| 国产精品国产成人国产三级| 韩国女主播一区二区三区| 久久香蕉国产线看观看av| 在线一区二区视频| 亚洲剧情一区二区| 国产在线视频欧美| 欧美福利电影在线观看| 国产日韩av在线播放| 麻豆乱码国产一区二区三区| 亚洲精品久久久一区二区三区| 午夜免费电影一区在线观看| 亚洲国产合集| 国产午夜亚洲精品不卡| 亚洲一级影院| 欧美伊久线香蕉线新在线| 国产精品露脸自拍| 亚洲激情一区| 欧美a级一区|