成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

3000字講講TCP協議,握手揮手不是你想的那么簡單

網絡 網絡管理
上一次講了 UDP 協議,從這次開始,就要講 TCP 協議了,因為 TCP 協議涉及到的東西很多,一篇文章概括不完,所以我把 TCP 協議的內容分成好幾個部分,逐個擊破。

上一次講了 UDP 協議,從這次開始,就要講 TCP 協議了,因為 TCP 協議涉及到的東西很多,一篇文章概括不完,所以我把 TCP 協議的內容分成好幾個部分,逐個擊破。

TCP 報文段結構

一談到 TCP 協議,大家最先想到的詞就是「面向連接」和「可靠」。沒錯,TCP 協議的設計就是為了能夠在客戶端和服務器之間建立起一個可靠連接。

在講連接過程之前,我們先來看看 TCP 的報文段結構,通過這個結構,我們可以知道 TCP 能夠提供什么信息:

這里有幾點是需要注意的:

  • TCP 協議需要一個四元組(源IP,源端口,目的IP,目的端口)來確定連接,這要和 UDP 協議區分開。多說一句,IP 地址位于 IP 報文段,TCP 報文段是不含 IP 地址信息的。
  • 基本 TCP 頭部的長度是 20 字節,但是由于「選項」的長度是不確定的,所以需要「首部長度」字段明確給出頭部長度。這里要注意的是,首部長度字段的單位是 32bit,也就是 4 字節,所以該字段的最小值是 5。
  • 標橙色的字段(確認序號,接收窗口大小,ECE,ACK)用于「回復」對方,舉個例子,服務器收到對方的數據包后,不單獨發一個數據包來回應,而是稍微等一下,把確認信息附在下一個發往客戶端的數據幀上,也就是捎帶技術。
  • 窗口大小是一個 16 位無符號數,也就是說窗口被限制在了 65535 字節,也就限制了 TCP 的吞吐量性能,這對一些高速以及高延遲的網絡不太友好(可以想想為什么)。所幸 TCP 額外提供了窗口縮放(Window Scale)選項,允許對這個值進行縮放。

下面是 8 個標志位的含義,有的協議比較舊,可能沒有前兩個標志位:

標志位雖然很多,但是如果放到具體場景里來看的話,就很容易理解他們的作用了。

三次握手

三次握手就是為了在客戶端和服務器間建立連接,這個過程并不復雜,但里面有很多細節需要注意。

這張圖就是握手的過程,可以看到客戶端與服務器之間一共傳遞了三次消息,這三次握手其實就是兩臺機器之間互相確認狀態,我們來一點一點看。

1. 第一次握手

首先是客戶端發起連接,第一個數據包將 SYN 置位(也就是 SYN = 1),表明這個數據包是 SYN 報文段(也被稱為段 1)。這一次發送的目的是告訴服務器,自己的初始序列號是 client_isn ,還有一個隱含的信息在圖里沒有表現出來,那就是告知服務端自己想連接的端口號。除了這些,客戶端還會發送一些選項,不過這跟三次握手沒多大關系,暫且按下不表。

段 1 里最需要注意的就是這個client_isn ,也就是初始序列號。「RFC0793^1」指出:

When new connections are created, an initial sequence number (ISN) generator is employed which selects a new 32 bit ISN. The generator is bound to a (possibly fictitious) 32 bit clock whose low order bit is incremented roughly every 4 microseconds. Thus, the ISN cycles approximately every 4.55 hours.

翻譯過來就是,初始序列號是一個 32 位的(虛擬)計數器,而且這個計數器每 4 微秒加 1,也就是說,ISN 的值每 4.55 小時循環一次。這個舉措是為了防止序列號重疊。

但即使這樣還是會有安全隱患——因為初始 ISN 仍然是可預測的,惡意程序可能會分析 ISN ,然后根據先前使用的 ISN 預測后續 TCP 連接的 ISN,然后進行攻擊,一個著名的例子就是「The Mitnick attack^2」 。這里摘一段原文:

Mitnick sent SYN request to X-Terminal and received SYN/ACK response.  Then he sent RESET response to keep the X-Terminal from being filled up. He repeated this for twenty times. He found there is a pattern between  two successive TCP sequence numbers. It turned out that the numbers were not random at all. The latter number was greater than the previous one  by 128000.

所以為了讓初始序列號更難預測,現代系統常常使用半隨機的方法選擇初始序列號,詳細的方法就不在這里展開了。

2. 第二次握手

當服務器接收到客戶端的連接請求后,就會向客戶端發送 ACK表示自己收到了連接請求,而且,服務器還得把自己的初始序列號告訴客戶端,這其實是兩個步驟,但是發送一個數據包就可以完成,用的就是前面說的捎帶技術。圖里的 ACK = client_isn + 1 是指確認號字段的值,要注意和 ACK 標志位區分開。

ACK 字段其實也有不少需要注意的點,不過這個跟滑動窗口一塊講比較直觀,這里就先不提了。

這里重點強調一下,當一個 SYN 報文段到達的時候,服務器會檢查處于 SYN_RCVD 狀態的連接數目是否超過了 tcp_max_syn_backlog 這個參數,如果超過了,服務器就會拒絕連接。當然,這個也會被黑客所利用,「SYN Flood」就是個很好的例子。因為服務器在回復 SYN-ACK 后,會等待客戶端的 ACK ,如果一定時間內沒有收到,認為是丟包了,就重發 SYN-ACK,重復幾次后才會斷開這個連接,linux 可能要一分鐘才會斷開,所以攻擊者如果制造一大批 SYN 請求而不回復,服務器的 SYN 隊列很快就被耗盡,這一段時間里,正常的連接也會得不到響應。

服務器的這種狀態稱為靜默(muted)。為了抵御 SYN Flood 攻擊,服務器可以采用「SYN cookies」,這種思想是,當 SYN 到達時,并不直接為其分配內存,而是把這條連接的信息編碼并保存在 SYN-ACK 報文段的序列號字段,如果客戶端回復了,服務器再從 ACK 字段里解算出 SYN 報文的重要信息(有點黑魔法的感覺了),驗證成功后才為該連接分配內存。這樣,服務器不會響應攻擊者的請求,正常連接則不會受到影響。

但 SYN cookies 本身有一些限制,并不適合作為默認選項,有興趣可以自行 Google。

3. 第三次握手

這是建立 TCP 連接的最后一步,經過前兩次握手,客戶端(服務器)已經知道對方的滑動窗口大小,初始序列號等信息了,這不就完了嗎?為什么還要第三次握手?

這是因為服務器雖然把數據包發出去了,但他還不知道客戶端是否收到了這個包,所以服務器需要等待客戶端返回一個 ACK,表明客戶端收到了數據,至此,連接完成。

連接建立后,進入傳輸數據的階段,這里就涉及到很多很多技術,我會另寫文章。

四次揮手

有了三次握手的基礎,四次揮手就比較容易理解了:

四次揮手的過程其實很簡單,就是服務器和客戶端互相發送 FIN 和 ACK 報文段,告知對方要斷開連接。

四次揮手里值得關注的一點就是 TIME_WAIT 狀態,也就是說主動關閉連接的一方,即使收到了對方的 FIN 報文,也還要等待 2MSL 的時間才會徹底關閉這條連接。(這里面的 MSL 指的是最大段生成期,指的是報文段在網絡中被允許存在的最長時間。)可為什么不直接關閉連接呢?

一個原因是,第四次揮手的 ACK 報文段不一定到達了服務器,為了不讓服務器一直處于 LAST_ACK 狀態(服務器會重發 FIN,直到收到 ACK),客戶端還得等一會兒,看看是否需要重發。假如真的丟包了,服務器發送 FIN ,這個 FIN 報文到達客戶端時不會超過 2MSL(一來一回最多 2MSL),這時候客戶端這邊的 TCP 還沒關掉,還能重發 ACK。

另一個原因是,經過 2MSL 之后,網絡中與該連接相關的包都已經消失了,不會干擾新連接。我們來看一個例子:假如客戶端向服務器建立了新的連接,舊連接中某些延遲的數據堅持到了新連接建立完畢,而且序列號剛好還在滑動窗口內,服務器就誤把它當成新連接的數據包接收,如下圖所示:

2MSL 機制就避免了這種情況。

 

責任編輯:趙寧寧 來源: tobe的囈語
相關推薦

2015-06-24 10:32:13

訊鳥云計算會展

2018-12-03 05:54:48

Wireshark網絡協議TCP

2015-04-30 10:12:13

開源云平臺OpenStack

2019-05-28 10:45:07

TCP3次握手數據傳輸

2017-09-25 21:27:07

TCP協議數據鏈

2017-08-09 14:49:03

WebHTTPS瀏覽器

2013-02-22 09:49:43

大數據谷歌大數據全球技術峰會

2015-11-09 09:58:56

2023-10-24 15:22:09

TCPUDP

2015-10-13 09:42:52

TCP網絡協議

2024-01-12 08:23:11

TCPACK服務器

2023-11-01 08:04:08

WiresharkTCP協議

2023-12-28 12:07:21

2021-01-29 06:11:08

TCP通信三次握手

2021-05-18 12:27:40

TCP控制協議

2024-10-31 11:49:41

Kafka管理死信隊列

2019-06-12 11:26:37

TCP三次握手四次揮手

2024-04-07 00:02:00

TCP連接通道

2010-01-18 10:27:20

2020-02-17 10:10:43

TCP三次握手四次揮手
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美黄色一区 | 特级做a爰片毛片免费看108 | 色一情一乱一伦一区二区三区 | 亚洲一区自拍 | 伊人在线视频 | 久久久久久99 | 国产在线网站 | 精品一区二区三区在线观看国产 | 日日干综合| 一级在线观看 | 二区亚洲 | 久久久久久久久久久久亚洲 | com.国产| 成年人在线视频 | 日韩和的一区二区 | 亚洲第一av| 欧美激情视频一区二区三区免费 | 亚洲精彩视频 | 久久久久成人精品 | 亚洲一区 | 国产精品视频网站 | 国产高清在线 | 欧美一极视频 | 天堂中文av | 一区二区三区国产精品 | www视频在线观看 | 欧美在线观看黄色 | 日本电影免费完整观看 | www.久久影视| 国产乱肥老妇国产一区二 | 午夜免费精品视频 | 国产精品一卡二卡三卡 | 狠狠夜夜| 精品在线免费看 | 久久精品一区二区 | 国产高清免费 | 欧美日韩成人在线 | 中文字幕在线观看一区 | 九色av| 中文字幕日韩一区 | 粉嫩一区二区三区四区公司1 |