2009年1月31日 星期六

在 Windows 中編輯 Linux Shell Script 的問題

最近開始練習 Linux shell script,想說用 Windows 上的編輯器來編輯

卻發現程式一直都無法正確執行

後來網路上找到資料,原來是 Windows 與 Linux 的換行字元不同所導致.......

這時候就必須要修改一下編輯器的設定了!

以 MadEdit 為例:


將換行字元改為 Unix,程式就可以正常執行啦! 


參考資料

2009年1月23日 星期五

[TCP/IP Illustrated] Dynamic Routing Protocols

Dynamic Routing

相鄰的 router 之間互相交換網段資訊、連線資訊 ... 等資訊,稱為 dynamic routing,而在 router 上處理這一類工作的 process,就稱為 routing daemon。

routing protocol  還可以根據是否在同一個 AS(Autonomous System) 中來分類,分別是:
  • IGP (Interior Gateway Protocol)
    包含 RIP(Routing Information Protocol)、EIGRP、OSPF(Open Shortest Path First Protocol)、IS-IS ... 等等。

  • EGP (Exterior Gateway Protocol)
    包含 EGP、BGP(Border Gateway Protocol) ... 等等。




Routing Information Protocol

RIP message 是包在 UDP datagram 中傳遞的,以下是傳遞 RIP 訊息的 UDP datagram 格式:


接著是 RIP message 本身的格式:


其中 RIP message 有幾個部份需要注意的:
  • command
    1 = request
    2 = reply

  • version
    是版本不同而不同,RIP = 1,RIPv2 = 2。

  • address family
    此欄位的值永遠為 2,而其他框起來的部份(共 20 bytes)則共同組成一個 IP address 與 metric 資訊。

一個 RIP 訊息最多就僅能帶 25 個 IP address 與 metric 資訊。

運作方式

RIP 所使用的是 UDP port 520,運作的流程如下:
  1. Initialization
    首先會偵測 router 上的介面是否啟用,接著會從啟用的介面送出 request 封包,請求其他 router 將其完整的 routing table 資訊送過來。
    而 request 封包中的 command = 1,address family = 0,metric = 16。

  2. Request received
    router 接收到 request 的封包後,回傳 routing table 資訊給請求者;或是根據封包中所請求的位址給予相對應的 routing 資訊。

  3. Response received
    請求者收到回應,更新 routing table。

  4. Regular routing updates
    接著 router 每 30 秒會將自己的 routing table 資訊送給相鄰的 router。

  5. Triggered updates
    當設定有改變時,就可以發送訊息給鄰近的 router 進行修改。

每個 router 都有其 timeout 的預設值,以三分鐘為例,就表示有 6 次 router advertisement message 沒有收到,因此此時會將 metric 設定為 16,表示此 router 已經不存在,將其刪除。

但沒辦法避免的,使用 RIP 的確會發生 routing table 更新延遲而發生網路不夠穩定的情況。

Metric 的意義

metric 在 RIP 是用來紀錄封包傳遞時,會經過的 router 次數(hop count),而直接連接網路介面的 hop count 為 1,以下用圖來說明:
若是 R1 要到 N2,metric = 1
若是 R1 要到 N3,metric = 2
若是 R2 要到 N2,metric = 1
若是 R2 要到 N1,metric = 2

RIP 的問題所在

從上面運作的原理,其實就可以大概推測出一些問題的端倪了,大概有以下幾點:
  1. hop count 最大是 15,這到 internet 上就不是那麼適用了。

  2. RIP 無法處理 subnet 的定址資訊。

  3. 不論是 router 故障或是從故障中復原,要讓網路上的其他 router 知道以更新 routing table,需要花過多的時間。




RIP version 2

基本上 RIPv2 並沒有改變原先 RIP 運作的模式,而是將原本在 RIP message 中沒有用到的欄位拿來使用而已,以下是 RIPv2 message 的格式:
不同於 RIP 的欄位說明如下:
  • routing domain
    辨識此封包屬於哪個 routing daemon(儲存 process number) 之用,因此表示可以同時有多個 routing daemon 同時處理 RIPv2 的封包。

  • route tag
    用來支援 EGP 之用,儲存 AS(Autonomous System) number。

  • subnet mask
    對應上面的 IP address,以支援 subnet 的處理。

另外要提的是,RIPv2 還支援了簡單的認證功能,只要 address family 設定為 0xFFFFF,且 route tag 的值為 2,往下的 16 個 bits 就是儲存明文密碼的地方。

不僅如此,RIPv2 還支援 multicast,如此一來就不用使用 broadcast 來減少網路流量了!



OSPF (Open Shortest Path First)

相較於 RIP,OSPF 是較新的 routing protocol,克服了 RIP 的許多限制,其中 OSPF Ver.2 定義在 RFC 1247 中。

RIP 屬於距離向量(distance-vector)協定,而 OSPF 屬於鏈路狀態(link-state)協定;差別在於 link-state protocol 中,router 之間不互相交換距離(這裡指的是 hop count)資訊,而是主動偵測周遭 router 的連線狀態(包含實際的距離、頻寬 ... 等資訊),接著將蒐集到的資訊傳送給同一個 AS 中的所有 router,每個 router 蒐集來自各方的資訊後,再將這些資訊組合而成 routing table。

其中最重要的是,當網路上有 router 發生問題而無法提供正常服務時,比起 RIP,使用 OSPF 可以大幅降低收斂(亦即重新發送訊息以組合成可以正常提供服務的 routing table)的時間。

之前提到 RIP 是使用 UDP port 520,而 OSPF 則是直接使用 IP 協定。

由於 OSPF 屬於 link-state protocol,因此也較 RIP 多了以下的優點:
  1. 可以針對不同的路徑計算出 IP type-of-service,因此在 routing table 中可以針對同一個目的地有多個選擇。

  2. 每個網路介面都會給予一個值,其計算的基準在於 throughput、round-trip time、可靠度 .... 等等。每個 IP type-of-service 都可以賦予一個值。

  3. 當到目的地的封包有多條路徑可以選擇,且每條路徑成本相同時,OSPF 會自動將流量分散從不同的路徑傳遞,以求達到負載平衡的效果。

  4. 點對點之間的連線網路介面不需要 IP address。

  5. router 之間訊息的傳輸使用 multicast 而非 broadcast,減少整體的網路流量。

而現在 routing protocol 幾乎都改用 OSPF 囉!



BGP (Border Gateway Protocol)

BGP 是 EGP 的一種,用來在 internet 中讓 AS 之間交換 routing 資訊之用,目前 BGP Ver. 4 的詳細規則可以查詢 RFC 1771

不同 AS 之間會透過 BGP 傳遞包含 AS 的完整 routing 路徑表資訊,藉由組合這些 routing 資訊來形成一個完整的 internet routing 資訊,並避免掉可能發生的 routing loop。

不同於 RIP(UDP port 520) 與 OSPF(IP),BGP 系統間的溝通是透過 TCP 協定來交換 routing table 的資訊;此外,BGP 還會定期送出 keepalive 的訊息,用來確定周遭的 AS 是否可以正常提供 routing 的服務,以便當 AS 有問題時,可以縮短收斂的時間。

而 BGP 的設計上,還可以讓 AS 的管理員自訂設定規則,亦即 BGP 可以允許轉換為 policy-based routing,因此也讓管理者有更大的空間可以發揮與利用。



CIDR (Classless Interdomain Routing)

CIDR 應該是不能算是 protocol,而是一種技術(或是功能)。

怎麼說呢? 這是由於 B class 的網段過於龐大,256 * 256 台主機,如果不切割網段會造成可怕的 broadcast storm,因此解決方式就是切成 C class。

但是切成 C class 卻衍生出了另一個問題:每個 network 之間都必須要有 router

這可是相當麻煩且耗費成本的事情阿,而且 routing table 的數量也會一下子暴增很多;因此 CIDR 就是用來解決這個問題所衍生出來的技術。

而若是僅按照 Class A B C 去切割網路,其實問題是相當多的,例如:
  1. 浪費 IP address
    使用 A class、B class 的組織不見得用的到這麼多 IP;使用 C class 的組織有可能 IP 數量不夠用;多切割一個網段就必須要多浪費兩個 IP(Network ID & Broadcast)。

  2. 無法符合實際需求
    大部分組織可能會遇到 C class 不夠用,B class 卻太多的情況,僅切成 class A B C 並不符合實際的需求。

CIDR 使用 7~32 可變換長度的 Network ID 來取代原本 Class A B C 長度為的 8 16 24 的 Network ID,因此 host 範圍可以從 32 ~ 約 50000 個!

從上面的敘述可以瞭解到,其實 CIDR 的功能就是「將多個小網段組成一個較大的網段」,如此一來 router 所維護的 routing table entry 就可以大大地減少,也因此可以提昇 router 運作的效能。



參考資料

2009年1月22日 星期四

[Oracle] Trigger - 「:NEW」的使用

今天試寫一支 trigger,目的是要讓每一列的 action 欄位更新為 1 時,自動塞入日期與時間的資料,第一次用到「:new」,因此記錄一下。

以下是程式碼:

create or replace trigger tri_fill_datetime_to_message
--只有在更新資料後才需要加入日期時間資訊
before update
on mytable
for each row
begin
--當 action 更新的值為 1 時,在執行以下動作
if :new.action = 1 then
--設定新資料的日期時間資訊
:new.log_date := to_char(sysdate, 'YYYYMMDD');
:new.log_time := to_char(sysdate, 'HH24MISS');
:new.log_datetime := sysdate;
end if;
end tri_fill_datetime_to_message;


參考資料

2009年1月19日 星期一

[TCP/IP Illustrated] IP Routing

簡介

IP 在 TCP/IP protocol suit 中是非常重要的一個協定,有多重要呢? 以下用一張圖來簡單說明 IP 所負責的事情:

在圖中的 routing table 是最常被 IP 存取的部份,可能每秒數百次;而 routing daemon 則是在背景執行的程序,大約半分鐘會更新 routing table 的資訊一次,而更新的資訊可能來自鄰近的 router,或甚至是 ICMP redirect 的封包都可以用來作為更新 routing table 的依據。


Routing 原則

基本上,routing 的規則如下:
  1. 搜尋有無符合的 host

  2. 搜尋有無符合的 network

  3. 搜尋 default gateway (預設閘道)

以上的 routing 工作是由 IP 負責處理;而上面的規則都是去搜尋 routing table 中的資訊,而這些資訊(也稱為 routing policy)都是由 routing daemon 所負責提供。

routing table 長什麼樣呢? 以下截圖說明:

其中兩條被框起來的規則(Flags 的部份有大寫「G」)為 gateway,而 Flags 說明如下:
  • U:表示此規則路徑是正常運作的

  • G:將封包導向 gateway

  • H:將封包導向特定的主機

  • D:表示此規則是由 ICMP Redirect 訊息所新增的

  • M:表示此規則是由 ICMP Redirect 訊息所修改的



關於 routing 時會發生的錯誤種類

ICMP Host & Network Unreachable Errors

當 router 收到 IP datagram 卻無法將其繼續傳送時,就會發生此錯誤,通常此種錯誤出現的原因為網路設定上的錯誤,或是硬體線路沒接好。

ICMP Redirect Errors

此錯誤訊息是由 router 所發,目的是用來告知發送 IP datagram 的主機,應該要將封包送到另外一個 router 上。

以下用圖片來說明一下發生 ICMP Redirect Error 的情境:

  1. 其中 host 將 IP datagram 送給 R1,因為 R1 是 host 的 default gateway。

  2. R1 收到封包,檢查 routing table 規則後,發現其實 R2 才是正確的路徑,因此將封包導向 R2。

  3. 除了將封包導向外,R1 也額外發送了 ICMP Redirect Error 的訊息給 host,通知它要修改自己本身的 routing table。

由這個功能可以瞭解到,若是在複雜一點的 topology 中,要每個 host 都清楚知道封包 routing 的路徑是很難的,但有了這功能後,就可以僅設定 default gateway,接著送封包後就會由 router 通知來改變自身的 routing table 了。

【備註】
  1. 此種錯誤訊息僅有 router 能發送,host 是不能發送的。

  2. router 僅能送出 host redirect 而不是 network redirect,理由是因為 router 要掌握 topology 所有的網段資訊不是很容易,而且也有可能覆蓋原本 host 的 routing table 中不需要修改的設定。



ICMP Router Discovery Messages

此種訊息是用來讓 host 動態取得 routing 資訊用,透過發送此訊息(solicitation),周遭收到此訊息的 router 便會進行回應(advertisement);此外,router 還會定期的廣播 router advertisement,讓 host 可以即時更新 routing table 中的資訊。

從上面的運作方式可以瞭解到:
ICMP Router Discovery Message = ICMP Router Solicitation Message +
ICMP Router Advertisement Message
接著是兩種 message 的格式:

ICMP Router Solicitation Message
ICMP Router Advertisement Message

Router 在做哪些事情?

在 routing 資訊的傳送中,router 做了哪些事情呢?

router 會固定每一段時間(約 450~600 秒不等)都發送 advertisement 訊息,若是 router 中有網路介面準備要關閉停用時,會發送一個 lifetime = 0 的 advertisement 訊息通知周圍的 host 與 router 此網路介面將要失效,必須要更新 routing table 中的資訊。

若是同時有多台 router 在同一個網段中,preference level 的部份就是要由網路管理者來決定了,才有辦法讓 routing policy 有先後順序之分。

Host 在做哪些事情?

host 就跟 router 相反了,開機時送出 router solicitation 訊息,以便接收 router 的回應來更新 routing table;當然,也會隨時監聽來自 router 的 advertisement 訊息,以便取得 routing 的最新資訊。

一般來說,router advertisement 訊息每 10 分鐘就會發送一次,而 lifetime 為 30 分鐘,只要在 30 分鐘之內有收到 router advertisement,就可以一直保持著有 routing 資訊了!

2009年1月11日 星期日

[TCP/IP Illustrated] Traceroute

運作原理簡介

基本上 traceroute 是使用 ICMP 協定,並透過 IP header 中的 TTL 的值每經過一個 router 會遞減的特性,來取得封包傳遞的路徑。

詳細的運作原理說明如下:(以下 client 為執行 traceroute 的主機,server 則為目的地)
  1. client 發送 TTL 為 1 的封包,destination 指定為 server。

  2. 當第一個 router 收到後會將 TTL 減一,此時 TTL 為 0,因此 router 回送 ICMP time exceeded 訊息,如此一來,client 就可以知道封包傳遞路徑中的第一個 router 是哪一個。

  3. 接著發送 TTL 為 2 的封包,同樣的可以接收到來自第二個 router 所回傳的 ICMP time exceeded 訊息。

  4. 一直到封包真正到達 server 時,此時 server 會回應 ICMP port unreachable 訊息,為什麼呢? 原因是因為 client 所發送的封包為 UDP datagram,並指定一個很大的數字(> 30000),通常不會有 server 會在這麼大的 port number 上提供服務,因此會回傳 ICMP port unreachable 的訊息。

  5. client 收到來自 server 的 ICMP port unreachable 訊息,就完整拼湊出封包傳遞路徑了!


tracertroute 實測

在 Windows 中的程式名稱為 tracert,在 Linux 則為 tracepath (也有 tracertroute,不過要另外裝套件),以下是在 Windows 使用的範例圖:

若用 tcpdump 偵測封包往來情況,結果如下:

從上面的實測可以得知,在封包傳遞路徑上的節點,都是由 ICMP time exceeded 與 udp port unreachable 來決定的,以下為 ICMP time exceeded 封包的格式:
從圖中可以看出,ICMP time exceed 封包的 type 值為 11,而 time exceeded error 又會在兩種情況下發生,分別是在傳送(trasmit,code = 0)以及封包重組(reassembly,code = 1)時。


IP Source Routing Option

這個功能剛好跟 ping 的 record route option 相反,是將 router 的 IP 清單填到封包中,讓封包可以按照清單上的路徑傳遞,有分為 strict/loose source routing,封包格式如下:

不過這功能似乎不常用,可能高階的網管有可能用到吧......以後學到高階的時候再來研究這個好了。


參考資料

[Linux Command] T 開頭

tcpdump

2009年1月10日 星期六

[TCP/IP Illustrated] Ping

簡介

ping 通常是我們用來驗證主機之間的通訊是否有連通的第一個手段。然而隨著網路技術越趨進步與複雜,光用 ping 已經不足以判斷兩台主機之間是否可以互相進行通訊了,但由於 ping 已經是一個歷史悠久的網路工具程式,因此還是很值得拿來探討一下。


ping 是如何運作的 ?

ping 的實作是使用 ICMP echo/reply 來達成的,其中發送 echo 的主機稱為 client,回應 reply 的主機稱為 server,而由於 ping 都已經實作在各 OS 的 kernel 中,因此也不必為了啟用這個功能而安裝特定的軟體或是服務。

以下是 ICMP echo/reply 的封包格式圖:
封包的欄位說明:
  • type
    echo 為 8;reply 為 0。

  • code
    echo/reply 皆為 0。

  • identifier
    此欄位儲存 ping client 的 process number,如此一來當收到 reply 後,就可以知道由哪一個 process 來處理。

  • sequence number
    紀錄 ping client 所送出的第幾個封包,從 0 開始依次遞增。


以下是從 Linux server ping 到 google 的範例:


IP Record Route Option

使用 ping 時可以透過「-R」參數將 record route 選項開啟,如此一來就可以知道封包所經過的路徑與節點,但由於目前大部分主機都關閉對此功能的支援,因此使用這個參數都不會有相關的回應。

不過雖然 ping 支援紀錄路徑的功能,但還是有最多僅能紀錄 9 組 ip 的限制(即使來回經過的相同節點都要包含),在目前網路環境下,實用性似乎不足。

不過以下還是放一下 IP record route 封包存放資料的格式:


IP Timestamp Option

這個就跟 record route option 蠻類似的,只是紀錄的是封包到達每個 hop 的 timstamp 而非 ip address,封包格式如下圖:

2009年1月9日 星期五

[Linux] 透過指令直接設定 IP、Netmask、Gateway

今天在 VirtualBox 上安裝 Ubuntu Server,但由於網路環境中沒有 DHCP,因此要進到 /etc/network/interfaces 去修改成 static;但麻煩的是,沒有安裝 vim 套件前,實在是沒辦法編輯(不曉得預設是哪種編輯器....用起來很彆扭),當然也就沒辦法修改 IP。

那........怎麼辦呢? 我要改 IP 跟 Gateway 阿!

找了一下資料,發現可以透過指令方式直接指定:(設定範例)
root> ifconfig eth0 192.168.1.1 netmask 255.255.255.0
root> route add default gw 192.168.1.254

這樣就成功啦!


參考資料