當前位置:
首頁 > 知識 > 網路TCP連接三次握手與四次揮手

網路TCP連接三次握手與四次揮手


一、三次握手

所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接的建立。在socket編程中,這一過程由客戶端執行connect來觸發。示意圖如下所示:

網路TCP連接三次握手與四次揮手

(1)第一次握手:Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。

(2)第二次握手:Server收到數據包後由標誌位SYN=1知道Client請求建立連接,Server將標誌位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認連接請求,Server進入SYN_RCVD狀態。

(3)第三次握手:Client收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連接建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸數據了。

二、四次揮手

網路TCP連接三次握手與四次揮手

由於TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味著這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。

(1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。

(2)第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。

(3)第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。

(4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。

三、為什麼連接的時候三次握手,釋放的時候四次揮手?

因為當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

四、主動斷開鏈接的一方為什麼要進入TIME_WAIT狀態

按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是需認為網路是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

未連接隊列

在三次握手協議中,伺服器維護一個未連接隊列,該隊列為每個客戶端的SYN包(syn=j)開設一個條目,該條目表明伺服器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連接在伺服器處於 Syn_RECV狀態,當伺服器收到客戶的確認包時,刪除該條目,伺服器進入ESTABLISHED狀態。


Backlog參數

表示內核為相應套接字排隊的最大連接個數。SYN-ACK重傳次數

網路TCP連接三次握手與四次揮手

半連接存活時間

是指半連接隊列的條目存活的最長時間,也即伺服器從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連接存活時間為Timeout時間、SYN_RECV存活時間。

TCP頭結構

面向連接的TCP三次握手是Syn Flood存在的基礎。

TCP協議頭最少20個位元組,包括以下的區域(由於翻譯不盡相同,文章中給出相應的英文單詞):

TCP源埠(Source Port):16位的源埠其中包含初始化通信的埠。源埠和源IP地址的作用是標示報文的返回地址。

TCP目的埠(Destination port):16位的目的埠域定義傳輸的目的。這個埠指明報文接收計算機上的應用程序地址介面。

TCP序列號(序列碼,Sequence Number):32位的序列號由接收端計算機使用,重新分段的報文成最初形式。當SYN出現,序列碼實際上是初始序列碼(ISN),而第一個數

據位元組是ISN+1。這個序列號(序列碼)是可以補償傳輸中的 不一致。

TCP應答號(Acknowledgment Number):32位的序列號由接收端計算機使用,重組分段的報文成最初形式。如果設置了ACK控制位,這個值表示一個準備接收的包的序列碼。

數據偏移量(HLEN):4位包括TCP頭大小,指示何處數據開始。

網路TCP連接三次握手與四次揮手

TCP四次揮手結束連接

保留(Reserved):6位值域,這些位必須是0。為了將來定義新的用途所保留。

標誌(Code Bits):6位標誌域。表示為:緊急標誌、有意義的應答標誌、推、重置連接標誌、同步序列號標誌、完成發送數據標誌。按照順序排列是:URG、ACK、PSH、RST、SYN、FIN。

窗口(Window):16位,用來表示想收到的每個TCP數據段的大小。

校驗位(Checksum):16位TCP頭。源機器基於數據內容計算一個數值,收信息機要與源機器數值結果完全一樣,從而證明數據的有效性。

優先指針(緊急,Urgent Pointer):16位,指向後面是優先數據的位元組,在URG標誌設置了時才有效。如果URG標誌沒有被設置,緊急域作為填充。加快處理標示為緊急的數據段。

選項(Option):長度不定,但長度必須是一個位元組。如果沒有選項就表示這一個位元組的域等於0。

關閉TCP連接:改進的三次握手

對於一個已經建立的連接,TCP使用改進的三次握手來釋放連接(使用一個帶有FIN附加標記的報文段)。TCP關閉連接的步驟如下:

第一步,當主機A的應用程序通知TCP數據已經發送完畢時,TCP向主機B發送一個帶有FIN附加標記的報文段(FIN表示英文finish)。

第二步,主機B收到這個FIN報文段之後,並不立即用FIN報文段回復主機A,而是先向主機A發送一個確認序號ACK,同時通知自己相應的應用程序:對方要求關閉連接(先發送ACK的目的是為了防止在這段時間內,對方重傳FIN報文段)。

第三步,主機B的應用程序告訴TCP:我要徹底的關閉連接,TCP向主機A送一個FIN報文段。

第四步,主機A收到這個FIN報文段後,向主機B發送一個ACK表示連接徹底釋放。[1]

標誌控制

URG:緊急標誌

緊急(The urgent pointer) 標誌有效。緊急標誌置位,

ACK:確認標誌

確認編號(Acknowledgement Number)欄有效。大多數情況下該標誌

網路TCP連接三次握手與四次揮手

TCP三次握手是Syn Flood存在的基礎

位是置位的。TCP報頭內的確認編號欄內包含的確認編號(w+1,Figure:1)為下一個預期的序列編號,同時提示遠端系統已經成功接收所有數據。

PSH:推標誌

該標誌置位時,接收端不將該數據進行隊列處理,而是儘可能快將數據轉由應用處理。在處理 telnet 或 rlogin 等交互模式的連接時,該標誌總是置位的。

RST:複位標誌

複位標誌有效。用於複位相應的TCP連接。

SYN:同步標誌

同步序列編號(Synchronize Sequence Numbers)欄有效。該標誌僅在三次握手建立TCP連接時有效。它提示TCP連接的服務端檢查序列編號,該序列編號為TCP連接初始端(一般是客戶端)的初始序列編號。在這裡,可以把TCP序列編號看作是一個範圍從0到4,294,967,295的32位計數器。通過TCP連接交換的數據中每一個位元組都經過序列編號。在TCP報頭中的序列編號欄包括了TCP分段中第一個位元組的序列編號。

FIN:結束標誌


帶有該標誌置位的數據包用來結束一個TCP回話,但對應埠仍處於開放狀態,準備接收後續數據。

服務端處於監聽狀態,客戶端用於建立連接請求的數據包(IP packet)按照TCP/IP協議堆棧組合成為TCP處理的分段(segment)。

分析報頭信息: TCP層接收到相應的TCP和IP報頭,將這些信息存儲到內存中。

檢查TCP校驗和(checksum):標準的校驗和位於分段之中(Figure:2)。如果檢驗失敗,不返回確認,該分段丟棄,並等待客戶端進行重傳。

查找協議控制塊(PCB{}):TCP查找與該連接相關聯的協議控制塊。如果沒有找到,TCP將該分段丟棄並返回RST。(這就是TCP處理沒有埠監聽情況下的機制) 如果該協議控制塊存在,但狀態為關閉,服務端不調用connect()或listen()。該分段丟棄,但不返回RST。客戶端會嘗試重新建立連接請求。

建立新的socket:當處於監聽狀態的socket收到該分段時,會建立一個子socket,同時還有socket{},tcpcb{}和pub{}建立。這時如果有錯誤發生,會通過標誌位來拆除相應的socket和釋放內存,TCP連接失敗。如果緩存隊列處於填滿狀態,TCP認為有錯誤發生,所有的後續連接請求會被拒絕。這裡可以看出SYN Flood攻擊是如何起作用的。

丟棄:如果該分段中的標誌為RST或ACK,或者沒有SYN標誌,則該分段丟棄。並釋放相應的內存。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 青峰科技 的精彩文章:

35年编程史沉淀下来的8条宝贵经验
javaWeb框架Spring Boot API 版本許可權控制
linux命令-淺談ARP
簡潔的Java8-java8新特性詳解 編程語言
Linux內核頁面換入換出

TAG:青峰科技 |

您可能感興趣

程序員面試被問到「三次握手,四次揮手」怎麼辦?
SN火力全開豪取三連勝,WE賽後握手舉動連司馬老賊都笑了
亂品三國:三次握手,每次都是在演戲
TCP 握手為什麼是 3 次,2 次或 4 次不行么?
LCK慘遭四連敗創歷史,UZI賽後握手差點忍不住笑出聲
命運多舛的《第二次握手》
無需四次握手包破解WPA&WPA2密碼
連續喂幾次流浪泰迪,次次握手被拒,結果這次收穫意外驚喜
LCKS8最尷尬選手誕生,小花生陷入亞軍魔咒,3個月和UZI握手3次!
GIF-登巴巴賽後不想與對手握手
奧巴馬與普京的三次見面:第一次咄咄逼人,卸任前主動握手示好
亞運會LOL奪冠CCTV正面報道,心疼李哥上了熱搜UZI握手圖片火了!
握手環節Meiko不去握手,RNG只有小虎一人前去握手!不尊重對手?
《第二次握手》:手抄本時代唯一的正能量小說
魯能熱身賽兩連勝,拚命三郎賽後與後防線每個人握手擁抱
七年來離和平最近的一次,曾互為對手的敘利亞兩兄弟握手言和
LPL最具「牌面」的選手:Meiko賽後不握手,Uzi比賽沒鏡頭
加拿大選手擦拭領獎台,和韓官員握手不摘手套,網友:冬奧會不幹凈
四大門派「握手言和」 一百多顆衛星攜手「照耀」地球
美記者和周總理握手後,卻拿出手帕擦手,周一舉動獲眾人鼓掌稱讚