2009/03/31

Layer 2 Switch...

寫了一大堆的Layer 2 Switch的功能
卻沒有做較完整的概論
希望能在這篇有個大致的輪廓...

首先要介紹的是
為什麼要用Switch而不用hub?
這就要提到Ethernet Network的原罪了
因為Ethernet是採用CSMA/CD的方式傳輸
在網路設備要傳輸前會偵測網路的使用狀況(碰撞偵測)
如果有別的設備在傳輸
則會等一段時間在試著傳輸
若太多的網路設備都在同一個網路上面的話
就會常常要等待
這樣的一個網路區域通常稱為"碰撞領域"(collision domain)
hub只會將碰撞領域變大
而switch可以切割碰撞領域
所以用switch可以增加網路使用的效能

如果要增加Ethernet的頻寬使用率
必須要減少一些不需要的封包在網路上傳送
以下將功能大致分為三類
減少網路流量、增加網路頻寬、安全與偵錯

● 減少網路流量
首先要介紹switch最主要的功能
802.1d (bridge behavior)
主要是介紹如何自動學習MAC以及轉送frame
在這邊可以參考MAC Table以及Static MAC forwarding
並且透過port security來設定MAC forwarding的作法
也可以透過filtering的功能來限制traffic的數量
除了這點之外還要避免"迴圈"的發生
迴圈會導致broadcast strom(廣播風暴)
在這邊可以參考RSTP
但是RSTP只能有一隻tree於是有了MRSTP(這不是在standard裡面)
而且RSTP無法解決不同VLAN可以有不同tree的問題
於是有了MSTP(802.1s)
而且為了避免edge端的loop產生
於是有了Loop Guard的功能

為了減少一些不必要的資料在網路上傳送
於是產生了VLAN(802.1q)的概念
並且衍伸了
Protocol based VLAN (根據protocol來切VLAN)
Port based VLAN (根據對應的port來區分traffic)
Subnet based VLAN (根據IP range來切VLAN)


● 增加網路頻寬
如果頻寬不夠的話
在802.3ad定義了link Aggregation
就是可以將多個實體的port綁成一個邏輯上的port
那個port有更高速的頻寬跟容錯的機制

而在802.1p則是定義了Ethernet的priority以及Multicats的運作
在priority的部份可以參考Queue Method
在Multicast的部份可以參考GARP以及Static Multicast Forwarding

在802.3x也定義了flow control的部份
可以參考broadcast strom control以及bandwidth control


● 安全與偵錯
在switch的認證與安全的部份定義了802.1x
可以參考AAAPort Authentication

在tunneling(VPN)的部分有802.1ad (Q-in-Q)
可以參考Layer 2 Protocol TunnelingVLAN StackingVLAN Mapping

之前最為大家所詬病的Fault Management
也在最近有了802.1ag CFM
Mirroring真的不知道要放在哪裡
就先在這邊借放一下啦...

2009/03/25

Static Multicast Forwarding...

就是手動設定要將Multicast MAC的frame
送到某個VLAN的某些port

IGMP Snooping與Static Multicast Forwarding的關係
有點類似MAC Table裡面的
Address Learning跟Static MAC Forwarding的關係
IGMP Snooping會自動學習
並且把對應的Multicast Packet送到適合的port
而Static Multicast Forwarding就是
手動指定Multicast Packet送到指定的port

這邊有個比較特殊的地方要做說明的
那就是關於Multicast MAC Address
在Layer 3的Multicast IP為Class D
224.0.0.0 ~ 239.255.255.255
而在Layer 2的Multicast MAC
必須為01:00:5E開頭的(這六碼通常稱為OUI)
所以Multicast MAC Address的範圍為
01:00:5E:00:00:00 ~ 01:00:5E:7F:FF:FF

如果眼尖的人會發現
為什麼不是
01:00:5E:00:00:00 ~ 01:00:5E:FF:FF:FF
因為這好像是standard定義的
如果要將Multicast IP轉為Multicast MAC
就只能針對後面的23個bits進行轉換
下面做個簡單的範例

如果想將224.10.0.1轉成Multicast MAC的話
先轉成2進位11100000.00001010.00000000.00000001
再針對最後面23個bit進行轉換
0001010.00000000.00000001 = 0a:00:01
在將前面帶入01:00:5E
所以224.10.0.1的Multicast就會成為01:00:5E:0a:00:01
因為只有針對後面的23個bit進行轉換
所以以下的Multicast IP都會被轉成01:00:5E:0a:00:01
224.10.0.1、224.138.0.1
225.10.0.1、225.138.0.1
226.10.0.1、226.138.0.1
227.10.0.1、227.138.0.1
228.10.0.1、228.138.0.1
229.10.0.1、229.138.0.1
230.10.0.1、230.138.0.1
231.10.0.1、231.138.0.1
232.10.0.1、232.138.0.1
233.10.0.1、233.138.0.1
234.10.0.1、234.138.0.1
235.10.0.1、235.138.0.1
236.10.0.1、236.138.0.1
237.10.0.1、237.138.0.1
238.10.0.1、238.138.0.1
239.10.0.1、239.138.0.1
一共32個Multicast IP會轉成相同的Multicast MAC

PS: 至於為什麼是23個bit,請參考此篇

2009/03/24

Multicast...(IGMP)

在IP packet的傳送方式中
主要分為兩類:unicast以及broadcast
unicast就是 一送一收
broadcast就是 一送全收
而multicast就是 一送群組收
以上翻的很爛...但是就差不多意思啦

在提到了Multicast時
必須要提到IGMP (Internet Group Management Protocol)
主要是用來定義如何在Layer 3建立multicast group
這個protocol不是用來傳送資料用的
專門用來建立multicast群組

之前學過網路的人一定知道
D class(224.0.0.0 ~ 239.255.255.255)是用來做multicast group
所以說如果
A的PC(IP為172.23.23.1)加入multicast group 224.0.0.1
B的PC(IP為172.23.123.1)加入multicast group 224.0.0.1
C的PC(IP為172.23.23.2)加入multicast group 224.0.0.2
而A的PC在做multicast只會傳給B的PC
特地將IP寫出來的意思是說IP是電腦的地址
而multicast group的address是群組的名稱
有點類似A以及B的PC都加入天道盟
而C加入竹聯幫的意思

IGMP Filter Profile指的是說
Switch可以收到哪些的multicast的group
如果設定IGMP Filter Profile (224.0.0.0 ~ 225.0.0.0)
那233.0.0.1的multicast的packet就會被這台switch捨棄掉

在來提一下IGMP Snooping
Snooping就是刺探的意思
但我覺得在這邊翻譯成"偷偷學"比較好

比方說port 3送了一個Join multicast 224.0.0.1的封包到switch
switch就偷偷地學起來
等到從port 5收到multicast 224.0.0.1的封包時
就知道只要傳給port 3就好了
不用傳給別的port
透過IGMP snooping就不需要手動設定了
而且也不會送到其他不屬於這個multicast group的port
減少封包傳遞的數量

而且每個VLAN都可以有自己的multicast group
所以IGMP snooping最多可以support到16個VLAN
所以VLAN 100有multicast group 224.0.0.100
VLAN 200也可以有multicast group 224.0.0.100
IGMP snooping有分為兩種mode
● auto
自動從任何vlan學multicast group
直到學滿16個VLAN就不再學了
● fixed
只會由手動建的vlan學multicast group

每台Device需要設定
● IGMP Snooping
用來決定是否要開啟IGMP snooping的功能
● Querier
讓這台switch可以送querier的封包給對應的port
● Host Timeout
多久沒有收到report message
就將此port從某個multicast group移除
● 802.1p Priority
出去的IGMP control packet要轉貼成什麼樣的priority
● Unknown Multicast Frame
如果收到未知的multicast frame要採取什麼樣的作法
可以選擇Drop或Flooding
● Reserved Mulitcast Group
224.0.0.0 ~ 224.0.0.255是用來保留給
local network使用的multicast group
如果收到這個domain的frame要採取什麼樣的作法
可以選擇Drop或Flooding

每個Port需要設定
● Immed. Leave
當一收到leave message的封包時
馬上將這個port從那個multicast group移除
● Normal Leave
在某一個port要離開某個multicast group時,會送出一個leave的msg
switch收到之後會送出一個query的msg,然後等依段時間
如是有收到join的msg則會繼續送資料
若沒有收到則從switch中刪掉
● Fast Leave

● Group Limited & Max Group number
限制這個port最多可以加入幾個multicast group
如果超過的multicast group的數量
就由Throttling來決定處裡的方式
● Throttling
如果超過某個port最多的multicast group的數量
可以選擇捨棄掉新的multicast group (deny)
或是將舊的multicast group給取代掉 (replace)
● IGMP Filtering Profile
選擇這個port的可以允許的multicast group
如果multicast group不屬於IGMP Filtering Profile
就不會進到此port
● IGMP Querier Mode
當此port收到query message的作法
選擇Auto時
如果一收到query message就會成為query port
選擇Fixed時
不管如何都會成為query port
選擇Edge時
不管如何都不會成為query port

PS:目前IGMP的版本到v3
IGMP-v1:只有query和report的封包,要等到timeout才會leave
IGMP-v2:加入了leave的封包
IGMP-v3:加入了source filter的功能,host端可以決定要收到來自哪些source來的IGMP封包

2009/03/23

GARP...

Generic Attribute Registration Protocol(GARP)
簡單來說
就是在網路上用來自動註冊或撤銷某些attribute
並將這些attribute傳送到整個網路
而attribute有VID或Multicast Group
使用VID當attribute的protocol就是GVRP
使用Multicast Group當attribute的protocol就是GMRP

GARP有三種不同的Message
● Join:用來註冊attribute (設備主動送出)
● Leave:用來註銷attribute (設備主動送出)
● Leave All:在固定時間註銷所有的attribute (Switch在固定時間註銷)

GARP也要設定三種不同的Timer
● Join Timer
實際上Join Message會送兩次
若第一次送出之後沒有回應
會再等Join Timer的時間之後
再送出第二次
● Leave Timer
在收到Leave Message之後
Switch會等待Leaver Timer的時間
若在這中間有收到Join Message
則會保留此attribute
若沒有收到Join Message
則再將此attribute刪除
● Leave All Timer
當GARP啟動之後
Leave All Timer就會開始倒數
在timer結束之後
會送Leave All Message給其他Device
所有的Device要重新註冊

PS:GARP不會單獨存在,一定要有GVRP或GMRP

2009/03/10

Makefile...

在介紹Makefile之前
先了解一下什麼是make
make是自動化轉換文件格式的工具
並且會檢查文件之間的相依性
只會針對有修改的檔案進行編譯
通常是用來轉換原始碼(*.C)成執行檔(*.exe)
而文件之間的相依性
就是定義在makefile中

makfile基本的結構
target: dependencies
Commands
以下分別說明
● target
所要建立的檔案
必須要以:結尾
在make時發現target建立的時間比dependecies新
就不會再重新建立target

基本上make時會先參考all的target
並根據它的dependencies決定要建哪些項目
若沒有all則會採用第一個target

若target並不是要建立檔案
例如
clean:
rm*.o
就要在前面宣告".PHONY: clean"
這樣make就會知道這不是用來建立檔案的
如果不加.PHONY
在目錄中有clean的file則clean就會被視為要建立
而clean卻沒有dependencies的項目
所以就永遠不會執行

● dependencies
相依的項目
make會跟據這些項目決定市府要重新建立target
在建立target之前必須要檢查的項目
若是traget建立的時間比dependencies早
則會重新建立target
若在dependencies中有其他的target
則會先檢查那個target的dependencies

● Commands
要建立target的指令
必須要以開頭
因為在makefile中
開頭都會當作Shell Script
每條Commands必須寫在同一行
每條Command會啟動新的Shell
若有錯誤就會中斷make
有些在Commands的特殊字元
&&:檢查某個指令是否執行成功,在執行下個指令
@:不要顯示執行的指令
-:即使執行錯誤也不會中斷

以下來的簡單的範例
main:main.o test1.o
gcc -o main main.o test1.o
在上述的範例中
要建立main的執行檔
在建立之前要先檢查main.o以及test1.o有沒有比main更新
如果沒有make會先將main.o與test1.o建立好
在去執行gcc -o main main.o test1.o去產生main的執行檔

其他的語法
◎ 註解
# 開頭則為註解啦

◎ 變數宣告
=
將變數給定成為某值
可以用&(變數名)或${變數名}來取出值
若要將變數清空
變數名=

:=
將全部變數展開後再給值
所以不會是最後的值
請參考下例
X = abc
Y = $(X) def
X = def
最後Y為def def
X := abc
Y := $(X) def
X := def
最後Y為abc def

?=
若變數未指定則給值
若已經指定了就採用原來的值

+=
將值給到現有變數的後面

◎ 內部變數
$?
代表已被更新的dependencies的值
也就是dependencies中比target還要新的值

$@
代表target的值

$<
代表第一個dependencies的值

$*
代表target所指定的檔案 不包含副檔名


PS1:gcc & make的不同
gcc是用來編譯與連結程式
並產生出執行檔
make是用來檢查文件之中的相依性
根據相依性以及外部程式來產生出target
所以make可以簡化gcc的執行過程
將gcc寫在makefile的Commands裡面
就可以快速的產生執行檔
並利用相依性可以避免不需要的編譯過程
PS2:configure & make的不同
configure是用來偵測作業環境
在偵測完畢之後會建立makefile
而configure所用的檔名為configure或config

2009/03/05

財務報表之間的關係...

之前有介紹過財務報表的內容
基本上是由四大報表所組成
資產負債表:某一個時間點公司的資產、負債、股東權益的狀況
損益表:一段時間內(一年或一季)公司的收入與支出以及最後所賺到的錢
現金流量表:一段時間內(一年或一季)公司的現金增減的狀況
● 股東權益表:一段時間內(一年或一季)盈餘分配的狀況

以下是各財務報表的關係

主要是由資產負債表以及損益表構成
每年所賺得錢從損益表的稅後淨利
分別流到資產負債表的現金以及保留盈餘
但是實際上沒有這麼單純
所以可以透過現金流量表知道現金實際細節
也可以從股東權益中知道
盈餘是如何處理

以下由一個簡單的範例來說明
財務報表之間的關係

如果阿垓決定拿出100萬出來創業
在創業那天的資產負債表如下

股本100萬以及現金100萬
之後決定再跟銀行借100萬
去買機器花了90萬
買廠房花了100萬

在成立公司那天的資產負債表如下

在資產的部份
現金10萬,機器90萬,廠房100萬
負債跟銀行借的100萬
股本是自己出的100萬

過了一年之後
公司一共收了100萬
扣除產品的成本(50萬)、人事成本(20萬)、稅(10萬)
淨賺了20萬
這一年的損益表如下


這筆20萬並沒有立即進入到資產負債表
因為阿垓決定花10萬再買新的設備
發給辛苦的員工5萬元紅包
順便拿去還給銀行5萬
加上上期的現金
一共還有20萬元

由於設備折舊的部份在損益表的成本已經扣掉了
但是沒有實際的現金支出
所以其實有10萬在損益表多扣的

所以在資產負債表如下

現金20萬從現金流量表過來
機器折舊扣10萬再加10買新備
所以機器還是90萬
廠房假設沒折舊不變
負債還了5萬變成95萬
股本不變
保留盈餘因為花了5萬員工分紅
所以從20萬變成15萬

PS:關於除權除息對公司的影響
可以參考這篇

AAA...

AAA是三個英文的縮寫
● Authentication(認證)
確認User是否可以存取Switch
● Authorization(授權)
User可以使用哪些的功能
● Accounting(紀錄)
User用過哪些功能的紀錄


如果有一台Server提供上述的功能
就可以稱為AAA Server
目前Switch所support的AAA Server有
● RADUIS (Remote Authentication Dial-In User Service)
用UDP的Protocol
只會對密碼的部份做加密
其他的資料都不會加密
● TACACS+ (Terminal Access Controller Access Control System Plus)
用TCP的Protocol
所有傳輸的資訊都會做加密的動作

RADIUS以及TACACS+都需要設定以下的資訊
● Mode
有兩種Mode:index-priority & round-robin
index-priority是如果發現第一台Server掛了
再用第二台Server做認證
round-robin是輪流使用第一台以及第二台Server
● Timeout
等待Server回應的時間
若選擇index-priority的模式
則每台Server各分到一半的時間
● Server IP
RADIUS以及TACACS+ Server的IP Address
● UDP/TCP Port
在Authentication的部份
RADIUS Server用UDP Port 1812
TACACS+ Server用TCP Port 49
在Accounting的部份
RADIUS server用UDP Port 1813
TACACS+ Server用TCP Port 49
● Shared Serect
存在Switch上面的密碼
並不會傳出網路
所以要跟遠端AAA Server相同
才可以進行認證

2009/03/04

Port Authentication...

利用RADIUS(Remote Authentication Dial In User Service) Server
來認證合法的使用者
如果User通過RADIUS的認證
就可以透過此Port來存取網路
若沒有通過認證
這台電腦就無法存取網路

Port Authentication分為兩種的作法
● IEEE 802.1x Authentication
就是採用user name以及password來進行認證
以下是認證的流程

每個Port都可以設定使否要重新認證
以及多久重新認證一次

● MAC Authentication
用連上電腦的MAC以及switch所給定的password做認證
認證流程如下

每台Switch都需要設定一組Password
跟著MAC一起送過去給RADIUS Server
每台Switch也可以設定Name Prefix
帶在MAC的後面
比方說
MAC是00:19:CB:12:34:56
Name Prefix是123
則送到RADIUS的MAC就是0019CB123456123
還有一個timeout要設定
如果有一台PC的MAC authentication失敗
在Switch的MAC Table中就會被視為無法存取網路
timeout是指在多久會從MAC Table將這筆清掉
如果設定timout = 0的話
這筆MAC就永遠無法存取網路了

PS:關於設定RADIUS的部份
請參考AAA(還沒寫...)

2009/03/03

Port Security...

Port Security只能允許
透過動態學到MAC以及User手動設定的MAC的frame
可以經由那個port進出
簡單來說
就是如果MAC Table有這筆MAC
才會送到對應的Port
如果沒有就不會送出了

每個Port都可以設定是否開啟Port Security的功能
並且決定要不要有Address Learning的功能
基本上預設是會將此功能打開的
也可以設定每個Port所能學到的MAC數量

除了上述的功能
在Port Security裡面
有一個MAC Freeze的功能
這項功能是將某個Port的學到的MAC
轉成Static MAC Forwarding的資料
再將Address learning的功能關掉

PS:
最高等級的Port Security是將Port security打開
並且關掉Address Learning
然後要通過這個Port的frame
只能用手動的設定
PS2:
如果同時關掉Port Security以及Address Learning
會造成大量的廣播封包

2009/03/02

MAC Table...

這個table是Switch在轉送frame參考的表
記錄著某個MAC
從哪個VLAN、Port學到的
並且是Dynamic(Switch自動學到)
或是Static(User從Static MAC Forwarding設定)

MAC Table的運作方式下:
1.當收到一個frame時
Switch會將這個frame的source MAC
記錄到MAC Table中

2.接著將看這個frame的destination MAC
看看是否有在MAC Table中出現
A.如果在MAC Table中出現
則Switch會將這個frame從那個Port送出去
B.如果沒有在MAC Table中出現
則Switch會將這個frame送到所有的Port
C.如果在MAC Table中出現
但是在跟進來同一個port時
則Switch會將這個frame丟掉