1. 程式人生 > >TCP三次握手,四次揮手(從狀態的角度分析)

TCP三次握手,四次揮手(從狀態的角度分析)

但是,我發覺我的知識來源大多來自《計算機網路-自頂向下》那本,這本書沒有過多的考慮TCP三次握手中的相關狀態轉移細節,導致當時回答的並不是特別好,這次決定好好把這塊知識好好鞏固一下。
首先,我們先來一張大家都非常熟悉的圖:
這裡寫圖片描述
相信大家對這張圖已經熟得不能再熟悉的,但我這次要應用程式的角度來說下:
1.客戶端的socket(socket描述符)呼叫connect主動開啟連線(當然要指定伺服器的IP地址)這個時候,connect函式阻塞住等待下面的回信,然後傳送SYN=1的包。
2.伺服器端這時候建立socket,然後bind埠,開啟監聽,呼叫accept(阻塞),這時候收到了SYN。然後,從伺服器上建立連線描述符,也就是建立了快取空間,反回去傳送SYN K,ack J+1(客戶端的SYN),傳送回客戶端。
3.客戶端這時候的connect返回,傳送了ack K+1。服務端accept返回,連線成功,進行read,write讀寫,read這時候發生阻塞。
咋看之下,這個過程非常簡單。但是,往深挖了就很多不會了,我也沒太回答上來:

問題一

TCP在三次握手的時候一共傳輸了哪些訊息:
SYN=1,ACK,序列號,看似只有這三個東西。還有目的IP,目的埠號,源IP,源埠號,還有一個最重要的接收視窗,接收視窗是在報文端裡面進行控制的,但是我們的滑動視窗是在我們的作業系統中實現的。

問題二

滑動視窗的大小如何控制?
這個我們可以和擁塞視窗相互聯絡起來,剛開始的大小非常小,然後我們線性增大,一旦碰到了擁塞的情況,我們的視窗迅速減半。

問題三

TCP是幾元組?
五元組,分別是源埠,源IP,目的埠,目的IP,還有一個運輸層協議

下面,還是把四次握手的圖一起放上來,好做理解:
這裡寫圖片描述

你以為這樣三次握手就完了嗎。。。
我們還沒講狀態呢?
來上圖:
這裡寫圖片描述


大家第一眼看這圖肯定懵逼。沒事,我們一步步來解決這個圖。
對於三次握手:
(1).對於客戶端而言:我們原來處理CLOSED的狀態,然後我們客戶端呼叫connect進行主動開啟,傳送SYN,之後我們便進入了SYN_SEND,這個時候我們應該準備的事情就是等待服務端的ACK了。
(2)對於服務端而言:開啟服務端的時候從CLOSED轉移到LISTEN,我們ACCEPT一個客戶端的connect,我們處於被動開啟的狀態,從LISTEN狀態轉移到SYN_RCVD狀態,併發送SYN K和ACK=SYN J+1。我們等待客戶段的ACK應答。
(3)對於客戶端而言:收到了服務端的SYN K和ACK=SYN J+1.客戶端的阻塞connect連線成功,狀態轉移到了ESTABLISHED,併發送ACK=K+1,到服務端。
(4)對於服務端而言:收到客戶端的ACK,狀態轉移到了ESTABLISHED。三次握手結束
(5)超時情況或應用close:繼續轉移到CLOSED的起始狀態。

服務端和客戶端都到了ESTABLISHED,說明可以進行傳輸資訊。
這時候我們再來關注一下關閉伺服器的場景是如何?
(1)客戶端:呼叫close函式,傳送FIN,到達FIN_WAIT_1狀態,等待服務端的ACK過來。
(1)服務端:接收到客戶端的FIN資訊,傳送ACK,並且到CLOSE_WAIT,服務端關閉與客戶端的連線,併發送FIN.
(2)客戶端:接收到服務端的ACK包,到達FIN_WAIT_2狀態,並等待服務端傳送FIN包。
(2)服務端:服務端開始傳送FIN資訊,到達LAST_ACK狀態。
(3)客戶端:接收到服務端的FIN資訊,狀態轉移到TIME_WAIT狀態。併發送 ACK包到服務端。
(3)服務端:接收到客戶端的ACK資訊,狀態由LAST_ACK轉移到CLOSED狀態。
(3)客戶端:超過2MSL時候後返回到CLOSED狀態。

感覺字有點多,我們繼續把這個過程簡化到一張圖上面:
這裡寫圖片描述
這個圖將我們的狀態轉移和三次握手、四次揮手的圖都放在了一張折線圖上面。
這就是我們要說的從狀態轉移的角度來說明TCP三次握手,四次揮手。
不知道大家有沒發覺一個很奇怪的狀態,也就是TIME_WAIT這個狀態,是否判斷2MSL超時。
給大家說明一下MSL是什麼意思?MSL代表著IP報文能在網際網路中存在的最長時間,2個MSL代表客戶端和服務端的一個IP報文能在網際網路中存在的最長時間總和。超過這個時間就說明出現了超時事件要進行重發。
那麼,我們的TIME_WAIT的作用到底是什麼呢,這裡有兩點:
1.實現終止TCP全雙工連線的可靠性
2.允許老的重複分組在網路中消逝
對於1而言,假設在圖中服務端的最後一個FIN未傳送成功,經過一個MSL,之後服務端會重發送一個FIN。這就需要兩個MSL時間讓客戶端進行稽核。所以,客戶端進入TIME_WAIT需要2個MSL時間。
對於2而言,是為了解決在結束這個連線之後,又建立起一個新的連線。為了避免這個新連線得到前一個連線的重發分組,2個MSL保證兩個方向的重發分組都被拋棄掉了。
對於UDP而言,三次握手和四次揮手的過程將會被全部拋棄掉,這樣看來,TCP將會比UDP多7節的傳輸過程。
Reference:UNIX網路程式設計

相關推薦

TCP握手揮手

http hacker mage 防護 復位 可能 報文 為什麽 準備 參考文章,感謝原博主的分享與總結; https://blog.csdn.net/qzcsu/article/details/72861891 https://www.cnblogs.co

TCP握手揮手(不看後悔一看必懂)

三次握手 step1:第一次握手 客戶端傳送資料包到伺服器,(在此連線請求報文段中的同步位SYN=1,確認ACK=0,表示這是一個TCP連線請求資料報文,序號seq=x,表示傳輸資料時的起始序號是x)此時,客戶端進入SYN_SENT狀態,等待伺服器確認 step2:第二次握手

如何理解tcp握手揮手

原文地址 這是一個很有意思的問題~     首先,我們要知道TCP是全雙工的,即客戶端在給伺服器端傳送資訊的同時,伺服器端也可以給客戶端傳送資訊。而半雙工的意思是A可以給B發,B也可以給A發,但是A在給B發的時候,B不能給A發,即不同時,為半雙工。 單工為只能A給B發,B不能給A發

TCP握手揮手詳解

三次握手為了準確無誤的將資料傳送到指定IP,TCP協議採用了三次握手 1 客戶端向服務端提出請求,內容帶有syn標識,隨機序列x 2 服務端向客戶端迴應請求,內容帶有syn和ack標識,隨機序列y,確認序列x+1 3 客戶端向服務端確認請求,內容帶有ack,隨機序列x+1,確認序列y+1 完成三次握手

第五章 運輸層(UDP和TCP握手揮手分析

    序言         通過這章,可以知道其實三次握手和四次揮手其實真的好簡單,通過這章的學習,我相信你也會同樣的認為,以後在也不需要聽到別人問三次握手的過程而自己一臉懵逼了,覺得人家好屌,其實也就是他懂你不懂,僅此而已,不懂就去學。學了你就會覺得其實也就那樣,沒有什麼厲害的,這讓我回想以前剛學習程式設

TCP/IP】TCP握手揮手過程詳解

TCP傳輸控制協議   TCP是一個面向連線的協議,為使用者程序提供可靠的全雙工位元組流。TCP套接字是一種流套接字,TCP關心確認、超時和重傳之類的細節。   首先,TCP提供客戶與伺服器之間的連線。TCP客戶先與某個給定伺服器建立一個連線,再跨該連線與那

TCP協議中為什麼握手揮手(詳解)!!!

建立TCP需要三次握手才能建立,而斷開連線則需要四次握手。整個過程如下圖所示: 先來看看如何建立連線的。 首先Client端傳送連線請求報文,Server段接受連線後回覆ACK報文,併為這次連線分配資源。Client端接收到ACK報文後也向Server段發

TCP握手揮手(狀態角度分析)

但是,我發覺我的知識來源大多來自《計算機網路-自頂向下》那本,這本書沒有過多的考慮TCP三次握手中的相關狀態轉移細節,導致當時回答的並不是特別好,這次決定好好把這塊知識好好鞏固一下。 首先,我們先來一張大家都非常熟悉的圖: 相信大家對這張圖已經熟得不能再

一起來了解TCP握手揮手

        瞭解TCP首先要簡單瞭解OSI七層模型。OSI(開放系統互聯)把網路通訊分為7層,即物理層、資料鏈層、網路層、傳輸層、會話層、表示層、應用層。HTTP是客戶端瀏覽器或其他程式與web伺服器之間的應用層通訊協議,TCP/IP是在傳輸層用TCP協議的規則進行的封裝

TCP協議的連線管理機制------握手揮手

有關TCP協議的相關知識見:這篇部落格        TCP與UDP最大的區別就是TCP保證可靠性資料傳輸。從TCP與UDP的協議報頭就可以看出差別。TCP的協議報頭比UDP報頭多了很多東西,而多出來的這些都是用於保證資料的可靠性傳輸的。下面將具體介紹TCP保證可靠傳輸的機制

TCP協議總結(理解握手揮手

TCP(傳輸控制協議)特點: 1.TCP是面向連線的運輸層協議 2.TCP連線是點對點的,連線端點是兩個套接字(socket=IP地址 : 埠號) 3.TCP是全雙工通訊,兩端都可以傳送接收資料 4.TCP資料傳輸是面向位元組流的。 TCP可靠傳輸的工

TCP握手揮手和重要的細節—乾貨滿滿建議細讀

最近把個人部落格搭建好了,連結在這裡:tobe的囈語,文章會先在部落格和公眾號更新~ 大家多多收藏啊 上一次講了 UDP 協議,從這次開始,就要講 TCP 協議了,因為 TCP 協議涉及到的東西很多,一篇文章概括不完,所以我把 TCP 協議的內容分成好幾個部分,逐個擊破。 TCP 報文段結構 一談到 TCP

淺談TCP握手揮手

今天我們來講一下TCP的三次握手和四次揮手,先來張思維導圖。      一、TCP是什麼 TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。 我們知道了上述瞭解到了TCP的定義,通俗一點講

嵌入式linux網路程式設計TCP、IP協議原理wireshark抓包工具乙太網頭(Ethernet header)IP頭TCP握手握手UDP頭

文章目錄 1,wireshark抓包工具 1.1,wireshark安裝 1.2,wireshark啟動 1.2.1,出現錯誤警告 1.2.2,解決方案 2,常用除錯測試工具 3,TCP

握手揮手”你真的懂嗎?

記得剛畢業找工作面試的時候,經常會被問到:你知道“3次握手,4次揮手”嗎?這時候我會“胸有成竹”地“背誦”前期準備好的“答案”,第一次怎麼怎麼,第二次……答完就沒有下文了,面試官貌似也沒有深入下去的意思,深入下去我也不懂,皆大歡喜! 作為程式設計師,要有“刨根問底”的精神。知其然,更要知其所以然。這篇文章希

圖片詳解TCP連線的握手斷開基本原理

圖片詳解TCP連線的三次握手,四次斷開 作者:林子            TCP(TransmissionControl Protocol 傳輸控制協議)是一種面向連線傳輸協議,就像打電話一

為什麼一定要是握手揮手

應用層向TCP層傳送用於網間傳輸的、用8位位元組表示的資料流,然後TCP把資料流分割槽成適當長度的報文段(通常受該計算機連線的網路的資料鏈路層的最大傳輸單元(MTU)的限制)。之後TCP把結果包傳給I

socket關於握手揮手的理解

socket的建立是全雙工的,所以會有三次握手,但是四次揮手的區別。          客戶端<------------------------------------------->伺服器 握手1,客戶端請求伺服器建立連線(客戶端發); 握手2,伺服器

握手揮手 之網路管理基礎命令

                            三次握手 三次握手  客戶端未發起請求之前處於CLOSED狀態,伺服器未接收到請

網路程式設計之——七層模型與TCP握手斷開

轉載請註明出處:https://blog.csdn.net/l1028386804/article/details/83046311 一、C/S架構 客戶端/服務端架構 二、OSI七層架構 七層模型,亦稱OSI(Open System Interconnection)參考模型,是