網中人  wrote in message news:8nrm0i$ogs@netnews.hinet.net...
> 
> Song  wrote in message
> news:3c4E1j$8OG@bbs.cynix.com.tw...
> >
> >     關於不同子網封包的處理,小弟又花了一些時間研究了手邊的資料,及
> >     Study_area network 的部分,有些想法要請 Netman 兄再指導。
> >
> >     因為 Router 的解析是只到 網路層,而 IP 正是在這層。所以,是否
> >     IP 的加封是每一個 Router 都要的動作?就是說,TCP 封包標頭的啟始端
> >     及目的端是真正的位置,而 IP 封包標頭的只是這一次路由的位置?
> >
> >     例如說:啟始端 IP:192.168.1.1/24 目的端 IP:192.168.2.1/24
> >     由啟始端發出時,TCP 封包標頭如上所示,而加封 IP 時,經路由判斷後,
> >     因為目的端不在同一子網中,所以 IP 封包標頭的目的端改為 Gateway IP
> >     (假設為 192.168.1.254)當此 IP 封包到達 Gateway (Router)後加以解封,
> >     再經由 Router 的路由判斷要送交到 Router 的另一介面(假設為
> 192.168.2.254),
> >     Router 再重新加封 IP ,而啟始端變為 192.168.1.254,目的端變為
> >     192.168.2.254 同時存活時間、路由器記錄也加以更新。到 Router 的
> >     另一個介面後又重複 解封、路由判斷、加封 的動作後,到達最後的目的端。
> >     (省略 Data link layer 用 ARP table 加封 SNDAP 的過程 ...)
> >
> >     實際的動作是這樣的嗎?謝謝 Netman 兄。
> 
> 不好意思﹐這兩天忙於修改 NAT 的文章和 script﹐現在才看到閣下文章。怠慢處望諒
> ﹗
> 
> 不過﹐弟對 TCP/IP 也是略懂皮毛而已。姑且就自己所知的一點淺見和閣下交流一下
> 吧。
> 
> 我始終認為學習 linux 必須具有堅實的網路理論基礎﹐而談封包路由也一樣﹐最好先
> 從 ISO 層級開始。太上層的我們不用理會了﹐ip routing 通常是指在 network 層級
> 所負責的事情。所以﹐有必要先了解一下 network 以下的底層架構是怎樣的。
> 
> 1) 實體層
> 定義了應用在網路傳輸中的各種設備規格﹐以及如何將硬體所攜載的信號轉換成電腦可
> 以理解的信號(0和1)﹐這通常都是設備上面之韌體(Firmware)的功能。這些規格一般是
> 由硬體的生產廠商制定的﹐比如﹕數據線的接腳、電壓、波長、相位、等等。 這就要
> 求我們使用相同規格的硬體來組網了﹐您不能一個網路卡用 BNC﹐另外一個用 token
> ring 就直接連線吧﹖如果玩過 RJ45 跳線的朋友﹐一定知道為什麼 1/3、2/6 要互調
> 的。沒辦法﹐硬體層就是要求這樣。
> 
> 2) 資料連接層
> 使用數據框包(frame)的概念來在電腦之間傳輸數據﹐它負責安排框包的界定﹐也同時
> 處理重複框包和框包的確認。這些規定就沒有像實體層那樣可視了。但還是一樣﹕大家
> 都要用相同的協定來溝通。其中最常見的是 IEEE2.x 標準了﹐但最常用的的則是
> ethernet IEEE802.3 (CSMA/CD )。
> 
> 該協定是如何工作的呢﹖
> 
> 很簡單﹐就是每次只能有一個節點在網路上傳遞數據給其它節點﹐其形式是通過對整個
> 網路進行廣播(broadcast)。然後其它接點收聽到廣播之後﹐就看看數據是否傳個自己
> 的﹐如果是﹐則接收下來﹔如果不是﹐則略過。每一節點都有一個自己用的48bit的地
> 址(也可以稱為Node ID﹐也就是在前面說的網卡地址了)﹐而每一個在網路中傳輸的數
> 據都是以這個地址為傳送和接收依據的。
> 
> 當任何一個節點進行廣播的時候﹐所有的其它節點都收聽得到。其情形就像我們上課一
> 樣﹐老師說﹕“第幾排第幾號同學出來拿作業﹗”雖然全班同學都聽得到﹐但卻只有一
> 位同學可以拿到。Bus形態也和這種形式很類似﹐當然具有更嚴謹的一套法則啦。在bus
> 上面的數據都是以框包(frame)形式傳遞的﹐框包送出來之後﹐會同時向bus兩端廣
> 播﹐當目的地接收到給它的框包﹐也不是據為己有的﹐而是複製一份給自己﹐而原來的
> 框包則還是會繼續被送給下一個節點﹐直到封包抵達終端電阻才會被銷毀。
> 
> 
> 任何類型的數據要在這一網路上面傳遞的話﹐都必須嚴格的遵循既定的封包格式﹕Data
> Link Layer Frame 格式﹐是給網路用來安排數據的。Ethernet的Data Link Layer
> Frame包括下面的部件﹕
> 序言(Preamble)
> 目的地地址(Destination MAC)
> 來源地址(Source MAC)
> 信息類型(Message Type)
> 數據(Data)
> 封包監測資料(Frame check sequence)
> 
> 它們的大小分別為﹕
> 8 bytes  6 bytes  6 bytes  2 bytes  46-1500 bytes  4 bytes
> 
> 每一個 frame 都不可以超過1518bytes﹐這樣就可以確保任何一個工作站都不會佔用網
> 路太久。工作站對網路廣播之前﹐都會先傾聽一下有沒其它人在使用網路﹐如果聽起來
> 很安靜﹐則它會發送廣播。但要是網路上仍然嘈嘈的呢﹖這時候工作站就需等待了。
> 
> 假如節點A和節點B相隔得太遠的話﹐當他們傾聽的時候可能都還沒聽得到對方有話要
> 說﹐就都同時把封包出去﹐這就是所謂的碰撞(collision)了。如果當一個碰撞發生
> 了﹐就會在網線產生一個頻率漣漪( frequecy ripple)。如果第一個節點監測到有這樣
> 的 ripple ﹐它就會發出一個高頻信號去清除所有其它信號。這個信號告訴所有節點碰
> 撞已經發生﹐這樣全部節點都不會再發送封包了。這時候﹐每一個節點都會隨機的等待
> 一段時間再重新進行廣播﹐總共可以進行16次嘗試大家才會最終放棄。不過其情形也不
> 會好到哪裡﹐因為在大家等待之後﹐彼此都有封包要發送﹐誰都想先發送自己的封包﹐
> 如果節點越多﹐距離越長﹐發生碰撞的機會也就越高。
> 
> 情形就象上課時您要發言﹐得先看看有沒有其它同學在發言﹐如果已經有人在說話了﹐
> 那你就先等他/她講完再舉手。要是兩個人都同時舉手﹐老師就會宣佈重新再舉手﹐這
> 時候大家可以在一秒鐘之內再舉手﹔要是還是一樣﹐那麼可以再於兩秒之內任何時段舉
> 手﹔再來就4秒、8秒、16秒....的延續下去﹐要試過16次都還一樣﹐沒辦法了﹐大家都
> 不要說好了。
> 
> 在網路上﹐我們稱這樣的方法為 CSMA/CD (Carrier-Sensing Multiple Access with
> Collision Dectection)。要注意的是﹐所有這些處理過程都必須在Ethernet 網卡上面
> 進行﹐也就是說﹐如果您要選用Ethernet形態﹐那麼你就必須全部使用Ethernet網卡。
> 
> 3)網路層
> 讓封包(packet)在不同的網路之間成功地進行傳遞。它規定了網路的定址方式﹐及處理
> 資料在不同網路之間的傳遞方式、處理子網路之間的傳遞、決定路由路徑、網路環境、
> 資料處理順序、等等工作。
> 
> 發送端電腦在封包被傳送出去之前﹐都會先為其建立header﹐作為在網路或子網間進行
> 路由的依據。網路層在辨認和處理資料的時候﹐會忽略由高層協定制定的定義﹐只負責
> 為數據在一個或多個網路間建立、維護、和終止連接。
> 
> 好了﹐到這裡我們就是看 ip 封包是如何路由的吧﹕系統會先檢查路由表﹐如果路由表
> 已經有目的地的路由(mask 全部為 32bit)﹐則直接傳給路由表所指定的下一站。否則
> 就要計算 net ID ﹐它是用 IP 和 MASK 做 AND 運算來獲得的。如果計算出目的 net
> ID 和界面 IP 地址在同一個 subnet 之內(也就是相同的 net ID)﹐那麼﹐路由表一定
> 會有這個 net ID 的敘述的﹐否則您的路由表是殘缺的(可能漏了 route add -net 吧
> ﹖)。然後封包就直接通過路由表指定的界面丟給對方。如果發現 net ID 不一樣﹐則
> 尋找路由表上是否還有其它 net ID 的路由資訊﹐如果沒有﹐則找 default gw 的路由
> 資訊﹐如發現則丟給路由表指定的 IP。注意﹕gw 的 net ID 一定是和其中一個界面一
> 至的(或說一定在同一個 subnet 內)。如果所有資訊都找不到關於目的地 IP 的路由﹐
> 則宣告失敗。
> 
> 當程式從上層協定建立好 socket﹐定好選項和埠口﹐切割好封包﹐再交到網路層的時
> 候﹐網路層再建一個封包﹐其標頭除了各項選項外﹐一定會包含發送端的 IP 地址和接
> 收端的 IP 地址﹐要注意﹐除非經過 MASQ 或其它轉址處理﹐這對地址在所有的路由過
> 程中都不會更改(frame relay 和 ATM 另議)。路由的決定不用管來源地址﹐但一定會
> 以目的地址為依據進行路由判斷(請參考剛才所述)。當發送端決定將封包交到 router
> 之後(可以肯定此封包不會在同一個 subnet 之內)﹐router 也會根據目的地址重複前
> 面講的路由判斷﹕是否有該目的地﹖是否同 subnet? 是否有該 subnet 的路由﹖是否
> 有default gw? .... 這樣一直傳遞到目的網路的 router ﹐最後的 router 其中一個
> 界面一定會和目的地址在同一個 subnet﹐然後就往那個界面送。如果傳送失敗﹐則會
> 將透過 ICMP (或其它協定﹐這裡不是很肯定)﹐告訴發送端路由不能到達。此時﹐原來
> 的來源地址﹐則變成目的地址了﹐既然可以來﹐當然也有路回去。不過﹐路徑可能未必
> 和原來的一樣﹐因為每一個 router 都會根據當時的網路情況來決定路由﹐尤其在多路
> 由通道的大型網路中。至於路由表的維護﹐恐怕超出現在這個話題了(有空再談吧)。但
> 無論如何﹐正常狀態下﹐來源和目的 IP 地址是不會變的。
> 
> 不過﹐我們回看 network 以下的兩個層級﹐它們使用的卻不是 IP 地址﹐而是 MAC
> (Media Access Control) 地址。那麼我們怎麼知道一個 IP 封包要丟給那個 MAC 呢﹖
> 此問題會發生在接收地址和界面地址(不是來源地址哦~~~﹗)在同一個 subnet 的時
> 候。這時就要借助 ARP (Address Resolution Protocol) 協定來幫忙了。
> 
> ARP在本地網路的運用﹕
> 
> 以使用TCP/IP 的 Ethernet 網路為例﹕每台電腦都有一個ARP表格(ARP Table)存放於
> ARP快取記憶區(ARP Cach)之中﹐它主要記錄著同一網路中各節點的 IP 和 MAC 地址的
> 對應。
> 
> 當機器有一個TCP/IP封包送出去的時候﹕
> 
> 1﹐會先看看目的地址是否屬於同一 subnet 裡面﹐(還記得的netmask和IP的作用嗎
> ﹖)﹔
> 2﹐如果是的話﹐則會檢查ARP 表格有沒有對方的IP和MAC對應﹔
> 3﹐如果有的話﹐就直接將封包傳到該MAC去﹔
> 4﹐如果ARP表格上面找不到對方的對應﹐則會向網路發出一個ARP Request廣播封包﹐
> 查詢對方的MAC地址﹐這個封包會包含發送端的MAC資料﹔
> 5﹐當網路上面的機器接聽到該廣播﹐看看IP欄位是否和自己的一致﹐如果不是則忽略
> ﹔
> 6﹐如果是則會先將發送端的MAC和IP資料更新到自己的ARP表格去﹔然後再回應一個ARP
> Reply封包給對方﹔
> 7﹐當發送端接到ARP Reply之後﹐也會更新自己的ARP表格﹔ 然後就可以用此紀錄進行
> 傳送了。
> 8﹐否則宣告傳送失敗。
> 
> 跨網路環境下的ARP﹕
> 
> 我們已經知道﹕如果Net ID不同的IP傳送都要經過router才可以做到。那麼當機器發現
> 封包不是傳給本地網路的時候﹐那麼它就要把封包傳給router了。記住﹕router必須有
> 一個界面和發送端在同一網路﹐這個router我們可以用DHCP來指定﹐也可以在各台機器
> 上面手工指定。如果本地網路同時還和好幾個網路連接﹐也就是說﹐有好幾個router可
> 以選擇﹐我們也必須一一在各機器上的IP環境中指定好。(可以參考 RIP 的資料)。
> 
> ARP 的跨網過程粗略如下﹕
> 
> 1﹐先檢查封包是否寄給本地網路的﹔
> 2﹐如果不是﹐將之送給router﹔
> 3﹐如果ARP表格還沒有router的記錄的話﹐利用ARP Request來進行更新﹔
> 4﹐然後router會判斷下一個router的MAC﹐再把封包傳出去﹔
> 5﹐當封包傳到目的地的router﹐router也一樣檢查ARP表格﹐或利用ARP Request找到
> 目的主機的MAC﹔
> 6﹐最後將封包傳給目的IP地址。
> 
> 當找到 MAC 地址之後﹐請回憶一下前面說的 Data Link Layer Frame 和 CSMA/CD ﹐
> 就知道資料如何送到目的地了。
> 
> 這個﹐就是一個封包的整個路由過程了。您看﹐封包的 IP 地址﹐並非是 router 改寫
> 的(除非您用 NAT)﹐準確來說是程式在建立 socket 時確定的。而每一個 socket 必須
> 包括 IP 地址和 port ﹐port 供傳送層(TCP)使用﹐而 IP 地址則供網路層(IP)使用﹐
> 合起來就是 TCP/IP 了。
> 
> 再多說一點 :)
> 
> 當您在 browser 上面打一個 URL ﹐其實就是為了獲得最基本的 socket 元素了﹕IP
> 和 port 。 URL 的地址可以通過 hosts 或 DNS 來查得﹐而 port﹐除非另外指定﹐那
> 個URL 最前面的 http: 或 ftp: 就是了。
> 
> 好了﹐DNS 的設定又是另外一個大題目﹐已經和目前討論無關。但設定過 linux 的朋
> 友﹐都不會忘了在 /etc/resolv.conf 上面打 nameserver 的 IP 。 溫習過前面的說
> 明﹐您會明白到為什麼 DNS 可以隨便在 internet 找一個了吧﹕因為路由是通的﹗
> 
> 以上的資料﹐大部份可以在 study-area 找得到。如有錯漏﹐懇請指正。謝謝﹗
> 
> --
> ======= http://go.to/study-area =======
> 飛雪迎春到﹐風雨送春歸
> 已是寒崖百丈冰﹐尤有花枝俏
> 俏也不爭春﹐只把春來報
> 待得山花爛漫時﹐他在叢中笑﹗
> 
> 


==============================================================================


網中人  wrote in message news:8ov0r0$jb7@netnews.hinet.net...
> 
> 雪龍~  wrote in message
> news:3cGeLg$5iV@bbs.cynix.com.tw...
> > ※ 引述《netmanforever@yahoo.com (網中人)》之銘言:
> > > 小州  wrote in message
> > > news:3cG1US$5W6@bbs.cynix.com.tw...
> > > >   有這種規定嗎?分別是 192.168.1.1 與 192.168.1.2 並沒有相衝突的地方。
> > > 弟以為這是原理而非規定的問題。
> > > 因為當一個封包被接收進來之後(來自 loopback device 的也一樣)﹐首先要做的是檢
> > > 查 route table 進行和目的地地址的比對。不過 route table 的特性之一是 first
> > > match 的﹐也就是當找到第一筆符合條件的紀錄﹐就不再往下找了。換句話說﹐如果兩
> > > 張卡都在同一個 subnet 之內﹐那就會有兩筆關於同一個 subnet 的紀錄存在﹐這時候
> > > 要看第一個句子指定的是哪一個界面了。如果不是手工去修改﹐通常會是第一張﹐所以
> > > 他會以為第二張不工作了。
> >
> >     應該不能說是找到第一筆符合的紀錄就不再往下找, 就我所知道的好像是
> >     最詳細的那一筆記錄喔. 比如說呢 192.168.1.10 的這個 ip 的位址可以
> >     說是屬於 192.0.0.0 這個網路, 也可以是說屬於 192.168.0.0 的這個網
> >     路, 當然也屬於 192.168.1.0 的網路, 端看你是用那一個等級的網路去看
> >     待 192.168.1.10 的這個 ip , 就這個部分來說只要是對 TCP/IP 網路有
> >     基本概念的人應該知道. 只不過在 route table 會針對所設定或是學習到
> >     的路由資訊按照 Net IP 與 Mask 的狀況先做好排列, 所以會如你所說的找
> >     到的第一筆, 就是為了增進網路效率. 不知道我這樣的說明有沒有錯誤的地
> >     方, 真有的話要告訴我喔..... ^_^
> >
> 
> 多謝指教﹗
> 
> 不過我覺得在同一個 router 上面(我想的目前討論都只講同一個 linux router 吧
> ﹖)﹐很少有人同時用 8bit、16bit、24bit (以及其它變動遮罩)同時描述一段
> 192.168.1.x 的網路吧﹖
> 
> 就算有這樣的情形﹐讓我們敲 route -n 看看﹐所有 route add -host 的記錄會被排
> 在前面(用 32bit mask 顯示)﹐然後到 route add -net 的記錄(也是依 mask 的 bit
> 數大小排列)﹐最後是 route add default 的記錄(也可以多個﹐不過卻是越遲寫的越
> 前面﹐請留意這個現象)。
> 
> 好了﹐如果您有一張網路界面使用 192.168.1.17 ﹐不指定 mask 的話﹐將會使用預設
> 的 24bit (自然遮罩值)﹐否則按指定的寫入。這裡我們假設用預設好了。您或許會下
> 這樣的命令來完成這張界面的設定(不同的系統或許不同)﹕
> ifconfig eth1 192.168.1.17 up
> route add -host 192.168.1.17 dev eth1
> route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
> #註﹕route add -net 的 netmask 不能省﹐因為正如閣下所指出﹐不同等 mask 會指
> 定不同的 network﹐不過用 redhat 的 ifconfig 或許已經幫您設定好 route
> add -net 了。
> 
> 然後輸入 ifconfig 您會看到 eth1 會使用預設的 24bit mask。請留意﹕這非常重
> 要﹐因為這會求出界面所在的 net_ID (用 AND 的邏輯運算)。
> 再輸入 route -n 您會發現 192.168.1.17 這筆記錄是用 32bit 的 mask﹐會和其它
> 32bit mask 的記錄排在前端。同時您還會發現 192.168.1.0 這個 24 bit mask 的網
> 路之 device 會使用 eth1 。
> 
> 好了﹐到這裡我們就可以進一步嘗試閣下所假設的環境﹐我們分別用 8bit 和 16bit
> 來增加 network 的記錄﹕
> route add -net 192.168.0.0 netmask 255.255.0.0 dev eth0
> route add -net 192.0.0.0 netmask 255.0.0.0 dev eth2
> #注﹕我先故意使用 eth0 和 eth2 來設定這兩個 network﹐以確定路由不會經過
> 192.168.1.17 所在的 eth1 界面。
> 
> 這時候的路由依據是什麼呢﹖(嗯~~﹐詳細的我不想重複了﹐有興趣可以參考前不久和
> song 兄討論的文章﹐是關於 NAT 的)
> 假如我有一筆路由要傳遞給 192.168.1.18 ﹐會先檢查有沒有關於它的 32bit 的路由
> 記錄﹐沒有﹐那看看有沒有 netmask 指定﹖
> 這裡又帶出兩個情形﹕
> 1﹐沒有 mask﹐那好﹐套用自然遮罩會使用 24bit﹐然後求出 net_ID﹐發現是
> 192.168.1.0 這個 network ﹐剛好路由表有關於這個 network 的記錄﹐界面為
> eth1﹐那麼將封包交由 eth1 傳遞。(之後的動作這裡不再討論了﹐請參考 arp 協定)
> 2﹐假如有 mask﹐那好﹐看 mask 的值﹐這裡假設用 16bit 吧﹐然後求出的 net_ID
> 是 192.168.0.0 ﹐再於路由表中發現這個 network 記錄﹐它的界面是 eth0﹐那麼將
> 封包交由 eth0 傳送。(假如 netmask 是 8 bit 也則會交由 eth2)
> 
> 看這樣的過程﹐應該不會困擾吧﹖那就讓我們搞亂一下吧﹐再下這樣的命令﹕
> route add -net 192.168.0.0 netmask 255.255.0.0 dev eth1
> route add -net 192.0.0.0 netmask 255.0.0.0 dev eth1
> 
> 哈﹐我們會同時有兩筆記錄分別是關於 192.168.0.0 和 192.0.0.0 的。這或許已經符
> 合這個討論的要求了吧﹖
> 這時﹐您就會發現越晚加入的設定會越排在前面。這也就是弟所指出的 first match
> 原則了。
> 
> 而其後的測試(別忘了路由要雙向同時設定才有用哦)﹐還是交由您自己玩了。例如﹐您
> 確定 192.168.1.18 是經由 eth2 傳到 192.0.0.0 這個網路的﹐可以下這樣的命令﹕
> route add -host 192.168.1.18 dev eth2
> #註﹕如果還要經過另外一台 gateway﹐則要指定 gw 參數。
> (這就是弟在前面文章中所說的靜態記錄了﹐應該是可行的﹐因為無需再往下比對了。)
> 
> p.s. 閣下所給出的例子﹐其實並沒運用到 first match 原則﹐因為在 route table
> 並沒有相同的記錄。(可用 route -n |awk '{print $1}' 來看看)
> 
> --
> ======= http://go.to/study-area =======
> 飛雪迎春到﹐風雨送春歸
> 已是寒崖百丈冰﹐尤有花枝俏
> 俏也不爭春﹐只把春來報
> 待得山花爛漫時﹐他在叢中笑﹗
> 
>