TCP協議的三次握手和四次分手

来源:https://www.cnblogs.com/huwentao/archive/2018/11/07/9925053.html
-Advertisement-
Play Games

TCP三次握手階段 三次握手總述 第一階段: 概念:半連接池 三次握手正常狀態 三次握手異常狀態syn_rcvd TCP四次揮手階段 四層揮手總述 UDP與TCP的區別 示例:如下圖訪問如下網址就會出現下麵的信息https://www.cnblogs.com/huwentao/p/9845379.h ...


TCP三次握手階段

三次握手總述

1. 為什麼建立連接
    
  tcp是一個可靠的傳輸機制,可靠在於每次收到一個數據都會相應的收到一個確認包之後才會將緩衝區的內容給刪除掉,否則過一段時間就會重傳。
  建立連接就像是偵察兵偵查道路一樣,我先看看這條路能不能走,如果能走,後面的大部隊就跟上來了,如果不能走,後面的大部隊就等著我繼續偵查。
2. 為什麼要用標誌位syn?
  
  案例一: 沒有標誌位syn的對話
    客戶端:嗨,伺服器
    伺服器:你恐怕是傻子吧,給我發這個幹嘛呢!!
  案例二: 有標誌位syn的對話
    客戶端:嗨,伺服器,我們開始連接吧
    服務端:好的,可以
  syn: 告訴服務端發送這條數據的客戶端想通過三次握手建立tcp連接

3. 為什麼要用標誌位seq,ack
  
  案例:
    客戶端:嗨,伺服器,這是我要跟你連接的第一條數據。 seq=1,syn=1
    伺服器:一看序列號是1,syn是1,是想和我連接的,因此給他回覆:好的,我已經收到你的數據了,我們可以連接了。 seq=10,ack=2此時的ack是收到數據的seq號加上1
    客戶端:一看ack是2,就是我上一條數據的序列號加1,看來服務端已經同意我要連接了,因此回覆:大哥,那我們開始發送數據吧。 seq=2,ack=11,此時三次握手建立成功
  seq:用來表示當前數據包的標號
  ack: 它的值是收到數據的seq值加上一,用來告訴對方我收到了你的數據包。
4. 狀態機是什麼意思?

  
  (1)我們會看到在圖的左右兩邊有syn_send,syn_listen等字樣,這個指的是在客戶端或者服務端收到某條信息之後會進入到哪個狀態中。這個狀態就是tcp的狀態機。
  (2)為什麼要有這個狀態機,因此tcp的連接或者斷開都是有一個明顯的過程中,對於每個過程都表示一個狀態對於以後的排查問題是很重要的,例如:當前有大量的tcp狀態是處於syn_rvcd,這很明顯是有問題的。

5. 為什麼要用三次握手去建立連接,一次不行嗎?
  
  之前已經說過,tcp的可靠機制是由於會發送確認包,因此在建立連接的時候我必須要確認我發送的信息你是否收到了,如果沒有收到,我是會繼續發送的。
  案例:
    客戶端:嗨,大哥,我們連接吧?(如果就這樣就完了,那我客戶端怎麼知道我這條連接的數據到底發送成功沒有呢?因此伺服器必須給我回覆信息,也就是第二次連接了)
    伺服器: 行,我們連接吧!(如果這樣就完了,那麼伺服器就會想了,這條數據客戶端到底收到了沒有,沒有收到咋辦,真讓人頭疼,因此大哥跟你小弟說話了,不管怎樣,你的表個態,這就有了第三次連接了)
    客戶單:好嘞,大哥,小弟知道了,我們開始發送數據吧。 (至此真正的連接才算完成)
  

第一階段:

註意:
    連接都是從客戶端開始的。
1. 沒有客戶端連接的時候
  服務端:服務端首先處於syn_listen狀態,也就是在監聽客戶端的連接。
  客戶端:客戶端在沒有收到伺服器給我回覆的確認包之前一直都處於syn_client狀態。

2. 客戶端發送:seq=1,syn=1的報文之後
  服務端:服務端一旦接收到syn=1的報文之後,狀態就會變成syn_rcvd

3. 服務端發送:seq=10,ack=2的報文之後
  客戶端:客戶端進入established的狀態,並且會發送一個確認報文,當服務端接收到報文之後也會變成established狀態。

 概念:半連接池

問題:現在有100個客戶端同時連接過來了,而我的伺服器1s中只能處理創建一個進程處理一個連接

半連接池:現在有前5個連接
伺服器:在一秒中的時候創建了一個進行從半連接池中取了一個連接進行回覆,此時那剩餘的95個客戶端有一個又進入了半連接池中等待連接,等第二秒的時候伺服器重新創建了一個進程從半連接池中得到了一個連接,此時剩餘的94個客戶端中有一個也進入了半連接池中。

為什麼要用半連接池呢?
  
  為了防止某一時間段大併發的訪問網站從而導致服務端崩潰掉。

對比
  沒有半連接池: 來了100個客戶端,我就要維持100個客戶端當前的狀態,來了1000個,我就要維持1000個,那要是來了1億個請求呢?怎麼辦,記憶體可能就要爆掉了。
  有半連接池:規定了半連接的數量是100,如果來了1000個連接,不好意思,我現在伺服器很忙,你得等一會,等我半連接池的連接被處理了我才能來放你們進來。

 

 三次握手正常狀態

客戶端常見的狀態
  established: 從你發送的那一刻起到服務端響應的這段時間是非常短的,因此在大部分的情況下我們看到的都是established狀態。 服務端常見的狀態
  syn_listen: 代表的是此時伺服器是沒有客戶端來進行訪問的
  established: 三次握手如果沒有什麼問題,三次握手的狀態是很快的,因此大部分的狀態也是此狀態。

三次握手異常狀態syn_rcvd

 

 

TCP四次揮手階段

 

四層揮手總述

1. 為什麼是服務端先發起的斷開連接請求?
  
  對於客戶端而言,我們一般是向伺服器索求數據的,因此當伺服器端把我們所需要的數據完全的發送給客戶端之後,為了提升工作效率,就會迫不及待的關掉連接,然後去做處理其他的請求。因此一般我們看到的都是伺服器端先發送一個fin標誌位為1的數據包表示伺服器端想斷開連接。

2. 標誌位FIN
  
  和三次握手的SYN一樣,此處的FIN就是為了告訴對方我想斷開連接

3. 為什麼要用四次揮手去斷開連接?
  
  因為在tcp建立連接之後數據的交互是雙向的,因此tcp連接也給我們虛擬出了兩個通道,一個是server--->client的通道,一個是client--->server的通道
  當我們的伺服器數據傳輸完成之後server--->client的通道已經沒有存在的必要的了,因此server發送fin斷掉此通道的連接,但是此時的client--->server還要給server端發送ack確認報文,因此此時這個client-->server的通道還不能斷開
  當伺服器收到了ack報文之後,也就代表著client--->server的的通道已經沒有必要在存在了,因此客戶端向服務端發送斷開請求,服務端發送一個ack確認斷開之後就可以斷開了。

4. 當出現了大量的TIME_WAIT狀態代表的是出現了高併發的請求。

UDP與TCP的區別

1. TCP要建立連接,UDP不需要
2. TCP可靠, UDP不可靠,是因為有確認包的原因
3. TCP效率低,UDP效率高,一是因為連接的問題,二是因為確認包的問題,但主要的還是因為確認包的問題
4. TCP適合用在較大的數據量,因為UDP的位元組一旦超過512,就極易丟失

示例:如下圖訪問如下網址就會出現下麵的信息https://www.cnblogs.com/huwentao/p/9845379.html ,接下來以這個網址為例來說明一下瀏覽器究竟是得到這個數據的

 

URL的解釋

url:統一資源定位符
三部分組成
  1. 協議 https://
  2. 功能變數名稱 www.cnblogs.com:80 此處隱藏了埠,web服務的客戶端為80
  3. 路徑 /huwentao/p/9845379.html 

步驟一:首先通過功能變數名稱得到對應的ip地址

首先通過功能變數名稱得到對應的ip地址
1. 當前的瀏覽器就是一個socket客戶端,此socket客戶端具有當前主機的ip,埠,mac,DNS地址等信息
2. 瀏覽器的socket客戶端 通過本機獲得得DNS伺服器IP地址然後加上53埠去鏈接DNSsocket服務端
3. 然後通過UDP將www.cnblogs.com發送到dnssocket服務端
4. DNS將解析到的地址返回到瀏覽器的socket客戶端

因此我們得到了以下的url地址:
  1. 協議 https://
  2. 功能變數名稱 101.37.255.65:80 此處隱藏了埠,web服務的客戶端為80
  3. 路徑 /huwentao/p/9845379.html 

步驟二:通過解析的ip加埠獲得一個tcp連接

通過解析的ip加埠獲得一個tcp連接
1. 通過101.37.255.65:80建立一個tcp的連接
2. 將數據 /huwentao/p/9845379.html 通過https協議封裝,然後封裝埠,ip,mac等信息之後發送到客戶端
3. 獲得當前伺服器上的一個文件
4. 通過tcp連接源源不斷的往客戶端發送
5. 發送完了之後立馬發送一個FIN標誌位的信息斷開連接
6. 客戶端發送ack確認包斷開連接
7. 客戶端再發送FIN標誌位斷開上層通道
8. 收到伺服器端的ACK報文之後斷開tcp連接

步驟三:將收到的文件已html的形式展現的瀏覽器上面

 


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

-Advertisement-
Play Games
更多相關文章
  • 函數 函數的定義 1.什麼是函數? 函數就是定義在類中的具有特定功能的一段獨立小程式。函數也稱為方法。 2.函數的格式: 修飾符 返回值類型 函數名(參數類型 形式參數1,參數類型 形式參數2,.. ) { 執行語句; return返回值; } 返回值類型:函數運行後的結果的數據類型。 參數類型:是 ...
  • 進程、線程 ​ 進程(Process) 是程式的運行實例。例如,一個運行的 Eclipse 就是一個進程。進程是程式向操作系統申請資源(如記憶體空間和文件句柄)的基本單位。線程(Thread)是進程中可獨立執行的最小單位。一個進程可以包含多個線程。進程和線程的關係,好比一個營業中的飯店與其正在工作的員 ...
  • about 演算法 項目介紹 工作之餘,代碼敲多了,停下來思考思考,會有異常不到的收穫。。。只為更好的自己 如何用棧實現隊列? 提示下:用一個棧肯定是沒辦法實現隊列,但如果我們有兩個棧呢? 分析:棧和隊列的特性 棧是先進後出,FILO 出入元素都是在同一端(棧頂) 入棧 1540432924606.p ...
  • 一、 性能往往是特定情景下的評價,泛泛地說性能“好”或者“快”,往是具有誤導性的。通過引入基準測試,我們可以定義性能對比的明確條件、具體的指標,進而保證得到定量的、可重覆的對比數據,這是工程中的實際需要。 不同的基準測試其具體內容和範圍也存在很大的不同。如果是專業的性能工程師,更加熟悉的可能是類似S ...
  • 公司推進Jenkins自動化部署,因為web站點都是集群部署,部署需要測試指定伺服器web服務是否成功啟動,頁面是否正常訪問,經過不斷baidu發現,python的request模塊可以很好的解決這一問題。本文記錄瞭解決這一問題的過程。 安裝包管理工具pip 安裝requests模塊 請求http資 ...
  • 之前介紹的各類變數都是單獨聲明的,倘若要求定義相同類型的一組變數,則需定義許多同類型的變數,顯然耗時耗力且不宜維護。為此,編程語言引入了數組的概念,每個數組都由一組相同類型的數據構成,對外有統一的數組名稱,對內通過序號區分每個數據元素。數組類型由基本的變數類型擴展而來,在基本類型後面加上一對方括弧, ...
  • HTTP連接管理: 1.誤解的Connection首部 當http報文經過中間客戶端到服務端中間的各種代理設備時,對標簽中列出的頭信息進行刪除,close是事務結束後關掉此條連接 2.消除串列化的時延 並行連接:多條TCP連接發起併發的HTTP請求 持久連接:重用TCP連接,消除連接和關閉時延 管道... ...
  • ''' 輸入2,5,列印: 1 2 3 4 5 6 7 8 9 10 ''' #行數 m = int(input('請輸入一個整數')) n = int(input('請在輸入一個整數')) for i in range(m): for j in range(n): num = i * n + j ... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...