文章持續更新,能夠微信搜一搜「golang小白成長記」第一時間閱讀,回覆【教程】獲golang免費視頻教程。本文已經收錄在GitHub github.com/xiaobaiTech… , 有大廠面試完整考點和成長路線,歡迎Star。git
故事就從一個車軲轆提及吧。先來看一個車軲轆。github
輻條從車軲轆邊緣,一直匯聚到 中心的軸,這個軸在英文裏叫hub。golang
而咱們今天要講到的集線器,英文裏也叫hub。面試
都叫hub,多少有點關係,看下這面這個圖大概能明白,其實二者有點像。shell
大概想表達的意思是,它是匯聚網線的中心,所以就叫集線器。緩存
因此能夠理解,你們常逛的 Github,Docker Hub, 還有P**hub ,都是爲了表達它們是某類資源的中心了吧。服務器
那麼集線器是什麼呢?那就要從電腦是怎麼互聯的這個話題提及。微信
小學的時候,有一種網吧,它實際上是不能上外網的。也就是不能打開度娘,不能搜索資料。markdown
不能上網的網吧還能叫網吧?網絡
能。雖然不能上外網,但網吧老闆能夠把不少臺機子連起來,實現網吧內互聯,造成一個局域網(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根線,注意上圖裏的顏色,是有順序的。第一、2根線起着收信號的做用,而第三、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地址的對應關係。
這個表的數據是交換機不斷學習的結果。
當A發消息到交換機時,交換機發現消息是從1號端口進來的,則會在MAC地址表上,記錄A的MAC地址對應1號端口。
若是A沒有很長時間沒發消息到這個1號端口,那這條記錄就會過時並被刪除。
那麼,當時間足夠長,ABC 都發過消息給交換機後,地址表就會有完整的關係信息。
正常流程很清楚了,看兩個特殊狀況:
先說結論,會直接丟棄這個包。
咱們看下,假設它不丟棄,會發生什麼狀況。
A只發了一次消息,B卻收到兩條消息,明顯不對。
所以,當交換機查詢地址表時,發現目標端口和源端口,是同一個端口時,會丟棄這個包。
這多是由於具備該地址的設備,尚未向交換機發送過包,或者這個設備一段時間沒有工做,致使地址被從地址表中刪除了。
這種狀況下,交換機沒法判斷應該把包轉發到哪一個端口,只能將包轉發到除了源端口以外的全部端口上,不管該設備鏈接在哪一個端口上,都能收到這個包。
此時,交換機就會跟集線器同樣進行廣播。
發送了包以後目標設備會做出響應,只要返回了響應包,交換機就能夠將它的地址寫入地址表,下次也就不須要把包 發到全部端口了。
再看下交換機內部結構。
其實對比能夠發現,交換機和集線器內部結構很像。
重點須要提到的是MAC模塊。消息以電信號的形式從網口進入,到了PHY會被轉成通用格式的電信號。而MAC模塊的做用是把這個電信號轉爲數字信號,這樣就能提取出MAC包頭,並經過MAC數據幀末尾的FCS校驗這個包有沒有問題,若是沒問題,則把數據放到內存緩衝區裏,不然直接丟棄。
另外,這個MAC模塊,雖然這麼叫。但其實交換機MAC模塊不具備 MAC 地址。所以交換機的端口不覈對接收方 MAC 地址,而是直接接收全部的包並存放到緩衝區中。
放入到內存緩衝區後,還會把MAC地址和端口號記錄到MAC地址表中。同時檢查目的MAC地址在不在MAC地址表中,在的話則會轉發到對應端口。不然廣播。
網橋,本質上能夠理解爲兩個網線口的交換機,正好能夠把兩臺電腦給連起來,也叫橋接。而交換機,則是多網線口的網橋,能夠把多臺電腦給連(橋接)起來。
其餘功能方面,大差不差,沒必要太過糾結。
這一部分提到的交換機,其實就是二層交換機,也就是工做在第二層(數據鏈路層)的交換機,兩者沒區別。
而三層交換機,是工做在第三層(網絡層)的交換機,其實就是接下來要提到的路由器。
有了交換機以後,小網吧裏的電腦就均可以被連起來了。交換機網口不夠?那就再接個交換機。
但世界上電腦這麼多,交換機裏的MAC地址表難道全都要記住嗎?
顯然作不到。爲了解決這個問題。
因而就有了路由器,工做在網絡層,比數據鏈路層更高一層。
網絡層引入了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地址和IP地址。
正由於路由器具備 MAC 地址,所以它可以成爲數據鏈路層的的發送方和接收方。
怎麼理解這句話?
前面提到交換機,是不具有MAC地址的,而MAC報頭是須要填上目的MAC地址的。所以交換機歷來都不是數據的目的地,它只簡單轉發數據幀到目的地。
但路由器,是有MAC地址的,所以MAC報頭就能夠寫上,下一站目的地就是xx路由。
到了路由器後,路由器能夠再次組裝下一站的目的MAC地址是再下一個路由,經過這一點,讓數據在路由和路由之間傳輸。
而同時由於交換機不具備MAC地址,所以也不會校驗收到的數據幀的MAC地址是否是本身的,所有收下作轉發。而路由器則會校驗數據幀的MAC報頭裏的目的MAC地址是否是本身,是的話纔會收入內存緩衝區,不然丟棄。
若是在路由表中沒法找到匹配的記錄,路由器會丟棄這個包,並經過 ICMP消息告知發送方。
而交換機在MAC地址表裏找不到轉發端口時會選擇廣播。
這裏的處理方式二者是不一樣的,緣由在於網絡規模的大小。
交換機鏈接的網絡最多也就是幾千臺設備的規模,這個規模並 不大。若是隻有幾千臺設備,遇到不知道應該轉發到哪裏的包,交換機能夠將包發送到全部的端口上,雖然這個方法很簡單粗暴,但不會引起什麼 問題。
但路由器工做的網絡環境就是互聯網,全世界全部的設備都鏈接在互聯網上,規模很是大,而且這個規模還在持續擴大中。若是此時它的操做跟交換機同樣,將不知道應該轉發到哪裏的包發送到整個網絡上,那就會產生大量的網絡包,形成網絡擁塞。所以,路由器遇到不知道該轉發到哪裏的包, 就會直接丟棄。
無論是交換機仍是路由器,前面都是提到網口輸入的是電信號。但如今流行的是光纖傳輸,傳輸的是光信號。
而光貓(modem),是一種調制解調器,其實就是用於光電信號轉換的設備。
接收數據時,能夠將光纖裏的光信號轉化爲電信號,發給路由器,路由器內部再轉成數字信號,並在此基礎上作各類處理。
相反,也會把路由器傳來的電信號轉爲光信號,發到光纖,並進入互聯網。
之前整個班的同窗家裏都不見得有一臺電腦,都喜歡偷偷跑去網吧玩電腦。改革開放的春風,把電腦吹進了每家每戶,也把網吧給吹成了網咖。
從前的我晚上偷偷上網,如今的我,接到報警,也能在大半夜爬起來網上衝浪。
沒想到我以這種方式保持了當初最純粹的質樸。
我是小白,看下右下角,你懂我意思的。
夏天快來了,咱們下期見。
網絡是怎麼鏈接的 - 戶根勤
趣談網絡協議- 極客時間
關注公衆號:【golang小白成長記】