故事就從一個車轱辘說起吧。先來看一個車轱辘。
輻條從車轱辘邊緣,一直彙聚到 中心的軸,這個軸在英文裡叫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地址可以粗略理解是這台電腦網卡的唯一标識。大概長這樣
br28: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就是幹這事情的協議。
從數據鍊路層到物理層,數據會被轉為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地址啦。
- 路由器和光貓之間是好搭檔,光貓負責把光纖裡的光信号轉換成電信号給路由器。
- 現在一般情況下,家裡已經不用集線器和交換機了,大部分路由器也支持交換機的功能。所以可以看到,家裡的台式機電腦一般就連到一個路由器,再連個光貓就夠能快樂上網了。
以前整個班的同學家裡都不見得有一台電腦,都喜歡偷偷跑去網吧玩電腦。改革開放的春風,把電腦吹進了每家每戶,也把網吧給吹成了網咖。
從前的我晚上偷偷上網,現在的我,接到報警,也能在大半夜爬起來網上沖浪。
沒想到我以這種方式保持了當初最純粹的質樸。
我是小白,看下右下角,你懂我意思的。
夏天快來了,我們下期見。
參考資料網絡是怎麼連接的 - 戶根勤
趣談網絡協議- 極客時間
别說了,一起在知識的海洋裡嗆水吧,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!