當資料報的目的位址是本機是,ip_rcv_finish函式就會將skb->dst->input函式指標初始化為ip_local_deliver,ip層本地傳送資料報也分為兩個階段分配分別有兩個處理函式:ip_local_deliver和ip_local_deliver_finish。本地**資料報的首要任務是重組資料報,前送的資料報可以不要重組,前送可以**每個分片資料報。
一、本地重組資料報
ip_local_deliver函式主要的任務是重組ip資料報,重組資料報呼叫ip_defrag函式完成,ip_defrag重組資料報完畢後返回完整資料報指標,如果還沒有收到資料報的所有分片,資料報還不完整就返回null。重組資料報成功後呼叫網路過濾子系統的input鏈上的鉤子函式對資料報做過濾處理,過濾處理完成就呼叫ip_local_deliver_finish函式繼續處理。
int ip_local_deliver(struct sk_buff *skb)
//資料報重組完成,呼叫防火牆上input鏈上的鉤子處理函式
//網路過濾子系統處理完成就呼叫ip_local_deliver_finish繼續處理
return nf_hook(nfproto_ipv4, nf_inet_local_in, skb, skb->dev, null,
ip_local_deliver_finish);
}
二、資料報從ip上傳到傳輸層
將資料報從ip層上傳給傳輸層的處理函式的ip_local_deliver_finish函式,它的主要任務有:
a、將資料報傳給正確的上層協議處理函式
b、將資料報傳給裸ip
c、對資料報進行安全策略檢查
(1)、傳輸層協議
在ip協議頭中protocol資料域佔了8位,所以傳輸層最多支援256種協議,linux支援的傳輸層協議定義成列舉變數在include/linux/in.h檔案中。
/* standard well-defined ip protocols. */
enum ;
(2)、傳輸層協議處理函式結構
傳輸層的每個協議都定義接受網路資料報的處理函式,完成對輸入資料報的處理,如分段、錯誤處理。傳輸層協議處理結構體struct net_protocol定義在include/net/protocol.h檔案中,結構體如下:
/* this is used to register protocols. */
struct net_protocol ;
傳輸層的資料報處理結構體在ip層初始化函式inet_init中呼叫inet_add_protocol註冊到核心全域性陣列inet_protos中。
//核心全域性陣列,儲存了所有傳輸層的處理結構體
extern const struct net_protocol *inet_protos[max_inet_protos];
inet_add_protocol函式:
int inet_add_protocol(const struct net_protocol *prot, unsigned char protocol)
else
spin_unlock_bh(&inet_proto_lock);
return ret;
}
tcp協議net_protocol協議結構體例項:
static const struct net_protocol tcp_protocol = ;
三、ip_local_deliver_finish函式
資料報通過網路過濾系統input鏈上的鉤子處理函式後呼叫ip_local_deliver_finish函式繼續處理。ip_local_deliver函式主要任務:
a、初始化skb->data,設定傳輸層協議頭指標skb->transplant_header,使指標指向傳輸層協議頭的起始位址,這時ip層已經處理完成,但還是可以通過skb->network_header訪問ip協議頭。
b、獲取傳輸層協議編碼iphdr-protocol,然後根據協議編碼在inet_protos全域性陣列中找到傳輸層結構體,呼叫傳輸層處理函式,資料報進如傳輸層。
c、檢查資料報是否需要ipsce檢查處理
c、錯誤處理,返回乙個imcp包表示位址不可達。
ip_local_deliver_finish函式**:
static int ip_local_deliver_finish(struct sk_buff *skb)
//配置了ipsec安全處理
if (!ipprot->no_policy)
nf_reset(skb);
}//呼叫傳輸層的介面處理函式
//資料報進入傳輸層
ret = ipprot->handler(skb);
if (ret < 0)
ip_inc_stats_bh(net, ipstats_mib_indelivers);
} else
} else
ip_inc_stats_bh(net, ipstats_mib_indelivers);
kfree_skb(skb);
} }out:
rcu_read_unlock();
return 0;
}
網路層 IP資料報
網路層的協議資料單元pdu是ip資料報,ipv4是ip協議的乙個版本,還有最新的ipv6版本,後面進行介紹。版本 指版本號4 首部長度 佔4位,一行首部4位元組 32位 至少5行共20位元組,最多15行共60位元組 區分服務 未使用該欄位 總長度 佔16位,首部和資料長度之和,最大2 16 1位元組...
IP資料報格式
版本字段長度為4,用來表明建立資料報的ip版本,目前的ip版本是ipv4,ipv6正在發展中。ipv4的字段為0100 首部長度 報頭長度 指的是首部佔32 bit字的數目,包括任何選項。由於它是乙個4位元字段,因此首部最長為60個位元組。15x32 8 60位元組.ip首部始終是32 bit的整數...
解析IP資料報
include stdafx.h include winsock2.h include ws2tcpip.h include iostream.h include stdio.h typedef struct ip header byte servicetype 服務型別 word totallen...