微信公衆號:鄭爾多斯
關注可瞭解更多的Nginx
知識。任何問題或建議,請公衆號留言;
關注公衆號,有趣有內涵的文章第一時間送達!算法
這裏介紹的校驗和算法被IP收不,ICMP首部,TCP,UDP首部所使用。
下面摘自《TCP/IP協議簇》的IP頭校驗和算法:
發送時:服務器
- 將校驗和字段置爲0;
- 將整個首部分爲16bit的部分,求和;
- 取反碼,填入到校驗和字段中;
接收時:微信
- 直接將整個首部分爲16bit的部分,求和;
- 取反碼,若結果爲0,取合法;不然丟棄;
這上面有兩個細節沒有描述清楚:網絡
- 計算時的字節順序(litter endian和big endian)問題;
- 取和溢出時的改進計算方法;
根據實驗結果,及參考網絡上的資料,實際上幾乎現有全部的系統對校驗和算法已經有點小小的補充,也許《TCP/IP協議簇》這裏沒有更新罷了,自我安慰吧,以下:
當發送IP包時,須要計算IP報頭的校驗和:app
一、 把校驗和字段置爲0;
二、 對IP頭部中的每16bit進行二進制求和;
三、 若是和的高16bit不爲0,則將和的高16bit和低16bit反覆相加,直到和的高16bit爲0,從而得到一個16bit的值;
四、 將該16bit的值取反,存入校驗和字段。測試
當接收IP包時,須要對報頭進行確認,檢查IP頭是否有誤,算法同上二、3步,而後判斷取反的結果是否爲0,是則正確,不然有錯。spa
ICMP報文是在IP數據報內部被傳輸的。ICMP報文的種類有兩種,即ICMP差錯報告報文和ICMP詢問報文。3d
說明:code
(1)全部報文的前4個字節都是同樣的,剩下的其餘字節則互不相同。
(2)類型字段能夠有15個不一樣的值,以描述特定類型的ICMP報文。某些ICMP報文還使用代碼字段的值來進一步描述不一樣的條件。
(3)檢驗和字段覆蓋整個ICMP報文。使用的算法與IP首部檢驗和算法相同。ICMP的檢驗和是必需的。orm
差錯報文共56個字節。
全部的ICMP差錯報告報文中的數據字段都具備一樣的格式。將收到的須要進行差錯報告IP數據報的首部和數據字段的前8個字節提取出來,做爲ICMP報文的數據字段。再加上響應的ICMP差錯報告報文的前8個字節,就構成了ICMP差錯報告報文。提取收到的數據報的數據字段的前8個字節是爲了獲得運輸層的端口號(對於TCP和UDP)以及運輸層報文的發送序號(對於TCP)。
查詢報文
查詢報文共40個字節
ICMP詢問報文有四種,分別爲回送請求和回答,時間戳請求和回答,掩碼地址請求和回答,以及路由器詢問和經過。
ICMP回送請求報文是由主機或路由器向一個特定的目的主機發出的詢問。收到此報文的機器必須給源主機發送ICMP回送應答報文。這種詢問報文用來測試目的站是否可達以及瞭解其有關狀態。好比ping命令
ICMP時間戳請求容許系統向另外一個系統查詢當前的時間。該ICMP報文的好處是它提供了毫秒級的分辨率,而利用其餘方法從別的主機獲取的時間只能提供秒級的分辨率。請求端填寫發起時間,而後發送報文。應答系統收到請求報文時填寫接收時間戳,在發送應答時填寫發送時間戳。大多數的實現是把後面兩個字段都設成相同的值。
主機使用ICMP地址掩碼請求報文可向子網掩碼服務器獲得某個接口的地址掩碼。系統廣播它的ICMP請求報文。ICMP報文中的標識符和序列號字段由發送端任意選擇設定,這些值在應答中將被返回,這樣,發送端就能夠把應答與請求進行匹配。
主機使用ICMP路由器詢問和經過報文可瞭解鏈接在本網絡上的路由器是否正常工做。主機將路由器詢問報文進行廣播(或多播)。收到詢問報文的一個或幾個路由器就使用路由器經過報文廣播其路由選擇信息
與ICMP
最相關的程序就是ping
和traceroute
了,下篇文章介紹這兩個指令和ICMP
的關係
喜歡本文的朋友們,歡迎長按下圖關注訂閱號鄭爾多斯,更多精彩內容第一時間送達