TCP/IP-ICMP
description
Transcript of TCP/IP-ICMP
資策會80期網路工程師養成班
TCP/IP STACK
ICMP 報告
指導老師:戴致禮 老師
學 員:傅桂鈞 同學
ICMP (Internet Control Message Protocol) IP 所提供的服務稱為 Best Effort型服務。在這當中,封包的遺失、延遲、
無順序顛倒的配信是有道理的。對此 IP所需有的功能只有使 CheckSum,檢查封
包在傳送中有沒有破損。另外,即使知道 IP 發覺封包有破損時也幫不上忙。因
為不知道封包哪裡破損,所以對傳送端也無法告知有誤,對接收端也無法傳送封
包。結局是 IP只能丟棄封包。
封包破損時,IP 沒有判定哪裡破損了,因此除了丟棄之外別無他法。同時,
這件事傳送端和接收端都無法得知。但是在某些特定狀況下,即使封包沒有破
損,因為網路的因素而導致無法使封包傳至接收端。這時,因為傳送端及接收端
都已確實知道,所以只要有方法,就有可能告知。這種狀況下,IP就是利用 ICMP
的協定。
ICMP 和 IP是相互依存的,IP傳送有誤會使用 ICMP,而 ICMP再傳送訊息時
則會使用 IP。換句話說,ICMP是透過 IP封包坐封裝後傳送。ICMP 的封裝如以
下(圖 1):
在 ICMP中定義通知 IP封包發生錯誤的訊息,和一些資料訊息。告知 IP封
包中發生了怎樣的錯誤以訊息類型的方式傳達給此 IP封包的傳送端。在這時
候,該 IP封包的傳送端欄位會被複製到 ICMP 的接收端欄位。因此;資訊訊息會
傳送給要持有要求訊息的標的節點。
通知 ICMP的錯誤的訊息裡頭,有無法到達、傳送端抑制、轉址、時間超過、
參數問題等。在資料訊息裡頭,有回覆要求/要求回覆、時間戳記請求和時間戳
記應答、資訊請求和資訊應答、位址遮罩請求和位址遮罩應答。各個訊息依照協
定 TYPE 來識別。
以下為 ICMP 的格式和 Type 表:
TYPE 8 要求封包
TYPE 0 回應封包
Identifier 欄位
作為識別之用,由 Echo Request 來源端裝置的程式所決定,所回應的 Echo
Reply 的 Identifier 欄位值, 必須與對應的 Echo Request 的 Identifier
欄位值相同。
Sequence Number 欄位
用來記錄序號,由 Echo Request 來源端裝置的程式所決定,所回應 Echo Reply
的 Sequence Number 欄位值必須與收到的 Echo Request 相同。
Checksum欄位:
檢查 ICMP header 跟 data的 checksum。
在 ICMP封包中的 TYPE為上面表格中 3 (Destination Unreachable)其 CODE
的欄位會帶出 15 種代碼來告訴我們無法送達目的地的原因,下面為其代
碼及意義。
CODE 意 義
0 網路無法到達
1 主機無法到達
2 通訊協定無法到達
3 目的埠無法到達
4 需要做分段才能傳送,但是該資料包的 DF(不要分段)卻被設定
5 來源端路徑無法被接受
6 目的端網路不明
7 目的端主機不明
8 來源端主機被隔離
9 與目的端網路的通訊被管理者禁止
10 與目的端主機的通訊被管理者禁止
11 對於所指定的服務其目的端網路無法到達
12 對於所指定的服務其目的端主機無法到達
13 主機無法到達,因為管理者過濾掉該資料包
14 主機無法到達,因為違反該主機的優先權設定
15 主機無法到達,因為他的優先權被停止
ICMP 常見的工具程式:
1.PING 測試本機與目的端主機的連線能力是否正常時。
2.TRACERT 知道本機至目的端主機會經過哪些路由時。
3.PATHPING可視為上述 2程式的合體,不但可以知道從本機至目的端主機會經
過哪些路由,還可以測試中間每個點的連線能力是否正常。
在命令提示字元輸入 ping tw.yahoo.com 後擷取到的封包
1.TYPE 8 要求回覆(Echo Request)
2.TYPE 0 回覆要求(Echo Reply)
用 Tracert 指令找出至目的端路由器後擷取到的封包的流程:
1.TRACERT 指令是如何運用 ICMP,來讓我們知道本機至目的端主機會經過
哪些路由?
利用逐次增加 TTL 值的方式!來源端第一個送出去的 ICMP 封包中,其
TTL值設定為 1,所以當他走到第一個路由器的時候,TTL 減為 0,路由器
就會回傳 TYPE 為 11(Time Exceed)的 ICMP 封包給來源端,因此來源端就
知道的 1 個路由的位置了。第二個被送出去的路由 TTL值會被設定為 2,
來獲得的 2個路由的位置。以此類推,用 TTL 值逐次加 1的方式送出封包,
直到抵達目的端主機為止。
2.使用 tracert 指令到 168.95.94.50
3.先發出存活時間為 1 的封包來得知第一個路由器位置(192.168.1.1)
4.第二次再發 TTL+1(192.168.168.254)