Tcp/ip三次握手

 TCP/IP三次握手過程 2010-01-23 21:27:06

分類: 系統運維

TCP 連接的建立和終止過程 
  TCP連接是面向連接的,所謂的面向連接就是,當計算機雙向通信時必需先建立連接,然後才能進行數據的傳輸,最後還要拆除連接。而同在一個網絡層的UDP傳輸,是面向非連接的傳輸,也不是可靠的。
 TCP建立連接需要三次握手的過程,而拆除連接需要四次握手的過程。
 TCP連接的建立:
  1.服務器必須準備好接受外來的連接,這通過調用socket,bind,和listen函數來完成,稱爲被動打開。
  2.客戶通過調用connect進行主動打開,這引起客戶TCP發送一個SYN(Synchronize)分節(表示同步 SYN=J),它告訴服務器客戶將在連接中發送的數據的初始序列號,一般情況下SYN分節不攜帶數據,它只包含有一
個IP頭部,一個TCP頭部,可能還有TCP選項。這時客戶端進入SYN_SEND狀態,並等待服務器確認。
3. 服務器必須確認客戶的SYN,同時自己也要發送一個SYN分節,它含有服務器將在同一個連接中發送的數據的初始序列號,服務器向客戶發送一個SYN(SYn=K)和對客戶的ACK(J+1)。也就是SYN+ACK包。這裏服務器
進入SYN_RECV狀態。
4 客戶必須確認服務器的SYN。這裏會向服務器發送確認包ACK(ack = K+1),此包發送完畢,客戶端和服務器專進入ESTABLISHED狀態。至此,三次握手完成,TCP連接建立。
  完成三次握手,客戶端和服務器開始傳輸數據。在握手過程中,ACK裏的確認號爲發送這個 ACK的一方所期待的對方的下一個序列號。因爲SYN只佔一個字節的序列號空間,所以每一個SYN的ACK中的確認號都是相應的初始序列號加1,每一個FIN的ACK的確認號爲FIN的序列號加1、
  在這過程中,還有一些重要的概念需要能明白。
SYN:同步標誌
同步序列編號(Synchronize Sequence Numbers)欄有效。該標誌僅在三次握手建立TCP連接時有效。它提示TCP連接的服務端檢查序列編號,該序列編號爲TCP連接初始端(一般是客戶端)的初始序列編號。在這裏,可以把TCP序列編號看作是一個範圍從0到4,294,967,295的32位計數器。通過TCP連接交換的數據中每一個字節都經過序列編號。在TCP報頭中的序列編號欄包括了TCP分段中第一個字節的序列編號。所以如果你拒絕進來的syn包,它將終止其他計算機打開你計算機上的服務,但是並不會你終止你使用別的計算機的服務。

FIN:結束標誌
帶有該標誌置位的數據包用來結束一個TCP回話,但對應端口仍處於開放狀態,準備接收後續數據。
RST:復位標誌
復位標誌有效。用於復位相應的TCP連接。
URG:緊急標誌
緊急(The urgent pointer) 標誌有效。緊急標誌置位,
PSH:推標誌
該標誌置位時,接收端不將該數據進行隊列處理,而是儘可能快將數據轉由應用處理。在處理 telnet 或 rlogin 等交互模式的連接時,該標誌總是置位的
  
 未連接隊列:
   在三次握手協議中,服務器維護一個未連接隊列,該隊列爲每個客戶端的SYN包(syn=j)開設一個條目,該條目表明服務器已收到SYN 包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連接在服務器處於Syn_RECV狀態,當服務器收到客戶的確認包時,刪除該條目,服務器 進入ESTABLISHED狀態。Backlog參數:表示未連接隊列的最大容納數目。
SYN-ACK重傳次數 :
服務器發送完SYN-ACK包,如果未收到客戶確認包,服務器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超 過系統規定的最大重傳次數,系統將該連接信息從半連接隊列中刪除。

注意,每次重傳等待的時間不一定相同。
半連接存活時間:是指半連接隊列的條目存活的最長時間,也即服務從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連接存活時間爲Timeout時間、SYN_RECV存活時間。

TCP選項:
   每一個SYN可以含有若干個TCP選項,通常使用的選項有:
MSS選項:TCP發送的SYN中,帶有這個選項是通知對方它的最大分節大小MSS(maximum segment size),即它能接受的每個TCP分節中的最大數據量,可以使用TCP_MAXSEG套接口選項獲取與設置這個TCP選項(Linux系統下)。
 窗口規模選項:TCP雙方能夠通知對方的最大窗口大小是65535,因爲TCP頭部相應的字段只佔16位,這個選項指定TCP頭部的廣告窗口必須擴大(左移)的位數(0--14),因此所提供的最大窗口幾乎是1G字節(65535*2的14次方)
時間戳選項:這個這項對高速連接是必要的,它可以防止失而復得的分組可能造成的數據損壞,也就是說是暫時的路由原因造成的迷途的分組,當路由穩定後,它們又會正常到達目的地,其前提是它們在此前尚未被路由主動丟棄。

TCP連接終止:
 TCP用三次握手建立一個連接,而終止一個連接則需要四次握手。
1. 某個應用進程首先調用close,我們稱這一端執行主動關閉(active close),這一端的TCP於是發送一個FIN分節,表示數據發送完畢。
2. 接收到FIN的另一端執行被動關閉,這個FIN由TCP確認,它的接收也作爲文件結束符,傳遞給接收方應用進程(放在已排隊等候該應用進程接收的任何其他數據之後),因爲FIN的接收意味着應用進程在相應連接上再也接收不到額外數據。
3. 一段時間後,接收到文件結束符的應用進程將調用close關閉它的套接口,這導致它的TCP也發送一個FIN、
4. 接收到這個FIN的源發送方TCP,對它進行確認。發送ACK、
 FIN佔據1個字節的序列號空間,這與SYN相同,所以每個FIN的ACK確認號是這個 FIN的序列號加1.
在步驟2與步驟3之間可以有從執行被動關閉端到執行主動關閉端的數據流,這稱爲半關閉。不管是客戶還是服務器都可以執行主動關閉。通常情況下是客戶執行主動關閉。

注意:
四次握手不是關閉TCP連接的唯一方法. 有時,如果主機需要儘快關閉連接(或連接超時,端口或主機不可達),RST (Reset)包將被髮送. 注意在,由於RST包不是TCP連接中的必須部分, 可以只發送RST包(即不帶ACK標記). 但在正常的TCP連接中RST包可以帶ACK確認標記請注意RST包是可以不要收到方確認的
下面是一個簡單的TCP連接的例子:其中涉及到了主要的數據包的變化。

握手階段:
序號 方向    seq           ack
1  A->B 10000          0
2      B->A   20000   10000+1=10001
3     A->B   10001     20000+1=20001
解釋:
1:A向B發起連接請求,以一個隨機數初始化A的seq,這裏假設爲10000,此時ACK=0
2:B收到A的連接請求後,也以一個隨機數初始化B的seq,這裏假設爲20000,意思是:你的請求我已收到,我這方的數據流就從這個數開始。B的ACK是A的seq加1,即10000+1=10001
3:A收到B的回覆後,它的seq是它的上個請求的seq加1,即10000+1=10001,意思也是:你的回覆我收到了,我這方的數據流就從這個數開始。A此時的ACK是B的seq加1,即20000+1=20001
數據傳輸階段:
序號  方向    seq      ack    size
23          A->B           40000 70000 1514
24          B->A           70000 40000+1514-54=41460 54
25          A->B           41460 70000+54-54=70000 1514
26          B->A           70000 41460+1514-54=42920 54

解釋:
23:B接收到A發來的seq=40000,ack=70000,size=1514的數據包
24:於是B向A也發一個數據包,告訴B,你的上個包我收到了。B的seq就以它收到的數據包的ACK填充,ACK是它收到的數據包的SEQ加上數據包的大小(不包括以太網協議頭,IP頭,TCP頭),以證實B發過來的數據全收到了
25:A在收到B發過來的ack爲41460的數據包時,一看到41460,正好是它的上個數據包的seq加上包的大小,就明白,上次發送的數據包已安全到達。於是它再發一個數據包給B。這個正在發送的數據包的seq也以它收到的數據包的ACK填充,ACK就以它收到的數據包的seq(70000)加上包的size(54)填充,即ack=70000+54-54(全是頭長,沒數據項)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章