TCP三次握手
一、什麼是三次握手
三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和服務器總共發送3個包。
二、三次握手的目的
三次握手的目的是連接服務器指定端口,建立TCP連接,並同步連接雙方的序列號和確認號並交換 TCP 窗口大小信息。客戶端執行連接請求時。將觸發三次握手。
三、三次握手過程
第一次握手:
客戶端發送一個TCP的SYN標誌位置1的包指明客戶打算連接的服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段裏。
第二次握手:
服務器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均爲1同時,將確認序號(Acknowledgement Number)設置爲客戶的ISN加1以.即X+1。
第三次握手.
客戶端再次發送確認包(ACK) SYN標誌位爲0,ACK標誌位爲1。如果正確則連接建立成功,客戶端和服務器進入ESTABLISHED狀態,完成三次握手,隨後客戶端與服務器之間可以開始傳輸數據了。把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫ISN的+1。
TCP四次揮手
一、什麼是四次揮手
TCP的連接的拆除需要發送四個包,因此稱爲四次揮手(four-way handshake)。客戶端或服務器均可主動發起揮手動作,任何一方執行close操作即可產生揮手操作。
二、四次揮手過程
第一次揮手:
客戶端發送一個FIN,用來關閉客戶端到服務器的數據傳送,客戶機進入FIN_WAIT_1狀態。
第二次揮手:
服務器收到FIN後,發送一個ACK給客戶端,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),服務器進入CLOSE_WAIT狀態。
第三次揮手:
服務器發送一個FIN,用來關閉服務器到客戶端的數據傳送,服務器進入LAST_ACK狀態。
第四次揮手:
客戶端收到FIN後,客戶端進入TIME_WAIT狀態,接着發送一個ACK給服務器,確認序號爲收到序號+1,服務器進入CLOSED狀態,完成四次揮手。
有限狀態機FSM:Finite State Machine
1、CLOSED 沒有任何連接狀態
2、LISTEN 偵聽狀態,等待來自遠方TCP端口的連接請求
3 、SYN-SENT 在發送連接請求後,等待對方確認
4、SYN-RECEIVED 在收到和發送一個連接請求後,等待對方確認
5、ESTABLISHED 代表傳輸連接建立,雙方進入數據傳送狀態
6、FIN-WAIT-1 主動關閉,主機已發送關閉連接請求,等待對方確認
7 、FIN-WAIT-2 主動關閉,主機已收到對方關閉傳輸連接確認,等待對方發送關閉傳輸連接請求
8、 TIME-WAIT 完成雙向傳輸連接關閉,等待所有分組消失
9、CLOSE-WAIT 被動關閉,收到對方發來的關閉連接請求,並已確認
10、LAST-ACK 被動關閉,等待最後一個關閉傳輸連接確認,並等待所有分組消失
11、CLOSING 雙方同時嘗試關閉傳輸連接,等待對方確認
附加問題:
【問題1】爲什麼連接的時候是三次握手,關閉的時候卻是四次揮手?
答:因爲當服務器收到客戶端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來回應的,SYN報文是用來同步的。但是關閉連接時,當服務器收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴客戶端,”發送的FIN報文已經收到”。只有等到客戶端所有的報文都發送完了,客戶端才能發送FIN報文,因此不能一起發送。故需要四步揮手。
【問題2】爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?
答:四個報文都發送完畢,客戶端和服務器可以直接進入CLOSE狀態了,但有可能最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文,確保之前的數據不會丟失後再進入close狀態。
原創文章,作者:Light Yagami,如若轉載,請註明出處:http://www.178linux.com/85976