(6)Wireshark的TCP包詳解-上篇

1.簡介

上一篇中通過介紹和講解,應該知道要講解和介紹的內容在哪里了吧,沒錯就是介紹OSI七層模型的傳輸層。因為只有它建立主機端到端的連接如:TCP、UDP。

2.TCP是什么?

tcp是工作在傳輸層,也就是網絡層上一層的協議。

它是面向連接的,可靠的,基于字節流、全雙工的通信協議。

TCP收到上一層的數據包后,會加上TCP頭并且進行一些特殊處理后,再傳遞給網絡層。

2.1TCP定義

? ? ??傳輸控制協議(英語:Transmission Control Protocol,縮寫:TCP)是一種面向連接的、可靠的、基于字節流的傳輸層通信協議,由IETF的RFC 793定義。在簡化的計算機網絡OSI模型中,它完成第四層傳輸層所指定的功能。用戶數據報協議(UDP)是同一層內另一個重要的傳輸協議。

3.TCP理論

TCP提供了一種面向連接的、可靠的字節流服務。

面向連接:接雙方在通信前需要預先建立一條連接,這猶如實際生活中的打電話。

  • 應用數據分割成TCP認為最適合發送的數據塊。
  • 重傳機制。設置定時器,等待確認包
  • 對首部和數據進行校驗
  • TCP對收到的數據進行排序,然后交給應用層
  • TCP的接收端丟棄重復的數據
  • TCP還提供流量控制

TCP連接必須要經歷三次握手,而釋放一個TCP連接需要四次握手,這是由TCP的半關閉特性造成的。因為TCP連接時全雙工的,因此,需要TCP兩端要單獨執行關閉。值得注意的是,主動關閉的一端在發送FIN之后,依然還能正常接收對方的數據,只是通知對方它已經沒有數據需要發送了,同理,被動關閉的一端在收到FIN之后,仍然可以發送數據,直到它自身同樣發出FIN之后,才停止發送數據。

4.什么是面向連接、無連接?

  • 面向連接:面向連接的協議要求發送數據前需要通過一種手段保證通信雙方都準備好了,之后才進行通信。
  • 無連接:無連接的協議則不需要,想發就發

5.什么是全雙工

全雙工(Full Duplex)是一種通信方式,指通信的雙方可以同時發送和接收數據,而不需要像半雙工那樣在發送和接收之間切換。在全雙工通信中,數據可以在兩個方向上同時傳輸,因此通信速度更快,效率更高。

6.OSI和封包詳細信息的對應

為了更加清楚明白,這里將上一篇文章中的圖拿過來進行說明和講解。

7.TCP包的具體內容

?從下圖可以看到wireshark捕獲到的TCP包中的每個字段。

8.TCP報文格式

?TCP是面向連接、可靠的傳輸協議,其報文格式較復雜。TCP報文的格式如下:

上圖簡化如下:

注意:實際的TCP報文段會根據TCP頭部長度和可選項的不同而有所變化。

|  源端口(16位)  |  目的端口(16位)  |
|   序號(32位)   |
| 確認序號(32位) |
|  數據偏移(4位) | 保留(6位) | 標志位(6位) | 窗口大小(16位) |
| 校驗和(16位)   |  緊急指針(16位)  |
|   選項(可選)   |
|   數據(可選)   |

? ?主要字段解釋:

  • 源端口:占 2 字節,標識數據包是哪個應用發出去的。
  • 目的端口:占 2 字節,標識數據包是發給哪個應用的。Source Port和Destination Port:分別占用16位,表示源端口號和目的端口號;用于區別主機中的不同進程,而IP地址是用來區分不同的主機的,源端口號和目的端口號配合上IP首部中的源IP地址和目的IP地址就能唯一的確定一個TCP連接。
  • 序號: 占 4 字節,TCP 連接中傳送的數據流中的每一個字節都編上一個序號.序號字段的值則指的是本報文段所發送的數據的第一個字節的序號。Sequence Number:用來標識從TCP發端向TCP收端發送的數據字節流,它表示在這個報文段中的的第一個數據字節在數據流中的序號;主要用來解決網絡報亂序的問題;
  • 確認號:占 4 字節,是期望收到對方的下一個報文段的數據的第一個字節的序號。Acknowledgment Number:32位確認序列號包含發送確認的一端所期望收到的下一個序號,因此,確認序號應當是上次已成功收到數據字節序號加1。不過,只有當標志位中的ACK標志(下面介紹)為1時該確認序列號的字段才有效。主要用來解決不丟包的問題。
  • 數據偏移(首部長度): 占 4 位,它指出 TCP 頭部實際長度。Offset:給出首部中32 bit字的數目,需要這個值是因為任選字段的長度是可變的。這個字段占4bit(最多能表示15個32bit的的字,即4*15=60個字節的首部長度),因此TCP最多有60字節的首部。然而,沒有任選字段,正常的長度是20字節。
    • 在 TCP 協議中,TCP 頭部的長度是可變的,最小長度為 20 個字節,最大長度為 60 個字節。這是因為 TCP 頭部中有一些可選字段,如 TCP 選項、窗口縮放因子等,這些字段的長度是可變的,因此 TCP 頭部的長度也會隨之變化。TCP 頭部長度是通過 TCP 頭部中的 數據偏移(首部長度)字段來指定的,它表示 TCP 頭部的長度以 32 位字為單位計算的值。因此,TCP 頭部長度實際上是 數據偏移(首部長度)字段值乘以 4。TCP Flags:TCP首部中有6個標志比特,它們中的多個可同時被設置為1,主要是用于操控TCP的狀態機的,依次為URGACKPSHRSTSYNFIN。每個標志位的意思如下:
  • 狀態位,占6比特:
    • URG:此標志表示TCP包的緊急指針域(后面馬上就要說到)有效,用來保證TCP連接不被中斷,并且督促中間層設備要盡快處理這些數據。
    • ACK:該位為 1 時,「確認號」的字段變為有效,否則無效。此標志表示應答域有效,就是說前面所說的TCP應答號將會包含在TCP數據包中;有兩個取值:0和1,為1的時候表示應答域有效,反之為0; TCP協議規定,只有ACK=1時有效,也規定連接建立后所有發送的報文的ACK必須為1。
    • PSH:這個標志位表示Push操作。所謂Push操作就是指在數據包到達接收端以后,立即傳送給應用程序,而不是在緩沖區中排隊。
    • RST:該位為 1 時,表示 TCP 連接中出現異常必須強制斷開連接,然后重新建立新鏈接。這個標志表示連接復位請求。用來復位那些產生錯誤的連接,也被用來拒絕錯誤和非法的數據包。
    • SYN:該位為 1 時,表示希望建立連接,并在其「序號」的字段進行序列號初始值的設定。

      表示同步序號,用來建立連接。SYN標志位和ACK標志位搭配使用,當連接請求的時候,SYN=1,ACK=0;連接被響應的時候,SYN=1,ACK=1;這個標志的數據包經常被用來進行端口掃描。掃描者發送一個只有SYN的數據包,如果對方主機響應了一個數據包回來 ,就表明這臺主機存在這個端口;但是由于這種掃描方式只是進行TCP三次握手的第一次握手,因此這種掃描的成功表示被掃描的機器不很安全,一臺安全的主機將會強制要求一個連接嚴格的進行TCP的三次握手。

    • FIN:該位為 1 時,表示數據發送傳輸完畢,希望斷開連接。表示發送端已經達到數據末尾,也就是說雙方的數據傳送完成,沒有數據可以傳送了,發送FIN標志位的TCP數據包后,連接將被斷開。這個標志的數據包也經常被用于進行端口掃描。
  • 窗口:占2字節,用于流量控制,通信雙方各聲明一個窗口,標識自己當前的處理能力。控制報文別發太快,也別發太慢。

    16位2字節,用于表示滑動窗口大小,窗口大小最大為65535(2^16-1)字節。
    接收方的流量控制手段,窗口大小為字節數,起始于確認序號字段指明的值,這個值是接收端正期望接收的字節。告訴發送端,接收端目前允許發送端數據量。大小兩字節65535,在客戶端與服務端 TCP 都允許的情況下,選項中可存在窗口擴展選項。 示例中:窗口大小65535,代表告訴發送方,從這個下一包0的序號開始,接收方只能接受65535個字節長度了(當然這里還沒有算上擴展選項,稍后再講)。

  • 檢驗和: 占 2 字節,校驗數據是否完整未更改。

    16位2字節,檢驗和覆蓋了整個的 TCP 報文段: TCP 首部和 TCP 數據。這是一個強制性的字段,一定是由發端計算和存儲,并由收端進行驗證。和 UDP 用戶數據報一樣,在計算檢驗和時,要在 TCP 報文段的前面加上12字節的偽首部。偽首部的格式和 UDP 用戶數據報的偽首部一樣。但應把偽首部第4個字段中的17改為6(TCP的協議號是6);把第5字段中的UDP中的長度改為TCP長度。接收方收到此報文段后,仍要加上這個偽首部來計算檢驗和。若使用TPv6,則相應的偽首部也要改變。
    校驗和錯誤的分組丟棄(因為源IP地址、源端口號或者協議字段可能被破壞)。

  • 緊急指針:16位2字節,在緊急 URG 標志執1的時候有效,代表一個偏移量,和序號字段值相加,代表緊急數據最后一個字節的序號。
  • 選項:長度可變,最長可達40字節。當沒有使用“選項”時,TCP 的首部長度是20字節。其最大長度可根據 TCP 首部長度進行推算。TCP 首部長度用4位數據偏移表示,單位是4字節,那么選項部分最長為:(2^4-1)*4-20=40字節。TCP 協議最初只規定了一種選項,即最長報文段長度(數據字段加上TCP首部),又稱為 MSS。MSS 告訴對方 TCP “我的緩存所能接收的報文段的數據字段的最大長度是 MSS 個字節”。
  • 填充: 為了使整個首部長度是 4 字節的整數倍。選項長度是指不一定是32位的整數倍,所以要加填充位,即在這個字段中加入額外的0,以保證TCP頭部是32的整數倍。

?8.1TCP報文字段說明表格展示

字段長度含義
Source Port16比特源端口,標識哪個應用程序發送。
Destination Port16比特目的端口,標識哪個應用程序接收。
Sequence Number32比特序號字段。TCP鏈接中傳輸的數據流中每個字節都編上一個序號。序號字段的值指的是本報文段所發送的數據的第一個字節的序號。
Acknowledgment Number32比特確認號,是期望收到對方的下一個報文段的數據的第1個字節的序號,即上次已成功接收到的數據字節序號加1。只有ACK標識為1,此字段有效。
Data Offset4比特數據偏移,即首部長度,指出TCP報文段的數據起始處距離TCP報文段的起始處有多遠,以32比特(4字節)為計算單位。最多有60字節的首部,若無選項字段,正常為20字節。
Reserved6比特保留,必須填0。
URG1比特緊急指針有效標識。它告訴系統此報文段中有緊急數據,應盡快傳送(相當于高優先級的數據)。
ACK1比特確認序號有效標識。只有當ACK=1時確認號字段才有效。當ACK=0時,確認號無效。
PSH1比特標識接收方應該盡快將這個報文段交給應用層。接收到PSH ?= 1的TCP報文段,應盡快的交付接收應用進程,而不再等待整個緩存都填滿了后再向上交付。
RST1比特重建連接標識。當RST=1時,表明TCP連接中出現嚴重錯誤(如由于主機崩潰或其他原因),必須釋放連接,然后再重新建立連接。
SYN1比特同步序號標識,用來發起一個連接。SYN=1表示這是一個連接請求或連接接受請求。
FIN1比特發端完成發送任務標識。用來釋放一個連接。FIN=1表明此報文段的發送端的數據已經發送完畢,并要求釋放連接。
Window16比特窗口:TCP的流量控制,窗口起始于確認序號字段指明的值,這個值是接收端正期望接收的字節數。窗口最大為65535字節。
Checksum16比特校驗字段,包括TCP首部和TCP數據,是一個強制性的字段,一定是由發端計算和存儲,并由收端進行驗證。在計算檢驗和時,要在TCP報文段的前面加上12字節的偽首部。
Urgent Pointer16比特緊急指針,只有當URG標志置1時緊急指針才有效。TCP的緊急方式是發送端向另一端發送緊急數據的一種方式。緊急指針指出在本報文段中緊急數據共有多少個字節(緊急數據放在本報文段數據的最前面)。
Options可變選項字段。TCP協議最初只規定了一種選項,即最長報文段長度(數據字段加上TCP首部),又稱為MSS。MSS告訴對方TCP“我的緩存所能接收的報文段的數據字段的最大長度是MSS個字節”。
Padding可變填充字段,用來補位,使整個首部長度是4字節的整數倍。
data可變TCP負載。

?9.梳理

主要詳細地介紹了一下TCP包的理論知識,基本上都是文字,看起來比較晦澀難懂。下一篇打算講解和分享一下:TCP的三次握手和四次揮手以及WireShark的實踐。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/86952.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/86952.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/86952.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

太極八卦羅盤JS繪制

LeaferJS 是一款好用的 Canvas 引擎,通過LeaferJS繪制羅盤案例. https://www.leaferjs.com/ui/guide/ 示例 太極八卦羅盤 直接上代碼 <template><div id"LuoPan"></div><div id"info"><p>屏幕寬度: {{ screenWidth }}px<…

Python開源項目月排行 2025年5月

#2025年5月2025年6月1日1scrapy一個開源的、基于 Python 的高性能網絡爬蟲和數據抓取框架。Scrapy 項目最初由倫敦的網絡聚合和電子商務公司 Mydeco 的員工以及烏拉圭蒙得維的亞的網絡咨詢公司 Insophia 的開發者共同創建。目前&#xff0c;Scrapy 由 Zyte&#xff08;原名 Scr…

Debezium日常分享系列之:在 Kubernetes 中使用 Debezium 的 CDC

Debezium日常分享系列之&#xff1a;在 Kubernetes 中使用 Debezium 的 CDC 架構源數據庫創建數據庫憑證密鑰Debezium 自定義鏡像構建并推送鏡像Kafka Connect 集群Debezium Postgres 連接器Debezium 創建的 Kafka 主題 Debezium 是一個開源的分布式變更數據捕獲 (CDC) 平臺。D…

tf serving和torch serve哪個耗時更低

TensorFlow Serving&#xff08;TF Serving&#xff09;和 TorchServe 的耗時對比需結合具體場景&#xff08;如硬件配置、模型類型、優化策略等&#xff09;&#xff0c;以下從多維度分析兩者的性能差異及適用場景。 ?? 1. 標準性能基準對比 根據公開壓測數據&#xff08;…

Java面試寶典:基礎六

133. 二進制小數點位移 答案:C(乘以2) 解析: 原理:二進制小數點右移一位等價于乘以 (2^1)(左移則除以 (2))。示例: 101.1(5.5)右移 → 1011(11)驗證:(5.5 \times 2 = 11)說明:位移前:1 0 1 . 1 (值 = 2+2?+2? = 5.5) 位移后:1 0 1 1 . (值 = 2+2+2? =…

04-React中綁定this并給函數傳參的幾種方式

前言綁定 this 的方式一&#xff1a;bind()綁定 this 并給函數傳參 的方式二&#xff1a;構造函數里設置 bind()綁定 this 并給函數傳參 的方式三&#xff1a;箭頭函數【薦】 前言 我們先來看下面這段代碼&#xff1a; components/MyComponent.jsx import React from "…

Docker拉取不兼容的鏡像解決辦法

錯誤提示如下&#xff1a; WARNING: The requested images platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested295ef35cfefe0dce6904e017e89218695d9a9c092b45496218f4476357be4f9c 這個警告表明你…

android14 未充電狀態電量低于15%彈框提示 10%直接關機

上層接收電量變化廣播&#xff0c;添加未充電判斷&#xff0c;做出彈框或關機動作 SystemUI\src\com\android\systemui\power\PowerUI.java Overridepublic void onReceive(Context context, Intent intent) {String action intent.getAction();if (PowerManager.ACTION_POWE…

ASP.NET Core 中 Kestrel 的應用及在前后端分離項目中的角色

目錄 一、Kestrel 基礎&#xff1a;輕量級且高性能的 Web 服務器 二、前后端分離項目架構&#xff1a;Vue、.NET Core API、Nginx 與 Kestrel 2.1 交互流程圖 2.2 流程詳解 三、Kestrel 在架構中的核心作用 四、launchSettings.json 與 Kestrel 配置的關系及底層機制 4.1…

Kotlin 退出循環總結

文章目錄 Kotlin 退出循環總結for循環forEach()嵌套for循環lambda函數inline函數 Kotlin 退出循環總結 for循環 for ((index, value) in list.withIndex()) {if (value "c") {break // 退出循環}println("$index - $value") }// 0 - a // 1 - bfo…

再看C語言

目錄 與Java的差異化 編程范式 跨平臺 編譯過程 包管理 基本類型 內存結構 重點掌握 進制、字節與計算 指針 結構體 關鍵詞 動態內存 模塊化 高級特性 動態鏈接 虛擬內存 打包編譯 并發編程 現在需要參與到存儲軟件開發工作&#xff0c;存儲層比較接近OS系統…

機器學習入門 | 訓練、推理與其他機器學習活動(預處理、測試與評估)

在訓練階段&#xff0c;訓練算法通過優化目標/損失函數在訓練數據集上的表現&#xff0c;不斷更新模型參數θ。在監督學習場景中&#xff0c;訓練數據集由輸入-標簽對&#xff08;真實輸出值&#xff09;組成。目標函數應當獎勵模型根據訓練輸入成功預測真實輸出的行為&#xf…

Node.js特訓專欄-實戰進階:11. Redis緩存策略與應用場景

&#x1f525; 歡迎來到 Node.js 實戰專欄&#xff01;在這里&#xff0c;每一行代碼都是解鎖高性能應用的鑰匙&#xff0c;讓我們一起開啟 Node.js 的奇妙開發之旅&#xff01; Node.js 特訓專欄主頁 專欄內容規劃詳情 Redis 緩存策略與應用場景&#xff1a;從理論到實戰的高…

【stm32】HAL庫開發——Cube配置基本定時器

目錄 一、Cube配置基本定時器 1.定時器CubeMX配置介紹 2.定時器中斷控制LED 3.定時器常用函數 4.定時器從模式&#xff08;Reset Mode&#xff09; 5.定時器的從模式&#xff08;Gated Mode&#xff09; 6.定時器的編碼器接口 一、Cube配置基本定時器 1.定時器CubeMX配置…

nginx反向代理后端服務restful及token處理

#user nobody; worker_processes 1;#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024; } #代理mysql服務 stream {upstream mysql_backend {server 192.168…

正確理解Cola StateMachine不內置事務管理機制

? 正確理解&#xff1a;Cola StateMachine 并非“不支持”事務一致性&#xff0c;而是“不內置”事務管理機制 因為&#xff1a; Cola StateMachine 是輕量級、無狀態、不依賴 Spring 的框架&#xff0c;它本身 不綁定任何事務上下文。它不像 Spring StateMachine 那樣自動與…

AudioTrack使用

** AudioTrack ** AudioTrack 是 Android 音頻系統中的核心類&#xff0c;用于播放原始音頻數據&#xff08;PCM&#xff09;或壓縮音頻&#xff08;如 MP3、AAC&#xff09;。它提供了低級別的音頻播放控制&#xff0c;適合需要精細管理的場景&#xff08;如游戲音效、實時音…

解密:MySQL 的常見存儲引擎

在數據庫領域&#xff0c;MySQL 作為一款廣受歡迎的關系型數據庫管理系統&#xff0c;提供了多種存儲引擎以滿足不同應用場景的需求。每種存儲引擎都有其獨特的特性、優勢和適用場景。本文將深入探討 MySQL 中幾種常見的存儲引擎&#xff0c;包括 InnoDB、MyISAM、MEMORY 和 AR…

qt和qtcreator版本關系

實例展示&#xff1a; 如圖所示的qtcreator是使用qt5.15安裝過程選擇勾選了qtcreator 14.0.2&#xff0c;安裝完成qtcreator版本信息&#xff1a; 安裝過程中選擇了這些構件kits&#xff0c;會自動識別到&#xff1a; 使用qt5.9.9另外安裝的kits&#xff0c;需要手動設置才能識…

2個任務同時提交到YARN后2個都卡住(CDH)

文章目錄 問題描述解決方案1、增加資源2、調整ApplicationMaster資源3、關閉YARN調度器的資源搶占4、不使用公平調度器 問題描述 在CDH集群上&#xff0c;同時提交2個任務到YARN后&#xff0c;2個任務都卡住 解決方案 1、增加資源 增加服務器的內存和CPU 2、調整Applicatio…