故事就從一個車轱轆說起吧。先來看一個車轱轆。
輻條從車轱轆邊緣,一直匯聚到 中心的軸,這個軸在英文里叫hub。
而我們今天要講到的集線器,英文里也叫hub。
都叫hub,多少有點關系,看下這面這個圖大概能明白,其實兩者有點像。
hub的由來
大概想表達的意思是,它是匯聚網線的中心,因此就叫集線器。
所以可以理解,大家常逛的 Github,Docker Hub, 還有P**hub ,都是為了表達它們是某類資源的中心了吧。
那么集線器是什么呢?那就要從電腦是怎么互聯的這個話題說起。
小學的時候,有一種網吧,它其實是不能上外網的。也就是不能打開度娘,不能搜索資料。
不能上網的網吧還能叫網吧?
能。雖然不能上外網,但網吧老板可以把很多臺機子連起來,實現網吧內互聯,形成一個局域網(Local Area Network,簡稱LAN)。
網吧內互聯之后,就可以放上各種游戲,比如CS,實現網吧內對線。
這種網吧有種好處,沒有那么多鍵盤俠。
畢竟你不知道什么時候鍵著鍵著,對方就順著網線找過來了。
對戰直接從線上轉移到線下了。
因此大家打游戲都很和諧,客氣,場面十分感人就是了。
那么網吧內的電腦是怎么互聯呢?
一根網線互聯電腦
從最簡單的場景說起,假設網吧內只有兩臺電腦
兩臺電腦互聯
隨便連根網線就能實現互聯嗎?
當然不是。
還記得網絡分層嗎?
數據如果要進行傳輸,會從A電腦經過這些網絡分層把消息組裝好,再到B電腦層層解包。
網線,只是代替了上面的灰色部分,實現物理層上互聯。
如果想要兩臺電腦互聯成功,還需要確保每一層所需要的步驟都要做到位,這樣數據才能確保正確投送并返回。
我們自頂向下,從細節開始說一下實現互聯需要做什么。
應用層
該層的網絡功能由應用本身保證。
假設兩臺電腦是打算用游戲進行聯網,那么該應用層的功能由游戲程序保證。
傳輸層
絕大部分游戲用的傳輸層協議都是TCP,我們可以看下TCP報頭。
這里面我們需要關注的是源和目的端口,這個可以定位到這臺電腦上哪個進程在收發數據。
這兩個端口信息一般是游戲內部已經填好。
AB兩臺電腦,其中一臺作為服務端啟動,比如A,起了個服務器進程。
服務器會開放一個固定的端口,比如27015。這就是目的端口。
這時候A和B都可以搜索到這個服務器。啟動一個客戶端進程,連接進入A的服務器進程。
而源端口,則由A和B自己生成。
網絡層
上圖除了端口,我們還看到一個192.168.0.105,這個就是A的IP地址。
我們看一下IP層的報文頭。
這里面需要關注是源和目的IP地址。
如果兩臺電腦想通過一根網線進行消息通信,那么他們需要在一個局域網內。
這意味著,他們的子網掩碼需要一致。局域網內,假設子網掩碼是 225.225.225.0,會認為 192.168.0.x 這些IP都屬于一個局域網。所以當A的IP地址是192.168.0.105 時,那么B的IP地址可以配成192.168.0.106 。
關于IP這一塊是啥,后面會細講,大家如果沒明白我說的是啥,不要急。
組裝好網絡層報頭后,數據包傳入到數據鏈路據層。
數據鏈路層
以上解決了網絡層的互聯,而在數據鏈路層,數據包里需要拼接上MAC報頭。先看下MAC報頭長什么樣子。
其中需要關心的是標紅的源和目的MAC地址。MAC地址可以粗略理解是這臺電腦網卡的唯一標識。大概長這樣
28:f9:d3:62:7d:31
源和目的地址,在發送消息的時候就會被填上。
但是A只知道自己的MAC地址,怎么才能知道B的MAC地址呢?
這時候需要ARP協議。
ARP(Address Resolution Protocal),即地址解析協議。用于將IP地址解析為以太網的MAC地址的協議。
在局域網中,當主機A有數據要發送給主機B時,A必須知道B的IP地址。
但是僅僅有IP地址還是不夠的,因為IP數據報文還需要在數據鏈路層封裝成幀才能通過物理網絡發送。因為發送端還必須有接收端的MAC地址,所以需要一個從IP地址到MAC地址的映射。ARP就是干這事情的協議。
A查本地ARP表發現B的IP和MAC映射關系不存在
A通過ARP廣播的形式向局域網發出消息,詢問某IP對應的MAC地址是多少。比如A此時知道B的IP,但并不知道B的MAC地址是多少,就會嘗試在局域網內發起ARP廣播,詢問局域網下所有機器,哪個機器的IP與B的IP一致。
B收到這個ARP消息,發現A要問的IP與自己的IP一致,就會把自己的MAC地址作為應答返回給A。
此時A就知道了B的MAC地址,順便把消息記錄到本地ARP表里,下次直接用表里的關系就行,不需要每次都去問。
物理層
從數據鏈路層到物理層,數據會被轉為01比特流。
此時需要把比特流傳到另一臺電腦。
通過一根網線,兩段水晶頭插入網口,把兩臺電腦連起來。
但對網線有一些要求。
這根網線兩端的水晶頭需要采用交叉互聯法。
水晶頭里有8根線,注意上圖里的顏色,是有順序的。第1、2根線起著收信號的作用,而第3、6腳發信號的作用。將一端的1號和3號線、2號和6號線互換一下位置,就能夠在物理層實現一端發送的信號,另一端能收到。
當然,現在有些網卡有自適應的功能,就算是直連互聯法的線,也能有交叉互聯法的效果。如果你用的是這種網卡,就當我物理層這塊什么都沒說吧。
互聯
此時,在確保關閉防火墻的前提下,可以嘗試從A電腦中ping一下B,再從B電腦中ping一下A。如無意外,都能ping通。
A給B發個消息,從應用層到數據鏈路層,會分別加上A和B的各種''身份信息"。比如在傳輸層會加上A和B的應用端口號,在網絡層加上源和目的IP,在數據鏈路層會加上源和目的網卡的MAC頭部信息。
B收到消息后逐層解包,驗證,最后順利到達應用層。實現AB兩臺機器消息互通。
至此游戲就能正常聯機對線,兩臺電腦互聯成功!
什么是集線器
兩個人打cs,總會覺得無聊,但是每臺電腦又只有一個網線口。
想要邀請更多的人一起玩,怎么辦?
那就要回到文章開頭提到的集線器(hub)了。
這是個工作在物理層的設備。
有多個網口,很好的解決了電腦上只有一個網口的問題,可以做到多臺電腦的網線都插入到集線器上。
同時工作原理也非常簡單,會把某個端口收到的數據,輸入到中繼電路。
中繼電路的基本功能是將輸入的信號廣播到集線器的所有端口上。
簡單來說就是無腦復制N份到其余N個端口上。
數據復制到N個端口后。對應轉發到N臺機器里。
集線器內部結構
說到這里,已經對集線器有個大概認識了。
接下來,我們看下集線器的內部結構。
從A網口進入集線器的消息,此時還是電信號。這里經過一個PHY模塊。
要理解PHY模塊的作用,首先要先了解每個網口,都可能接著網線(廢話),而每根網線的傳輸的格式都是有可能不同的。而PHY的作用,就是把這些格式轉化為一個通用的格式。
舉個例子。PHY就好比一個翻譯器,有的人說英文,有的人說日文。但是PHY,會把它統一轉為普通話,給內部電路處理。內部電路處理完之后,再經過PHY模塊,轉為英語,或日文從對應網口里輸出。
經過PHY的處理后,以電信號的形式輸入到中繼電路,被無腦廣播,再次經過PHY模塊后變成BCD網口的格式輸出。
這里面的電信號,是會受噪聲干擾,導致信號形變出錯的。
但就算是錯了,也還是會原封不動的廣播出去,這就是上面提到無腦的精髓所在。
那信號如果出錯了怎么辦?
只能讓接收方收到消息后進行校驗。
還記得上文里提到的數據鏈路層的MAC報頭里最末尾有個FCS嗎?
FCS里存放的是發送方通過循環冗余校驗CRC計算得到的值。
接收方用收到的數據算一次CRC,與FCS里的值進行對比。
如果一致,那證明數據沒問題。如果出錯,則直接丟棄。
當然,丟棄包并不會影響數據的傳輸, 因為丟棄的包不會觸發確認響應。因此協議棧的 TCP 模塊會檢測到丟包, 并對該包進行重傳。
如果消息沒出錯,但是因為無腦廣播,C也能收到A發給B的數據包。
此時 C 會在接受到數據包后一層層的"剝開"。
正常情況下,在數據鏈路層時,識別到目的 MAC 地址跟 C 的不一致時,也會把數據丟棄。
什么是交換機
目前只有 ABC 三臺機器,每次都是廣播發消息倒還好。
如果機器越來越多,每臺機器發一條消息,都會被廣播,就有點頂不住了。
舉個例子。
假設N臺機器,其中兩臺機器A和B,A發到B和B發給A,共兩條消息。
如果這N臺機器,用的是集線器。還是AB之間互發消息,每條消息都是廣播的話,就是(N-1)+(N-1)條消息,差距有些大,對網絡資源浪費就有些嚴重了。
那么,有沒有可能做到,A發給B的消息,就不要轉發給C呢?
可以的,把集線器換成交換機。
交換機,又叫switch,跟集線器長得很像。
但是功能更強一些,從網絡分層上來說,屬于數據鏈路層,比集線器所在的物理層還要高一層。
所有發到交換機的數據,都會先進入交換機的緩存區。接著消息再被轉發到對應機器上。
注意這里用的是轉發,而不是集線器的廣播,交換機是怎么做到轉發的呢?
MAC地址表
交換機內部維護了一張MAC地址表。
記錄了 端口號和MAC地址的對應關系。
這個表的數據是交換機不斷學習的結果。
當A發消息到交換機時,交換機發現消息是從1號端口進來的,則會在MAC地址表上,記錄A的MAC地址對應1號端口。
如果A沒有很長時間沒發消息到這個1號端口,那這條記錄就會過期并被刪除。
那么,當時間足夠長,ABC 都發過消息給交換機后,地址表就會有完整的關系信息。
A準備發送消息給B,此時A會把B的MAC地址,放入要發送的數據里。數據順著網線發出。
交換機從端口收到數據,會把數據里的源和目的MAC地址提出來,跟MAC地址表進行對比。
發現B的MAC地址正好在2號端口,那么就把數據轉發給2號端口。
此時B電腦從網線收到來自交換機2號端口的數據。
兩種特殊情況
正常流程很清楚了,看兩個特殊情況:
交換機查詢地址表時,發現目的 MAC 地址的目標端口和這個包的源端口,是同一個端口,怎么辦?
先說結論,會直接丟棄這個包。
我們看下,假設它不丟棄,會發生什么情況。
A發了個消息給B,中間經過一個集線器,此時消息會被廣播到B和交換機。
此時B收到第一條A發給它的消息
交換機從1號端口收到A的消息后,解包,獲得目的MAC地址是BB-BB-BB-BB-BB-BB。查MAC地址表,發現要發到1號端口。此時,源和目的端口都是同一個,如果交換機不丟棄這個消息,B會收到第二條A發給它的消息。
A只發了一次消息,B卻收到兩條消息,明顯不對。
因此,當交換機查詢地址表時,發現目標端口和源端口,是同一個端口時,會丟棄這個包。
MAC地址表里找不到對應的MAC地址,怎么辦?
這可能是因為具有該地址的設備,還沒有向交換機發送過包,或者這個設備一段時間沒有工作,導致地址被從地址表中刪除了。
這種情況下,交換機無法判斷應該把包轉發到哪個端口,只能將包轉發到除了源端口之外的所有端口上,無論該設備連接在哪個端口上,都能收到這個包。
此時,交換機就會跟集線器一樣進行廣播。
發送了包之后目標設備會作出響應,只要返回了響應包,交換機就可以將它的地址寫入地址表,下次也就不需要把包 發到所有端口了。
交換機內部結構
再看下交換機內部結構。
其實對比可以發現,交換機和集線器內部結構很像。
重點需要提到的是MAC模塊。消息以電信號的形式從網口進入,到了PHY會被轉成通用格式的電信號。而MAC模塊的作用是把這個電信號轉為數字信號,這樣就能提取出MAC包頭,并通過MAC數據幀末尾的FCS校驗這個包有沒有問題,如果沒問題,則把數據放到內存緩沖區里,否則直接丟棄。
另外,這個MAC模塊,雖然這么叫。但其實交換機MAC模塊不具有 MAC 地址。因此交換機的端口不核對接收方 MAC 地址,而是直接接收所有的包并存放到緩沖區中。
放入到內存緩沖區后,還會把MAC地址和端口號記錄到MAC地址表中。同時檢查目的MAC地址在不在MAC地址表中,在的話則會轉發到對應端口。否則廣播。
交換機與網橋的區別
網橋,本質上可以理解為兩個網線口的交換機,正好可以把兩臺電腦給連起來,也叫橋接。而交換機,則是多網線口的網橋,可以把多臺電腦給連(橋接)起來。
其他功能方面,大差不差,不必太過糾結。
交換機和二層交換機和三層交換機有什么區別
這一部分提到的交換機,其實就是二層交換機,也就是工作在第二層(數據鏈路層)的交換機,二者沒區別。
而三層交換機,是工作在第三層(網絡層)的交換機,其實就是接下來要提到的路由器。
什么是路由器
有了交換機之后,小網吧里的電腦就都可以被連起來了。交換機網口不夠?那就再接個交換機。
但世界上電腦這么多,交換機里的MAC地址表難道全都要記住嗎?
顯然做不到。為了解決這個問題。
于是就有了路由器,工作在網絡層,比數據鏈路層更高一層。
網絡層引入了IP的概念。
什么是IP
比如前面提到的 192.168.0.105 就是一個IP,同一個局域網內還可能會有一個IP是192.168.0.106。有沒有發現,它們都是192.168.0.xxx。
像極了 上海市.黃浦區.南京東路.105號,這樣的地址。現實生活中,我們可以通過一個地址定位到要去哪。到了 上海市.黃浦區.南京東路.105號樓里,我們就可以再去找某個叫身份證為xiaobaixxxxx的人。
那互聯網世界里,我們也就可以通過IP地址,定位到某個廣域網段,再通過廣域網內部的局域網的MAC地址定位到具體某個電腦。
上海市.黃浦區.南京東路.105號可以幫助我們定位到在南京東路上的第105號樓的位置。但還有些路,比如南京西路,可能不止105號,可能要到257號。
實際上一個IP由網絡號和主機號組成,共32位組成。如果拿了前面24位做網絡號,那主機號就剩8位了,2的8次方=256,最多表示表示256號樓。因此為了多表示幾個樓,可以向網絡號多挪幾位過來作為主機號。
那么具體多少位作為網絡號呢?可以在IP后面加一個數字,用來表明這一點。
于是就有了 192.168.0.105/24這種表示方法,表明前24位192.168.0.0是網絡號,105是主機號。
有了網段,就可以一次性表示一大批地址。就不需要像交換機那樣苦哈哈的一條一條MAC地址記錄在表里。
路由表
路由器的作用,可以幫助我們在互聯網世界里轉發消息到對應的IP。
對比一下。
交換機,是通過 MAC 頭部中,接收方 MAC 地址,來判斷轉發目標的。
路由器,則是根據 IP 頭部中, IP 地址來判斷的。
由于使用的地址不同,記錄轉發信息的表也會不同。
類似交換機的MAC地址表,路由器也維護了一張路由表。
而路由表,是用于告訴路由器,什么樣的消息該轉發到什么端口。
假設A要發消息到D。也就是192.168.0.105/24要發消息到192.168.1.11/24。
那么A會把消息經過交換機發到路由器。
路由器通過192.168.0.105/24獲得其網絡號是 192.168.0.0 ,而目的地的網絡號是192.168.1.0,二者網絡號不同,處于不同局域網。
查路由表,發現192.168.1.0,在e2端口,那么就會把消息從e2端口發出,到達交換機,交換機發現MAC地址是它局域網下的D機器,就把消息打過去。
當然,如果路由表里找不到,那就打到默認網關吧,也就是從e1口發出,發到IP192.0.2.1。這個路由器的路由表不知道該去哪,說不定其他路由器知道。
路由器的內部結構
路由器內部,分為控制平面和數據平面,說白了就是對應軟件部分和硬件部分。
硬件部分跟交換機很像。數據從A網口進入,此時數據還是網線上格式的電信號,會被PHY模塊轉為通用信號格式,再被MAC模塊轉為數字信號,通過FCS進行錯誤校驗,同時校驗MAC地址是否是自己,通過校驗則進入內存緩沖區,否則丟棄。
再進入軟件部分,由路由選擇處理器,通過一定規則(軟件邏輯),查詢路由表判斷轉發目標和對應轉發口,再經由硬件部分的交換結構轉發出去。
如果路由表中無法找到匹配記錄,路由器會丟棄這個包,并通過ICMP消息告知發送方。
路由器和交換機的主要區別
MAC模塊的區別
路由器和交換機不同點在于,它的每個網口下,都有一個MAC地址和IP地址。
正因為路由器具有 MAC 地址,因此它能夠成為數據鏈路層的的發送方和接收方。
怎么理解這句話?
前面提到交換機,是不具備MAC地址的,而MAC報頭是需要填上目的MAC地址的。因此交換機從來都不是數據的目的地,它只簡單轉發數據幀到目的地。
但路由器,是有MAC地址的,因此MAC報頭就可以寫上,下一站目的地就是xx路由。
到了路由器后,路由器可以再次組裝下一站的目的MAC地址是再下一個路由,通過這一點,讓數據在路由和路由之間傳輸。
而同時因為交換機不具有MAC地址,因此也不會校驗收到的數據幀的MAC地址是不是自己的,全部收下做轉發。而路由器則會校驗數據幀的MAC報頭里的目的MAC地址是不是自己,是的話才會收入內存緩沖區,否則丟棄。
找不到轉發目的地時的處理方式有區別
如果在路由表中無法找到匹配的記錄,路由器會丟棄這個包,并通過 ICMP消息告知發送方。
而交換機在MAC地址表里找不到轉發端口時會選擇廣播。
這里的處理方式兩者是不同的,原因在于網絡規模的大小。
交換機連接的網絡最多也就是幾千臺設備的規模,這個規模并 不大。如果只有幾千臺設備,遇到不知道應該轉發到哪里的包,交換機可以將包發送到所有的端口上,雖然這個方法很簡單粗暴,但不會引發什么 問題。
但路由器工作的網絡環境就是互聯網,全世界所有的設備都連接在互聯網上,規模非常大,并且這個規模還在持續擴大中。如果此時它的操作跟交換機一樣,將不知道應該轉發到哪里的包發送到整個網絡上,那就會產生大量的網絡包,造成網絡擁塞。因此,路由器遇到不知道該轉發到哪里的包, 就會直接丟棄。
路由器和光貓有什么區別
不管是交換機還是路由器,前面都是提到網口輸入的是電信號。但現在流行的是光纖傳輸,傳輸的是光信號。
而光貓(modem),是一種調制解調器,其實就是用于光電信號轉換的設備。
接收數據時,可以將光纖里的光信號轉化為電信號,發給路由器,路由器內部再轉成數字信號,并在此基礎上做各種處理。
相反,也會把路由器傳來的電信號轉為光信號,發到光纖,并進入互聯網。
總結
兩臺電腦可以通過一根網線直接連接,進行通信。
機器一多,可以把網線都接到集線器(物理層)上,但是集線器會不管三七二十一進行廣播。
不想廣播,可以用(二層)交換機(數據鏈路層),又叫多端口網橋,它比較聰明,會自我學習生產MAC地址表,知道消息發到哪,那就不需要廣播啦
互聯網電腦這么多,交換機MAC地址表總不能全放下吧。改用路由器(網絡層),也叫三層交換機,通過網段的方式定位要把消息轉發到哪,就不需要像交換機那樣苦哈哈一條條記錄MAC地址啦。
路由器和光貓之間是好搭檔,光貓負責把光纖里的光信號轉換成電信號給路由器。
現在一般情況下,家里已經不用集線器和交換機了,大部分路由器也支持交換機的功能。所以可以看到,家里的臺式機電腦一般就連到一個路由器,再連個光貓就夠能快樂上網了。
最后
以前整個班的同學家里都不見得有一臺電腦,都喜歡偷偷跑去網吧玩電腦。改革開放的春風,把電腦吹進了每家每戶,也把網吧給吹成了網咖。
從前的我晚上偷偷上網,現在的我,接到報警,也能在大半夜爬起來網上沖浪。
沒想到我以這種方式保持了當初最純粹的質樸。
更多信息可以來這里獲取==>>電子技術應用-AET<<
電子技術應用專欄作家 一口linux
原文鏈接:https://mp.weixin.qq.com/s/t7vomHGTMJ179XTmuJjDqQ