1. 程式人生 > >Linux的TCP/IP協議棧閱讀筆記

Linux的TCP/IP協議棧閱讀筆記

7 們已經知道了,如果使用socket(AF_SOCKET, ..)產生一個PACKET SOCKET的話,dev_add_pack加入的函式是packet_rcv,下面是這個在net/packet/af_packet.c裡面的函式:
static int packet_rcv(struct sk_buff *skb, struct device *dev, 
struct packet_type *pt)
{
struct sock *sk;
struct sockaddr_ll *sll = (struct sockaddr_ll*)skb->cb;

sk = (struct sock *) pt->data;
//我們在packet_create中令data = sk了,remember?

if (skb->pkt_type == PACKET_LOOPBACK) {
kfree_skb(skb);
return 0;
}

skb->dev = dev;

sll->sll_family = AF_PACKET;
sll->sll_hatype = dev->type;
sll->sll_protocol = skb->protocol;
sll->sll_pkttype = skb->pkt_type;
sll->sll_ifindex = dev->ifindex;
sll->sll_halen = 0;

if (dev->hard_header_parse)
sll->sll_halen = dev->hard_header_parse(skb, sll->sll_addr);

if (dev->hard_header)
if (sk->type != SOCK_DGRAM)
skb_push(skb, skb->data - skb->mac.raw);
else if (skb->pkt_type == PACKET_OUTGOING)
skb_pull(skb, skb->nh.raw - skb->data);

if (sock_queue_rcv_skb(sk,skb)<0)
{
kfree_skb(skb);
return 0;
}
return(0);
}
在這個函式裡面有個地方我很疑惑,那就是pkt_type屬性,不知道這個屬性是什麼地方確定的,從網絡卡驅動 ->netif_rx->net_bh中間都沒有,而且甚至在net_bh函式中間就有if(skb->pkt_type==...) 這樣的語句,說明在驅動中間就設定了,但是沒有找到,我faint了.這個屬性以後還會大量使用,還是很重要的.

這裡還有幾個函式要說明:
skb_pull在include/linux/skbuff.h中間:
extern __inline__ char *__skb_pull(struct sk_buff *skb, 
unsigned int len)
{
skb->len-=len;
return skb->data+=len;
}

extern __inline__ unsigned char * skb_pull(struct sk_buff *skb, 
unsigned int len)

if (len > skb->len)
return NULL;
return __skb_pull(skb,len);
}
不過是把頭部的資料空出來,相應調整資料頭部data的地址和長度.

同樣skb_push在include/linux/skbuff.h中間:
extern __inline__ unsigned char *__skb_push(struct sk_buff *skb, 
unsigned int len)
{
skb->data-=len;
skb->len+=len;
return skb->data;
}

extern __inline__ unsigned char *skb_push(struct sk_buff *skb, 
unsigned int len)
{
skb->data-=len;
skb->len+=len;
if(skb->datahead)
{
__label__ here;
skb_under_panic(skb, len, &&here);
here: ;
}
return skb->data;
}
這個調整使資料長度加長,和skb_pull相反,不過skb_push顯然更加安全一點.

在上面的程式中間,如果裝置有一個明確的link_level_header,就考慮要不要調整資料長度和地址,如果sk->type不是 SOCK_DGRAM的話,說明程式對整個資料包包括ll地址都感興趣.這樣需要加長資料段使得資料包含ll頭部.不然如果資料是向外走的,則需要把資料 裁減到只包含從網路層資料包頭開始的地方.所以
是從nh.raw剪掉data,這就是差值.(nh=network header)

經過了這些處理以後,現在的skb已經是可以提交的了,這樣就呼叫sock_queue_rcv_skb函式將這個skb加入到相應socket的接收緩衝區中去. 這個
函式以後再說把.

相關推薦

Linux的TCP/IP協議閱讀筆記

7 們已經知道了,如果使用socket(AF_SOCKET, ..)產生一個PACKET SOCKET的話,dev_add_pack加入的函式是packet_rcv,下面是這個在net/packet/af_packet.c裡面的函式: static int packet_rcv(struct sk_buff

linux-Tcp IP協議原始碼閱讀筆記【轉】

0 推薦 一.linux核心網路棧程式碼的準備知識 1. linux核心ipv4網路部分分層結構: BSD socket層: 這一部分處理BSD socket相關操作,每個socket在核心中以struct socket結構體現。這一部分的檔案 主要有:/net/socket.c /net/protoc

《TCP IP 詳解卷1:協議閱讀筆記 - 第一章

閱讀須知:筆記為閱讀《TCP IP 詳解卷1:協議》後摘抄的一些知識點,其間也有加入一些根據英文原版的自己翻譯和結合網上知識後的理解,所以有些段落之間並不能夠串聯上或者知識點與書上略有差別(基本差別不大,參考的資料屬RFC官方文件)。   第一章:概述 Effective communi

《TCP IP 詳解卷1:協議閱讀筆記 - 第二章

網上 能夠 類別 ipv 範圍 歸類 標識符 一次 重要 閱讀須知:筆記為閱讀《TCP IP 詳解卷1:協議》後摘抄的一些知識點,其間也有加入一些根據英文原版的自己翻譯和結合網上知識後的理解,所以有些段落之間並不能夠串聯上或者知識點與書上略有差別(基本差別不大,參考的資料屬

《TCP IP 詳解卷1:協議閱讀筆記 - 第十八章

序列號 child 劃分 定時 eap targe not 檢驗 審計 閱讀須知:筆記為閱讀《TCP IP 詳解卷1:協議》後摘抄的一些知識點,其間也有加入一些根據英文原版的自己翻譯和結合網上知識後的理解,所以有些段落之間並不能夠串聯上或者知識點與書上略有差別(基本差別不大

《TCP IP 詳解卷1:協議閱讀筆記 - 第四章

發送數據 地方 style 中間 小結 int 格式 兩個 情況 閱讀須知:筆記為閱讀《TCP IP 詳解卷1:協議》後摘抄的一些知識點,其間也有加入一些根據英文原版的自己翻譯和結合網上知識後的理解,所以有些段落之間並不能夠串聯上或者知識點與書上略有差別(基本差別不大,參考

《TCP IP 詳解卷1:協議閱讀筆記 - 第七章

還會在 列表 大量數據 序列 交換 算法 一個數 防火墻 交互式 閱讀須知:筆記為閱讀《TCP IP 詳解卷1:協議》後摘抄的一些知識點,其間也有加入一些根據英文原版的自己翻譯和結合網上知識後的理解,所以有些段落之間並不能夠串聯上或者知識點與書上略有差別(基本差別不大,參考

《TCP IP 詳解卷1:協議閱讀筆記 - 第五章

但是 選擇 路由轉發 匹配 -s 構圖 防止 余數 出現 閱讀須知:筆記為閱讀《TCP IP 詳解卷1:協議》後摘抄的一些知識點,其間也有加入一些根據英文原版的自己翻譯和結合網上知識後的理解,所以有些段落之間並不能夠串聯上或者知識點與書上略有差別(基本差別不大,參考的資料屬

《TCP IP 詳解卷1:協議閱讀筆記 - 第九章

輕量級 穩定性 以及 記錄 pan 屏蔽 種類 32位 第一個 閱讀須知:筆記為閱讀《TCP IP 詳解卷1:協議》後摘抄的一些知識點,其間也有加入一些根據英文原版的自己翻譯和結合網上知識後的理解,所以有些段落之間並不能夠串聯上或者知識點與書上略有差別(基本差別不大,參考的

TCP/IP協議模型

路由 會話管理 add 網絡設備 源地址 解密 發的 傳輸協議 認證 OSI七層模型介紹: 下面4層(物理層、數據鏈路層、網絡層和傳輸層)主要提供數據傳輸和交換功能,即以節點到節點之間的通信為主;第4層作為上下兩部分的橋梁,是整個網絡體系結構中最關鍵的部分;而上3層(會話

TCP/IP協議

ip tcp TCP/IP協議棧全稱是傳輸控制協議/因特網互聯協議,其實是OSI模型的進化版,所以就先解釋一下什麽是OSI模型,OSI的全稱是開放系統互連參考模型,就是為了實現開放系統互連所建立的通信功能分層模型,其目的就是為異種計算機互連提供一個共同的基礎和標準框架,並為保持相關標準的一致性和兼

做運維需要了解的網絡知識,TCP/IP協議

tcp/ip協議棧的基本介紹TCP/IP協議棧:TCP/IP的分層:圖中看的很清楚,在TCP/IP協議棧中,最重要的協議就是傳輸層的TCP協議與UDP協議,而網絡層最重要的是IP協議,下面就做一下簡單的介紹。TCP協議:TCP協議是一種工作在傳輸層,全雙工(雙向傳輸),半關閉,擁有錯誤檢查,確認機制,和數據恢

002::每天五分鐘入門TCP/IP協議::IP協議IP首部長度問題

IP 首部 首部長度 事出反常必有妖,邪乎到家必有鬼。 整個TCP/IP協議中,IP協議是最核心的協議。 IP協議是不可靠的、無連接的服務。 何為不可靠?不能保證IP數據報能夠成功到達目的地,傳輸的可靠×××給傳輸層或應用層去實現。 何為無連接?IP並不維護任何關於後續數據報的狀態信息。 進入正題

003::每天五分鐘入門TCP/IP協議::IP協議之TOS字段說明

IP首部 ToS服務類型 從IP首部看ToS的位置:ToS即為服務類型,只有當網絡設備能夠支持(能夠識別IP首部中的ToS字段)識別ToS字段時,這給字段設置才有意義。否則都是空談。 先說具體字段的意義:Tos字段長度為8bit前3bit字段:為優選權子字段,現在已經廢棄,這個字段默認值是000,從w

TCP/IP協議基礎知識

協議 fin 存儲 無數據 可靠 技術分享 事物 ip協議 同步 設計思想 把一個復雜的事物進行分層劃分,使得每個部分變得相對簡單 分層模型 OSI分為7層模型 tcp/ip分為四層模型 應用層(Application) 傳輸層(T

004::每天五分鐘入門TCP/IP協議::IP協議之16位總長度字段引出的MTU值問題

IP首部 MTU 數據封裝 要理解MTU以及實際生產環境中的MTU問題,就得搞清楚三個問題:IP數據報包含什麽內容;數據進入協議棧的封裝過程;MTU具體代表含義; 首先要理解一個過程:數據進入協議棧的封裝過程!數據從發送主機發送出去之前,在主機的協議棧中會經歷上述圖中的幾個封裝過程。本次以TCP

TCP/IP協議的學習筆記

不同 傳輸層 現象 rda .cn 協議 過程 學習 情況 1.OSI和TCP/IP的協議體系結構   OSI是開放系統互連參考模型,它的七層體系結構概念清楚,理論也比較完整,但它既復雜又不實用。而TCP/IP是一個四層的體系結構,它包含應用層、傳輸層、網際層和網絡接口層。

-1-7 java 網絡編程基本知識點 計算機網絡 TCP/IP協議 通信必備 tcp udp

kit 外部 block 識別 ESS net 常見 主機 通訊 計算機網絡 是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來, 在網絡操作系統,網絡管理軟件及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。 網絡編程

網絡基礎之OSI模型及TCP/IP協議

ack 二進制 能夠 系統 http 數據表 滑動 鏈路 ext OSI參考模型 開放系統互連參考模型為實現開放系統互連所建立的通信功能分層模型。其目的是為異種計算機互連提供一個共同的基礎和標準框架,並為保持相關標準的一致性和兼容性提供共同的參考。這裏所說的開放系統

Linux 從網卡到TCP IP協議數據流跟蹤與審計

軟中斷 sys load 一個 註冊 linux rst 是否 ring 前沿 在學代碼審計,然後最近做Linux協議棧的審計,發現Linux不愧是一個久經考驗的系統,本來以為可以找到個DoS的,結果發現其在TCP/IP協議棧的鏈路層實現,利用了各種技術,用來提高性能與安全