icmp分屬於網路層,用來傳遞差錯報文以及其他需要注意的資訊。
ping程式中就是通過icmp報文資料中存放傳送請求的時間值來計算往返時間。
traceroute程式是通過icmp和ip報文中的ttl選項結合起來來實現的(ttl是由傳送端初始設定的乙個8bit欄位)。
請求端傳送乙個ttl欄位為1的ip資料報給目的主機。處理這份資料報的第乙個路由器將ttl減1,丟棄該資料報,這時返回乙個超時icmp報文。這樣就獲得了第乙個路由器的位址。繼續這個過程直至到達目標主機。但是此時有個問題,主機接受了報文時並不會返回乙個差錯icmp,這時如何如何判斷已經到達目的主機呢?這個時候traceroute程式傳送乙份udp資料報給目的主機,但是它選擇乙個不可能的值作為udp埠號(大於30000)。這時目標主機會返回乙個埠不可達的錯誤,此時tracerout程式只要區分接收到的是超時還是埠不可達即可。
還有一種利用traceroute來確定路徑mtu以用來判斷ip是否分片等內容。具體的是傳送分組,並設定「不分組」的標識,傳送的第乙個分組長度正好與出口mtu相等,每次收到icmp「不能分片」差錯時就減小分組長度。如果路由器傳送的icmp差錯報文是新格式,包含出口的mtu,那麼就用該值來替代,否則就用下乙個最小的mtu代替。
關於ICMP簡介
icmp協議的功能主要有 確認ip包是否成功到達目標位址 通知在傳送過程中ip包被丟棄的原因 注意 icmp是基於ip協議工作的,但是它並不是傳輸層的功能,因此仍然把它歸結為網路層協議 icmp只能搭配ipv4使用,如果是ipv6的情況下,需要是用icmpv6 icmp報文格式和各個欄位的含義 ic...
關於記憶體對齊的小總結
對齊規則 1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照 pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。2 結構 或聯合 的整體對齊規則 在資料成員完成各自對齊之後,結構 或...
關於JavaScript的小技巧總結
獲取陣列的最後乙個元素 array.prototype.slice begin,end 用來獲取begin和end之間的陣列元素。如果你不設定end引數,將會將陣列的預設長度值當作end值。但有些同學可能不知道這個函式還可以接受負值作為引數。如果你設定乙個負值作為begin的值,那麼你可以獲取陣列的...