TCP協議深入理解

2021-05-21 23:25:24 字數 2268 閱讀 8777

tcp協議在能夠傳送資料之前就建立起了「連線」。要實現這個連線,啟動tcp連線的那一方首先將傳送乙個syn資料報。這只是乙個不包含資料的資料報,然後,開啟syn標記。如果另一方同時在它收到syn標記的埠通話,它將發回乙個syn+ack:syn和ack標誌位都被開啟,並將ack(確認)編號字段設定為剛收到的那個資料報的順序號欄位的值。接下來, 連線發起方為了表示收到了這個syn+ack資訊,會向傳送方傳送乙個最終的確認資訊(ack包)。這種syn、syn+ack、ack的步驟被稱為tcp連線建立時的「三次握手」。在這之後,連線就建立起來了。這個連線將一直保持活動狀態,直到超時或者任何一方發出乙個fin(結束)訊號。 

任何一方都可以關閉乙個tcp連線,要求雙方傳送乙個fin訊號關閉自己的通訊頻道。一方可以在另一方之前關閉,或者雙方同時關閉tcp連線。因此,當一方傳送乙個fin訊號時,另一方可傳送 「fin+ack」,開始關閉自己一方的通訊並且確認收到了第乙個fin訊號。傳送第乙個fin訊號的人接下來再傳送乙個「fin+ack」資訊,確認收到第二個fin訊號。另一方就知道這個連線已經關閉了,並且關閉了自己的連線。傳送第乙個fin的人沒有辦法收到最後乙個ack訊號的確認資訊。這時它會進入「time_wait」(等待時間)狀態並啟動乙個定時器,防止另一方沒有收到ack資訊並且認為連線仍是開啟的。一般來說,這個狀態會持續1至2分鐘。

現在,我們來討論第乙個問題。如果有人(假如乙個黑客)在你的web伺服器上留下乙個半開或者半關的連線,那就是乙個壞訊息。每乙個連線都要消耗記憶體,開啟數千個虛假的tcp連線可能導致伺服器癱瘓。當然,你實際上不可能在不影響tcp正常工作的情況下調整tcp定時器。如果你聽說過tcp syn 攻擊的話,那就是這個意思。為了防止出現這種情況,大多數作業系統都要限制半開連線的數量。例如,linux預設的限制一般是256個。

關於持續流控制問題,現在我們就來討論這個問題。tcp中實現它的機制是tcp滑動視窗機制。tcp協議使用 「重新傳送與正向ack」來保證資料傳輸的可靠性。傳送方將等待一段時間,如果沒有收到其傳送的資料報的ack確認資訊,傳送方就要重新傳送。順便說一下,tcp協議中有許多定時器。這只是其中乙個定時器。ack的概念對於流控制是非常重要的,因為tcp滑動視窗協議使tcp的往復確認變得更有效率。如果tcp要傳送乙個資料報並且等待每乙個ack確認資訊,它實際上就把資料吞吐量削減了一半。

理想的情況是,我們能夠一次傳送許多資料報,然後等待收到乙個確認收到全部資料報的ack資訊,而不用對方發來更多的資料。但是,我們如何知道傳送了多少個資料報呢?tcp視窗尺寸可以控制在「已傳送但是沒有確認」的狀態下能夠容納多少個資料報。如果這個視窗尺寸很大,我們不必等待ack資訊就可以傳送大量的資料報。這實際上就是流控制。

接收方就是控制視窗大小的那一方。如果接收方將視窗大小設為「0」,那麼,傳送方根本就不能傳送任何資料。如果這個視窗的尺寸是「1」,那麼,我們就回到了簡單的「傳送和等待ack」的協議。如果最後的視窗尺寸是「0」,傳送者將發出乙個探測訊號以搞清這個視窗什麼時間再次開啟。如果傳送方從來沒有收到ack資訊,它就一直不斷地重試,直到定時器過期。請記住,這個視窗尺寸在tcp頭中是乙個16位欄位。如果你要乙個視窗尺寸(按位元組計算)大於16位可以表示的容量(2的16次方個位元組),還可以使用乙個名為「視窗縮放」的tcp協議選項。這個選項允許視窗尺寸乘以比例因子。如果沒有極大的視窗尺寸,tcp協議就就無法充分利用gb級別的高速連線。這也是我們需要針對這些新的高速連線調整tcp引數的原因,

關於tcp流控制的問題,我們不能不提一下nagle演算法。如果我們在乙個telnet連線上使用乙個大的tcp視窗會發生什麼事情呢?你會輸入乙個指令(例如敲了乙個字母),然後一直等待回應它卻遲遲不出現在終端回顯上。這對於實時通訊來說是乙個大問題。而且,telnet也會增加網路的阻塞度,因為乙個位元組的資料(例如我們的一次擊鍵)需要40個位元組的包頭。於是rfc 896定義這個nagle演算法,用以消除小的資料報。這個思路是我們應該在資料傳送之前給先把小資料集中起來然後一次性傳送,以便提高效率。為了更有效率,它還限定只允許存在乙個未經確認的資料段,你在得到確認資訊之前不能傳送更多的資料。telnet和互動ssh連線使用tcp_nodelay套介面選項啟用這個功能,這樣當你按下乙個按鍵的時候,你能夠立即得到乙個回應。

當然,我們仍是忽略了有關tcp協議的許多事情。然而,通過這兩篇文章的了解,你應該能夠理解其它一些更專業的tcp著作。阻塞控制與流控制不同,本文沒有討論。如果你真的對了解tcp協議的全部工作原理感興趣,你可以詳細閱讀tcp rfc。

小結 tcp 協議非常善於解決流控制問題,因此非常適應於許多應用程式。tcp協議中的流控制的含義是:「在收到對傳送的資料的確認資訊這前,我可以傳送多少資料?」 這就是tcp視窗。學習阻塞控制的問題可以留作讀者的練習。需要指出的是,在tcp協議之下連線速度開始很慢,然後速度逐漸加快。這個做法並不總是最理想的。

TCP協議深入理解

任何一方都可以關閉乙個tcp連線,要求雙方傳送乙個fin訊號關閉自己的通訊頻道。一方可以在另一方之前關閉,或者雙方同時關閉tcp連線。因此,當一 方傳送乙個fin訊號時,另一方可傳送 fin ack 開始關閉自己一方的通訊並且確認收到了第乙個fin訊號。傳送第乙個fin訊號的人接下來再發 送乙個 f...

深入理解TCP

tcp是面向連線的傳輸層層協議,可以為應用層提供可靠的資料傳輸服務。所謂的面向連線並不是真正意思上的連線,只不過是在傳送資料之前,首先得相互握手,也就是說接收方知道你要發資料給它了。而udp是面向無連線的傳輸層協議,並不提供可靠的資料傳輸。有乙個很恰當的比喻 udp傳輸就類似於寫信,接收方事先並不知...

深入理解HTTPS協議

最好對http協議有所了解,不需要太透徹,但是基本概念要知道。如果能懂一些tcp ip 方面的東西就更好了。還不知道tcp三次握手的同學,可以先自行搜尋一下相關知識。這裡為什麼要複習tcp三次握手,因為http鏈結是在這之上的,任何乙個http鏈結,都需要tcp的三次握手的過程,https下面的加密...