注:三次握手和四次揮手自己並不複雜,但卻能夠從不少角度理解這兩個過程,本文僅取一個視點解讀,若有其它見解歡迎留言交流。html
三次握手與四次揮手分別對應TCP鏈接創建過程與斷開過程,先上TCP報文格式:ui
三次握手過程:.net
問題1: 爲何要三次握手?unix
答:三次握手的目的是創建可靠的通訊信道,說到通信,簡單來講就是數據的發送與接收,而三次握手最主要的目的就是雙方確認本身與對方的發送與接收機能正常。htm
第一次握手:Client什麼都不能確認;Server確認了對方發送正常blog
第二次握手:Client確認了:本身發送、接收正常,對方發送、接收正常;Server確認了:本身接收正常,對方發送正常請求
第三次握手:Client確認了:本身發送、接收正常,對方發送、接收正常;Server確認了:本身發送、接收正常,對方發送接收正常im
因此三次握手就能確認雙發收發功能都正常,缺一不可。通信
問題2:爲何要發送特定的數據包,隨便發不行嗎?數據
答:三次握手的另一個目的就是確認雙方都支持TCP,告知對方用TCP傳輸。
第一次握手:Server 猜想Client可能要創建TCP請求,但不肯定,由於也多是Client亂髮了一個數據包給本身
第二次握手:經過ack=J+1,Client知道Server是支持TCP的,且理解了本身要創建TCP鏈接的意圖
第三次握手:經過ack=K+1,Server知道Client是支持TCP的,且確實是要創建TCP鏈接
問題3:上圖中的SYN和ACK是什麼?
答:SYN是標誌位,SYN=1表示請求鏈接;
ACK其實就是ack後面加上的那個數,真正發送的時候不單獨發ACK,只發ack,下面四次揮手的圖同理
四次揮手:
問題1: 爲何要四次揮手?
答:根本緣由是,一方發送FIN只表示本身發完了全部要發的數據,但還容許對方繼續把沒發完的數據發過來。
舉個例子:A和B打電話,通話即將結束後,A說「我沒啥要說的了」,B回答「我知道了」,可是B可能還會有要說的話,A不能要求B跟着本身的節奏結束通話,因而B可能又巴拉巴拉說了一通,最後B說「我說完了」,A回答「知道了」,這樣通話纔算結束。
問題2:爲何雙方要發送這樣的數據包?
答:和握手的狀況相似,只是爲了讓對方知曉本身理解了對方的意圖。
參考文章:
1.http://blog.csdn.net/renzhenhuai/article/details/12105457
2.http://blog.chinaunix.net/uid-20726927-id-2455485.html