㈠ 路由器轉發數據包的工作原理
路由器轉發數據包的工作原理
路由器有很多介面(也就是數據出入的埠),每個介面都有不同網路的IP地址,連接著不同的網路。當一個介面收到一個數據報文後,根據報文頭信息,目標地址和原地址,查找路由表,按路由規則,轉發到相應的介面上,把數據轉發出去。
另外還有ACL,TCP/UDP等轉發控制規則,對數據進行是否轉發的控制。
㈡ 這數據包怎麼發送,想學數據傳送的原理,能教我一下嗎,謝謝!!
比如我們要打開一個網頁,過程是,先發一個請求到伺服器(HTTP請求),伺服器會將你要請求的網頁文件發回來給你,你就能看到網頁信息了。
我給你說一下請求發過去的過程(伺服器把網頁發回來給你的過程是一樣的)。
你在計算機打開瀏覽器以後,計算機會給瀏覽器分配一個埠號,並在應用層生成HTTP請求,要發往伺服器的80埠,這個請求一層一層往下,到傳輸層的時候,被封裝為「數據段」;再往下傳,到網路層的時候被封裝為「IP數據包」,再往下傳,到數據鏈路層的時候被封裝為「幀」,這個幀再往下傳,到物理層的時候,被轉換為電信號。
電信號從物理層發出,到交換機的物理層,交換機的物理層將電信號轉換為幀(接收方做的是一個跟發送方相反的過程),交換機拿到幀以後,讀懂上面的MAC地址,拿到MAC地址以後,去對照MAC地址映射表,決定要從哪一個埠轉發出去以後,將幀發給物理層,物理層再將幀轉換為電信號,然後發出。
到路由器的物理層接收到交換機發過來的電信號以後將其轉換為幀,路由器的物理層將這個幀發給路由器的數據鏈路層,數據鏈路層將幀拆開,得到IP數據包,並將這個幀發給網路層;路由器的網路層拿到IP數據包以後,讀出包上的目的IP地址,然後去對照路由表,決定要把這個包從哪個埠轉發出去。決定以後,網路層把這個包往下發,到數據鏈路層,數據鏈路層把IP包封裝為新的幀,再往下發給物理層,物理層再把幀轉換為電信號,發給伺服器。
伺服器的物理層接收到電信號以後,將電信號轉換為幀發給數據鏈路層;數據鏈路層將幀拆開,得到IP數據包以後,發給網路層;網路層得到IP數據包以後,將包拆開,得到數據段,並繼續往上傳,給傳輸層;傳輸層得到數據段以後,將數據段拆開,就得到當初客戶機生成的原本的HTTP請求,這個請求一直往上發,到應用層,工作在應用層的網站服務就得到了這個請求,並作出響應。
響應的方式就是將你請求的網頁發回來給你,過曾是一樣的。
要理解這個過程,最好能先理解一下網路模型的概念。
希望對你有幫助。
㈢ 路由器使用轉發信息庫和臨接表時用於作出交換決策所採用的數據包轉發方法是什麼
交換機(Switch)是一種基於MAC(網卡的硬體地址)識別,能完成封裝轉發數據包功能的網路設備。交換機可以「學習」MAC地址,並把其存放在內部地址表中,通過在數據幀的始發者和目標接收者之間建立臨時的交換路徑,使數據幀直接由源地址到達目的地址。交換機分為:二層交換機,三層交換機或是更高層的交換機。三層交換機同樣可以有路由的功能,而且比低端路由器的轉發速率更快。它的主要特點是:一次路由,多次轉發。
路由器(Router)亦稱選徑器,是在網路層實現互連的設備。它比網橋更加復雜,也具有更大的靈活性。路由器有更強的異種網互連能力,連接對象包括區域網和廣域網。過去路由器多用於廣域網,由於路由器性能有了很大提高,價格下降到與網橋接近,因此在區域網互連中也越來越多地使用路由器。路由器是一種連接多個網路或網段的網路設備,它能將不同網路或網段之間的數據信息進行「翻譯」,以使它們能夠相互「讀」懂對方的數據,從而構成一個更大的網路。路由器有兩大典型功能,即數據通道功能和控制功能。數據通道功能包括轉發決定、背板轉發以及輸出鏈路調度等,一般由特定的硬體來完成;控制功能一般用軟體來實現,包括與相鄰路由器之間的信息交換、系統配置、系統管理等。
就路由器與交換機來說,主要區別體現在以下幾個方面:
(1)工作層次不同
最初的的交換機是工作在OSI/RM開放體系結構的數據鏈路層,也就是第二層,而路由器一開始就設計工作在OSI模型的網路層。由於交換機工作在OSI的第二層(數據鏈路層),所以它的工作原理比較簡單,而路由器工作在OSI的第三層(網路層),可以得到更多的協議信息,路由器可以做出更加智能的轉發決策。
(2)數據轉發所依據的對象不同
交換機是利用物理地址或者說MAC地址來確定轉發數據的目的地址。而路由器則是利用不同網路的ID號(即IP地址)來確定數據轉發的地址。IP地址是在軟體中實現的,描述的是設備所在的網路,有時這些第三層的地址也稱為協議地址或者網路地址。MAC地址通常是硬體自帶的,由網卡生產商來分配的,而且已經固化到了網卡中去,一般來說是不可更改的。而IP地址則通常由網路管理員或系統自動分配。
(3)傳統的交換機只能分割沖突域,不能分割廣播域;而路由器可以分割廣播域
由交換機連接的網段仍屬於同一個廣播域,廣播數據包會在交換機連接的所有網段上傳播,在某些情況下會導致通信擁擠和安全漏洞。連接到路由器上的網段會被分配成不同的廣播域,廣播數據不會穿過路由器。雖然第三層以上交換機具有VLAN功能,也可以分割廣播域,但是各子廣播域之間是不能通信交流的,它們之間的交流仍然需要路由器。
(4)路由器提供了防火牆的服務
路由器僅僅轉發特定地址的數據包,不傳送不支持路由協議的數據包傳送和未知目標網路數據包的傳送,從而可以防止廣播風暴。
交換機一般用於LAN-LAN的連接,交換機歸於網橋,是數據鏈路層的設備,有些交換機也可實現第三層的交換。路由器用於WAN-WAN之間的連接,可以解決異性網路之間轉發分組,作用於網路層。他們只是從一條線路上接受輸入分組,然後向另一條線路轉發。這兩條線路可能分屬於不同的網路,並採用不同協議。相比較而言,路由器的功能較交換機要強大,但速度相對也慢,價格昂貴,第三層交換機既有交換機線速轉發報文能力,又有路由器良好的控制功能,因此得以廣泛應用。
(5)總之,可以這么認為,交換機在具體的城域網中往往扮演著VLAN透傳的角色,就是橋。而路由器默認的是不支持二層的,路由器的每一個埠都是一個獨立的廣播域和沖突域,而交換機是只有一個廣播域和埠數量的沖突域,在二層交換機上存在MAC表,三層交換機上存在路由表.MAC.ARP表,在路由器上存在路由表和arp表。比如當一個路由器上有一個2層的vlan100和另外一個路由器上的3層vlan100對接的時候,是不通的,這時候我們需要藉助L2VPN技術來進行互通,比較流行的就是VPLS技術。
㈣ 如何攔截並修改網路數據包
攔截並修改網路數據包方法有:
1、用網路安全開發包,類似winpcap之類的吧,但有一個問題,如果程序寫好,在主機上不安裝winpcap環境,程序能不能正常工作?是不是主機也必須安裝相應的開發包。如果要實現數據包攔截修改轉發功能,用什麼開發包好?至少winpcap是不能實現的;
2、實在不行只能用防火牆攔截機制和raw socket 之類的編寫了;
3、從NDIS驅動下手,做一個驅動,攔截到數據包進行修改轉發功能。
㈤ socket編程。怎麼實現數據包的轉發C語言版的。
我也不知道····只好復制一份···共同學習~~ 要寫網路程序就必須用Socket,這是程序員都知道的。而且,面試的時候,我們也會問對方會不會Socket編程?一般來說,很多人都會說,Socket編程基本就是listen,accept以及send,write等幾個基本的操作。是的,就跟常見的文件操作一樣,只要寫過就一定知道。對於網路編程,我們也言必稱TCP/IP,似乎其它網路協議已經不存在了。對於TCP/IP,我們還知道TCP和UDP,前者可以保證數據的正確和可靠性,後者則允許數據丟失。最後,我們還知道,在建立連接前,必須知道對方的IP地址和埠號。除此,普通的程序員就不會知道太多了,很多時候這些知識已經夠用了。最多,寫服務程序的時候,會使用多線程來處理並發訪問。我們還知道如下幾個事實:1。一個指定的埠號不能被多個程序共用。比如,如果IIS佔用了80埠,那麼Apache就不能也用80埠了。2。很多防火牆只允許特定目標埠的數據包通過。3。服務程序在listen某個埠並accept某個連接請求後,會生成一個新的socket來對該請求進行處理。於是,一個困惑了我很久的問題就產生了。如果一個socket創建後並與80埠綁定後,是否就意味著該socket佔用了80埠呢?如果是這樣的,那麼當其accept一個請求後,生成的新的socket到底使用的是什麼埠呢(我一直以為系統會默認給其分配一個空閑的埠號)?如果是一個空閑的埠,那一定不是80埠了,於是以後的TCP數據包的目標埠就不是80了--防火牆一定會組織其通過的!實際上,我們可以看到,防火牆並沒有阻止這樣的連接,而且這是最常見的連接請求和處理方式。我的不解就是,為什麼防火牆沒有阻止這樣的連接?它是如何判定那條連接是因為connet80埠而生成的?是不是TCP數據包里有什麼特別的標志?或者防火牆記住了什麼東西?後來,我又仔細研讀了TCP/IP的協議棧的原理,對很多概念有了更深刻的認識。比如,在TCP和UDP同屬於傳輸層,共同架設在IP層(網路層)之上。而IP層主要負責的是在節點之間(End to End)的數據包傳送,這里的節點是一台網路設備,比如計算機。因為IP層只負責把數據送到節點,而不能區分上面的不同應用,所以TCP和UDP協議在其基礎上加入了埠的信息,埠於是標識的是一個節點上的一個應用。除了增加埠信息,UPD協議基本就沒有對IP層的數據進行任何的處理了。而TCP協議還加入了更加復雜的傳輸控制,比如滑動的數據發送窗口(Slice Window),以及接收確認和重發機制,以達到數據的可靠傳送。不管應用層看到的是怎樣一個穩定的TCP數據流,下面傳送的都是一個個的IP數據包,需要由TCP協議來進行數據重組。所以,我有理由懷疑,防火牆並沒有足夠的信息判斷TCP數據包的更多信息,除了IP地址和埠號。而且,我們也看到,所謂的埠,是為了區分不同的應用的,以在不同的IP包來到的時候能夠正確轉發。TCP/IP只是一個協議棧,就像操作系統的運行機制一樣,必須要具體實現,同時還要提供對外的操作介面。就像操作系統會提供標準的編程介面,比如Win32編程介面一樣,TCP/IP也必須對外提供編程介面,這就是Socket編程介面--原來是這么回事啊!在Socket編程介面里,設計者提出了一個很重要的概念,那就是socket。這個socket跟文件句柄很相似,實際上在BSD系統里就是跟文件句柄一樣存放在一樣的進程句柄表裡。這個socket其實是一個序號,表示其在句柄表中的位置。這一點,我們已經見過很多了,比如文件句柄,窗口句柄等等。這些句柄,其實是代表了系統中的某些特定的對象,用於在各種函數中作為參數傳入,以對特定的對象進行操作--這其實是C語言的問題,在C++語言里,這個句柄其實就是this指針,實際就是對象指針啦。現在我們知道,socket跟TCP/IP並沒有必然的聯系。Socket編程介面在設計的時候,就希望也能適應其他的網路協議。所以,socket的出現只是可以更方便的使用TCP/IP協議棧而已,其對TCP/IP進行了抽象,形成了幾個最基本的函數介面。比如create,listen,accept,connect,read和write等等。現在我們明白,如果一個程序創建了