一步一腳印。
先簡單介紹一下TCP協定。
TCP(Transmission Control Protocol 傳輸控制協定)是一種連線導向的、可靠的、基於位元組流的傳輸層協定。很複雜,但屬於不論程式設計師還是維運人員都必會的基本功。
物件導向的-連結雙方在通訊前需要預先建立一條連接,這猶如實際生活中的打電話,電話必須撥通了以後才能交流。
可靠的-TCP協定中有許多的規則來保障通訊連結的可靠性,包含應用資料分隔、重傳機制、對首部和資料校驗、對收到的資料進行排序,然後交給應用層、接收端會丟棄重複的資料、可進行流量控制。
TCP資料封裝在一個IP資料封包中,格式如下:
含:連接埠號碼[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的四次分手就這麼愉快的完成了。
建立連結和斷開連結圖示如下:
#下面來分解為什麼是三次握手呢?
為了防止已失效的連結請求封包片段突然又傳送到了伺服器端,因而產生錯誤。舉一個「栗」子。
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Dreamweaver CS6
視覺化網頁開發工具