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

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

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

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

TCP 報文段結構

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

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

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

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

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

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

三次握手

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

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

1. 第一次握手

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

段 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 位的(虛擬)計數(shù)器,而且這個計數(shù)器每 4 微秒加 1,也就是說,ISN 的值每 4.55 小時循環(huán)一次。這個舉措是為了防止序列號重疊。

但即使這樣還是會有安全隱患——因為初始 ISN 仍然是可預測的,惡意程序可能會分析 ISN ,然后根據(jù)先前使用的 ISN 預測后續(xù) 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.

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

2. 第二次握手

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

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

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

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

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

3. 第三次握手

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

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

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

四次揮手

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

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

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

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

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

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

 

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

2015-06-24 10:32:13

訊鳥云計算會展

2018-12-03 05:54:48

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

2015-04-30 10:12:13

開源云平臺OpenStack

2019-05-28 10:45:07

TCP3次握手數(shù)據(jù)傳輸

2017-09-25 21:27:07

TCP協(xié)議數(shù)據(jù)鏈

2013-02-22 09:49:43

大數(shù)據(jù)谷歌大數(shù)據(jù)全球技術峰會

2017-08-09 14:49:03

WebHTTPS瀏覽器

2015-11-09 09:58:56

2015-10-13 09:42:52

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

2023-10-24 15:22:09

TCPUDP

2023-12-28 12:07:21

2024-01-12 08:23:11

TCPACK服務器

2023-11-01 08:04:08

WiresharkTCP協(xié)議

2021-01-29 06:11:08

TCP通信三次握手

2021-05-18 12:27:40

TCP控制協(xié)議

2024-10-31 11:49:41

Kafka管理死信隊列

2019-06-12 11:26:37

TCP三次握手四次揮手

2010-01-18 10:27:20

2024-04-07 00:02:00

TCP連接通道

2020-02-17 10:10:43

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

51CTO技術棧公眾號

主站蜘蛛池模板: 国产人免费人成免费视频 | 国产在线麻豆精品入口 | 欧美性网站 | 国产成人高清 | 国产高清在线观看 | 在线精品一区二区三区 | 中文精品视频 | 男人的天堂在线视频 | 成人免费看片 | 亚洲一区二区三区视频在线 | 黄色毛片免费看 | 每日更新av | 欧洲高清转码区一二区 | 欧美视频二区 | 久久精品无码一区二区三区 | 精品无码久久久久久国产 | 精品日韩一区二区 | 精品亚洲一区二区三区四区五区高 | 香蕉一区二区 | www.99热| 欧美日韩在线成人 | 久久久久久高清 | 精品国产99| 亚洲视频免费在线观看 | 欧美一级大片 | 亚洲天堂一区 | 国产一区不卡 | 国产午夜精品理论片a大结局 | 成人免费日韩 | 午夜av电影 | 国产成人综合亚洲欧美94在线 | 免费一级欧美在线观看视频 | 日本久久久久久久久 | 免费黄色片在线观看 | 精品国产乱码一区二区三区a | 在线视频日韩精品 | 99精品国产一区二区三区 | 五月婷婷 六月丁香 | 黄色片大全在线观看 | 黄视频免费在线 | 欧美一区二区视频 |