TCP協議--TCP三次握手和四次揮手

来源:https://www.cnblogs.com/yinn/archive/2019/11/13/11850708.html
-Advertisement-
Play Games

TCP三次握手和四次揮手 TCP有6種標示:SYN(建立聯機) ACK(確認) PSH(傳送) FIN(結束) RST(重置) URG(緊急) 一、TCP三次握手 第一次握手 客戶端向伺服器發出連接請求報文,這時報文首部中的同部位SYN=1,同時隨機生成初始序列號 seq=x,此時,TCP客戶端進程 ...


TCP三次握手和四次揮手

TCP有6種標示:SYN(建立聯機) ACK(確認) PSH(傳送) FIN(結束) RST(重置) URG(緊急) 

一、TCP三次握手                         

  第一次握手

      客戶端向伺服器發出連接請求報文,這時報文首部中的同部位SYN=1,同時隨機生成初始序列號 seq=x,此時,TCP客戶端進程進入了 SYN-SENT(同步已發送狀態)狀

態。TCP規定,SYN報文段(SYN=1的報文段)不能攜帶數據,但需要消耗掉一個序號。這個三次握手中的開始。表示客戶端想要和服務端建立連接。

  第二次握手

      TCP伺服器收到請求報文後,如果同意連接,則發出確認報文。確認報文中應該 ACK=1,SYN=1,確認號是ack=x+1,同時也要為自己隨機初始化一個序列號 seq=y,此

時,TCP伺服器進程進入了SYN-RCVD(同步收到)狀態。這個報文也不能攜帶數據,但是同樣要消耗一個序號。這個報文帶有SYN(建立連接)和ACK(確認)標誌,詢問客戶端

是否準備好。

  第三次握手

      TCP客戶進程收到確認後,還要向伺服器給出確認。確認報文的ACK=1,ack=y+1,此時,TCP連接建立,客戶端進入ESTABLISHED(已建立連接)狀態。

TCP規定,ACK報文段可以攜帶數據,但是如果不攜帶數據則不消耗序號。這裡客戶端表示我已經準備好。

思考:為什麼要三次握手呢,有人說兩次握手就好了

舉例:已失效的連接請求報文段。

   client發送了第一個連接的請求報文,但是由於網路不好,這個請求沒有立即到達服務端,而是在某個網路節點中滯留了,直到某個時間才到達server,本來這已經是一個失效

的報文,但是server端接收到這個請求報文後,還是會想client發出確認的報文,表示同意連接。假如不採用三次握手,那麼只要server發出確認,新的建立就連接了,但其實這個

請求是失效的請求,client是不會理睬server的確認信息,也不會向服務端發送確認的請求,但是server認為新的連接已經建立起來了,並一直等待client發來數據,這樣,server的

很多資源就沒白白浪費掉了,採用三次握手就是為了防止這種情況的發生,server會因為收不到確認的報文,就知道client並沒有建立連接。這就是三次握手的作用。

  

二、TCP數據的傳輸過程

  建立連接後,兩台主機就可以相互傳輸數據了。如下圖所示:

  1)主機A初始seq為1200,滑動窗體為100,向主機B傳遞數據的過程。

  2)假設主機B在完全成功接收數據的基礎上,那麼主機B為了確認這一點,向主機A發送 ACK 包,並將 Ack 號設置為 1301。因此按如下的公式確認 Ack 號:

       Ack號 = Seq號 + 傳遞的位元組數 + 1 (這是在完全接受成功的情況下)

  3)主機A獲得B傳來的ack(1301)後,開始發送seq為1301,滑動窗體為100的數據。
       ......

與三次握手協議相同,最後加 1 是為了告訴對方要傳遞的 Seq 號。上面說了,主機B完全成功接收A發來的數據才是這樣的,如果存在丟包該如何。

 下麵分析傳輸過程中數據包丟失的情況,如下圖所示:

 

上圖表示通過 Seq 1301 數據包向主機B傳遞100位元組的數據,但中間發生了錯誤,主機B未收到。經過一段時間後,主機A仍未收到對於 Seq 1301 的ACK確認,因此嘗試

重傳數據。為了完成數據包的重傳,TCP套接字每次發送數據包時都會啟動定時器,如果在一定時間內沒有收到目標機器傳回的 ACK 包,那麼定時器超時,數據包會重傳。

 上面也只是一種可能,比如數據1250丟失,那麼Ack返回的就是1250,具體的可以詳細看下博客:【TCP協議】(1)---TCP協議詳解,這裡面滑動視窗有說明。

 

 三、TCP的四次揮手                   

 

第一次揮手  

    TCP發送一個FIN(結束),用來關閉客戶到服務端的連接。

    客戶端進程發出連接釋放報文,並且停止發送數據。釋放數據報文首部,FIN=1,其序列號為seq=u(等於前面已經傳送過來的數據的最後一個位元組的序號加1),

此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。

揮手

    服務端收到這個FIN,他發回一個ACK(確認),確認收到序號為收到序號+1,和SYN一樣,一個FIN將占用一個序號。

    伺服器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,並且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP伺服器

通知高層的應用進程,客戶端向伺服器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,但是伺服器若發送數據,客戶端依然要接受。這個

狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。

 

客戶端收到伺服器的確認請求後,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待伺服器發送連接釋放報文(在這之前還需要接受伺服器發送的最後的數據)。

揮手

      服務端發送一個FIN(結束)到客戶端,服務端關閉客戶端的連接。

      伺服器將最後的數據發送完畢後,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由於在半關閉狀態,伺服器很可能又發送了一些數據,假定此時的序列號為seq=w,

此時,伺服器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。

揮手

     客戶端發送ACK(確認)報文確認,並將確認的序號+1,這樣關閉完成。

     客戶端收到伺服器的連接釋放報文後,必鬚髮出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。註意此時

TCP連接還沒有釋放,必須經過2∗∗MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。

 

伺服器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連接。可以看到,伺服器結束TCP連接的時間要比客戶端早一些。

思考:那麼為什麼是4次揮手呢?

為了確保數據能夠完成傳輸。

      關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上會關閉SOCKET,也

即你可能還需要發送一些數據給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這裡的ACK報文和FIN報文多數情況下都是分開發送的。

可能有人會有疑問,tcp我握手的時候為何ACK(確認)和SYN(建立連接)是一起發送。揮手的時候為什麼是分開的時候發送呢.

因為當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到

FIN報文時,很可能並不會立即關閉 SOCKET,所以只能先回覆一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能

發送FIN報文,因此不能一起發送。故需要四步揮手

思考:客戶端突然掛掉了怎麼辦?

    正常連接時,客戶端突然掛掉了,如果沒有措施處理這種情況,那麼就會出現客戶端和伺服器端出現長時期的空閑。解決辦法是在伺服器端設置保活計時器,每當伺服器收到

客戶端的消息,就將計時器複位。超時時間通常設置為2小時。若伺服器超過2小時沒收到客戶的信息,他就發送探測報文段。若發送了10個探測報文段,每一個相隔75秒,

還沒有響應就認為客戶端出了故障,因而終止該連接。

 

四、SYN(洪水)攻擊

背景

      初始化連接的 SYN 超時問題Client發送SYN包給Server後掛了,Server回給Client的SYN-ACK一直沒收到Client的ACK確認,這個時候這個連接既沒建立起來,也不能算

失敗。這就需要一個超時時間讓Server將這個連接斷開,否則這個連接就會一直占用Server的SYN連接隊列中的一個位置,大量這樣的連接就會將Server的SYN連接隊列耗盡,

讓正常的連接無法得到處理。

      目前,Linux下預設會進行5次重發SYN-ACK包,重試的間隔時間從1s開始,下次的重試間隔時間是前一次的雙倍,5次的重試時間間隔為1s, 2s, 4s, 8s, 16s,總共31s,第

5次發出後還要等32s都知道第5次也超時了,所以,總共需要 1s + 2s + 4s+ 8s+ 16s + 32s = 63s,TCP才會把斷開這個連接。由於,SYN超時需要63秒,那麼就給攻擊者一

個攻擊伺服器的機會,攻擊者在短時間內發送大量的SYN包給Server(俗稱SYN flood攻擊),用於耗盡Server的SYN隊列。

什麼是 SYN 攻擊

       SYN 攻擊指的是,攻擊客戶端在短時間內偽造大量不存在的IP地址,向伺服器不斷地發送SYN包,伺服器回覆確認包,並等待客戶的確認。由於源地址是不存在的,伺服器

需要不斷的重發直至超時,這些偽造的SYN包將長時間占用未連接隊列,正常的SYN請求被丟棄,導致目標系統運行緩慢,嚴重者會引起網路堵塞甚至系統癱瘓。SYN 攻擊是一

種典型的 DoS攻擊。

如何檢測 SYN 攻擊?

      檢測 SYN 攻擊非常的方便,當你在伺服器上看到大量的半連接狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊。在 Linux/Unix 上可以使用系統自帶的

netstats 命令來檢測 SYN 攻擊。

如何防禦 SYN 攻擊?

      SYN攻擊不能完全被阻止,除非將TCP協議重新設計。我們所做的是儘可能的減輕SYN攻擊的危害,常見的防禦 SYN 攻擊的方法有如下幾種:

      縮短超時(SYN Timeout)

      時間增加最大半連接數

      過濾網關防護SYN

      cookies技術

 四、TCP和UDP的區別      

  我這裡簡單列舉幾個,因為我還沒有研究UDP這個協議。

  1、基於連接與無連接;UDP是無連接的,即發送數據之前不需要建立連接

  2、TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。也就是說,通過TCP連接傳送的數據,無差錯,不丟失,不重覆,且按序到達;UDP盡最大努力交付

       ,即不保證可靠交付Tcp通過校驗和,重傳控制,序號標識,滑動視窗、確認應答實現可靠傳輸。如丟包時的重發控制,還可以對次序亂掉的分包進行順序控制。

  3、UDP具有較好的實時性,工作效率比TCP高,適用於對高速傳輸和實時性有較高的通信或廣播通信。

  4、每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信。

  5、TCP對系統資源要求較多,UDP對系統資源要求較少。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • webpack安裝時的坑 高版本的webpack除了全局安裝webpack外,還需安裝webpack cli,在本地使用時也一樣需要這樣,不然會出錯 webpack使用是的坑 在原始啟動webpack編譯時不要忘了加 o,在原始文件和要編譯成為的文件目錄中間 要正常使用(方便使用)就要在packag ...
  • [TOC] 什麼是css css: 層疊樣式表 css語法結構: 選擇器 {屬性1:屬性值1} 註釋 CSS三種引入方式 通過link標簽引入外部的css文件(最正規用法) 直接在html頁面上的head內通過style標簽直接書寫css代碼 行內標簽(直接在標簽內部通過style標簽寫)(不推薦使 ...
  • [TOC] form表單 表單能夠獲取用戶輸入,用於向伺服器傳輸數據,從而實現用戶與web伺服器的交互 表單屬性 action 控制數據提交的地址,有三種書寫方式: 不寫 預設就是朝當前這個頁面所在的地址i提交數據 寫全路徑 如(https://www.baidu.com) 只寫路徑尾碼(/inde ...
  • CSS CSS簡述 CSS是什麼?有什麼作用? CSS(Cascading Style Sheets):層疊樣式表。 CSS通常稱為CSS樣式或層疊樣式表。主要用於設置HTML頁面中的文本內容(字體、大小、對齊方式等)、圖片的外形(寬度、邊框樣式、邊距等)以及版式的佈局等外觀顯示樣式。 CSS可以使 ...
  • Mirror王宇陽 2019年11月13日 [首發] 數日沒有更新博文了,覺得不好意思了!這不是,整理了一下JavaScript的一下BOM筆記資料,今天貢獻出來!(HTML DOM也會隨後整理髮表) 筆者在接觸Js之前就聽聞Js的“牛逼”,接觸後發現只要想法夠賊,Js就能給你的賊想法復現 ~ 作者 ...
  • 2019.11.11 深圳千鋒H5前端學習筆記 ...
  • [TOC] form表單( ) 能夠獲取用戶輸入(輸入,選擇,上傳的文件) 參數 action 控制數據提交的地址 三種書寫方式 1.不寫 預設就是朝當前頁面所在的地址提交數據 2.寫全路徑(https://www.baidu.com) 3.只寫路徑尾碼( ) method 控制數據提交的方式 `f ...
  • 因為在IOS微信中在彈窗中使用input使鍵盤彈起,使彈窗的位置上移,當鍵盤關閉時頁面還在上面,彈窗位移量也在上面,只有下拉才能回到原位,這樣彈窗也消失了。我的處理辦法就是在鍵盤彈起和消失的時候,讓頁面都回到彈起之前的狀態,使用了window.scrollTo方法。 keyUpClose () { ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...