首頁 > 運維 > 安全 > 主體

TCP三次握手建立連結與四次揮手斷開連結的範例分析

WBOY
發布: 2023-05-11 22:34:24
轉載
911 人瀏覽過

一步一腳印。

先簡單介紹一下TCP協定。

  TCP(Transmission Control Protocol 傳輸控制協定)是一種連線導向的、可靠的、基於位元組流的傳輸層協定。很複雜,但屬於不論程式設計師還是維運人員都必會的基本功。

  物件導向的-連結雙方在通訊前需要預先建立一條連接,這猶如實際生活中的打電話,電話必須撥通了以後才能交流。

  可靠的-TCP協定中有許多的規則來保障通訊連結的可靠性,包含應用資料分隔、重傳機制、對首部和資料校驗、對收到的資料進行排序,然後交給應用層、接收端會丟棄重複的資料、可進行流量控制。

TCP資料封裝在一個IP資料封包中,格式如下: 

TCP三次握手建立連結與四次揮手斷開連結的範例分析

含:連接埠號碼[16bit]、序號[32bit]、偏移[4bit]、Reserved [6bit]、標誌[6bit]、視窗大小(window)[16bit]、校驗和[16bit]、緊急指標[16bit]、TCP選項

#這裡要注意的:

  • TCP的套件是沒有IP位址的,那是IP層上的事,但有來源埠和目標埠。

  • 一個TCP連線需要四個元組來表示是同一個連線(src_ip, src_port, dst_ip, dst_port)精確說是五元組,還有一個是協定。但因為這裡只是說TCP協議,所以,這裡我只說四元組。

  • Sequence Number是套件的序號,用來解決網路包亂序(reordering)問題。

  • Acknowledgement Number就是ACK-用來確認收到,用來解決不丟包的問題

  • Window又叫Advertised-Window,也就是著名的滑動視窗(Sliding Window),用來解決串流控制的

  • TCP Flag ,也就是套件的類型,主要是用來操控TCP的狀態機的

     URG: 緊急指標有效

     ACK:確認序號有效

     PSH:接收者應盡快將這個封包交給應用層

    # RST :重建連線

     SYN:同步序號,用來啟動一個連線

     FIN: 發端完成傳送任務(主動關閉)  

#三次握手建立連結

1.請求端(client客戶端)發送一個SYN=1指明客戶打算連接的伺服器的端口,TCP規定SYN=1時不能攜帶數據,但要消耗一個序號,因此宣告自己的初始序號seq為一個隨機數假定為seq=x。

2.服務端(server)對客戶端封包文段進行確認,將確認序號設為ACK=x 1。同時也請求連接客戶端,發送SYN=1,並且發送初始seq號假定為seq=y。

3.客戶端對服務端封包段進行確認,發送確認序號並同意與服務端建立連線ACK=y 1。

這三個封包完成連線的建立。這個過程也稱為三次握手(three-way handshake)

四次揮手斷開連結

1.主機1(可以使客戶端,也可以是伺服器端),設定Sequence Number和Acknowledgment Number,傳送一個FIN封包文段給主機2;此時,主機1進入FIN_WAIT_1狀態;這表示主機1沒有資料要傳送給主機2了;

2.主機2收到了主機1發送的FIN報文段,向主機1回一個ACK報文段,Acknowledgment Number為Sequence Number加1;主機1進入FIN_WAIT_2狀態;主機2告訴主機1,我也沒有資料要發送了,可以進行關閉連接了;

3.主機2向主機1發送FIN報文段,請求關閉連接,同時主機2進入CLOSE_WAIT狀態;

4.第主機1收到主機2發送的FIN報文段,向主機2發送ACK報文段,然後主機1進入TIME_WAIT狀態;主機2收到主機1的ACK報文段以後,就關閉連接;此時,主機1等待2MSL後依然沒有收到回复,則證明Server端已正常關閉,那好,主機1也可以關閉連線了。

至此,TCP的四次分手就這麼愉快的完成了。

建立連結和斷開連結圖示如下:

TCP三次握手建立連結與四次揮手斷開連結的範例分析

#下面來分解為什麼是三次握手呢?

為了防止已失效的連結請求封包片段突然又傳送到了伺服器端,因而產生錯誤。舉一個「栗」子。

client發出的第一個連線請求封包並沒有遺失,而是在某個網路結點長時間的滯留了,以致延遲到連線釋放以後的某個時間才到達server。本來這是一個早已失效的報文段。但server收到此失效的連線請求封包段後,就誤認為是client再次發出的一個新的連線請求。於是就向client發出確認報文段,同意建立連線。假設不採用“三次握手”,那麼只要server發出確認,新的連線就建立了。由於現在client並沒有發出建立連線的請求,因此不會理睬server的確認,也不會向server傳送資料。但server卻以為新的運輸連線已經建立,並且一直等待client發送資料。這樣,server的很多資源就白白浪費掉了。採用「三次握手」的辦法可以防止上述現象發生。例如剛才那種情況,client不會向server的確認發出確認。 server由於收不到確認,就知道client並沒有要求建立連線。 "

這就很明白了,防止了伺服器端的一直等待而浪費資源。

那麼又為什麼是四次揮手呢?

TCP協定是一種面向連接的、可靠的、基於位元組流的傳輸層通訊協定。TCP是全雙工模式,這意味著,當主機1發出FIN報文段時,只是表示主機1已經沒有資料要發送了,主機1告訴主機2, 它的資料已經全部發送完畢了;但是,這時候主機1還是可以接受來自主機2的資料;當主機2返回ACK報文段時,表示它已經知道主機1沒有資料發送了,但主機2還是可以傳送資料到主機1的;當主機2也發送了FIN 封包片段時,這時候就表示主機2也沒有資料要傳送了,就會告訴主機1,我也沒有資料要傳送了,之後彼此就會愉快的中斷這次TCP連結。如果要正確的理解四次分手的原理,就需要了解四次分手過程中的狀態變化。

以上是TCP三次握手建立連結與四次揮手斷開連結的範例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
tcp
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!