資料報前送

2021-09-01 03:01:25 字數 4507 閱讀 9004

一、ip_forward函式

ip_rcv_finish處理結束後,如果資料報的目標位址不是本機,核心就要前送資料報,如果是資料報的目標位址是本機就上傳tcp/ip協議棧,處理函式由dst_input完成,根據路由選項將處理函式設定為ip_forward或則ip_local_deliver。ip_forward是資料報前送處理函式,ip_local_deliver是本地接受處理函式。

資料報的前送處理也分為兩個階段分別由ip_forward和ip_forward_finish完成,定義在net/ipv4/ip_forward.c檔案中,函式到達ip_forward時前送的資訊已經準備好了:

a、資料報前送路徑的路由資訊,存放在skb->dst資料域中,或者由ip_rcv_finish函式呼叫ip_route_input獲取存放在skb->dst中。

b、ip選項設定已經解析完成放在ip_option資料結構型別變數中。

前送資料報主要做的事情:

1)、處理ip選項

2)、基於ip協議頭的資料域確定資料報可以前送

3)、對ip協議頭中的ttl資料域減1,如果ttl的值變成0就扔掉資料報

4)、基於路由的mtu,如果資料報大於mtu就要對資料報做分片處理

5)、將資料報通過選定的網路介面傳送出去

6)、錯誤處理

完成了這些處理就呼叫netfilter框架中的forward鏈中的鉤子函式處理,通過鉤子函式的處理就呼叫ip_forward_finish函式繼續處理。

ip_forward函式原始碼分析:

int ip_forward(struct sk_buff *skb)

/* we are about to mangle packet. copy it! */

if (skb_cow(skb, ll_reserved_space(rt->u.dst.dev)+rt->u.dst.header_len))

goto drop;

iph = ip_hdr(skb);

/* decrease ttl after skb cow done */

ip_decrease_ttl(iph);

/* * we now generate an icmp host redirect giving the route

* we calculated.

*/if (rt->rt_flags&rtcf_doredirect && !opt->srr && !skb_sec_path(skb))

ip_rt_send_redirect(skb);

//設定資料域優先順序,給流量控制系統(qos)使用決定資料報傳送順序

skb->priority = rt_tos2priority(iph->tos);

//呼叫網路過濾子系統forward鏈上的鉤子函式

//網路過濾系統處理接受呼叫ip_forward_finish

return nf_hook(nfproto_ipv4, nf_inet_forward, skb, skb->dev,

rt->u.dst.dev, ip_forward_finish);

sr_failed:

/* * strict routing permits no gatewaying

*///錯誤就回乙個icmp包

icmp_send(skb, icmp_dest_unreach, icmp_sr_failed, 0);

goto drop;

too_many_hops:

/* tell the sender its packet died... */

ip_inc_stats_bh(dev_net(skb_dst(skb)->dev), ipstats_mib_inhdrerrors);

icmp_send(skb, icmp_time_exceeded, icmp_exc_ttl, 0);

drop:

kfree_skb(skb);

return net_rx_drop;

}

二、ip_forward_finish函式

當資料報到ip_forward_finish已經通過了所有正確信檢查和安全性檢驗,準備通過網路裝置傳送給網路上的另一台主機。到目前位置已經處理了兩個ip選項:router alert和strict source routing(嚴格路由選項),餘下的ip選項就會在ip_forward_finish函式中呼叫ip_forward_option函式處理前送資料報的ip選項,通過查詢ip_option_compile解析選項時初始化的標誌:如opt->rr_needaddr、opt->ts_needaddr來決定資料報在ip協議頭中新增什麼資訊。最後資料報由dst_output處理。

ip_forward_finish**:

static int ip_forward_finish(struct sk_buff *skb)

三、dst_output函式

所有要傳送的資料報,如論是前送的資料報還是本機產生的資料報要傳送給其他網路主機都要通過dst_output傳送給目的網路。這時ip協議頭已經處理結束,協議頭中嵌入了要傳送的資訊和本機系統需要加入的資訊。dst_output呼叫函式指標skb->output,skb->output根據目標位址型別來初始化,目標位址為木乙個主機位址時,skb->output初始化為ip_output,目標位址是組傳送位址時就初始化為ip_mac_output。ip_output函式會初始化資料報的輸出網路裝置和傳輸協議,最後進入netfilter的post_routing鏈處理鉤子函式,post_routing鏈上的鉤子函式處理結束後呼叫ip_output_finish。

ip_output函式**分析:

int ip_output(struct sk_buff *skb)

四、ip_finish_output函式

ip_finish_output主要任務是根據網路配置決定資料報是否要重新路由、是否要對資料報做分片處理,最後呼叫ip_finish_output2和相鄰子系統介面。

ip_finish_output函式**分析:

static int ip_finish_output(struct sk_buff *skb)

#endif

//資料報長度大於mtu而且沒有設定gso

//就要重新分片,然後呼叫ip_finish_output2和相鄰子系統介面

if (skb->len > ip_skb_dst_mtu(skb) && !skb_is_gso(skb))

return ip_fragment(skb, ip_finish_output2);

else

return ip_finish_output2(skb);

}

五、ip_finish_output2函式

ip_finish_output2函式是與相鄰子系統介面的函式,該函式的主要任務是為資料鏈路層協議插入其協議頭,或者為資料鏈路層協議頭預留分配空間,然後將資料報交給相鄰子系統傳送函式dst->neithbour->output處理,實際呼叫的是dev_queue_ximit。

ip_finish_output2函式**分析:

static inline int ip_finish_output2(struct sk_buff *skb)

else if (rt->rt_type == rtn_broadcast)

ip_upd_po_stats(dev_net(dev), ipstats_mib_outbcast, skb->len);

/* be paranoid, rather than too clever. */

//資料報headroom小於鏈路層協議頭長度,切裝置裝置

//初始化了操作協議頭函式,就要為二層協議頭分配空間

if (unlikely(skb_headroom(skb) < hh_len && dev->header_ops))

if (skb->sk)

//為新的skb設定所屬套接字

skb_set_owner_w(skb2, skb->sk);

kfree_skb(skb);

skb = skb2;

} //將資料報交給相鄰子系統處理函式

if (dst->hh)

return neigh_hh_output(dst->hh, skb);

else if (dst->neighbour)

return dst->neighbour->output(skb);

if (net_ratelimit())

printk(kern_debug "ip_finish_output2: no header cache and no neighbour!\n");

kfree_skb(skb);

return -einval;

}

資料報格式 USB資料報解析

由域構成的包有四種型別,分別是令牌包 資料報 握手包和特殊包,前面三種是重要的包,不同包的域結構不同,介紹如下 1 令牌包 分為輸入包 輸出包 設定包和幀起始包 注意這裡的輸入包是用於設定輸入命令的,輸出包是用來設定輸出命令的,而不是放資料的 其中輸入包 輸出包和設定包的格式都是一樣的 sync p...

IP資料報 TCP資料報結構詳解

一般來說,網路程式設計我們僅僅須要呼叫一些封裝好的函式或者元件就能完畢大部分的工作,可是一些特殊的情況下,就須要深入的理解 網路資料報的結構,以及協議分析。如 網路監控,故障排查等 ip包是不安全的,可是它是網際網路的基礎,在各方面都有廣泛的應用。由ip協議衍生的協議族有10數種 據我所知 以後還會...

網路資料報

我們知道網路是通過分組交換進行通訊,是將使用者傳送的資訊資料劃分成一定的長度,每個部分叫做乙個分組。每個分組的前面有乙個分組頭,用以指明該分組發往何位址,然後由 交換機根據每個分組的位址標誌,將他們 至目的地,這一過程稱為 分組交換 osi open system interconnection,開...