瀏覽器輸入一個網址發生了什麼(四) :網路包在局域網中傳輸——路由器和交換機如何轉發包
上一節我們介紹了網路包經過協定棧的IP模組的封裝后,經由網卡發送出本機。
《瀏覽器輸入一個網址發生了什麼(三) IP模組封裝、ARP協定、IP協定、ICMP協定和網卡原理》
接下來我們將介紹數據從用戶端主機傳輸出去后,在局域網內經歷了什麼。
網路包從用戶端主機發出后,要經過集線器、交換機和路由器最終進入到互聯網。 在我們實際生活中,家裡的路由器已經集成了集線器和交換機的功能,網路包到達家裡的路由器之後就能立刻進入互聯網。
這裡為了理解集線器、交換機和路由器的功能,故而將每個功能獨立出介紹以方便理解。
如下圖所示:
一、電信號到達集線器
從之前的內容我們知道,計算機網卡會將MAC模組封裝的數據幀轉為電信號(0和1組成的高低電平),該電信號會沿著計算機連接的網線到達集線器。
集線器包含多個插口(介面),每個插口可能連接著其他集線器,交換機,路由器或者多個計算機。 每個介面背後都裝有網卡中PHY(MUA)功能相同的模組用於接收和發送電信號。
集線器上的每一個介面既可發送也可接收,但每一個介面不能在發送的同時又接收,或者接收的時候同時發送,這是因為集線器是基於半雙工的工作模式。
當信號通過網線到達集線器接收介面後面的PHY(MUA)模組之後,會進入中繼電路,中繼電路的基本功能是將輸入的信號廣播到該集線器的所有介面之上,信號就會從這些介面發向所有連到該集線器的所有設備。
PS:集線器不會對發送過來的數據進行解析和處理,也就是說,當集線器接收到電信號之後,不會將電信號還原為數字資訊(也就是不會將電信號還原為數據幀和數據包),而是將電信號直接轉發。
二、電信號從集線器到達交換機
交換機和集線器一樣也有眾多介面或者說埠,並且每個介面後面也裝著PHY(MUA)模組用於收發電信號。 與集線器不同的是交換機內部存儲著一張MAC位址與網線埠的對應表(MAC位址表)而且交換機是一個包含數據鏈路層的設備,具有MAC模組,可以校驗和解析數據幀,而集線器則沒有,集線器不會將電信號轉為數據幀(而是直接轉發電信號),更不用說解析數據幀。
當電信號被交換機的某一個埠接收到之後,由PHY(MUA)模組將電信號還原為數據幀,再由MAC模組校驗數據幀內的數據是否正確(FCS校驗),如果正確則把幀裡面的乙太網包放到緩衝區中。
PS:我們可以理解為交換機的每一個埠都相當於一塊網卡,具有MAC模組並且擁有自己的緩衝區。 實際上並非每個埠都有獨立的PHY(MUA)、MAC和記憶體,而是由一個控制晶元同時控制多個埠。 而交換機中實際上也沒有網卡,因此交換機也沒有MAC位址。
網卡本身是具有MAC位址的,所以網卡能夠核對接收到的包的接收方MAC位址是否是自己的MAC位址,如果不是則丟棄包。 但交換機由於沒有網卡也沒有MAC位址,因此交換機會接收所有發給它的包存到緩衝區並轉發,而不會丟棄(如果發送方MAC位址對應的介面和接收方MAC對應的介面相同則會丟棄該包,後面會介紹)。
包放入緩衝區后,MAC模組會獲取到乙太網包MAC頭部的發送方MAC位址和接收方MAC位址。
一方面,交換機會將發送方MAC位址和交換機對應接收埠的埠號的映射關係記錄到MAC位址表中,這樣交換機就知道這個發送方MAC位址的設備是連接在哪個埠上的,下次有其他機器要發送數據給這個MAC位址時,交換機就知道要將數據通過哪個介面發出。
另一方面,交換機會查詢接收方MAC位址是否在MAC位址表有記錄的發送埠,例如查詢到接收方MAC位址為00-02-B3-1C-9C-F9則對應下面的MAC位址表中的第三行,交換機就會把包從埠8發送出去。
PS:如果交換機接收到某個包其接收方MAC位址是主機A的MAC位址,那麼交換機接收這個包的埠不一定是直接連著主機A,而可能是連接著幫A轉發包的集線器或幫A轉發包的其他交換機。
從上圖中我們也可以看出,交換機的埠也是分為接收埠和發送埠的。 00-02-B3-1C-9C-F9這個MAC位址對應的埠號為8,那麼交換機針對該MAC地址的發送埠號和接收埠號都是8,但是發送埠和輸出埠本身不是同一個埠,而是不同的2個埠,只是它們的埠號都是8。 這裡涉及到交換機的交換電路。 如下圖所示:
左邊是交換機的輸入埠,下方是輸出埠,左邊8號埠是交換機對00-02-B3-1C-9C-F9機器的接收埠,下方8號埠是交換機對00-02-B3-1C-9C-F9機器的發送埠。
MAC位址表的維護
像我們剛才所說,當收到包時交換機會把發送方MAC位址與接收埠的埠號記錄到MAC位址表,並且交換機每次收到包都會執行這個操作。 這樣以後當收到發往這個位址的包,交換機就能將它發到正確的埠了。
但是位址表中的記錄不能永久有效,會在一段時間不使用之後自動刪除,這是為了避免類似於設備發生移動導致位址表中記錄不再正確的情況,例如筆記型電腦從辦公室移動到了會議室,連了不同的網線。
位址表記錄的有效期為幾分鐘,但如果在有效期內,某條記錄就過時了(發生了設備移動的情況),那麼交換機依舊會將包轉發給老的埠,通信就會發生錯誤。 此時只需重啟一下交換機,位址表會被清空並更新正確的資訊。
下面我們看一種特殊情況:如果交換機查詢MAC位址表發現記錄中接收方MAC位址對應的介面和發送方MAC位址對應的發送介面相同,那麼交換機會如何處理,如下圖所示:
A發送了一個給B的數據包,我們發現A和B都連接在同一台集線器上,集線器會把A的包廣播到該集線器所有的埠,其中就包括B。 因此B接收到集線器發給他的包之後,校驗MAC地址發現是自己的MAC位址,於是B會回應回包,經過集線器,集線器再通過廣播的方式把回包傳回給A。
但是集線器也連接著左側的交換機上,因此集線器同樣會把這個包發給交換機,交換機一查MAC位址表會發現發送埠和接收埠是同一個埠號,為了避免計算機B接收重複的包,因此交換機會丟棄這個包,而不會把包又轉發回集線器而又由集線器轉發給B。
另一種特殊情況就是MAC位址表中無法找到指定的MAC位址,這是因為該MAC地址的設備沒有向交換機發送過包,或者MAC記錄因過了有效期而被刪除。
此時交換機會將包轉發給除了源埠之外的其他所有埠。 可能有人會擔心這樣發過多的包會不會造成網路擁塞,其實不用擔心,因為只要目標設備做出回應(這裡主要指ARP回應),交換機就會根據回包將其MAC地址記錄到位址表,下次就無需這樣廣播轉發。
另外,如果接收方MAC位址是一個廣播位址那麼交換機也會將包發送到除了源埠外的其他埠。
交換機是全雙工的工作模式,這也是交換機和集線器的區別。 交換機的發送和接收埠是相互獨立的,發送埠只能發送不能接收,接收埠亦然; 但是發送埠在發送的時候,接收埠也能接收,這就是全雙工模式的特點。 而集線器的單個埠可以接收也可以發送,但接收和發送不能同時進行,否則就會發生信號碰撞,所以當集線器接收某個包時,它需要將這個包轉發給其他所有埠,導致其他埠這段期間不能接收包。 從轉發能力而言,集線器是低於交換機的。
三、網路包經路由器並轉發
網路包經過集線器和交換機轉發之後達到路由器,並被轉發到下一個路由器。
當然,網路包不一定非要先經過集線器再到交換機再到路由器,也可能集線器連接著路由器,包到達集線器后就能轉發到路由器; 也可能是電腦直接連著路由器,網路包從計算機發出后直接到達路由器; 在局域網中,路由器與路由器之間也存在著眾多的集線器和交換機,從當前路由器到下一跳路由器需要經過這兩台路由器之間的集線器和交換機; 也可能路由器內部本身就集成了集線器和交換機的功能,這樣包就可以按上述所說的轉發方式直接被轉發到下一跳路由器。
當然本小節的重點不是集線器和交換機,而是路由器的轉發機制。 和交換機不同,路由器是基於IP設計的(具有網路層和鏈路層),而交換機是基於乙太網設計的(只有鏈路層),因此路由器可以解析MAC包和IP包,交換機則只能解析MAC包; 交換機是通過包中的接收方MAC位址判斷轉發目標,而路由器則是根據包中接收方的IP位址判斷轉發目標。
1.路由器結構簡化圖
路由器內部包含兩部分:轉發模組和埠模組。
轉發模組負責根據包內目的地IP判斷包應該轉發到哪個下一跳路由器; 埠模組負責執行包的收發操作。
2.埠模組
埠模組包含PHY(MUA)模組(可以接收電信號將幀轉為數字資訊)、MAC模組(將幀解析為乙太網包)和記憶體緩衝區(暫存網路數據),埠模組對於路由器而言就相當於網路對於計算機一樣。 路由器的每個埠都具有獨立的MAC位址和IP位址。
不同類型的路由器安裝的埠模組也不同,例如具有ADSL元件的路由器(一般用作為互聯網中的路由器),具有FTTH元件的路由器(互聯網中的路由器),支援專線的路由器(公司局域網中的路由器),支援無線局域網或乙太網的路由器(局域網中的路由器)。
不同埠模組的路由器支援不同的通信功能,例如具有ADSL通信功能的路由器在把包轉發之前會為包添加MAC頭部、PPPOE頭部和PPP頭部(用於在互聯網中傳輸和鑒權)併發送到互聯網中; 而具有乙太網或無線局域網功能的路由器在轉發時只添加MAC頭部,並且只支援包在局域網內傳輸和解析。
一般而言,計算機的網路支援乙太網和無限局域網的通信技術,而路由器的埠模組除了支援乙太網和無線區域網還支援如ADSL,FTTH以及各種寬頻專線的通信,只需要埠模組安裝了支持這些技術的硬體即可。
一個路由器可以有多個埠和多種類型的埠(意味著這個路由器既支援包在局域網中轉發也支援在互聯網中轉發),每個埠都可能連接著一根網線(如果埠類型是無線的則不用連網線),埠類型不同,連的網線種類也不同。
3.轉發模組
路由器的轉發模組中有一個重要的表叫做路由表,如下所示:
路由器中的路由表內容,以及匹配規則和之前介紹的計算機內的路由表一樣。
其中,第一列“目標位址”記錄的是接收方的資訊,但它不是具體某台設備的IP,而是只有IP的網路號部分的IP段,表示主機號部分的比特值都為0。
第二列表示目標位址的子網掩碼,用於路由器判斷所需比對的網路號的比特數。
路由器在比對路由表和接收方IP時,只會比對 接收方IP的網路號而忽略主機號。
4.路由聚合
路由表第一列和第二列中記錄的可能不是目標位址IP的真正子網,這是路由聚合的結果。 所謂的路由聚合就是將多個子網合併為一個子網,並在路由表中生成一條記錄,這樣就能減少路由表中的記錄數。
例如有3個子網:10.10.1.0/24、10.10.2.0/24和10.10.3.0/24。 路由器B需要轉發接收方IP為10.10.2.100的包,但實際上路由器B的路由表 中並沒有上面的3個子網的記錄,而是將上面3個子網合併成一個10.10.0.0/16的子網記錄起來(這裏記錄的是聚合后的位址),並將下一跳指向路由器A。 如下所示:
目標位址 | 子網掩碼 | 閘道 | 介面 | 躍點數 |
10.10.0.0 | 255.255.0.0 | 路由器A的IP | 路由器B某介面的IP | 1 |
此時在路由器B中就只需匹配目標位址10.10.2.100的前16個位,即10.10。 匹配正確后B會將這個包轉發給路由器A。
路由器A的路由表則記了上面3個子網的記錄,根據10.10.2.100匹配到10.10.2.0/24這個子網和下一跳的IP位址,如下所示:
目標位址 | 子網掩碼 | 閘道 | 介面 | 躍點數 |
10.10.1.0 | 255.255.255.0 | ... | 路由器A的5號埠的IP | 1 |
10.10.2.0 | 255.255.255.0 | ... | 路由器A的2號埠的IP | 1 |
10.10.3.0 | 255.255.255.0 | ... | 路由器A的8號埠的IP | 1 |
路由聚合是將多個子網聚合為一個子網,路由表記錄聚合后的子網位址。 相反的,路由器也可能將一個子網細分並註冊到路由表形成多條記錄。 甚至也可以將某台具體計算機的位址寫入路由,此時第二列的子網掩碼為255.255.255.255,表示匹配路由表時需要匹配所有32個比特的值。
至於閘道、介面和躍點數在上面介紹計算機的路由表已經介紹過,這裡不再贅述。 第4列介面在計算機中代表某一塊網卡,在路由器中代表路由器眾多埠中的某一個埠。
PS:路由表的維護方式與交換機不同,交換機對MAC位址表的維護是通過記錄發送方的乙太網包MAC位址以及交換機接收埠的埠號、記錄接收方的回應乙太網包的MAC頭部和交換機接收該包的接收埠實現的。 路由表的維護則通過人手動維護以及根據路由協定通過路由器之間的資訊交換由路由器自行維護。
那麼回到正題,當包到達路由器時路由器是怎麼處理的,這會根據路由器的埠不同而異(如乙太網路埠,無線局域網路埠,ADSL等),這裡只介紹路由器乙太網路是如何接收和轉發包的。
首先信號到達網線介面部分,由PHY(MUA)模組和MAC模組將電信號轉為數位資訊,檢驗幀尾部FCS,查看接收方的MAC位址是不是發送給自己的,放入接收緩衝區; 如果不是發給自己的包則丟棄(交換機不具有MAC位址,只負責轉發,因此交換機不會因為校驗MAC位址不是自己的MAC位址而丟棄乙太網包,而是根據MAC位址表轉發)。
校驗完MAC地址之後,MAC頭部的任務就完成了然後被丟棄(MAC頭部的任務就是將包送到指定MAC位址的路由器上,因此其實上一章中我們介紹通過ARP協定向局域網中廣播以獲取接收方的MAC地址實際上是獲取路由器的MAC位址而不是遠端目標主機的MAC位址)。 然後路由器會根據IP包頭部的接收方IP位址匹配路由表的記錄,從而找到下一跳路由器的IP(即路由表中的網關列)和輸出埠(路由表的介面列,即通過本路由器的哪個埠發出這個包)。 需要注意,如果匹配到的記錄的網關列為具體IP位址,則該位址就是下一個轉發目標,如果網關列為空,則IP頭部的接收方IP位址就是下一個轉發目標。
如果無法在路由表中匹配到對應記錄,路由器會丟棄這個包,並通過ICMP消息告知發送方。
在發出這個包前,路由器需要重新封裝MAC頭部,因為之前的MAC頭部已經被丟棄。 此時MAC頭部填入的發送方MAC位址不是源發送端的MAC位址,而是本路由器的某發送埠的MAC位址(路由器有多個埠,每一個埠都有一個MAC位址)。 接收方的MAC位址則根據下一個轉發目標的IP(可能是下一跳路由器的IP,也可能是目標主機的IP)通過ARP查詢的方式獲取,當然路由器中也有ARP緩存,因此會先在ARP緩存中查詢。
網路包封裝完畢后,會在埠模組將數位資訊轉為電信號發送出去,這個過程和在計算機的發送包過程一樣。 如果輸出埠是以太網類型,則網路包會通過交換機到達下一個路由器並經過路由器的層層轉發,網路包到達最終目的地(當然這裡省略了包如何從局域網進入互聯網的過程介紹,我們會在下一章再介紹)。
需要注意的是,如果路由器通過乙太網類型的埠發出包則此時乙太網包的頭部只有MAC頭部,如果是通過ADSL類型的埠(將包發送到網路服務運營商和互聯網)發出則乙太網包會包含MAC、PPPoE和PPP頭部。
5.預設路由
對於局域網中的路由器而言,可能小的局域網中的路由器和計算機數量不多,因此所有轉發目標都能夠寫到路由表。 但如果是互聯網中的路由器,由於互聯網中的設備數量太多,無法將所有目標IP的網路號都記錄到路由表中。 因此路由表會在最後一行配置預設路由的記錄,這一行的目標位址列和子網掩碼列為0.0.0.0,子網掩碼為0.0.0.0表示需要匹配網路包接收方IP的比特數為0,即無需匹配。 而這一條記錄的網關列即為預設網關,一般會填寫為接入互聯網的路由器位址。
换句话说,如果包内的接收方IP无法匹配到路由表中的其他所有记录,且路由表中有0.0.0.0这条默认网关记录,那么接收方IP就会匹配到这条记录并转发到默认网关。
当然,如果路由器中没有设置默认网关,那么当匹配路由表中所有记录失败时,路由器会发送ICMP消息给发送方。
6.包的有效期
在路由器转发包之前,其转发模块会更新IP头部的TTL字段。该字段表示有效期,每经过一个路由器的转发这个值就会减1,当这个值变为0时就表示超过了有效期,这个包就会被丢弃。
这个机制是为了防止包在转发的过程中陷入死循环,如果路由表中的配置正确是不会出现这种情况的,但如果信息有问题或者设备故障等原因切换备用路由器导致暂时性的路由混乱就会出现这种情况。
TTL一般会设置为64或128。
7.通過分片功能拆分大網路包
路由器的埠類型不只乙太網一種,也可以支援其他局域網或專線通信技術。 不同埠類型的線路能傳輸的最大包長度(MTU)也不同,像在乙太網中,乙太網包的MTU(包括乙太網頭部)為1500。
當路由器的輸入埠和輸出埠是不同的埠類型(像局域網內的路由器輸入埠和輸出埠可能都是乙太網類型的埠和線路,但接入互聯網的路由器的輸入埠為乙太網類型埠,輸出埠是ADSL類型的埠),且輸出埠能傳輸的MTU小於輸入埠時,一旦傳入的包的大小超過了輸出埠的MTU,就會導致包無法發送。 如下所示
有時候即使輸入和輸出埠的MTU一樣,但可能由於包經過重新封裝添加了額外的頭部數據導致包的長度超過輸出埠的MTU。 例如ADSL和FTTH等埠類型在發出包之前需要在IP頭部前添加PPP頭部和PPPoE頭部再添加MAC頭部。
為了避免包超過輸出埠MTU而無法發送包的情況出現,路由器中的IP模組提供了分片功能,首先它會看看這個要發送出去的包能否直接發送出去,將輸出埠的MTU與包的長度(數據幀的包長度,不包括幀的報頭和FCS)比較,如果輸出埠的MTU小於包的長度則會對這個包分片,拆分之前會看一下IP頭部的標誌字段是否允許分片; 如果標誌欄位表示不能分片,則路由器會丟棄該包併發送ICMP消息給發送方。
分片如下圖所示:
圖中(a)的藍色部分就是被拆分的內容
每個分片都會添加相同的MAC頭部和IP頭部(如果是在乙太網中傳輸則為這兩個頭部,如果是通過ADSL則還需要PPP和PPPoE頭部)。
需要注意的是,這裡對IP包的分片和之前在協定棧中介紹的TCP模組對HTTP消息的分片不同。 TCP模組對 HTTP 消息的分片是在數據被裝進包裡之前進行的,而且每個分片都包含一個 TCP 頭部。 而路由器則是直接對IP包進行分片,每個分片都有一個IP頭部,但是所有分片只有一個TCP頭部。 TCP分片也是因為要發送的數據可能大於MTU因而分片。
假如有用戶端有1M的HTTP消息要發送,則這1M的內容會在TCP模組中被分為幾百多個分片包(IP包),但經過路由器的時候,每個IP包還可能再被路由器的IP模組分片為兩個小包。
8.路由器与交换机以及路由器之间的关系
简单的来说,路由器负责通过将包不断传递给下一跳路由器最终把包送达通信对象这一整个过程(由网络层如IP模块负责)。而包从一个路由器到达下一个路由器则是由交换机负责广播获取MAC地址实现(由链路层如以太网线路等负责)。
网络中除了以太网之外,还有无线局域网、ADSL和FTTH等等众多类型的网络,如果当前路由器和下一跳路由器是通过以太网连接的,则当前路由器的IP模块会委托以太网将包传递给下一个路由器;如果当前路由器和下一跳路由器是通过ADSL连接,则会委托ADSL线路传递。IP本身不负责包的传输,而是委托链路层的各种通信技术(以太网、ADSL、FTTH、无线局域网等)把包传给下一个路由器。
当然,现在基本上很多的路由器都内置了交换机功能,因此路由器本身就具有广播,以及进行ARP查询MAC地址的功能。
四、路由器的附加功能
上面我们介绍了路由器的基本功能,即根据网络包头部接收方IP来查询路由表,获取下一跳地址,并以接力的方式将包传送到目标地址的计算机上。
除了这个基本功能之外,路由器还有一些附加功能,这里介绍比较重要的两个功能:地址转换和过滤。
1.地址转换
我们知道一台设备只有一个唯一的IP地址,如果网络中出现有重复IP地址的设备就会无法正常传输网络包。可是随着互联网设备数量增长,IP地址会被很快分配完。为了解决这个问题,我们容许相互独立的不同内网之间的机器出现IP重复而同一内网的机器的IP不重复的情况,只要不同内网之间的设备不直接进行通信就行。为此我们提出了私有地址和公有地址的概念。
公有地址中没分配的一部分拿出来规定只能在内网使用的地址叫做私有地址,而互联网中分配的固定地址叫做公有地址。
私有地址的范围如下:
- 10.0.0.0 ~ 10.255.255.255
- 172.16.0.0 ~ 172.31.255.255
- 192.168.0.0 ~ 192.168.255.255
不同內網的兩台機器即使出現上面範圍內的IP位址重複也沒有關係。
下面我們以公司內網為例。 一般而言,公司內網中的設備會分為兩部分,一部分是對互聯網開放的伺服器,一部分是公司內部設備。 對互聯網開放的設備分配公有位址,對公司內部設備分配私有位址,被分配私有地址的設備只能夠與內網的設備直接通信而不能和互聯網直接收發網路包。
如果內網中的設備想和互聯網中的設備通信就需要一種特別的機制,這個機制就是位址轉換。
地址轉換的原理就是依靠路由器在轉發網路包時對IP包頭部的IP位址和埠進行改寫。
當內網的設備要把網路包發送到遠端的目標機器,在網路包經過路由器的時候,路由器會將IP包頭部的發送方IP位址(私有位址)換為路由器接收埠的位址(該路由器的埠位址是一個公有位址),並且將包 TCP頭部的埠號也改寫為路由器分配的一個空閒埠號。
改寫前的私有位址和埠號,改寫后的公有位址和埠號會對應的記錄到路由器的一張表中。
這個被替換后的公有位址其實是位址轉換設備的IP,即路由器的IP。 所以實際上真正的發送者不是內網的計算機,而是該路由器。
服務端的回包的接收方IP會寫之前發送方的公有位址,即198.18.8.31,這個公網IP是路由器的IP。 當包到達公司網關路由器時,路由器會根據回包的接收方IP和埠查上面的映射表找到對應的內網設備並轉發給該設備(上圖的表格中只有一個公有IP,但真實情況其實還可能有多個公有位址,因為路由器有多個埠)。
在公有位址只有一個的情況下,可以用不同的埠號來區別內網的不同終端。 這樣就不至於服務端的回包無法找到準確的內網設備。
這個公有位址和私有位址的映射表的某條記錄會在某內網計算機A與外網伺服器B建立連接時(A發送連接請求的TCP包到達路由器時)生成,之後該內網計算機A與外網設備B的通信都會使用這條轉換記錄,直到A與B通信完畢,斷開連接,A關閉用於與B通信的套接字后,(此時這個私有位址的埠號就失效)這條記錄才會被刪除。
我們發現路由器做位址轉換的時候還改寫了埠號,這樣做是為了在位址轉換時讓公有位址的一個埠號對應一個私有IP位址,提高公有位址的利用率。 如果不改寫埠號,就意味著每轉換一個私有位址都需要一個新的公有位址。 假如這個公司的局域網只被分配了10個公有位址,但是公司有1000台設備(1000個私有位址),就意味著只有10台內部設備能夠同時和互聯網通信。
上面我們介紹了內網設備作為用戶端,互聯網中的遠端設備作為服務端情況下的路由器地址轉換。 下面我們再說說公司內網設備作為服務端,從互聯網訪問公司內網設備時路由器的位址轉換。
其實基本原理還是通過複用一個(或多個)公有位址的多個埠號來對應多個私有位址建立映射進行轉換,唯一的不同在於內網設備作為用戶端請求的情況下,這個位址轉換表的記錄是在設備發出請求並經過路由器時才生成的(即動態生成); 而內網設備作為服務端供互聯網請求的情況下,路由器中的位址轉換表記錄需要提前手動添加,而且只要內網設備不停止提供服務,裡面的記錄就不會刪除。 如圖:
这样一来,互联网中的某个用户访问198.18.8.31:8080其实访问的就是公司内网中的 10.10.1.1这台机器的80端口所提供的服务。
2.路由器的包过滤功能
包过滤就是对包转发时根据MAC头部、IP头部和TCP头部按时限设定好的规则决定转发这个包还是丢弃这个包。我们常说的防火墙设备和软件就是利用这一机制。
这一原理虽然简单,但是想要灵活控制不容易,例如如何防止来自互联网的包经过路由器进入内网,但是又允许内网发出的包能通过路由器转发给互联网。
很多朋友會想,如果希望內網能訪問互聯網而不讓互聯網訪問內網,只需允許路由器轉發由內網發向互聯網的包,而禁止轉發由互聯網發到內網的包就行。
可是網路包是雙向傳輸的,例如TCP應答機制中,內網設備發送了帶有序號的網路包,服務端就會回一個ACK包。 此時這個ACK包就被攔截導致內網向用戶端發起的請求無法正常回應(應該說用戶端的請求包都無法正常傳輸完,用戶端主機會一直等服務端的應答包)。
這部分內容將會在探索伺服器時介紹。