自我總結:總結來自極客時間
第一講:為什么要學習網絡協議?
協議三要素
語義
內容要符合一定的規則和格式,如括號要成對、結束要使用分號等(HTTP報文的狀態、首部、內容)
語法
一段內容是代表某種意義的,如數字減去數字是有意義的,數字減去文本一般來說就沒有意義。
順序(時序)
先干啥后才能干啥,如先加上某個數后才能做下一步的操作
只有通過網絡協議,才能夠使一大片機器相互協作,共同完成一件事
例子
從瀏覽器發起一個請求開始,如去考拉商城進行購物,瀏覽器之所以能夠展示界面就是因為瀏覽器收到了HTTP響應報文,報文格式如下:
請求流程
應用層
從輸入請求的URL(www.kaola.com)開始,瀏覽器只知道名字("www.kaola.com"),但不知道具體的地點,于是打開地址簿(DNS或者HTTPSDNS),然后得到服務器的地址(106.114.138.24);
知道了目標服務器的地址后,瀏覽器開始打包請求,對于普通的瀏覽,一般使用的是HTTP協議;但是對于購物下單這類的信息就是使用HTTPS協議,協議里面寫明了“要買什么、要買多少”等信息
經過應用層的協議封裝后,瀏覽器將包交給傳輸層去完成(Socket套接字)
傳輸層(TCP、UDP)
UDP無連接,面向服務;
TCP面向連接:TCP會保證包能準確到達目的地址,如果不能到達就會重新發送,知道準確到達(如支付請求就需要使用TCP)
頭里有兩個端口:瀏覽器端口:瀏覽器監聽的端口;電商應用端口:電商的服務器監聽的端口;? ? 操作系統根據端口來決定把包轉發到哪個進程中進行處理
傳輸層封裝完畢后,繼續把包轉交給下一層:網絡層
網絡層
網絡層的協議是IP協議,協議頭里面包含了源地址(瀏覽器所在的機器IP)和目標地址(電商服務器的IP)
操作系統既然知道了目標IP地址,就開始想如何根據這個門牌號(IP地址)找到目標機器。操作系統往往會判斷,這個目標IP地址是本地人,還是外地人。如果是本地人,從門牌號就能看出來,但是顯然電商網站不在本地,而在遙遠的地方。
操作系統知道要離開本地去遠方。雖然不知道遠方在何處,但是可以這樣類比一下:如果去國外要去海關,去外地就要去網關。而操作系統啟動的時候,就會被DHCP協議配置IP地址,以及默認的網關的IP地址192.168.1.1。
操作系統將IP地址發給網關呢?在本地通信基本靠吼,于是操作系統大吼一聲,誰是192.168.1.1啊?網關會回答它,我就是,我的本地地址在村東頭。這個本地地址就是MAC地址,而大吼的那一聲是ARP協議。
操作系統得到MAC地址后,繼續封裝并轉發給MAC層
物理層(MAC層)
MAC頭里包含了MAC地址,所以能準確的到達網關,網關(192.168.1.1)在收到包后,根據自己的知識判斷下一步該怎么走
網關:往往是一個路由器,到某個IP地址應該怎么走,這個叫路由表
路由器有點像玄奘西行路過的一個個國家的一個個城關。每個城關都連著兩個國家,每個國家相當于一個局域網,在每個國家內部,都可以使用本地的地址MAC進行通信。一旦跨越城關,就需要拿出IP頭來,里面寫著貧僧來自東土大唐(就是源IP地址),欲往西天拜佛求經(指的是目標IP地址)。路過寶地,借宿一晚,明日啟行,請問接下來該怎么走啊?城關往往是知道這些“知識”的,因為城關和臨近的城關也會經常溝通。到哪里應該怎么走,這種溝通的協議稱為路由協議,常用的有OSPF和BGP。
城關與城關之間是一個國家,當網絡包知道了下一步去哪個城關,還是要使用國家內部的MAC地址,通過下一個城關的MAC地址,找到下一個城關,然后再問下一步的路怎么走,一直到走出最后一個城關。
最后一個城關知道這個網絡包要去的地方。于是,對著這個國家吼一聲,誰是目標IP啊?目標服務器就會回復一個MAC地址。網絡包過關后,通過這個MAC地址就能找到目標服務器。目標服務器發現MAC地址對上了,取下MAC頭來,發送給操作系統的網絡層。發現IP也對上了,就取下IP頭。IP頭里會寫上一層封裝的是TCP協議,然后將其交給傳輸層,即TCP層。
在這一層里,對于收到的每個包,都會有一個回復的包說明收到了。這個回復的包絕非這次下單請求的結果,例如購物是否成功,扣了多少錢等,而僅僅是TCP層的一個說明,即收到之后的回復。當然這個回復,會沿著剛才來的方向走回去,報個平安。因為一旦出了國門,西行路上千難萬險,如果在這個過程中,網絡包走丟了,例如進了大沙漠,或者被強盜搶劫殺害怎么辦呢?因而到了要報個平安。
如果過一段時間還是沒到,發送端的TCP層會重新發送這個包,還是上面的過程,直到有一天收到平安到達的回復。這個重試絕非你的瀏覽器重新將下單這個動作重新請求一次。對于瀏覽器來講,就發送了一次下單請求,TCP層不斷自己悶頭重試。除非TCP這一層出了問題,例如連接斷了,才輪到瀏覽器的應用層重新發送下單請求。
當網絡包平安到達TCP層之后,TCP頭中有目標端口號,通過這個端口號,可以找到電商網站的進程正在監聽這個端口號,假設一個Tomcat,將這個包發給電商網站。
電商網站的進程得到HTTP請求的內容,知道了要買東西,買多少。往往一個電商網站最初接待請求的這個Tomcat 只是個接待員,負責統籌處理這個請求,而不是所有的事情都自己做。例如,這個接待員要告訴專門管理訂單的進程,登記要買某個商品,買多少,要告訴管理庫存的進程,庫存要減少多少,要告訴支付的進程,應該付多少錢,等等。
如何告訴相關的進程呢?往往通過RPC(remote procedure call)調用,即遠程過程調用的方式來實現。遠程過程調用就是當告訴管理訂單進程的時候,接待員不用關心中間的網絡互連問題,會由RPC框架統一處理。RPC框架有很多種,有基于HTTP協議放在HTTP的報文里面的,有直接封裝在TCP報文里面的。
當接待員發現相應的部門都處理完畢,就回復一個HTTPS的包,告知下單成功。這個HTTPS的包,會像來的時候一樣,經過千難萬險到達你的個人電腦,最終進入瀏覽器,顯示支付成功。
講后問題
當網絡包到達一個城關的時候,可以通過路由表得到下一個城關的IP地址,直接通過IP地址找就可以了,為什么還要通過本地的MAC地址呢?
答:1. mac地址是唯一的,為什么可以修改?想想身份證,身份證號是唯一的,不能改變的,但是可以造假。mac地址全球唯一,它是固化在網卡里的。網卡畢竟是個硬件,需要軟件支持,既操作系統識別。重點來了,操作系統識別出來的mac地址是可以更改的,它只不過是一個字符串。我們常說的修改mac指的是修改電腦中記錄的既注冊表中的記錄。
2. 有了mac地址為什么還要有ip地址。舉個例子,身份證號是你的唯一標識,不會重復,一落戶就有(網卡一出廠就有mac)。現在我要和你通信(寫信給你),地址用你的姓名+身份證,信能送到你手上嗎?明顯不能!身份證號前六位能定位你出生的縣。mac地址前幾位也可以定位生產廠家。但是你出生后會離開這個縣(哪怕在這個縣,也不能具體找到你)。所以一般寫個人信息就要有出生地和現居地址了。
第2講:網絡分層的真實含義
網絡為什么要分層?
網絡是一個非常龐大、復雜的系統,網絡上的兩個終端要進行通信交互需要很復雜的過程,而網絡分層可以將復雜的通信過程化解為一些列可以控制和實現的功能模塊,使復雜的計算機網絡系統變得易于設計、實現和標準化。網絡各個層之間相互獨立,專門處理該層該處理的事情,體現了職責分離的思想。
程序工作過程:簡單地想象“你”這個程序的工作過程
當一個網絡包從一個網口經過的時候,你看到了,首先先看看要不要請進來,處理一把。有的網口配置了混雜模式,凡是經過的,全部拿進來。????????????
拿進來以后,就要交給一段程序來處理。于是,“你”調用process_layer2(buffer)。當然,這是一個假的函數。但是你明白其中的意思,知道肯定是有這么個函數的。那這個函數是干什么的呢?從Buffer中,摘掉二層的頭,看一看,應該根據頭里面的內容做什么操作。????????????
假設你發現這個包的MAC地址和你的相符,那說明就是發給你的,于是需要調用process_layer3(buffer)。這個時候,Buffer里面往往就沒有二層的頭了,因為已經在上一個函數的處理過程中拿掉了,或者將開始的偏移量移動了一下。在這個函數里面,摘掉三層的頭,看看到底是發送給自己的,還是希望自己轉發出去的。
如何判斷呢?如果IP地址不是自己的,那就應該轉發出去;如果IP地址是自己的,那就是發給自己的。根據IP頭里面的標示,拿掉三層的頭,進行下一層的處理,到底是調用process_tcp(buffer)呢,還是調用process_udp(buffer)呢?
假設這個地址是TCP的,則會調用process_tcp(buffer)。這時候,Buffer里面沒有三層的頭,就需要查看四層的頭,看這是一個發起,還是一個應答,又或者是一個正常的數據包,然后分別由不同的邏輯進行處理。如果是發起或者應答,接下來可能要發送一個回復包;如果是一個正常的數據包,就需要交給上層了。交給誰呢?是不是有process_http(buffer)函數呢?
沒有的,如果你是一個網絡包處理程序,你不需要有process_http(buffer),而是應該交給應用去處理。交給哪個應用呢?在四層的頭里面有端口號,不同的應用監聽不同的端口號。如果發現瀏覽器應用在監聽這個端口,那你發給瀏覽器就行了。至于瀏覽器怎么處理,和你沒有關系。瀏覽器自然是解析HTML,顯示出頁面來。電腦的主人看到頁面很開心,就點了鼠標。點擊鼠標的動作被瀏覽器捕獲。瀏覽器知道,又要發起另一個HTTP請求了,于是使用端口號,將請求發給了“你”。
你應該調用send_tcp(buffer)。不用說,Buffer里面就是HTTP請求的內容。這個函數里面加一個TCP的頭,記錄下源端口號。瀏覽器會給你目的端口號,一般為80端口。
然后調用send_layer3(buffer)。Buffer里面已經有了HTTP的頭和內容,以及TCP的頭。在這個函數里面加一個IP的頭,記錄下源IP的地址和目標IP的地址。
然后調用send_layer2(buffer)。Buffer里面已經有了HTTP的頭和內容、TCP的頭,以及IP的頭。這個函數里面要加一下MAC的頭,記錄下源MAC地址,得到的就是本機器的MAC地址和目標的MAC地址。不過,這個還要看當前知道不知道,知道就直接加上;不知道的話,就要通過一定的協議處理過程,找到MAC地址。反正要填一個,不能空著。
萬事俱備,只要Buffer里面的內容完整,就可以從網口發出去了,“你”作為一個程序的任務就算告一段落了。
層與層之間的關系
每個層之間雖然是相互獨立的,但是只要是在網絡上跑的包,都是完整的,可以有下層沒有上層,絕對不可能有上層而沒有下層(如對TCP協議來說,三次握手也好,重試也罷,只要想發出去包,就要有MAC層和IP層,不然是發不出去的)
第3講:將ifconfig,熟悉又陌生的命令行
從ip addr命令入手
IP地址分類
CIDR:無類別域間路由
無類別域間路由(Classless Inter-Domain Routing、CIDR)是一個用于給用戶分配IP地址以及在互聯網上有效地路由IP數據包的對IP地址進行歸類的方法。
這種方式打破了原來設計的幾類地址的做法,將32位的IP地址一分為二,前面是網絡號,后面是主機號(192.168.1.128/24)。伴隨著CIDR存在的,一個是廣播地址,192.168.1.255。如果發送這個地址,所有192.168.1網絡里面的機器都可以收到。另一個是子網掩碼,255.255.255.0。
網絡號=IP地址&子網掩碼
CIDR例題,已知IP為16.158.165.91/22,求出這個網絡的第一個地址(16.158.164.1)、子網掩碼(255.255.252.0)和廣播地址(16.158.167.255)
私有IP地址
私有IP地址段:這些地址允許組織內部的IT人員自己管理、自己分配,而且可以重復。
公有IP地址有個組織統一分配,你需要去買。如果你搭建一個網站,給你學校的人使用,讓你們學校的IT人員給你一個IP地址就行。但是假如你要做一個類似網易163這樣的網站,就需要有公有IP地址,這樣全世界的人才能訪問。
組播地址
使用這一類地址,屬于某個組的機器都能收到。這有點類似在公司里面大家都加入了一個郵件組。發送郵件,加入這個組的都能收到。
在IP地址的后面有個scope,對于eth0這張網卡來講,是global,說明這張網卡是可以對外的,可以接收來自各個地方的包。對于lo來講,是host,說明這張網卡僅僅可以供本機相互通信。
lo全稱是loopback,又稱環回接口,往往會被分配到127.0.0.1這個地址。這個地址用于本機通信,經過內核處理后直接返回,不會在任何網絡中出現。
MAC地址
MAC地址是一個很容易讓人“誤解”的地址。因為MAC地址號稱全局唯一,不會有兩個網卡有相同的MAC地址,而且網卡自生產出來,就帶著這個地址。很多人看到這里就會想,既然這樣,整個互聯網的通信,全部用MAC地址好了,只要知道了對方的MAC地址,就可以把信息傳過去。
這樣當然是不行的。 一個網絡包要從一個地方傳到另一個地方,除了要有確定的地址,還需要有定位功能。 而有門牌號碼屬性的IP地址,才是有遠程定位功能的。
反例:如果只是用MAC地址,那么一個客戶端發送一個請求,它不知道請求目標在哪,于是它要往廣播這個請求,互聯上的請求通常是億級以上的,這么大量的請求很容易使路由或者交換機宕機。假如使用了IP,對于一個請求可以先根據一個IP定位到一定的范圍,然后再根據MAC地址繼續往下查找,直到找到準確的那個目標。
網絡設備的狀態標識
<BROADCAST,MULTICAST,UP,LOWER_UP>:這個叫作net_device flags,網絡設備的狀態標識
UP表示網卡處于啟動的狀態;BROADCAST表示這個網卡有廣播地址,可以發送廣播包;MULTICAST表示網卡可以發送多播包;LOWER_UP表示L1是啟動的,也即網線插著呢。MTU1500:是二層MAC層的概念。MAC層有MAC的頭,以太網規定
連MAC頭帶正文合起來,不允許超過1500個字節。正文里面有IP的頭、TCP的頭、HTTP的頭。如果放不下,就需要分片來傳輸。
qdisc pfifo_fast是什么意思呢?qdisc全稱是queueing discipline,中文叫排隊規則。內核如果需要通過某個網絡接口發送數據包,它都需要按照為這個接口配置的qdisc(排隊規則)把數據包加入隊列。
最簡單的qdisc是pfifo,它不對進入的數據包做任何的處理,數據包采用先入先出的方式通過隊列。pfifo_fast稍微復雜一些,它的隊列包括三個波段(band)。在每個波段里面,使用先進先出規則。三個波段(band)的優先級也不相同。band 0的優先級最高,band 2的最低。如果band 0里面有數據包,系統就不會處理band 1里面的數據包,band 1和band 2之間也是一樣。
數據包是按照服務類型(Type of Service,TOS)被分配到三個波段(band)里面的。TOS是IP頭里面的一個字段,代表了當前的包是高優先級的,還是低優先級的。
第4講:DHCP與PEX
DHCP:動態主機配置協議
只需要配置一段共享的IP地址。每一臺新接入的機器都通過DHCP協議,來這個共享的IP地址里申請,然后自動配置好就可以了。等人走了,或者用完了,還回去,這樣其他的機器也能用。
如果是數據中心里面的服務器,IP一旦配置好,基本不會變,這就相當于買房自己裝修。DHCP的方式就相當于租房。你不用裝修,都是幫你配置好的。你暫時用一下,用完退租就可以了。
DHCP的工作方式
當一臺機器新加入一個網絡的時候,肯定一臉懵,啥情況都不知道,只知道自己的MAC地址。怎么辦?先吼一句,我來啦,有人嗎?這時候的溝通基本靠“吼”。這一步,我們稱為DHCP Discover。
新來的機器使用IP地址0.0.0.0發送了一個廣播包,目的IP地址為255.255.255.255。廣播包封裝了UDP,UDP封裝了BOOTP。其實DHCP是BOOTP的增強版,但是如果你去抓包的話,很可能看到的名稱還是BOOTP協議。在這個廣播包里面,新人大聲喊:我是新來的(Boot request),我的MAC地址是這個,我還沒有IP,誰能給租給我個IP地址!
如果一個網絡管理員在網絡里面配置了DHCP Server的話,他就相當于這些IP的管理員。他立刻能知道來了一個“新人”。這個時候,我們可以體會MAC地址唯一的重要性了。當一臺機器帶著自己的MAC地址加入一個網絡的時候,MAC是它唯一的身份,如果連這個都重復了,就沒辦法配置了。
只有MAC唯一,IP管理員才能知道這是一個新人,需要租給它一個IP地址,這個過程我們稱為DHCP Offer。同時,DHCP Server為此客戶保留為它提供的IP地址,從而不會為其他DHCP客戶分配此IP地址。
DHCP Offer的格式就像這樣,里面有給新人分配的地址:
DHCP Server仍然使用廣播地址作為目的地址,因為,此時請求分配IP的新人還沒有自己的IP。DHCP Server回復說,我分配了一個可用的IP給你,你看如何?除此之外,服務器還發送了子網掩碼、網關和IP地址租用期等信息。
新來的機器很開心,它的“吼”得到了回復,并且有人愿意租給它一個IP地址了,這意味著它可以在網絡上立足了。當然更令人開心的是,如果有多個DHCP Server,這臺新機器會收到多個IP地址,簡直受寵若驚。
它會選擇其中一個DHCP Offer,一般是最先到達的那個,并且會向網絡發送一個DHCP Request廣播數據包,包中包含客戶端的MAC地址、接受的租約中的IP地址、提供此租約的DHCP服務器地址等,并告訴所有DHCP Server它將接受哪一臺服務器提供的IP地址,告訴其他DHCP服務器,謝謝你們的接納,并請求撤銷它們提供的IP地址,以便提供給下一個IP租用請求者。
此時,由于還沒有得到DHCP Server的最后確認,客戶端仍然使用0.0.0.0為源IP地址、255.255.255.255為目標地址進行廣播。在BOOTP里面,接受某個DHCP Server的分配的IP。
當DHCP Server接收到客戶機的DHCP request之后,會廣播返回給客戶機一個DHCP ACK消息包,表明已經接受客戶機的選擇,并將這一IP地址的合法租用信息和其他的配置信息都放入該廣播包,發給客戶機,歡迎它加入網絡大家庭。
最終租約達成的時候,還是需要廣播一下,讓大家都知道。
IP地址的續租和收回
租期到了,管理員就要將IP收回。如果不用的話,收回就收回了。就像你租房子一樣,如果還要續租的話,不能到了時間再續租,而是要提前一段時間給房東說。DHCP也是這樣。客戶機會在租期過去50%的時候,直接向為其提供IP地址的DHCP Server發送DHCP request消息包。客戶機接收到該服務器回應的DHCP ACK消息包,會根據包中所提供的新的租期以及其他已經更新的TCP/IP參數,更新自己的配置。這樣,IP租用更新就完成了。
PXE:預啟動執行環境
數據中心里面的管理員可能一下子就拿到幾百臺空的機器,一個個安裝操作系統,會累死的。所以管理員希望的不僅僅是自動分配IP地址,還要自動安裝系統。裝好系統之后自動分配IP地址,直接啟動就能用。
第5講:從物理層到MAC層
第一層:物理層
電腦連電腦,除了網線要交叉,還要配置兩臺電腦的IP地址、子網掩碼和默認網關,要想兩臺電腦能夠通信,就必須把上面三項配置成一個網絡,如可以是192.168.1.2/24和192.168.1.3/24,否則是不通的。(注意:此時兩臺電腦之間的網絡包是包含MAC層的)至此兩臺電腦已經構成了最小的一個局域網(LAN)
此時有第三臺電腦,想要加入本局域網,除了交換機之外,可以使用Hub(集線器),這種設備有多個口,可以將宿舍里的多臺電腦連接起來。但是,和交換機不同,集線器沒有大腦,它完全在物理層工作。它會將自己收到的每一個字節,都復制到其他端口上去。這是第一層物理層聯通的方案。
第二層;數據鏈路層
Hub采用的是廣播的模式,如果每一臺電腦發出的包,宿舍的每個電腦都能收到,那就麻煩了。這就需要解決幾個問題:
1. 這個包是發給誰的?誰應該接收?
2. 大家都在發,會不會產生混亂?有沒有誰先發、誰后發的規則?
3. 如果發送的時候出現了錯誤,怎么辦?
這幾個問題,都是第二層,數據鏈路層,也即MAC層要解決的問題。MAC的全稱是Medium Access Control,即媒體訪問控制。控制什么呢?其實就是控制在往媒體上發數據的時候,誰先發、誰后發的問題。防止發生混亂。這解決的是第二個問題。這個問題中的規則,學名叫多路訪問。有很多算法可以解決這個問題。就像車管所管束馬路上跑的車,能想的辦法都想過了:
方式一:分多個車道。每個車一個車道,你走你的,我走我的。這在計算機網絡里叫作信道劃分;
方式二:今天單號出行,明天雙號出行,輪著來。這在計算機網絡里叫作輪流協議;
方式三:不管三七二十一,有事兒先出門,發現特堵,就回去。錯過高峰再出。我們叫作隨機接入協議。著名的以太網,用的就是這個方式。
接下來要解決第一個問題:發給誰,誰接收?這里用到一個物理地址,叫作鏈路層地址。但是因為第二層主要解決媒體接入控制的問題,所以它常被稱為MAC地址。
解決第一個問題就牽扯到第二層的網絡包格式。對于以太網,第二層的最開始,就是目標的MAC地址和源的MAC地址。
接下來是類型,大部分的類型是IP數據包,然后IP里面包含TCP、UDP,以及HTTP等,這都是里層封裝的事情。
有了這個目標MAC地址,數據包在鏈路上廣播,MAC的網卡才能發現,這個包是給它的。MAC的網卡把包收進來,然后打開IP包,發現IP地址也是自己的,再打開TCP包,發現端口是自己,也就是80,而nginx就是監聽80。于是將請求提交給nginx,nginx返回一個網頁。然后將網頁需要發回請求的機器。然后層層封裝,最后到MAC層。因為來的時候有源MAC地址,返回的時候,源MAC就變成了目標MAC,再返給請求的機器。
對于以太網,第二層的最后面是CRC,也就是循環冗余檢測。通過XOR異或的算法,來計算整個包是否在發送的過程中出現了錯誤,主要解決第三個問題。這里還有一個沒有解決的問題,當源機器知道目標機器的時候,可以將目標地址放入包里面,如果不知道呢?一個廣播的網絡里面接入了N臺機器,我怎么知道每個MAC地址是誰呢?這就是ARP協議,也就是已知IP地址,求MAC地址的協議。
在一個局域網里面,當知道了IP地址,不知道MAC怎么辦呢?靠“吼”。
廣而告之,發送一個廣播包,誰是這個IP誰來回答。具體詢問和回答的報文就像下面這樣:
為了避免每次都用ARP請求,機器本地也會進行ARP緩存。當然機器會不斷地上線下線,IP也可能會變,所以ARP的MAC地址緩存過一段時間就會過期。
局域網
至此,三臺電腦組成了一個小的局域網(Hub)。
這種組網的方法,對一個機器數目來說沒有問題,但是一旦機器數目增多,問題就出現了。因為Hub是廣播的,不管某個接口是否需要,所有的Bit都會被發送出去,然后讓主機來判斷是不是需要。這種方式路上的車少就沒問題,車一多,產生沖突的概率就提高了。而且把不需要的包轉發過去,純屬浪費。看來Hub這種不管三七二十一都轉發的設備是不行了,需要點兒智能的。因為每個口都只連接一臺電腦,這臺電腦又不怎么換IP和MAC地址,只要記住這臺電腦的MAC地址,如果目標MAC地址不是這臺電腦的,這個口就不用轉發了。
誰能知道目標MAC地址是否就是連接某個口的電腦的MAC地址呢?這就需要一個能把MAC頭拿下來,檢查一下目標MAC地址,然后根據策略轉發的設備,按第二節課中講過的,這個設備顯然是個二層設備,我們稱為交換機。
交換機怎么知道每個口的電腦的MAC地址呢?這需要交換機會學習。一臺MAC1電腦將一個包發送給另一臺MAC2電腦,當這個包到達交換機的時候,一開始交換機也不知道MAC2的電腦在哪個口,所以沒辦法,它只能將包轉發給除了來的那個口之外的其他所有的口。但是,這個時候,交換機會干一件非常聰明的事情,就是交換機會記住,MAC1是來自一個明確的口。以后有包的目的地址是MAC1的,直接發送到這個口就可以了。
當交換機作為一個關卡一樣,過了一段時間之后,就有了整個網絡的一個結構了,這個時候,基本上不用廣播了,全部可以準確轉發。當然,每個機器的IP地址會變,所在的口也會變,因而交換機上的學習的結果,我們稱為轉發表,是有一個過期時間的。
三個重要點
第一,MAC層是用來解決多路訪問的堵車問題的;
第二,ARP是通過吼(廣播)的方式來尋找目標MAC地址的,吼完之后記住一段時間,這個叫作緩存;
第三,交換機是有MAC地址學習能力的,學完了它就知道誰在哪兒了,不用廣播了。
問題:如果一個局域網里面有多個交換機,ARP廣播的模式會出現什么問題呢?
答:ARP廣播時,交換機會將一個端口收到的包轉發到其他的端口上,比如數據包經過交換機A到達交換機B,交換機B又將包復制多份廣播出去,如果整個局域網存在一個環路,使得數據包又回到最初的交換機A,這個包又會被A再次復制多份廣播出去,如此循環,數據包會不停轉發,而且越來越多,最終占滿帶寬,或者使解析協議的硬件過載,形成廣播風暴。