TCP 三向交握協議

來源:互聯網
上載者:User

TCP握手協議
在TCP/IP協議中,TCP協議提供可靠的串連服務,採用三向交握建立一個串連。
第一次握手:建立串連時,用戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三向交握:用戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,用戶端和伺服器進入ESTABLISHED狀態,完成三向交握。
完成三向交握,用戶端與伺服器開始傳送資料,在上述過程中,還有一些重要的概念:
未串連隊列:在三向交握協議中,伺服器維護一個未串連隊列,該隊列為每個用戶端的SYN包(syn=j)開設一個條目,該條目表明伺服器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的串連在伺服器處於Syn_RECV狀態,當伺服器收到客戶的確認包時,刪除該條目,伺服器進入 ESTABLISHED狀態。
Backlog參數:表示未串連隊列的最大容納數目。
SYN-ACK 重傳次數伺服器發送完SYN-ACK包,如果未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該串連資訊從半串連隊列中刪除。注意,每次重傳等待的時間不一定相同。
半串連存活時間:是指半串連隊列的條目存活的最長時間,也即服務從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半串連存活時間為Timeout時間、SYN_RECV存活時間。

syn_send         a   syn=j       ---> b
         a   syn=k ack=j+1
ESTABLISHED      a   ack=k+1     --->b        ESTABLISHED

TCP/IP詳解學習筆記(10)-TCP串連的建立與中止     選擇自 goodboy1881 的 Blog  
關鍵字   TCP/IP詳解學習筆記(10)-TCP串連的建立與中止
出處   

TCP是一個連線導向的協議,所以在串連雙方發送資料之前,都需要首先建立一條串連。這和前面講到的協議完全不同。前面講的所有協議都只是發送資料而已,大多數都不關心發送的資料是不是送到,UDP尤其明顯,從編程的角度來說,UDP編程也要簡單的多----UDP都不用考慮資料分區。
書中用telnet登陸退出來解釋TCP協議串連的建立和中止的過程,可以看到,TCP串連的建立可以簡單的稱為三向交握,而串連的中止則可以叫做四次握手。
1.串連的建立
在建立串連的時候,用戶端首先向伺服器申請開啟某一個連接埠(用SYN段等於1的TCP報文),然後伺服器端發回一個ACK報文通知用戶端請求報文收到,用戶端收到確認報文以後再次發出確認報文確認剛才伺服器端發出的確認報文(繞口麼),至此,串連的建立完成。這就叫做三向交握。如果打算讓雙方都做好準備的話,一定要發送三次報文,而且只需要三次報文就可以了。
可以想見,如果再加上TCP的逾時重傳機制,那麼TCP就完全可以保證一個資料包被送到目的地。
2.結束串連
TCP有一個特別的概念叫做half-close,這個概念是說,TCP的串連是全雙工系統(可以同時發送和接收)串連,因此在關閉串連的時候,必須關閉傳和送兩個方向上的串連。客戶機給伺服器一個FIN為1的TCP報文,然後伺服器返回給用戶端一個確認ACK報文,並且發送一個FIN報文,當客戶機回複ACK報文後(四次握手),串連就結束了。
3.最大報文長度
在建立串連的時候,通訊的雙方要互相確認對方的最大報文長度(MSS),以便通訊。一般這個SYN長度是MTU減去固定IP首部和TCP首部長度。對於一個乙太網路,一般可以達到1460位元組。當然如果對於非本地的IP,這個MSS可能就只有536位元組,而且,如果中間的傳輸網路的MSS更佳的小的話,這個值還會變得更小。
4.TCP的狀態遷移圖
書P182頁給出了TCP的狀態圖,這是一個看起來比較複雜的狀態遷移圖,因為它包含了兩個部分---伺服器的狀態遷移和用戶端的狀態遷移,如果從某一個角度出發來看這個圖,就會清晰許多,這裡面的伺服器和用戶端都不是絕對的,發送資料的就是用戶端,接受資料的就是伺服器。
4.1.用戶端應用程式的狀態遷移圖
用戶端的狀態可以用如下的流程來表示:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
以上流程是在程式正常的情況下應該有的流程,從書中的圖中可以看到,在建立串連時,當用戶端收到SYN報文的ACK以後,用戶端就開啟了資料互動地串連。而結束串連則通常是用戶端主動結束的,用戶端結束應用程式以後,需要經曆FIN_WAIT_1,FIN_WAIT_2等狀態,這些狀態的遷移就是前面提到的結束串連的四次握手。
4.2.伺服器的狀態遷移圖
伺服器的狀態可以用如下的流程來表示:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
在建立串連的時候,伺服器端是在第三向交握之後才進入資料互動狀態,而關閉串連則是在關閉串連的第二次握手以後(注意不是第四次)。而關閉以後還要等待用戶端給出最後的ACK包才能進入初始的狀態。
4.3.其他狀態遷移
書中的圖還有一些其他的狀態遷移,這些狀態遷移針對伺服器和用戶端兩方面的總結如下
LISTEN->SYN_SENT,對於這個解釋就很簡單了,伺服器有時候也要開啟串連的嘛。
SYN_SENT->SYN收到,伺服器和用戶端在SYN_SENT狀態下如果收到SYN資料報,則都需要發送SYN的ACK資料報並把自己的狀態調整到SYN收到狀態,準備進入ESTABLISHED
SYN_SENT->CLOSED,在發送逾時的情況下,會返回到CLOSED狀態。
SYN_收到->LISTEN,如果受到RST包,會返回到LISTEN狀態。
SYN_收到->FIN_WAIT_1,這個遷移是說,可以不用到ESTABLISHED狀態,而可以直接跳轉到FIN_WAIT_1狀態並等待關閉。
4.4.2MSL等待狀態
書中給的圖裡面,有一個TIME_WAIT等待狀態,這個狀態又叫做2MSL狀態,說的是在TIME_WAIT2發送了最後一個ACK資料報以後,要進入 TIME_WAIT狀態,這個狀態是防止最後一次握手的資料報沒有傳送到對方那裡而準備的(注意這不是四次握手,這是第四次握手的保險狀態)。這個狀態在很大程度上保證了雙方都可以正常結束,但是,問題也來了。
由於插口的2MSL狀態(插口是IP和連接埠對的意思,socket),使得應用程式在2MSL時間內是無法再次使用同一個插口的,對於客戶程式還好一些,但是對於服務程式,例如httpd,它總是要使用同一個連接埠來進行服務,而在2MSL時間內,啟動httpd就會出現錯誤(插口被使用)。為了避免這個錯誤,伺服器給出了一個平靜時間的概念,這是說在2MSL時間內,雖然可以重新啟動伺服器,但是這個伺服器還是要平靜的等待2MSL時間的過去才能進行下一次串連。
4.5.FIN_WAIT_2狀態
這就是著名的半關閉的狀態了,這是在關閉串連時,用戶端和伺服器兩次握手之後的狀態。在這個狀態下,應用程式還有接受資料的能力,但是已經無法發送資料,但是也有一種可能是,用戶端一直處於FIN_WAIT_2狀態,而伺服器則一直處於WAIT_CLOSE狀態,而直到應用程式層來決定關閉這個狀態。
5.RST,同時開啟和同時關閉
RST是另一種關閉串連的方式,應用程式應該可以判斷RST包的真實性,即是否為異常中止。而同時開啟和同時關閉則是兩種特殊的TCP狀態,發生的機率很小。
6.TCP伺服器設計
前面曾經講述過UDP的伺服器設計,可以發現UDP的伺服器完全不需要所謂的並發機制,它只要建立一個資料輸入隊列就可以。但是TCP不同,TCP伺服器對於每一個串連都需要建立一個獨立的進程(或者是輕量級的,線程),來保證對話的獨立性。所以TCP伺服器是並發的。而且TCP還需要配備一個呼入串連請求隊列(UDP伺服器也同樣不需要),來為每一個串連請求建立對話進程,這也就是為什麼各種TCP伺服器都有一個最大串連數的原因。而根據源主機的IP和連接埠號碼碼,伺服器可以很輕鬆的區別出不同的會話,來進行資料的分發。
掌握本章的狀態遷移圖才是學習本章的關鍵。
首先來介紹一下三向交握:
1:
伺服器
必須準備好接受外來的串連,這通過調用socket,bind,和listen函數來完成,稱為被動開啟
2:客戶通過調用connect 進行主動開啟,這引起客戶TCP發送一個SYN分節。一般情況下,SYN分節不攜帶資料,它只含有一個IP頭部,一個TCP頭部,及可能的TCP選項。
3:伺服器必須確認客戶的SYN,同時自己也得發送一個SYN分節,包含同一串連中發送資料的一個系列號,伺服器以單個分節向客戶發送SYN和對客戶SYN的ACK.
4:客戶確認ACK.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.