首頁 運維 安全 TCP三次握手建立連結與四次揮手斷開連結的範例分析

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

May 11, 2023 pm 10:34 PM
tcp

一步一腳印。

先簡單介紹一下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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

win10如何重置tcp/ip協定? windows10重置tcp/ip協定棧的方法 win10如何重置tcp/ip協定? windows10重置tcp/ip協定棧的方法 Mar 16, 2024 am 11:07 AM

win10如何重置tcp/ip協定?其實方法很簡單的,使用者可以直接的進入到命令提示符,然後按下ctrl shift enter的組合鍵來進行操作就可以了或者是直接的執行重置命令來進行設置,下面就讓本站來為使用者來仔細的介紹一下windows10重置tcp/ip協定棧的方法吧。 windows10重置tcp/ip協定棧的方法一、管理員權限1、我們使用快捷鍵win R直接開啟運行窗口,然後輸入cmd並按住ctrl shift enter的組合鍵。 2、或者我們可以直接在開始選單中搜尋命令提示符,右鍵點

python中怎麼使用TCP實作對話客戶端和伺服器 python中怎麼使用TCP實作對話客戶端和伺服器 May 17, 2023 pm 03:40 PM

TCP客戶端一個使用TCP協定實現可連續對話的客戶端範例程式碼:importsocket#客戶端設定HOST='localhost'PORT=12345#建立TCP套接字並連接伺服器client_socket=socket.socket(socket.AF_INET,socket .SOCK_STREAM)client_socket.connect((HOST,PORT))whileTrue:#取得使用者輸入message=input("請輸入要傳送的訊息:&

活久見! TCP兩次揮手,你有看過嗎?那四次握手呢? 活久見! TCP兩次揮手,你有看過嗎?那四次握手呢? Jul 24, 2023 pm 05:18 PM

那這裡面提到的"面向連接",意味著需要 建立連接,使用連接,釋放連接。建立連線是指我們熟知的TCP三次握手。而使用連接,則是透過一發送、一確認的形式,進行資料傳輸。還有就是釋放連接,也就是我們常見的TCP四次揮手。

如何在Java中使用單一TCP連線發送多個檔案? 如何在Java中使用單一TCP連線發送多個檔案? Apr 27, 2023 am 08:49 AM

使用一個TCP連線發送多個檔案為什麼會有這篇部落格?最近在看一些相關方面的東西,簡單的使用一下Socket進行程式設計是沒有的問題的,但是這樣只是建立了一些基本概念。對於真正的問題,還是無能為力。當我需要進行檔案的傳輸時,我發現我好像只是發送過去了資料(二進位資料),但是關於檔案的一些資訊卻遺失了(檔案的副檔名)。而且每次我只能使用一個Socket發送一個文件,沒有辦法做到連續發送文件(因為我是依靠關閉流來完成發送文件的,也就是說我其實是不知道文件的長度,所以只能以一個Socket連接代表一個檔案)。

Java API 開發中使用 Netty4 進行 TCP 通信 Java API 開發中使用 Netty4 進行 TCP 通信 Jun 17, 2023 pm 11:18 PM

TCP是電腦網路通訊協定的一種,是一種連線導向的傳輸協定。在Java應用開發中,TCP通訊被廣泛應用於各種場景,例如客戶端和伺服器之間的資料傳輸、音訊視訊即時傳輸等等。 Netty4是一個高效能、高可擴展性、高效能的網路程式框架,能夠優化伺服器和用戶端之間的資料交換流程,使其更有效率可靠。使用Netty4進行TCP通訊的具體實作步驟如下:引入

Nginx怎麼配置TCP負載平衡 Nginx怎麼配置TCP負載平衡 May 19, 2023 am 08:29 AM

假設Kubernetes叢集已經配置好,我們將基於CentOS為Nginx建立一個虛擬機器。以下是實驗中設定的詳細資訊:Nginx(CenOS8Minimal)–192.168.1.50KubeMaster–192.168.1.40KubeWorker1–192.168.1.41KubeWorker2–192.168.192.168.1.41KubeWorker2–192.168.1.421)所以需要安裝e

Linux SIGPIPE訊號 Linux SIGPIPE訊號 Feb 19, 2024 pm 04:00 PM

在TCP通信雙方中,為了描述方便,以下將通信雙方用A和B代替。根據TCP協定規定,如果A關閉連線後B繼續發送數據,B會收到A的RST回應。若B繼續發送數據,系統會發出SIGPIPE訊號告知連接已斷開,停止發送。系統對SIGPIPE訊號的預設處理行為是讓B進程退出。作業系統對SIGPIPE訊號的這種預設處理行為非常不友好,讓我們來分析一下。 TCP通訊是全雙工頻道,相當於兩條單工頻道,連線兩端各負責一條。當對端「關閉」時,雖然本意是關閉整個兩條頻道,但本端只是收到FIN包。依TCP協議的規定,當一

swoole開發功能的高併發TCP長連接處理技巧 swoole開發功能的高併發TCP長連接處理技巧 Aug 25, 2023 pm 10:01 PM

【標題】Swoole開發功能的高並發TCP長連接處理技巧【導言】隨著互聯網的高速發展,應用程式對並發處理的需求也越來越高。 Swoole作為一款基於PHP的高效能網路通訊引擎,提供了強大的非同步、多進程、協程能力,大大提升了應用程式並發處理的能力。本文將介紹如何使用Swoole開發功能的高並發TCP長連接處理技巧,並結合程式碼範例進行詳細說明。 【正文】一、Swo

See all articles