主頁 >  其他 > 【計算機網路】TCP基礎知識詳解

【計算機網路】TCP基礎知識詳解

2020-09-11 09:55:11 其他

1. TCP概念相關

[!NOTE]
TCP(Transmission Control Protocol),又叫傳輸控制協議,
TCP協議是面向連接的,可靠的,基于位元組流的傳輸協議,在基于 TCP 進行通信時,通信雙方需要先建立一個 TCP 連接,建立連接需要經過三次握手,斷開連接的時候需要經過四次揮手,

1.1 TCP頭部

TCP header

對于 TCP 頭部來說,以下幾個欄位是很重要的:

  • 序列號 (Sequence number),這個序號保證了 TCP 傳輸的報文都是有序的,對端可以通過序號順序的拼接報文

  • 確認號 (Acknowledgement Number),這個序號表示資料接收端期望接收的下一個位元組的編號是多少,同時也表示上一個序號的資料已經收到

  • 視窗大小 (Window Size),表示還能接收多少位元組的資料,用于流量控制

  • 識別符號

    • ACK=1 :該欄位為一表示確認號欄位有效,此外,TCP 還規定在連接建立后傳送的所有報文段都必須把 ACK 置為一,
    • SYN=1:當SYN=1,ACK=0時,表示當前報文段是一個連接請求報文,當SYN=1,ACK=1時,表示當前報文段是一個同意建立連接的應答報文,
    • FIN=1:該欄位為一表示此報文段是一個釋放連接的請求報文,
    • URG=1 : 該欄位為一表示本資料報的資料部分包含緊急資訊,是一個高優先級資料報文,此時緊急指標有效,緊急資料一定位于當前資料包資料部分的最前面,緊急指標標明了緊急資料的尾部,
    • PSH=1 :該欄位為一表示接收端應該立即將資料 push 給應用層,而不是等到緩沖區滿后再提交,
    • RST=1:該欄位為一表示當前 TCP 連接出現嚴重問題,可能需要重新建立 TCP 連接,也可以用于拒絕非法的報文段和拒絕連接請求,

1.2 三次握手

三次握手

簡單的說:

  • 第一次握手

    • SYN = 1, seq(client) = x
    • 客戶端向服務端發送連接請求報文段,該報文段中包含自身的資料通訊初始序號,請求發送后,客戶端便進入 SYN-SENT 狀態,
  • 第二次握手

    • SYN = 1,ACK = 1,確認序號 = x+1, seq(server) = y
    • 服務端收到連接請求報文段后,如果同意連接,則會發送一個應答,該應答中也會包含自身的資料通訊初始序號,發送完成后便進入 SYN-RECEIVED 狀態
  • 第三次握手

    • ACK = 1,確認序號 = y+1, seq(client) = x + 1
    • 客戶端收到連接同意的應答后,還要向服務端發送一個確認報文,客戶端發完這個報文段后便進入ESTABLISHED 狀態,服務端收到這個應答后也進入 ESTABLISHED 狀態,此時連接建立成功,

1.3 為什么不用兩次握手?

[!NOTE]
主要是為了防止已經失效的連接請求報文突然又傳送到了服務器,從而產生錯誤,

假設有這樣一種場景, 客戶端發送的第一個請求連接并且沒有丟失,但是被滯留的時間太長,由于TCP的客戶端遲遲沒有收到確認報文,以為服務器沒有收到,此時重新向服務器發送報文,
而現在第一個請求到達服務端,這個請求已經報廢了,但是又會建立連接,

如果采用的是三次握手,就算是那一次失效的報文傳送過來了,服務端接受到了那條失效報文并且回復了確認報文,但是客戶端不會再次發出確認,由于服務器收不到確認,就知道客戶端并沒有請求連接,

1.3 為什么建立連接是三次握手,四次不可以嗎

第一次握手:

Client什么都不能確認   
Server確認了對方發送正常

第二次握手:

Client確認:自己發送/接收正常,對方發送/接收正常
Server確認:自己接收正常 ,對方發送正常

第三次握手:

Client確認:自己發送/接收正常, 對方發送/接收正常
Server確認:自己發送/接收正常,對方發送/接收正常

所以通過三次握手確認雙方收發功能都正常,四次也可以但是顯得比較多余

1.4 四次揮手

四次揮手

TCP 是全雙工的,在斷開連接時兩端都需要發送 FIN 和 ACK,

  • 第一次揮手

    • 若客戶端 A 認為資料發送完成,則它需要向服務端 B 發送連接釋放請求,
  • 第二次揮手

    • B 收到連接釋放請求后,會告訴應用層要釋放 TCP 鏈接,然后會發送 ACK 包,并進入 CLOSE_WAIT 狀態,表示 A 到 B 的連接已經釋放,不接收 A 發的資料了,但是因為 TCP 連接時雙向的,所以 B 仍舊可以發送資料給 A,
  • 第三次揮手

    • B 如果此時還有沒發完的資料會繼續發送,完畢后會向 A 發送連接釋放請求,然后 B 便進入LAST-ACK狀態,
    • PS:通過延遲確認的技術(通常有時間限制,否則對方會誤認為需要重傳),可以將第二次和第三次握手合并,延遲 ACK 包的發送,
  • 第四次揮手

    • A 收到釋放請求后,向 B 發送確認應答,此時 A 進入 TIME-WAIT 狀態,該狀態會持續 2MSL(最大段生存期,指報文段在網路中生存的時間,超時會被拋棄) 時間,若該時間段內沒有 B 的重發請求的話,就進入 CLOSED 狀態,當 B 收到確認應答后,也便進入 CLOSED 狀態,

1.5 為什么 A 要進入 TIME-WAIT 狀態,等待 2MSL 時間后才進入 CLOSED 狀態?

為了保證 B 能收到 A 的確認應答,若 A 發完確認應答后直接進入 CLOSED 狀態,如果確認應答因為網路問題一直沒有到達,那么會造成 B 不能正常關閉,

如果A發送完ACK應答之后直接進入CLOSED狀態的話,如果因為網路延遲問題這個應答丟失或在2MSL內還沒有到達B的話,那么B等待超時之后就會重新發送一個FIN包,但是此時A已經關閉了,永遠得不到A的回應,從而導致B永遠不能正常關閉

1.6 為什么需要TIME_WAIT狀態

1.6.1 為實作TCP這種全雙工連接的可靠釋放

這樣可讓TCP再次發送最后的ACK以防這個ACK丟失(另一端超時并重發最后的FIN)這種2MSL等待的另一個結果是這個TCP連接在2MSL等待期間,定義這個連接的插口(客戶的IP地址和埠號,服務器的IP地址和埠號)不能再被使用,這個連接只能在2MSL結束后才能再被使用,

1.6.2 為使舊的資料包在網路因過期而消失

每個具體TCP實作必須選擇一個報文段最大生存時間MSL,它是任何報文段被丟棄前在網路內的最長時間,

1.7 為什么建立連接是三次握手,關閉連接確是四次揮手呢?

  1. 建立連接的時候, 服務器在LISTEN狀態下,收到建立連接請求的SYN報文后,把ACK和SYN放在一個報文里發送給客戶端,

  2. 而關閉連接時,服務器收到對方的FIN報文時,僅僅表示對方不再發送資料了但是還能接收資料,而自己也未必全部資料都發送給對方了

2. ARQ (超時重傳)協議

[!NOTE]
通過確認和超時機制保證了資料的正確送達,ARQ 協議包含停止等待 ARQ連續 ARQ

2.1 停止等待 ARQ

正常傳輸程序

只要 A 向 B 發送一段報文,都要停止發送并啟動一個定時器,等待對端回應,在定時器時間內接收到對端應答就取消定時器并發送下一段報文,

當報文丟失或出錯:

報文傳輸的程序中丟包: 這時候超過定時器設定的時間就會再次發送丟包的資料直到對端回應,所以需要每次都備份發送的資料,

傳輸程序中報文出錯: 對端會拋棄該報文并等待 A 端重傳,

PS:一般定時器設定的時間都會大于一個 RTT 的平均時間,

ACK 超時或丟失:

對端傳輸的應答也可能出現丟失或超時的情況,那么超過定時器時間 A 端照樣會重傳報文,這時候 B 端收到相同序號的報文會丟棄該報文并重傳應答,直到 A 端發送下一個序號的報文,

這個協議的缺點就是傳輸效率低,在良好的網路環境下每次發送報文都得等待對端的 ACK ,

2.2 連續 ARQ

在連續 ARQ 中,發送端擁有一個發送視窗,可以在沒有收到應答的情況下持續發送視窗內的資料,這樣相比停止等待 ARQ 協議來說減少了等待時間,提高了效率,

2.2.1 累計確認

連續 ARQ 中,接收端會持續不斷收到報文,如果和停止等待 ARQ 中接收一個報文就發送一個應答一樣,就太浪費資源了,通過累計確認,可以在收到多個報文以后統一回復一個應答報文,報文中的 ACK 可以用來告訴發送端這個序號之前的資料已經全部接收到了,下次請發送這個序號 + 1的資料,

但是累計確認也有一個弊端,在連續接收報文時,可能會遇到接收到序號 5 的報文后,并未接到序號 6 的報文,然而序號 7 以后的報文已經接收,遇到這種情況時,ACK 只能回復 6,這樣會造成發送端重復發送資料,這種情況下可以通過 Sack 來解決,

2.2.2 滑動視窗

上面講到了發送視窗,在 TCP 中,兩端都維護著視窗:分別為發送端視窗和接收端視窗,

發送端視窗包含已發送但未收到應答的資料和可以發送但是未發送的資料,

滑動視窗

發送端視窗是由接收視窗剩余大小決定的,接收方會把當前接收視窗的剩余大小寫入應答報文,發送端收到應答后根據該值和當前網路擁塞情況設定發送視窗的大小,所以發送視窗的大小是不斷變化的,

當發送端接收到應答報文后,會隨之將視窗進行滑動

滑動視窗實作了流量控制,接收方通過報文告知發送方還可以發送多少資料,從而保證接收方能夠來得及接收資料,

流量控制舉例

Zero 視窗

在發送報文的程序中,可能會遇到對端出現零視窗的情況,在該情況下,發送端會停止發送資料,并啟動 persistent timer ,該定時器會定時發送請求給對端,讓對端告知視窗大小,在重試次數超過一定次數后,可能會中斷 TCP 鏈接,

3. 擁塞處理

[!NOTE]
擁塞處理和流量控制不同,后者是作用于接收方,保證接收方來得及接受資料,而前者是作用于網路,防止過多的資料擁塞網路,避免出現網路負載過大的情況,

擁塞處理包括了四個演算法,分別為:慢開始,擁塞避免,快速重傳,快速恢復,

TCP擁塞控制

3.1 慢開始演算法

[!NOTE]
慢開始演算法,顧名思義,就是在傳輸開始時將發送視窗從1開始指數級擴大,從而避免一開始就傳輸大量資料導致網路擁塞,

慢開始演算法步驟具體如下

  1. 連接初始設定擁塞視窗(Congestion Window) 為 1 MSS(一個分段的最大資料量)
  2. 每過一個 RTT (往返時延) 就將視窗大小乘二
  3. 指數級增長肯定不能沒有限制的,所以有一個閾值限制,當視窗大小大于閾值時就會啟動擁塞避免演算法

3.2 擁塞避免演算法

[!NOTE]
擁塞避免演算法相比簡單點,每過一個 RTT 視窗大小只加一,這樣能夠避免指數級增長導致網路擁塞,慢慢將大小調整到最佳值,

擁塞避免

在傳輸程序中可能定時器超時的情況,這時候 TCP 會認為網路擁塞了,會馬上進行以下步驟:

  • 將閾值設為當前擁塞視窗的一半
  • 將擁塞視窗設為 1 MSS
  • 啟動擁塞避免演算法

3.3 快速重傳

快速重傳一般和快恢復一起出現,一旦接收端收到的報文出現失序的情況,接收端只會回復最后一個順序正確的報文序號(沒有 Sack 的情況下),如果收到三個重復的 ACK,無需等待定時器超時再重發而是啟動快速重傳,具體演算法分為兩種:

4. TCP 小結

4.1 為什么TCP這么復雜?

[!NOTE]
因為既要保證可靠性, 同時又要盡可能提高性能

4.1.1 保證可靠性的機制

  • 校驗和
  • 序列號(按序到達)
  • 確認應答
  • 超時重傳
  • 連接管理
  • 流量控制
  • 擁塞控制

4.1.2 提高性能的機制

  • 滑動視窗
  • 快速重傳
  • 延遲應答
  • 捎帶應答

4.2 定時器

  • 超時重傳定時器
  • 保活定時器
  • TIME_WAIT定時器

4.3 基于 TCP 的應用層協議

  • HTTP
  • HTTPS
  • SSH
  • Telnet
  • FTP
  • SMTP

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/5219.html

標籤:其他

上一篇:Django 原始碼閱讀筆記(基礎視圖)

下一篇:【作業系統】作業系統高頻面試考點總結

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more