TCP/IP數據包結構分析


一般來說,網絡編程我們只需要調用一些封裝好的函數或者組件就能完成大部分的工作,但是一些特殊的情況下,就需要深入的理解

網絡數據包的結構,以及協議分析。如:網絡監控,故障排查等……

?

IP包是不安全的,但是它是互聯網的基礎,在各方面都有廣泛的應用。由IP協議衍生的協議族有10數種(據我所知),以后還會出現

更多的基于IP的協議…

?

先從實際出發吧!

一般我們在談上網速度的時候,專業上用帶寬來描述,其實無論說網速或者帶寬都是不準確的,呵呵。比如:1兆,512K……

有些在學校的學生,也許會有疑問,明明我的業務是1M,為什么下載速度到100K就飆不上去了?512K的為什么50多K就封頂了?…

?

這里所說的1M是指1Mbps = 1 Million Bits Per Second,也就是1M比特每秒,即一秒鐘傳輸1048576個二進制位。我們知道一個字節

是8個二進制位。

好,又來問題了。即便這樣子,1M=1048756÷8=131072÷1024=128K。那也應該有128K啊,為什么下載速度還是很少到120K,

110K都謝天謝地了。看完本文,你的帳就對了……

?

IP數據包結構

如圖,一個刻度表示1個二進制位(比特)。

1-1.版本4位,表示版本號,目前最廣泛的是4=B1000,即常說的IPv4;相信IPv6以后會廣泛應用,它能給世界上每個紐扣都分配

?????? 一個IP地址。

1-2.頭長4位,數據包頭部長度。它表示數據包頭部包括多少個32位長整型,也就是多少個4字節的數據。無選項則為5(紅色部分)。

1-3.服務類型,包括8個二進制位,每個位的意義如下:

?????? 過程字段:3位,設置了數據包的重要性,取值越大數據越重要,取值范圍為:0(正常)~ 7(網絡控制)

?????? 延遲字段:1位,取值:0(正常)、1(期特低的延遲)

?????? 流量字段:1位,取值:0(正常)、1(期特高的流量)

?????? 可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)

?????? 成本字段:1位,取值:0(正常)、1(期特最小成本)

?????? 保留字段:1位 ,未使用

1-4.包裹總長16位,當前數據包的總長度,單位是字節。當然最大只能是65535,及64KB。

2-1.重組標識16位,發送主機賦予的標識,以便接收方進行分片重組。

2-2.標志3位,他們各自的意義如下:

?????? 保留段位(2):1位,未使用

?????? 不分段位(1):1位,取值:0(允許數據報分段)、1(數據報不能分段)

?????? 更多段位(0):1位,取值:0(數據包后面沒有包,該包為最后的包)、1(數據包后面有更多的包)

2-3.段偏移量13位,與更多段位組合,幫助接收方組合分段的報文,以字節為單位。

3-1.生存時間8位,經常ping命令看到的TTL(Time To Live)就是這個,每經過一個路由器,該值就減一,到零丟棄。

3-2.協議代碼8位,表明使用該包裹的上層協議,如TCP=6,ICMP=1,UDP=17等。

3-3.頭檢驗和16位,是IPv4數據包頭部的校驗和。

4-1.源始地址,32位4字節,我們常看到的IP是將每個字節用點(.)分開,如此而已。

5-1.目的地址,32位,同上。

6-1.可選選項,主要是給一些特殊的情況使用,往往安全路由會當作攻擊而過濾掉,普聯(TP_LINK)的TL-ER5110路由就能這么做。

7-1.用戶數據。

TCP數據包結構

1-1.源始端口16位,范圍當然是0-65535啦。

1-2.目的端口,同上。

2-1.數據序號32位,TCP為發送的每個字節都編一個號碼,這里存儲當前數據包數據第一個字節的序號。

3-1.確認序號32位,為了安全,TCP告訴接受者希望他下次接到數據包的第一個字節的序號。

4-1.偏移4位,類似IP,表明數據包頭有多少個32位。

4-2.保留6位,未使用,應置零。

4-3.緊急比特URG—當URG=1時,表明緊急指針字段有效。它告訴系統此報文段中有緊急數據,應盡快傳送(相當于高優先級的數據)。

4-3.確認比特ACK—只有當ACK=1時確認號字段才有效。當ACK=0時,確認號無效。參考TCP三次握手

4-4.復位比特RST(Reset) —當RST=1時,表明TCP連接中出現嚴重差錯(如由于主機崩潰或其他原因),必須釋放連接,然后再重新

?????? 建立運輸連接。參考TCP三次握手

4-5.同步比特SYN—同步比特SYN置為1,就表示這是一個連接請求或連接接受報文。參考TCP三次握手

4-6.終止比特FIN(FINal)—用來釋放一個連接。當FIN=1時,表明此報文段的發送端的數據已發送完畢,并要求釋放運輸連接。

4-7.窗口字段16位,窗口字段用來控制對方發送的數據量,單位為字節。TCP連接的一端根據設置的緩存空間大小確定自己的接收窗口

?????? 大小,然后通知對方以確定對方的發送窗口的上限。

5-1.包校驗和16位,包括首部數據這兩部分。在計算檢驗和時,要在TCP報文段的前面加上12字節的偽首部。

5-2.緊急指針16位,緊急指針指出在本報文段中的緊急數據的最后一個字節的序號。

6-1.可選選項24位,類似IP,是可選選項。

6-2.填充8位,使選項湊足32位。

7-1.用戶數據……

?

可以看出,每個IP包至少要20字節的頭部長度,這些與下載內容無關,加上目前多數傳輸,包括http協議(就是IE直接下載),都是基于

TCP協議的,所以IP包裹還要從用戶數據中扣除20字節的TCP包頭,這里已經是40字節,加上其他程序的連接,狀態確認等等包裹,因

而算出來要比理論值要小。

另外網絡環境(包括穩定因素和傳輸節點的轉發率)也是影響下載速度的重要原因…

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

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

相關文章

C#decimal數據類型

文章目錄博主寫作不容易,孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 為適應高精度的財務和貨幣計算的需要,C#提供了十進制decimal類型。decimal類型數據特征如下表所示: 數據類型含義取值范圍有效數字位數decimal128位高精度十進制…

世界杯快到了,看我用Python爬蟲實現(偽)球迷速成!

還有4天就世界杯了,作為一個資深(偽)球迷,必須要實時關注世界杯相關新聞,了解各個球隊動態,這樣才能在一堆球迷中如(大)魚(吹)得(特)水…

Bootstrap學習筆記(四)-----Bootstrap每天必學之表單

本文主要講解的是表單,這個其實對于做過網站的人來說,并不陌生,而且可以說是最為常用的提交數據的Form表單。本文主要來講解一下內容: 1.基本案例2.內聯表單3.水平排列的表單4.被支持的控件5.靜態控件6.控件狀態7.控件尺寸8.幫助文…

LVS--NAT模型配置

環境準備 管理IP地址角色備注192.168.11.131調度器(Director)對外提供VIP服務的地址為192.168.1.114192.168.11.132RS1 網關為192.168.11.131192.168.11.129RS2 網關為192.168.11.131將Directory開啟內核轉發 Linux系統默認是禁止數據包轉發的。所謂轉發…

STL中list的使用(理論)

STL中的list就是一雙向鏈表&#xff0c;可高效地進行插入刪除元素。現總結一下它的操作。文中所用到兩個list對象c1,c2分別有元素c1(10,20,30) c2(40,50,60)。還有一個list<int>::iterator citer用來指向c1或c2元素。list對象的聲明構造()&#xff1a;A. list<in…

C#數據類型轉換—使用Convert類轉換

文章目錄簡介用例博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 簡介 System.Covert類就是專門進行類型轉換的類&#xff0c;Convert類提供的方法可以實現各種進本數據類型之間的轉換。Convert類的常用方法如下表&#xff1a; 方法說明ToBo…

服務器租用單線、雙線、bgp 相比有哪些區別優勢?

2019獨角獸企業重金招聘Python工程師標準>>> 在IDC行業中&#xff0c;服務器的穩定性、安全性是考核服務商的主要指標&#xff0c;影響這兩個指標的因素有很多&#xff0c;其中比較重要的有三個&#xff0c;分別是服務器的配置、機房骨干網寬帶和機房的線路。我們常…

SQL Server 數據庫的維護(四)__游標(cursor)

--維護數據庫-- --游標(cursor)-- --概述&#xff1a; 注&#xff1a;使用select語句查詢結果的結果集是一個整體&#xff0c;如果想每次處理一行或一部分行數據&#xff0c;游標可以提供這種處理機制。可以將游標理解為指針。指針指向哪條記錄&#xff0c;哪條記錄即是被操作記…

關于在unity中動態獲取字符串后在InputField上進行判斷的BUG

今天想做一個簡單的密碼鎖定控制功能&#xff0c;但是出現了問題。我是在游戲開始時讀取streamingAsset中的text中的文本&#xff0c;其實就是密碼如下圖密碼是123456789 然后我在程序中輸入了該密碼出現錯誤&#xff0c;居然錯了。 然后我打印讀取的文本信息是什么、沒錯啊。然…

轉載 調用xvid 實現解碼

2011-06-01 00:26:14) 轉載view plaincopy to clipboardprint? /// intinit_decoder() { intret; xvid_gbl_init_t xvid_gbl_init; xvid_dec_create_txvid_dec_create; memset(&xvid_gbl_init, 0,sizeof(xvid_gbl_init_t)); memset(…

C# 數值和字符串之間的相互轉換

文章目錄方法用例ToString&#xff08;&#xff09;方法Parse&#xff08;&#xff09;方法博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 方法 ToString&#xff08;&#xff09;方法&#xff1a;數值類型的 ToString&#xff08;&#xff…

LeetCode Reverse Words in a String III

原題鏈接在這里&#xff1a;https://leetcode.com/problems/reverse-words-in-a-string-iii/#/description 題目&#xff1a; Given a string, you need to reverse the order of characters in each word within a sentence while still preserving whitespace and initial wo…

創業感悟:技術兄弟為什么一直沒有起來(1)

相信很多做技術的朋友&#xff0c;看到“人脈”兩個字&#xff0c;就顯得有些敏感&#xff0c;有人甚至產生一種“抵觸”的心理。 因為在很多人的心中&#xff0c;會自動的把“人脈”和“關系”關聯起來&#xff0c;會把“人脈”與“走后門”&#xff0c;甚至會和“酒桌文化”&…

kali開啟ssh

修改 vi /etc/ssh/sshd_config 1.將 permitrootlogin 前面的注釋去掉,并且后面改為yes 如果沒有則添加permitrootlogin yes 2.將#PasswordAuthentication no的注釋去掉&#xff0c;并且將NO修改為YES //kali中默認是yes 3.按Esc , 同時按shift和冒號鍵 ,輸入wq &#xff0c;回…

C# 引用類型與值類型轉換-裝箱和拆箱

文章目錄簡介用例裝箱拆箱博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 簡介 拆箱就是把 “引用” 類型轉化為 “值” 類型&#xff1b; 裝箱就是把 “值” 類型轉化為 “引用” 類型&#xff1b; 裝箱與拆箱是數據類型轉換的一種特殊應用…

XVID基本參數解析

XVID&#xff0c;X264等是MPEG4、H264標準的開源編碼器&#xff0c;其中X264只有編碼部分&#xff0c;解碼部分需要FFMPEG完成&#xff1b;XVID有編解碼部分&#xff0c;其中解碼亦可以利用FFMPEG中的MPEG4完成解碼。視頻壓縮算法的計算復雜度&#xff0c;都是比較高的。其中具…

自己整理的openresty安裝步驟

這幾天一直在研究對webapi的限流和名單的問題&#xff0c;于是看了開濤博客的方案&#xff0c;于是就用到了openresty&#xff0c;一個把Nginx和lua集成的東西。 下面就是整理的安裝方案&#xff08;簡單使用基本可以這么安裝&#xff09; 下載openresty&#xff08;centos上下…

京東入職一周感悟:4個匹配和4個觀點

入職一周啦&#xff0c;隨便寫點。一、京東之緣1、我和京東之間的4點匹配Ⅰ技術2008年9月到2016年9月&#xff0c;一直堅持自學技術。京東&#xff0c;是一家商業化的互聯網公司&#xff0c;有技術積淀&#xff0c;有發揮空間。作為技術人員&#xff0c;職業匹配。Ⅱ讀書大學的…

C#賦值運算符及解析

文章目錄博主寫作不容易&#xff0c;孩子需要您鼓勵 萬水千山總是情 , 先點個贊行不行 賦值運算符對運算符右邊的操作式求值&#xff0c;并用該值設置運算符左邊的變量操作式。賦值運算符主要有簡單賦值及復合賦值運算符&#xff1b;可以放在賦值運算符左邊的對象類型是變量…

mysql 案例 ~ pt修復工具的使用

簡介:今天咱們來聊聊PT修復工具pt-table-sync 注意事項&#xff1a; 1 表要有主鍵或者唯一鍵 2 針對每一個chunk加的是for update鎖 3 修復過程中不能容忍從庫延遲 如果從庫延遲太多&#xff0c;pt-table-sync會長期持有對chunk的for update鎖&#xff0c;然后等待從庫的…