所謂三次握手(Three-way Handshake),是指創建一個TCP鏈接時,須要客戶端和服務器總共發送3個包,那麼爲何在TCP創建鏈接時是三次握手,而不是兩次或四次? TCP名爲傳輸控制協議,是一種可靠的傳輸層協議。(原則上任何數據傳輸都沒法確保絕對可靠,三次握手只是確保可靠的基本須要)git
舉個例子,日常和女友打電話的時候(雖然我如今沒有女友@_@)
編程
注:握手過程當中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP鏈接一旦創建,在通訊雙方中的任何一方主動關閉鏈接以前,TCP鏈接都將被一直保持下去。服務器
位碼即TCP標誌位:socket
TCP的鏈接的拆除須要發送四個包,所以稱爲四次揮手(four-way handshake)。客戶端或服務器都可主動發起揮手動做,在socket編程中,任何一方執行close()操做便可產生揮手操做。圖片
舉個例子,和女友分手的時候(分手是件痛苦的事情,因此雙方儘可能多些包容,少些爭吵,不要輕易說分手,畢竟在一塊兒不容易) 開發
對應客戶端與服務器之間的通訊第一次揮手 主動關閉方發送一個FIN,用來關閉主動方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不會再給你發數據了(固然,在fin包以前發送出去的數據,若是沒有收到對應的ack確認報文,主動關閉方依然會重發這些數據),可是,此時主動關閉方還能夠接受數據。 同步
第二次揮手 被動關閉方收到FIN包後,發送一個ACK給對方,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號, SYN 和 FIN 都有seq序號)。 it
第三次揮手 被動關閉方發送一個FIN,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,個人數據也發送完了,不會再給你發數據了。 io
第四次揮手 主動關閉方收到FIN後,發送一個ACK給被動關閉方,確認序號爲收到序號+1,至此,完成四次揮手。ast
注:任何一方(客戶端或服務器)均可以選擇主動關閉,在雙方尚未徹底肯定關閉鏈接時,還有可能存在沒有發送完的數據
狀態說明:
這是由於服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它能夠把ACK和SYN(ACK起應答做用,而SYN起同步做用)放在一個報文裏來發送。
當關閉鏈接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你全部的數據都所有發送給對方了,因此你可能未必會立刻會關閉SOCKET,也即你可能還須要發送一些數據給對方以後,再發送FIN報文給對方來表示你贊成如今能夠關閉鏈接了,因此它這裏的ACK報文和FIN報文多數狀況下都是分開發送的。