TCP是一個面向鏈接的的協議,因此不管哪一方發送數據以前都必需要創建鏈接。三次握手是TCP/IP網絡中用於在本地主機/客戶端和服務器之間建立鏈接的方法。這是一種三步方法,要求客戶機和服務器在實際數據通訊開始以前交換SYN和ACK(確認)數據包。 要創建鏈接,將發生三次握手:服務器
1.SYN:主動打開由客戶機向服務器發送syn來執行。客戶機將段的序列號(SEQ)設置爲隨機值A。
2.SYN-ACK:做爲響應,服務器用SYN-ACK進行響應。確認號被設置爲比接收到的序列號多一個,即A+1,服務器爲數據包選擇的序列號是另外一個隨機數B。
3.最後,客戶機將一個ACK發送回服務器。序列號設置爲接收到的確認值,即A+1,確認號設置爲接收到的序列號(即B+1)的一個以上。網絡
此時,客戶機和服務器都已收到鏈接確認。步驟一、2創建一個方向的鏈接參數(序列號),並確認。步驟二、3爲另外一個方向創建鏈接參數(序列號),並確認。經過這些,創建了全雙工通訊。
3d
TCP的關閉是四次,也就是說須要雙方都發送FIN告知對方我要關閉了,並回復FIN-ACK。因此在一方關閉的時候另外一方還能夠發送數據,咱們把這種現象稱爲TCP半關閉。固然主動方發起方也能夠選擇不接受。TCP四次揮手:cdn
1.FIN:主動打開方通知向被動方發送FIN,告知被動方我已經完成數據發送要關閉鏈接了。本身進入FIN_WAIT1
2.ACK:服務器收到對方FIN並回復ACK告知我已收到(這裏不像創建鏈接同樣,把ACK和本身的FIN一塊兒發送是由於本身有可能還沒完成數據的傳輸)本身能夠繼續進行未完成的數據傳輸並把狀態設置成CLOSE_WAIT,對方收到ACK把本身的狀態變成FIN_WAIT2並繼續等待被動方的FIN
3.FIN:服務端數據傳輸完成後向主動打開方發送發送FIN,等待對方的ACK,被動關閉的一方進入LAST_ACK狀態
4.ACK:主動方收到被動方發送的FIN,回覆ACKblog
此時,主動方進入到TIME_WAIT狀態而後等待2MSL(Maximum segment lifetime 它是任何報文段被丟棄前在網絡內的最長時間)後進入到CLOSED關閉,被動方收到ACK後進入到CLOSED。由於網絡環境是複雜多變的,有可能本身的最後一個ACK丟失致使對方重傳FIN。因此主動發起方要等待2MSL來預防對方重傳
最後附上一副TCP狀態機,能夠參考TCP/IP illustrated Vol. 1 第18章(強烈推薦英文版,若是英文很差能夠買本中文的參考着看) it