TCP建立與斷開連接那些事兒

1. TCP建立連接:

    三次握手,需要注意的是ACK確認序列號是SYN攜帶序列號+1,不是直接相等。基本過程如圖所示。

 

客戶端:

socket程序中調用connect將激發三路握手過程,connect將在成功建立連接或者出錯才返回。
(1) 客戶端發送SYN以後,6s沒有來自服務器的SYN分節響應,則重發SYN,24s後無響應再重發,75s後無響應則返回錯誤ETIMEOUT。
(2) 對客戶端的響應若是RST,則表明服務器端對應端口沒有進程等待與之連接,硬錯誤,返回ECONNREFUSED錯誤。
(3) 客戶發出的SYN在中間路由器發生了“destination unreachable”ICMP錯誤,客戶主機內核保存該信息,按照第一種情況所述時間間隔發送SYN。超時未收到相應,則把保存信息EHOSTUNREACH或ENETUNREACH錯誤返回給進程。
(4) connect導致套接字從CLOSED狀態轉換到SYN_SENT,若失敗,則此套接字不可用,必須關閉,不能再次調用connect,需要重新調用socket。
 
 

服務器端:

使用listen等待建立連接,在accept之前。維護兩個隊列:未完成連接隊列(SYN_RECV)與已完成連接隊列(ESTABLISHED)。
 
(1) 客戶SYN到達之後,TCP在未完成連接隊列中創建新的一項,然後響應以三路握手的第二個分節:服務器SYN,在隊列中保持直到第三個分節到達或者超時(與connect類似的75s)。
(2)服務器端如果一直沒有收到ACK第三分節,則會重發服務器SYN分節,套接字保持在未完成隊列直到超時。
(3)如果服務器端隊列滿,收到客戶端SYN,會忽略,而不是發送RST,因爲情況是暫時的,可能下次就能夠有空閒隊。RST會讓connect立即返回一個錯誤。
此處是SYN攻擊的發生位置。黑客可以僞造大量不存在的IP地址發送SYN建立連接,服務器需要不斷回覆確認,但是沒有響應,繼續重發,佔用了等待隊列,無法爲正常連接服務,堵塞網絡,其屬於典型的DDOS攻擊。如果檢測到許多隨機的半連接IP地址,基本可以判斷爲SYN攻擊(netstat -n -p TCP | grep SYN_RECV)
連接建立成功之後返回,調用accept。

2. TCP斷開連接

四次分組交換。確認ACK序列號也是FIN攜帶序列號+1。

(1) 如果一方已經關閉或異常終止,而另一方不知道,此時TCP連接爲半打開。不傳輸數據,另一方就不會檢測到,(此時可以設置TCP的KEEPALIVE選項,來定時檢測),如果發送數據,另一方會返回RST分節。
(2) 第四個分節ACK丟失,服務器端(被動關閉)會重發FIN分節。(對照前文,第一個分節發送之後如果沒有ack,應該也是超時重發,但此點不確定)
 
 

其他問題:

1. TCP建立連接的時候,初始序列號是隨機選擇的,兩次SYN的序列號不固定。 

    TCP建立連接交換的信息包括:最大分節大小MSS、窗口規模選項、時間戳選項(高速網絡需要,避免由失而復現的分組造成數據損壞)。
 

2. 爲什麼建立連接協議是三次握手,而關閉連接卻是四次握手呢?(慎重對待,不一定正確)

TCP是全雙工的,可以在兩個方向傳輸數據,因此需要每個方向單獨關閉。一方發送完數據之後就能夠用FIN通知對方,一端收到之後,嚮應用層發送發送通知。
 
也可如此理解,服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文裏來發送。但關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要發送一些數據給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這裏的ACK報文和FIN報文多數情況下都是分開發送的。

3. TIME_WAIT狀態的必要性?

TIME_WAIT的持續時間是2*MSL(最長分節壽命,IP數據包在網絡中的最長生存時間),一般是1-4分鐘之間,存在的兩個理由:

(1) 可靠的實現TCP全雙工連接的終止。如果四次交換的最後ACK丟失,服務器將重發FIN,客戶端需要能夠正確處理,發送ACK,如不維護此狀態,將發送RST信息,被解釋爲一個錯誤。爲了可靠結束,必須應對不得不重傳最終的ACK。
(2)允許老的重複分節在網絡中消逝。如果在相同的端口與IP之間建立了新的連接,原來的連接的包經過路由處理又重新發送過來,可能被認爲是原來的包,因此TCP不給TIME_WAIT狀態建立新的連接。2MSL可以保證所有老的包消逝。

4.RST產生的三個條件:

(1) SYN到達目的端口,但是服務器沒有對應的監聽進程;
(2) TCP想取消一個已有連接;
(3) TCP收到一個根本不存在的連接上的分節。
 

5. 慢啓動、快速重傳

爲了避免擁塞,TCP擁塞控制是採用:慢啓動、快速重傳等機制,避免過長的定時器機制。
慢啓動主要表現在發送窗口的大小:開始是2的指數增加,超過臨界值(一般最大值一半)就會改變成線性增長(每收到一個ACK就加1)。
收到3個重複ACK包就認爲發生了擁塞,會將窗口設爲原來的一半。
 

6. Nagle算法

  Nagle算法是爲了避免網絡中存在太多的小包(協議頭比例非常大)造成擁塞,可以用TCP_NODELAY選項關閉。

發佈了105 篇原創文章 · 獲贊 35 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章