Linux核心網路部分---IP資料報文分片重組
當Linux系統接收到一個IP報文時,判斷IP報文是否是有分片,如果未分片的話,則直接返回該報文。否則,進行IP報文重組的處理。
問題1:如何判斷IP資料報文是否有分片;
IP資料報分片的原因:物理網路層一般要限制每次傳送資料幀的最大長度(MTU46-1500位元組),把一份IP資料報分片以後,只有到達目的地才進行重新組裝(這裡的重新組裝與其他網路協議不同,它們要求在下一站就進行進行重新組裝,而不是在最終的目的地),已經分片過的資料報有可能會再次進行分片(可能不止一次)。
當IP資料報被分片後,每一片都成為一個分組,具有自己的IP首部,並在選擇路由時與其他分組獨立。這樣,當資料報的這些片到達目的端時有可能會失序,但是在IP首部中有足夠的資訊讓接收端能正確組裝這些資料報片。
儘管IP分片過程看起來是透明的,但有一點讓人不想使用它:即使只丟失一片資料也要重傳整個資料報。因為IP層本身沒有超時重傳的機制——由更高層來負責超時和重傳(TCP有超時和重傳機制,但UDP沒有。一些UDP應用程式本身也執行超時和重傳)。當來自TCP報文段的某一片丟失後,TCP在超時後會重發整個TCP報文段,該報文段對應於一份IP資料報。沒有辦法只重傳資料報中的一個數據報片。事實上,如果對資料報分片的是中間路由器,而不是起始端系統,那麼起始端系統就無法知道資料報是如何被分片的。就這個原因,經常需要避免分片。如果60-120秒後(IP_FRAG_TIME常量指定。(30*HZ))重組佇列內包未到齊, 則重組過程失敗, 重組佇列被釋放,同時向傳送方以ICMP協議通知失敗資訊. 重組佇列的記憶體消耗不得大於256k(sysctl_ipfrag_high_thresh), 否則將會呼叫(ip_evictor)釋放每支雜湊尾端的重組佇列.
判斷IP資料報文是否還有分片:
1、對於每份IP資料報來說,其標識欄位都包含一個唯一值。該值在資料報分片時被複制到每個片中。
2、標誌欄位用其中一個位元來表示“更多的片”,除了最後一片外,其他每個組成資料報的片都要把該位元MF置 1。
3、片偏移欄位指的是該片偏移原始資料報開始處的位置。另外,當資料報被分片後,每個片的總長度值要改為該片的長度值。(IdentificationR
DF MF Fragment Offset
wireshark是非常流行的網路封包分析軟體,功能十分強大。可以擷取各種網路封包,顯示網路封包的詳細資訊。使用wireshark的人必須瞭解網路協議,否則就看不懂wireshark了。為了安全考慮,wireshark只能檢視封包,而不能修改封包的內容,或者傳送封包。
wireshark是捕獲機器上的某一塊網絡卡的網路包,當你的機器上有多塊網絡卡的時候,你需要選擇一個網絡卡。
WireShark 主要分為這幾個介面
1. Display Filter(顯示過濾器), 用於過濾
2. Packet List Pane(封包列表), 顯示捕獲到的封包, 有源地址和目標地址,埠號。 顏色不同,代表
3. Packet Details Pane(封包詳細資訊), 顯示封包中的欄位
4. Dissector Pane(16進位制資料)
5. Miscellanous(位址列,雜項)
使用過濾是非常重要的, 初學者使用wireshark時,將會得到大量的冗餘資訊,在幾千甚至幾萬條記錄中,以至於很難找到自己需要的部分。搞得暈頭轉向。過濾器會幫助我們在大量的資料中迅速找到我們需要的資訊。
封包列表(Packet List Pane)封包列表的面板中顯示,編號,時間戳,源地址,目標地址,協議,長度,以及封包資訊。 你可以看到不同的協議用了不同的顏色顯示。
封包詳細資訊 (Packet Details Pane)
這個面板是我們最重要的,用來檢視協議中的每一個欄位。
各行資訊分別為
Frame: 物理層的資料幀概況
Ethernet II: 資料鏈路層乙太網幀頭部資訊
Internet Protocol Version 4: 網際網路層IP包頭部資訊
Transmission Control Protocol: 傳輸層T的資料段頭部資訊,此處是TCP
Hypertext Transfer Protocol: 應用層的資訊,此處是HTTP協議
wireshark與對應的OSI七層模型、
TCP包的具體內容
從下圖可以看到wireshark捕獲到的TCP包中的每個欄位、
問題2:如何對IP資料報文進行分片重組;
雜湊表的結構與實現
1.基本概念:
1、散列表(Hash table,也叫雜湊表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。陣列的特點是:定址容易,插入和刪除困難;而連結串列的特點是:定址困難,插入和刪除容易。雜湊表綜合兩者的特性,做出一種定址容易,插入刪除也容易的資料結構。
2、雜湊表有多種不同的實現方法,我接下來解釋的是最常用的一種方法——Linux核心實現方法:拉鍊法(常見有衝突處理方法還有開放定址法、再雜湊法建立一個公共溢位區),我們可以理解為“連結串列的陣列”。鏈地址使用連結串列儲存關鍵字,可以隨時插入新資料,資料量大小不受限制。缺點是要用到指標,給新單元分配地址需要時間,會一定程度上減慢演算法速度,但影響不大可以忽略。
3、左邊很明顯是個陣列,陣列的每個成員包括一個指標,指向一個連結串列的頭,當然這個連結串列可能為空,也可能元素很多。我們根據元素的一些特徵把元素分配到不同的連結串列中去,也是根據這些特徵,找到正確的連結串列,再從連結串列中找出這個元素。元素特徵轉變為陣列下標的方法就是雜湊法(雜湊函式)。hash 最重要的是選擇適當的hash函式,從而平均的分配關鍵字在桶中的位置,從而優化查詢 插入和刪除所用的時間。
4、它是一種單向密碼體制,即它是一個從明文到密文的不可逆的對映,只有加密過程,沒有解密過程。同時,雜湊函式可以將任意長度的輸入經過變化以後得到固定長度的輸出。hash演算法一般用於快速查詢和加密。雜湊函式當然不止一種,下面列出三種比較常用的:1,除法雜湊法 :最直觀的一種,上圖使用的就是這種雜湊法,公式: index = value % 16;2,平方雜湊法 ;3,斐波那契(Fibonacci)雜湊法;
http://www.codeceo.com/article/hash-based-on-bkdrhash.html
報文佇列資料結構:
IP分片資料結構:
本文使用的雜湊函式:
(1)初始化雜湊(雜湊)表,每個單元分配的記憶體大小為sizeof(ipq_t),前一個節點和下一個節點賦NULL
(2) 先申請一個sk_buff_t緩衝區,再給sk_buff_t的IP分片部首申請sizeof(iphdr_t)大小的空間,儲存資料的data資料區則申請一個RESERVE_SIZE + len空間,用於接收IP分片報文
(3)1、從接收到的IP分片報文中,提取偏移地址frag_off和標誌位mf,如果都為0,則表示這是一個完整的IP資料包,直接返回。
2、否則提取IP部首中的IP源地址、目標地址、標識和協議作為雜湊函式的輸入,根據運算結果求出分片在Hash表的位置。
3、由於本文構造的雜湊表採用的是拉鍊法,所以需要繼續在雜湊索引單元的ipq_t連結串列中查詢該分片所屬的報文。
4、找到所屬報文後,將分片加入分片連結串列中,並判斷報文是否完整(判斷方法是,當檢測到標誌位mf=0時,累計接收到的 資料長度len,是否等於mf = 0的分片的偏移地址+該分片的長度),若完整則將所有分片連結串列的資料都拷出來,並刪除其 ipq結點及分片連結串列。
5、若是沒有找到所屬報文,則新增一個新的ipq_t節點。
相關推薦
Linux核心網路部分---IP資料報文分片重組
當Linux系統接收到一個IP報文時,判斷IP報文是否是有分片,如果未分片的話,則直接返回該報文。否則,進行IP報文重組的處理。 問題1:如何判斷IP資料報文是否有分片; IP資料報分片的原因:物理網路層一般要限制每次傳送資料幀的最大長度(MTU46-1500位元組),把一
linux核心學習筆記------ip報文的分片
對網路比較熟悉的童鞋都知道,當傳送的ip報文長度超出了最大的傳輸單位MTU,且允許分片的情況下,就會對ip報文進行分片。在上層要傳送資料時就會呼叫dst_output,dst_output就會呼叫ip_output,而ip_output就會呼叫ip_finish_outpu
Linux 核心網路協議棧 中最重要的資料結構 SKB
在計算機的世界裡,備份是一種美德。-------------漫步雲端 作為核心網路協議部分最重要的資料結構SKB,有很多值得仔細推敲的問題。 SKB這種說法實際包含了兩部分,即skb描述符和skb資料。 Skb描述符即核心中的skbuff結構體,裡面含有大量的指標變數
linux 核心網路,資料傳送流程圖
4.2 資料傳送流程圖 各層主要函式以及位置功能說明: 1)sock_write:初始化msghdr{}結構 net/socket.c 2)sock_sendmsg:net/socket.c 3)inet_s
Linux 核心網路協議棧 ------ tcp重傳資料包 tcp_retransmit_skb 函式
/* This retransmits one SKB. Policy decisions and retransmit queue * state updates are done by the caller. Returns non-zero if an
【linux網路】linux核心網路資料包流向圖
根據網路上搜集的資源以及檢視linux核心網路相關的程式碼,arvik繪製了一份linux核心網路資料包流向圖,該圖大致呈現了資料包從網絡卡進來以後到怎麼出網絡卡或者進入本地的流程 以及 本地資料怎麼流出網絡卡的流程。如下(linux核心版本3.10.36):
linux核心學習筆記------ip報文組裝
ip報文有分片就會有組裝。在接收方,只有報文的所有分片被重新組合後才會提交到上層協議。核心組裝ip報文用到了ipq結構體:(注,這系列原始碼中的註釋都來自:http://blog.csdn.net/justlinux2010) struct ipq { struct in
Linux核心--網路棧實現分析(二)--資料包的傳遞過程(上)
本文分析基於Linux Kernel 1.2.13作者:閆明注:標題中的”(上)“,”(下)“表示分析過程基於資料包的傳遞方向:”(上)“表示分析是從底層向上分析、”(下)“表示分析是從上向下分析。上一篇博文中我們從巨集觀上分析了Linux核心中網路棧的初始化過程,這裡我們再
Linux核心--網路棧實現分析(十)--網路層之IP協議(下)
本文分析基於Linux Kernel 1.2.13作者:閆明注:標題中的”(上)“,”(下)“表示分析過程基於資料包的傳遞方向:”(上)“表示分析是從底層向上分析、”(下)“表示分析是從上向下分析。上篇博文分析傳輸層最終會呼叫函式ip_queue_xmit()函式,將傳送資料
一篇文章講懂IP資料報分片、組裝以及與TCP/UDP的聯絡
http://www.mamicode.com/info-detail-1465195.html https://blog.csdn.net/leex_brave/article/details/51971053 https://blog.csdn.net/buptzwp/article
Linux核心入門: ip協議頭定義
struct iphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4; #elif defined (__B
VirtualBox 設定虛擬機器網路 以及內建的linux系統 網路靜態ip的配置 包含有線和無線兩種方式
我們討論一下如何在Linux中設定網路連線,配置網路連線最基本的涉及到IP地址、掩碼、閘道器和DNS設定,一般情況下系統設定好以上資訊後就可以接入網路了,這裡介紹了Linux在文字模式下通過修改配置檔案來配置基本網路連線,涉及到更多的網路配置方法請參閱相關的書籍,本文只供Linu
走進Linux核心網路 套接字的祕密—socket與sock
雙十一 今天是雙十一,記得還在念書的時候,每次都會參加京東圖書滿200-100的活動,然後腦子一熱屯一堆書。印象中人文類的書基本都會看,而電子資訊類的可能就只看了一半,甚至買過哪些都忘了。究其原因,主要是人文類的通常都是自己想看的,而技術類的就跟風看哪個銷量大買
Linux 核心網路協議棧 -sk_buff結構體
sk_buff結構體是linux網路程式碼中最重要的資料結構,是整個網路傳輸載體。所以sk_buff結構體裡面有很多關於其他功能的成員欄位,比如:防火牆,子路由系統,多播等。這些欄位並不是一定有的,只有在滿足特點條件才有的。 sk_buff結構體是雙鏈表結構,sk_buf
linux核心驅動重要的資料結構
檔案操作 迄今為止, 我們已經保留了一些裝置編號給我們使用, 但是我們還沒有連線任何我們裝置操作到這些編號上. file_operation 結構是一個字元驅動如何建立這個連線. 這個結構, 定義在 , 是一個函式指標的集合. 每個開啟檔案(內部用一個 file
Linux 核心網路協議棧 ------ 擁塞避免處理函式 tcp_reno_cong_avoid
慢啟動和快速重傳擁塞避免演算法,函式tcp_reno_cong_avoid 在“慢開始”階段,每收到一個ACK,cwnd++一次,那麼一個RTT之後,cwnd就會加倍 擁塞避免階段,其實就是在一個RTT時間內將cwnd++一次( 注意在不丟包的情況下 ) /* *
linux下網路配置——ip配置
我在這隻介紹字元模式下配置ip.第一種方法:配置ip[[email protected] ~]# ifconfig eth0 192.168.0.5 配置閘道器[[email protected] ~]# route add default gw 192.
linux核心網路協議棧學習筆記(6)
本篇討論IP包的收發(暫不包括路由) 先來看inet_init, 首先是呼叫proto_register,註冊了tcp_prot, udp_prot, raw_prot,其中proto_register前半部分是初始化各種slab_cache,後半部分把這些struct
協議棧之一:《linux核心網路棧原始碼情景分析》.(曹桂平)
在工作中或多或少需要和協議棧打交道,因為公司的策略,公司自有的協議棧基本都是基於開源協議棧的理解重寫的協議棧,在可維護性和效能方面均比開源軟體強勢很多,可惜在公司時更多是呼叫API,並未從頭到尾研究過一個完整的協議棧。從事網路工作沒有研究過完整的協議棧,不得不說是個嚴重的缺
Linux核心網路協議棧程式碼分析
^ | sys_read fs/read_write.c | sock_read net/socket.c | sock_recvmsg net/socket.c | inet_re