一年十二月  誰主春秋
關(guān)注:基礎(chǔ)系統(tǒng)工程 密碼學(xué) 人工智能
C++博客
首頁
新隨筆
聯(lián)系
聚合
管理
隨筆-159 評論-223 文章-30 trackbacks-0
Linux ICMP消息的產(chǎn)生與轉(zhuǎn)換
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
2
int
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ā)送速率。
1
void
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_sen
d
(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
只有注冊用戶
登錄
后才能發(fā)表評論。
【推薦】100%開源!大型工業(yè)跨平臺軟件C++源碼提供,建模,組態(tài)!
相關(guān)文章:
基于X509證書的身份認(rèn)證思考小結(jié)
使用HiRedis實現(xiàn)自動重連Redis
基于ENet實現(xiàn)可靠UDP通信的同步模型
總結(jié)網(wǎng)絡(luò)路由走向診斷方法
深入理解SSL/TLS技術(shù)內(nèi)幕
一種攔截Linux原始套接字IO的方法
一種P2P代理中TCP連接調(diào)度的方法
TCP分組丟失時的狀態(tài)變遷
Linux ICMP消息的產(chǎn)生與轉(zhuǎn)換
Linux套接字與虛擬文件系統(tǒng)(2):操作和銷毀
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
本博客所有隨筆均為原創(chuàng),因為不定期維護(hù)更新,所以轉(zhuǎn)載請注明出處,如有問題和建議,請留言或評論,發(fā)表您的寶貴意見,藉此平臺以分享交流、共同進(jìn)步。
聯(lián)系方式:微信theory-math
<
2012年5月
>
日
一
二
三
四
五
六
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(74)
給我留言
查看公開留言
查看私人留言
隨筆分類
(158)
Algorithm(46)
C/C++(24)
Compiler(25)
Compute Theory(5)
Database(4)
Network(17)
Opensrc(13)
System(24)
隨筆檔案
(159)
2025年4月 (2)
2024年12月 (1)
2024年11月 (1)
2024年9月 (1)
2024年8月 (2)
2024年6月 (1)
2024年5月 (1)
2024年4月 (1)
2024年3月 (2)
2024年2月 (2)
2023年12月 (1)
2023年11月 (2)
2023年10月 (2)
2023年9月 (37)
2021年12月 (1)
2021年10月 (1)
2021年9月 (1)
2021年2月 (1)
2020年5月 (3)
2020年4月 (1)
2019年11月 (4)
2019年7月 (1)
2018年11月 (1)
2017年12月 (1)
2016年12月 (1)
2016年11月 (2)
2016年10月 (1)
2016年9月 (1)
2016年8月 (3)
2016年7月 (4)
2016年5月 (1)
2015年10月 (2)
2015年9月 (1)
2015年6月 (2)
2015年5月 (3)
2015年2月 (1)
2015年1月 (1)
2014年12月 (2)
2014年4月 (2)
2014年3月 (1)
2014年1月 (1)
2013年10月 (1)
2013年9月 (1)
2013年8月 (3)
2013年5月 (1)
2013年3月 (1)
2012年11月 (1)
2012年9月 (3)
2012年8月 (1)
2012年7月 (1)
2012年6月 (5)
2012年5月 (3)
2011年12月 (5)
2011年11月 (1)
2011年10月 (5)
2011年8月 (7)
2011年7月 (6)
2011年6月 (6)
2010年6月 (1)
2009年12月 (1)
2009年8月 (1)
2009年7月 (1)
2009年6月 (1)
2009年4月 (3)
文章分類
(30)
詩詞作品集(30)
關(guān)注的開源項目
LLVM
編譯系統(tǒng)
nginx
高性能Web服務(wù)器
OpenSSL
密碼學(xué)庫
suricata
網(wǎng)絡(luò)IPS引擎
最新隨筆
1.?二元二次型的相似變換與正定性
2.?關(guān)于群的一些結(jié)論及應(yīng)用
3.?不定方程的代數(shù)數(shù)論解法
4.?關(guān)于橢圓曲線的驗證計算
5.?不可約多項式判別算法的改正
6.?論證有限域上平方根的求解
7.?求解離散對數(shù)問題的Terr算法
8.?簡單私鑰加密構(gòu)造的驗證及安全性分析
9.?二元有限域及其擴(kuò)域上的計算
10.?簡單連分?jǐn)?shù)攻擊RSA的迭代次數(shù)分析
積分與排名
積分 - 412950
排名 - 56
最新評論
1.?re: 一種攔截Linux原始套接字IO的方法[未登錄]
很有前途和很有錢途啊。
--chipset
2.?re: 一種攔截Linux原始套接字IO的方法[未登錄]
@chipset
是的
--春秋十二月
3.?re: 一種攔截Linux原始套接字IO的方法[未登錄]
工作是做網(wǎng)絡(luò)安全?
--chipset
4.?re: 一種使用函數(shù)指針實現(xiàn)狀態(tài)機(jī)的方法
函數(shù)指針實現(xiàn)狀態(tài)機(jī)
--linda
5.?re: 多標(biāo)簽視圖類CTabView的設(shè)計實現(xiàn)
為啥代碼缺少一些呢,給新手個完整點的啊
--pekingliu
6.?re: 工作線程與消息循環(huán)
從消息隊列取出消息 mark了
--mmocake
7.?re: 一種簡單的跨平臺套接字管道
評論內(nèi)容較長,點擊標(biāo)題查看
--IT搬運工
8.?re: 一種簡單的跨平臺套接字管道
windows僅支持af_init和af_init6地址族有錯別字么?
af_init和af_init6
--IT搬運工
9.?re: Shell應(yīng)用(8):使用awk定位反匯編輸出[未登錄]
厲害
--Chipset
10.?re: TCP分組丟失時的狀態(tài)變遷
不錯
--Binky
閱讀排行榜
1.?基于OpenSSL實現(xiàn)的安全連接(13957)
2.?字符串16進(jìn)制顯示(12856)
3.?基于boost asio實現(xiàn)的ssl socket框架(12310)
4.?Linux套接字與虛擬文件系統(tǒng)(1):初始化和創(chuàng)建(8637)
5.?關(guān)于數(shù)據(jù)庫的一些學(xué)習(xí)研究心得(8087)
6.?使用CString GetBuffer自適應(yīng)獲取計算機(jī)名稱(7974)
7.?使用正則表達(dá)式解析URL(7930)
8.?basic_string內(nèi)存泄露問題之分析解決(7733)
9.?Shell應(yīng)用(4): 使用sed刪除行尾的^M字符(7647)
10.?nginx iocp(1):tcp異步連接(7625)
評論排行榜
1.?basic_string內(nèi)存泄露問題之分析解決(19)
2.?求單向鏈表倒序第m個元素(11)
3.?基于順序存儲實現(xiàn)的多叉樹(1):深度優(yōu)先存儲(9)
4.?字符大小寫轉(zhuǎn)換(7)
5.?字符串16進(jìn)制顯示(6)
6.?面向?qū)ο箧i框架的設(shè)計與實現(xiàn)(6)
7.?Shell應(yīng)用(4): 使用sed刪除行尾的^M字符(5)
8.?工作線程與消息循環(huán)(5)
9.?使用正則表達(dá)式解析URL(5)
10.?十進(jìn)制整數(shù)千位分隔符(4)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 春秋十二月
91精品国产综合久久香蕉
|
国产A级毛片久久久精品毛片
|
久久婷婷国产综合精品
|
亚洲人成无码www久久久
|
国产无套内射久久久国产
|
国产精品九九九久久九九
|
蜜臀久久99精品久久久久久小说
|
亚洲中文字幕久久精品无码喷水
|
精品久久久久一区二区三区
|
久久久久久久人妻无码中文字幕爆
|
久久久久国产精品熟女影院
|
亚洲AV无一区二区三区久久
|
久久精品国产99久久久古代
|
麻豆精品久久久久久久99蜜桃
|
99久久精品免费看国产一区二区三区
|
国产精品一区二区久久精品涩爱
|
精产国品久久一二三产区区别
|
中文字幕久久久久人妻
|
无码国产69精品久久久久网站
|
久久精品夜夜夜夜夜久久
|
97久久久久人妻精品专区
|
国内精品久久久久影院日本
|
精品久久久久久亚洲
|
色噜噜狠狠先锋影音久久
|
人妻无码精品久久亚瑟影视
|
中文字幕无码久久久
|
久久久久久人妻无码
|
久久99热这里只有精品国产
|
国产精品热久久无码av
|
久久综合视频网站
|
久久影院综合精品
|
精品久久人人爽天天玩人人妻
|
中文成人久久久久影院免费观看
|
久久人人爽人人爽人人AV东京热
|
亚洲AV无码久久精品蜜桃
|
久久亚洲国产欧洲精品一
|
久久毛片一区二区
|
国产精品99久久久久久www
|
国产69精品久久久久APP下载
|
久久精品国产亚洲一区二区
|
波多野结衣久久
|