TCP 三次握手 與 四次揮手

TCP 三次握手

所謂三次握手(Three-way Handshake),是指創建一個TCP鏈接時,須要客戶端和服務器總共發送3個包,那麼爲何在TCP創建鏈接時是三次握手,而不是兩次或四次? TCP名爲傳輸控制協議,是一種可靠的傳輸層協議。(原則上任何數據傳輸都沒法確保絕對可靠,三次握手只是確保可靠的基本須要)git


舉個例子,日常和女友打電話的時候(雖然我如今沒有女友@_@)
編程

圖片加載失敗!
對應客戶端與服務器之間的通訊
圖片加載失敗!

  • 第一次握手
    客戶端發送syn包(syn=x)的數據包到服務器,並進入SYN_SEND狀態,等待服務器確認;
  • 第二次握手
    服務器收到syn包,必須確認客戶的SYN(ack=x+1),同時本身也發送一個SYN包(syn=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
  • 第三次握手
    客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

注:握手過程當中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP鏈接一旦創建,在通訊雙方中的任何一方主動關閉鏈接以前,TCP鏈接都將被一直保持下去。服務器


位碼即TCP標誌位:socket

  • SYN(synchronous創建聯機)
  • ACK(acknowledgement 確認)
  • PSH(push傳送)
  • FIN(finish結束)
  • RST(reset重置)
  • URG(urgent緊急)
  • Sequence number(seq 順序號碼)
  • Acknowledge number(ack 確認號碼)

TCP 四次揮手

TCP的鏈接的拆除須要發送四個包,所以稱爲四次揮手(four-way handshake)。客戶端或服務器都可主動發起揮手動做,在socket編程中,任何一方執行close()操做便可產生揮手操做。圖片


舉個例子,和女友分手的時候(分手是件痛苦的事情,因此雙方儘可能多些包容,少些爭吵,不要輕易說分手,畢竟在一塊兒不容易) 開發

圖片加載失敗!
   對應客戶端與服務器之間的通訊  
圖片加載失敗!
  

  • 第一次揮手   主動關閉方發送一個FIN,用來關閉主動方到被動關閉方的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不會再給你發數據了(固然,在fin包以前發送出去的數據,若是沒有收到對應的ack確認報文,主動關閉方依然會重發這些數據),可是,此時主動關閉方還能夠接受數據。  同步

  • 第二次揮手   被動關閉方收到FIN包後,發送一個ACK給對方,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號, SYN 和 FIN 都有seq序號)。  it

  • 第三次揮手   被動關閉方發送一個FIN,用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,個人數據也發送完了,不會再給你發數據了。  io

  • 第四次揮手   主動關閉方收到FIN後,發送一個ACK給被動關閉方,確認序號爲收到序號+1,至此,完成四次揮手。ast

注:任何一方(客戶端或服務器)均可以選擇主動關閉,在雙方尚未徹底肯定關閉鏈接時,還有可能存在沒有發送完的數據


狀態說明:

  • CLOSED: 這個表示初始狀態。
  • LISTEN(服務器): 表示服務器端的某個SOCKET處於監聽狀態,能夠接受鏈接了。
  • ESTABLISHED:表示鏈接已經創建了。
  • SOCKET:請自行百度

爲何創建鏈接協議是三次握手,而關閉鏈接倒是四次握手呢?

這是由於服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它能夠把ACK和SYN(ACK起應答做用,而SYN起同步做用)放在一個報文裏來發送。

當關閉鏈接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你全部的數據都所有發送給對方了,因此你可能未必會立刻會關閉SOCKET,也即你可能還須要發送一些數據給對方以後,再發送FIN報文給對方來表示你贊成如今能夠關閉鏈接了,因此它這裏的ACK報文和FIN報文多數狀況下都是分開發送的。


^_<

相關文章
相關標籤/搜索