• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-159  評論-223  文章-30  trackbacks-0
               ICMP在IP系統(tǒng)間傳遞差錯和管理報文,是任何IP系統(tǒng)必須實現(xiàn)的組成部分。Linux 2.6.34中ICMP模塊的實現(xiàn)在linux/icmp.h,net/icmp.h和ipv4/icmp.c中,導(dǎo)出了icmp_err_convert數(shù)組和icmp_send函數(shù),供其它網(wǎng)絡(luò)子系統(tǒng)使用。在其它網(wǎng)絡(luò)子系統(tǒng)中,當(dāng)檢測到錯誤時,調(diào)用icmp_send產(chǎn)生并發(fā)送相應(yīng)的ICMP差錯消息到源主機(jī);當(dāng)源主機(jī)收到ICMP不可達(dá)差錯消息,傳遞到原始套接字和傳輸層,而它們使用icmp_err_convert把對應(yīng)的消息代碼轉(zhuǎn)換成套接字層比較容易理解的錯誤代碼。在內(nèi)核空間中可發(fā)送的ICMP消息包括查詢應(yīng)答和差錯報文,下面總結(jié)了產(chǎn)生這兩類消息的網(wǎng)絡(luò)子系統(tǒng)(及函數(shù))與錯誤轉(zhuǎn)換。


            應(yīng)答消息
               應(yīng)答消息由ICMP模塊的內(nèi)部函數(shù)icmp_reply而非icmp_send發(fā)送。根據(jù)RFC1122 3.2.2.9規(guī)范, 除非一個主機(jī)作為地址掩碼代理,否則不能發(fā)送回復(fù),這對應(yīng)ICMP的icmp_address實現(xiàn)為空,因此上表沒有列出地址掩碼應(yīng)答項(內(nèi)核符號為ICMP_ADDRESSREPLY)。

            差錯消息
               差錯消息由中間路由器或目的主機(jī)產(chǎn)生,當(dāng)數(shù)據(jù)報不能成功提交給目的主機(jī)時。從上表可見,在IP層的接收、本地處理、轉(zhuǎn)發(fā)和輸出各過程中,都可能產(chǎn)生差錯消息;在傳輸層如果對應(yīng)的端口沒有打開,那么UDP會產(chǎn)生ICMP端口不可達(dá)差錯,而TCP則會使用自己的差錯處理機(jī)制發(fā)送一個RST復(fù)位包,這也是上表沒有列出TCP子系統(tǒng)的原因。對于重定向差錯,由ICMP模塊的icmp_redirect調(diào)用ip_rt_redirect更新路由;其它差錯則由icmp_unreach處理。


            錯誤轉(zhuǎn)換
               第2列為icmp_err_convert數(shù)組索引,第4列也就是調(diào)用socket API出錯時返回的errno,最后1列為icmp_err_convert中的fatal成員取值,0表示非致命錯誤,1表示致命錯誤,需要報告給用戶進(jìn)程。錯誤轉(zhuǎn)換會被RAW的raw_err、TCP的tcp_v4_err和UDP的udp_err用到,對于ICMP_DEST_UNREACH類型的差錯,使用上表轉(zhuǎn)換;ICMP_SOURCE_QUENCH類型的忽略不處理;ICMP_PARAMETERPROB類型的轉(zhuǎn)換成EPROTO(協(xié)議錯誤);ICMP_TIME_EXCEEDED類型的轉(zhuǎn)換成EHOSTUNREACH。
               在這要注意,從ICMP_PORT_UNREACH到ECONNREFUSED的轉(zhuǎn)換,不適用于TCP,原因已在上節(jié)說明;而對于UDP的未連接套接字,如果主機(jī)在線而端口沒打開,調(diào)用sendto得不到ECONNREFUSED錯誤,但recvfrom會阻塞,這是因為雖然內(nèi)核收到了ICMP差錯,但沒上報給應(yīng)用進(jìn)程。盡管如此,如果想得到ECONNREFUSED錯誤,那么可以寫個ICMP守護(hù)進(jìn)程,應(yīng)用進(jìn)程先把它的套接字描述符通過unix域套接口傳遞到ICMP守護(hù)進(jìn)程,而守護(hù)進(jìn)程使用raw socket來接收ICMP差錯,再發(fā)給應(yīng)用進(jìn)程。


            發(fā)送限速
               不論一般差錯消息還是重定向差錯消息,發(fā)送限速針對的都是特定目標(biāo)主機(jī)。
               一般限速
               在使用icmp_send發(fā)送差錯消息(PMTU消息除外)時,為減少網(wǎng)絡(luò)擁塞而限制了發(fā)送的速率,限速由xrlim_allow函數(shù)實現(xiàn),定義在ipv4/icmp.c中。
             1#define XRLIM_BURST_FACTOR 6
             2int xrlim_allow(struct dst_entry *dst, int timeout)
             3{
             4    unsigned long now, token = dst->rate_tokens;
             5    int rc = 0;
             6
             7    now = jiffies;
             8    token += now - dst->rate_last;
             9    dst->rate_last = now;
            10    if (token > XRLIM_BURST_FACTOR * timeout)
            11        token = XRLIM_BURST_FACTOR * timeout;
            12    if (token >= timeout) {
            13        token -= timeout;
            14        rc = 1;
            15    }

            16    dst->rate_tokens = token;
            17    return rc;
            18}
               dst為目標(biāo)路由緩存,timeout為允許發(fā)送的超時(單位為jiffies),dst->rate_tokens記錄令牌的個數(shù),當(dāng)令牌個數(shù)不小于timeout時,則減少timeout并允許發(fā)送一個消息;反之則不能發(fā)送,需等到令牌個數(shù)累積到大于timeout時才能發(fā)送,但是不能無限大,否則就會導(dǎo)致在一個可能很短的timeout內(nèi),發(fā)送遠(yuǎn)多于6個的消息,引起ICMP風(fēng)暴,所以這里限制了令牌的最大值為XRLIM_BURST_FACTOR*timeout即6倍的超時,也就是說在一個timeout內(nèi),最多能發(fā)送6個差錯消息。 
              
               重定向限速
               路由子系統(tǒng)使用ip_rt_send_redirect來發(fā)送重定向消息,定義在ipv4/route.c中,該函數(shù)內(nèi)部調(diào)用icmp_send實現(xiàn),在它的限速基礎(chǔ)上,使用指數(shù)回退算法控制發(fā)送速率。
             1void ip_rt_send_redirect(struct sk_buff *skb)
             2{
             3    struct rtable *rt = skb_rtable(skb);
             4    
               
             5
             6    /* No redirected packets during ip_rt_redirect_silence;
             7     * reset the algorithm.
             8     */

             9    if (time_after(jiffies, rt->u.dst.rate_last + ip_rt_redirect_silence))
            10        rt->u.dst.rate_tokens = 0;
            11
            12    /* Too many ignored redirects; do not send anything
            13     * set u.dst.rate_last to the last seen redirected packet.
            14     */

            15    if (rt->u.dst.rate_tokens >= ip_rt_redirect_number{
            16        rt->u.dst.rate_last = jiffies;
            17        return;
            18    }

            19
            20    /* Check for load limit; set rate_last to the latest sent
            21     * redirect.
            22     */

            23    if (rt->u.dst.rate_tokens == 0 || time_after(jiffies, (rt->u.dst.rate_last (ip_rt_redirect_load << rt->u.dst.rate_tokens)))) {
            24        icmp_send(skb, ICMP_REDIRECT, ICMP_REDIR_HOST, rt->rt_gateway);
            25        rt->u.dst.rate_last = jiffies;
            26        ++rt->u.dst.rate_tokens;
            27        
            28    }

            29}
               重定向差錯使用ip_rt_redirect_silence(默認(rèn)為(HZ/50)<<10)、ip_rt_redirect_number(默認(rèn)為9)和ip_rt_redirect_load(默認(rèn)為HZ/50)3個量來控制發(fā)送的速率;rt->u.dst.rate_last記錄上次發(fā)送的時間,rt->u.dst.rate_tokens累計發(fā)送總數(shù),最大值為ip_rt_redirect_number;當(dāng)兩次發(fā)送的時間間隔超過ip_rt_redirect_silence或ip_rt_redirect_load<<rt->u.dst.rate_tokens,并且發(fā)送總數(shù)不超過ip_rt_redirect_number時,才允許發(fā)送一個,這樣一來,在ip_rt_redirect_silence間隔內(nèi),每次發(fā)送的超時呈2的指數(shù)增長,達(dá)到了變減速發(fā)送的效果,直到總數(shù)達(dá)到ip_rt_redirect_number時停止發(fā)送,這是因為源主機(jī)可能忽略了重定向消息所以停止發(fā)送;當(dāng)ip_rt_redirect_silence時間過后,又允許發(fā)送了,這是因為認(rèn)為源主機(jī)沒有更新路由所以又需要發(fā)送。
            posted on 2015-05-18 19:52 春秋十二月 閱讀(2796) 評論(0)  編輯 收藏 引用 所屬分類: Network
            91精品国产综合久久香蕉 | 国产A级毛片久久久精品毛片| 久久婷婷国产综合精品| 亚洲人成无码www久久久| 国产无套内射久久久国产| 国产精品九九九久久九九| 蜜臀久久99精品久久久久久小说| 亚洲中文字幕久久精品无码喷水 | 精品久久久久一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 久久久久国产精品熟女影院| 亚洲AV无一区二区三区久久| 久久精品国产99久久久古代| 麻豆精品久久久久久久99蜜桃| 99久久精品免费看国产一区二区三区| 国产精品一区二区久久精品涩爱| 精产国品久久一二三产区区别| 中文字幕久久久久人妻| 无码国产69精品久久久久网站| 久久精品夜夜夜夜夜久久| 97久久久久人妻精品专区| 国内精品久久久久影院日本 | 精品久久久久久亚洲| 色噜噜狠狠先锋影音久久| 人妻无码精品久久亚瑟影视| 中文字幕无码久久久| 久久久久久人妻无码| 久久99热这里只有精品国产 | 国产精品热久久无码av| 久久综合视频网站| 久久影院综合精品| 精品久久人人爽天天玩人人妻| 中文成人久久久久影院免费观看| 久久人人爽人人爽人人AV东京热 | 亚洲AV无码久久精品蜜桃| 久久亚洲国产欧洲精品一| 久久毛片一区二区| 国产精品99久久久久久www| 国产69精品久久久久APP下载| 久久精品国产亚洲一区二区| 波多野结衣久久|