ICMP緩存
1.定位:互聯網控制報文協議(Internet Control Message Protocol),是TCP/IP協議族的一個子協議,位於網絡層。它被IP用於提供許多不一樣的服務。ICMP是一個管理性協議,而且也是一個IP信息服務的提供者。它的信息是被做爲IP數據報來傳送的。安全
2.ICMP包具備2個特性:服務器
能爲主機提供有關網絡故障的信息。網絡
被封裝在IP數據報內。工具
3.ICMP用於在IP主機、路由器之間傳遞控制消息,判斷網絡鏈接的情況。控制消息是指目的是否可達、報告錯誤、網絡通不通、路由是否可用、緩存區是否已滿、是否超過最大跳數(超時)等網絡自己的消息。這些控制消息雖然並不傳輸用戶數據,可是對於用戶測試
數據的傳遞起着重要的做用。ICMP是一種面向鏈接的協議,它的傳輸出錯報告控制信息功能對於網絡安全具備極其重要的意義。如當遇到IP數據沒法訪問目標、IP路由器沒法按當前的傳輸速率轉發數據包等狀況時,會自動發送ICMP消息。即錯誤偵測與回報機制。操作系統
它提供了錯誤報告和其它回送給源點的關於 IP 數據包處理狀況的消息。ICMP 包含幾種不一樣的消息,其中回送請求(Echo Request)由 Ping 命令產生,主機可經過它來測試網絡的可達性,ICMP應答報文(Echo Reply)消息表示該節點是可達的。code
4.ICMP差錯報告報文:不可達報文、源站抑制、時間超過、參數問題、重定向orm
ICMP查詢報文:回送請求和應答報文、時間戳請求和應答報文、掩碼地址請求和應答報文、路由器請求和通告報文。blog
5.ICMP數據包詳解
各類ICMP報文的前4個字節(32bits)都是三個長度固定的字段(見上圖):
type類型字段(8位)、code代碼字段(8位)、checksum校驗和字段(16位)。
8bits類型和8bits代碼字段:一塊兒決定了ICMP報文的類型。常見的有:
類型八、代碼0:回顯請求;
類型0、代碼0:回顯應答;
類型十一、代碼0:超時。
16bits校驗和字段:包括數據在內的整個ICMP數據包的校驗和,其計算方法和IP頭部校驗和的計算方法是同樣的。
對於ICMP回顯請求和應答報文來講(見上圖),接下來是16bits標識符字段:用於標識本ICMP進程。最後是16bits序列號字段:用於判斷回顯應答數據報。
ICMP報文包含在IP數據報中,屬於IP的數據,IP頭部就在ICMP報文的前面,一個ICMP報文包括IP頭部(20字節)、ICMP頭部(8字節)和ICMP報文。
IP頭部的Protocol值爲1就說明這是一個ICMP報文;
ICMP頭部中的類型(Type)域用於說明ICMP報文的做用及格式;
此外還有代碼(Code)域用於詳細說明某種ICMP報文的類型;
全部數據都在ICMP頭部後面。
6.下面是幾種常見的ICMP報文:
1.響應請求
咱們平常使用最多的ping,就是響應請求(Type=8)和應答(Type=0),一臺主機向一個節點發送一個Type=8的ICMP報文,若是途中沒有異常(例如被路由器丟棄、目標不迴應ICMP或傳輸失敗),則目標返回Type=0的ICMP報文,說明這臺主機存在,
更詳細的tracert經過計算ICMP報文經過的節點來肯定主機與目標之間的網絡距離。
2.目標不可到達、源抑制和超時報文
這三種報文的格式是同樣的,目標不可到達報文(Type=3)在路由器或主機不能傳遞數據報時使用,例如咱們要鏈接對方一個不存在的系統端口(端口號小於1024)時,將返回Type=三、Code=3的ICMP報文,它要告訴咱們:「嘿,別鏈接了,我不在家的!」,
常見的不可到達類型還有網絡不可到達(Code=0)、主機不可到達(Code=1)、協議不可到達(Code=2)等。源抑制則充當一個控制流量的角色,它通知主機減小數據報流量,因爲ICMP沒有恢復傳輸的報文,因此只要中止該報文,主機就會逐漸恢復
傳輸速率。最後,無鏈接方式網絡的問題就是數據報會丟失,或者長時間在網絡遊蕩而找不到目標,或者擁塞致使主機在規定時間內沒法重組數據報分段,這時就要觸發ICMP超時報文的產生。超時報文的代碼域有兩種取值:Code=0表示傳輸超時,
Code=1表示重組分段超時。
3.時間戳
時間戳請求報文(Type=13)和時間戳應答報文(Type=14)用於測試兩臺主機之間數據報來回一次的傳輸時間。傳輸時,主機填充原始時間戳,接收方收到請求後填充接收時間戳後以Type=14的報文格式返回,發送方計算這個時間差。
一些系統不響應這種報文。
ICMP報文格式
ICMP雖然是網絡層的協議,但要將ICMP報文放入IP中發送。
ICMP報文的頭部由1字節的類型(type)、1字節的代碼(code)和2字節的校驗和(checksum)組成。
類型域和代碼域用來標識各類ICMP報文。類型域表示ICMP報文的類型,目前已定義了14種,從類型值來看ICMP報文可分爲二大類。
第1 類是取值爲1~127的差錯報文,第2類是取值128以上的是信息(informational)報文。
7.糾錯機制:發送的出錯報文返回到發送原數據的設備,由於只有發送設備纔是出錯報文的邏輯接受者。發送設備隨後可根據ICMP報文肯定發生錯誤的類型,並肯定如何才能更好地重發失敗的數據包。可是ICMP惟一的功能是報告問題而不是糾正錯誤,
糾正錯誤的任務由發送方完成。
經常使用的有:用於檢查網絡通不通的Ping命令(Linux和Windows中均有),這個「Ping」的過程實際上就是ICMP協議工做的過程。還有其餘的網絡命令如跟蹤路由的Tracert命令。
8.操做系統規定的ICMP數據包最大尺寸不超過64KB。
利用這一規定向主機發起「Ping of Death」(死亡之Ping)攻擊。「Ping of Death」 攻擊的原理是:若是ICMP數據包的尺寸超過64KB上限時,主機就會出現內存分配錯誤,致使TCP/IP堆棧崩潰,導致主機死機。(操做系統已經取消了發送
ICMP數據包的大小的限制,解決了這個漏洞)
防範「Ping of Death」:1) 在路由器上對ICMP數據包進行帶寬限制,將ICMP佔用的帶寬控制在必定的範圍內,這樣即便有ICMP攻擊,它所佔用的帶寬也是很是有限的,對整個網絡的影響很是少;
2) 在主機上設置ICMP數據包的處理規則,最好是設定拒絕全部的ICMP數據包。
PING
1.Ping 在Windows系下是自帶的一個可執行命令,也叫時延,其值越大,速度越慢。利用它能夠檢查網絡是否可以連通,用好它能夠很好地幫助咱們分析斷定網絡故障。應用格式:Ping IP地址。
2.原理:利用網絡上機器IP地址的惟一性,給目標IP地址發送一個數據包,再要求對方返回一個一樣大小的數據包來肯定兩臺網絡機器是否鏈接相通,時延是多少。
3.工做流程:
如下面一個網絡爲例:有A、B、C、D四臺機子,一臺路由RA,子網掩碼均爲255.255.255.0,默認網關爲192.168.0.1。
1) 在同一網段內
在主機A上運行「Ping 192.168.0.5」後,都發生了些什麼呢? 首先,Ping命令會構建一個固定格式的ICMP請求數據包,而後由ICMP協議將這個數據包連同地址「192.168.0.5」一塊兒交給IP層協議(和ICMP同樣,其實是一組後臺運行的進程),
IP層協議將以地址「192.168.0.5」做爲目的地址,本機IP地址做爲源地址,加上一些其餘的控制信息,構建一個IP數據包,並想辦法獲得192.168.0.5的MAC地址(物理地址,這是數據鏈路層協議構建數據鏈路層的傳輸單元——幀所必需的),
以便交給數據鏈路層構建一個數據幀。關鍵就在這裏,IP層協議經過機器B的IP地址和本身的子網掩碼,發現它跟本身屬同一網絡,就直接在本網絡內查找這臺機器的MAC,若是之前兩機有過通訊,在A機的ARP緩存表應該有B機IP與其MAC的映射關係,
若是沒有,就發一個ARP請求廣播,獲得B機的MAC,一併交給數據鏈路層。後者構建一個數據幀,目的地址是IP層傳過來的物理地址,源地址則是本機的物理地址,還要附加上一些控制信息,依據以太網的介質訪問規則,將它們傳送出去。
主機B收到這個數據幀後,先檢查它的目的地址,並和本機的物理地址對比,如符合,則接收;不然丟棄。
接收後檢查該數據幀,將IP數據包從幀中提取出來,交給本機的IP層協議。一樣,IP層檢查後,將有用的信息提取後交給ICMP協議,後者處理後,立刻構建一個ICMP應答包,發送給主機A,其過程和主機A發送ICMP請求包到主機B如出一轍。
2) 不在同一網段內
在主機A上運行「Ping 192.168.1.4」後,開始跟上面同樣,到了怎樣獲得MAC地址時,IP協議經過計算髮現D機與本身不在同一網段內,就直接將交由路由處理,也就是將路由的MAC取過來,至於怎樣獲得路由的MAC,跟上面同樣,先在ARP緩存表找,
找不到就廣播。路由獲得這個數據幀後,再跟主機D進行聯繫,若是找不到,就向主機A返回一個超時的信息。
4.測試網絡的連通性:
一、使用ipconfig /all觀察本地網絡設置是否正確;
二、Ping127.0.0.1,127.0.0.1回送地址Ping回送地址,檢查本地的TCP/IP協議有沒有設置好;
三、Ping本機IP地址,檢查本機的IP地址是否設置有誤;
四、Ping本網網關或本網IP地址,檢查硬件設備是否有問題,也能夠檢查本機與本地網絡鏈接是否正常;(在非局域網中這一步驟能夠忽略)
五、Ping本地DNS地址,檢查DNS是否可以接受本地IP。
六、Ping遠程IP地址,這主要是檢查本網或本機與外部的鏈接是否正常。
7.故障檢查:
1)首先對本地工做站的循環地址127.0.0.1進行ping測試。
當遇到一些沒法直接找到故障緣由的特殊網絡故障時,首先須要使用Ping命令測試一下本地工做站的循環地址127.0.0.1可否被正常Ping通,假若該地址沒法被正常Ping通的話,那麼說明本地工做站的TCP/IP協議程序受到了破壞,或者網卡設備發生了損壞。
此時打開本地工做站系統的設備管理器窗口,從中找到網卡設備選項,並用鼠標右鍵單擊該選項,從彈出的快捷菜單中執行「屬性」命令,打開網卡設備的屬性設置窗口,在該窗口的「常規」標籤頁面中咱們就能看到當前的網卡工做狀態是否正常了。
當發現網卡工做狀態正常的話,那頗有多是本地工做站的TCP/IP協議程序受到了破壞,此時打開本地鏈接屬性設置窗口,選中並刪除該設置窗口中的TCP/IP協議選項,以後再從新安裝一下TCP/IP協議程序,相信這麼一來本地工做站的循環地址127.0.0.1
就能被正常Ping通了。
2)其次對本地工做站的IP地址進行ping測試。
在確認127.0.0.1地址可以被Ping通的狀況下,咱們繼續使用Ping命令測試一下本地工做站的靜態IP地址是否能被正常Ping通,假若該地址不能被正常Ping通的話,那麼說明本地工做站的網卡參數沒有設置正確,或者網卡驅動程序不正確,
也有多是本地的路由表受到了破壞。
此時咱們能夠從新檢查一下本地工做站的網絡參數是否設置正確,若是在網絡參數設置正確的狀況下仍然沒法Ping通本地IP地址的話,咱們最好從新安裝一下網卡設備的原裝驅動程序,相信這麼一來咱們就能正確Ping通本地工做站的靜態IP地址了。
一旦本地工做站的靜態IP地址被順利Ping通的話,那就代表本地工做站已經可以加入到局域網網絡中了。
接着對本地局域網的默認網關地址進行ping測試。因爲本地工做站是經過網關與局域網中的其餘工做站進行相互通訊的,只有本地工做站與默認網關之間鏈接正常,才能確保本地工做站與其餘工做站通訊正常。假若網關地址能被正常Ping通的話,
那就代表本地工做站能夠與局域網中的其餘工做站進行正常通訊。
要是Ping命令操做不成功的話,那頗有多是網關設備自身存在問題,或者是本地工做站與網關之間的線路鏈接不正常,也有多是本地工做站與網關沒有設置成同一個子網中。此時,咱們能夠先用專業的線纜測試工具測試一下網絡線纜的連通性,
在線纜連通性正常的狀況下,再檢查本地工做站的網絡參數是否與網關的參數設置成同一個子網中。
假若網絡參數設置正確的話,咱們再從其餘工做站Ping一下網關地址,以便確認網關自身是否存在緣由,若是局域網中的其餘工做站也沒法Ping通網關的話,那多半是網關設備自身存在問題,這個時候咱們只要將故障排查重點鎖定在網關設備上就能夠了。
下面對局域網中任意一臺遠程工做站的IP地址進行ping測試,以便檢驗本地工做站可否經過網關設備與局域網中的其餘工做站進行通訊。要是咱們發現遠程工做站的IP地址沒法Ping通的話,那頗有多是遠程工做站自身沒法響應,
或者是遠程工做站與網關設備之間的線路鏈接出現了問題,此時咱們能夠將網絡故障的排查重點聚焦到遠程工做站上或者是局域網的網絡設備上。
3)最後對局域網的遠程工做站主機名稱進行ping測試。在確認可以Ping通遠程工做站IP地址的狀況下,仍然出現沒法訪問遠程工做站內容的時候,咱們就有必要進行這一項測試操做。若是該主機名稱沒法被Ping成功的話,那頗有多是DNS解析出現了問題,
而不是網絡鏈接發生了故障,此時咱們不妨把故障檢查重點鎖定在DNS服務器上。
小提示:爲了有效地找出網絡故障緣由,咱們在使用Ping命令進行測試檢查時,儘可能確保局域網中只配置了一個網關且要ping的主機保持正常的使用狀態,同時確保本地工做站沒有啓用IP安全設置策略,這樣能夠保證Ping命令可以得到正確的測試結果