通訊P.05:資料鏈結層 LLC MAC
前情提要在上一章我們詳細介紹了實體層,以及實體層會遇到什麼問題用什麼技術解決。這次介紹資料鏈結層,以及會遇到什麼問題用什麼技術解決
資料鏈結層:資料聯結層(Data link layer)這一層是比較特殊的一個階層,因為底下是實體的定義,而上層則是軟體的定義。因此又分兩個子層。偏向硬體的子層稱為MAC,偏向軟體的子層稱為LLC,而這些子層業務分別是產生表頭2和表尾2
所以資料鏈結層可以分為兩個層,其細分結果如下:OSI 第三層 -> OSI 第二層 的 LLC 層 -> OSI 第二層的 MAC層 -> OSI 第一層
MAC:該層主要提供兩個業務
尋址機制
通道訪問控制機制
Ex:假設今天你和你哥都用同一台中華電信ADSL,你們的IP就是一樣的,那麼今天老媽在外面要傳送一封信給你,可是你們IP位置一樣,那ADSL是怎麼知道這個封包要傳給你還是你哥,其實很簡單,就是這個封包到你家的ADSL,之後再根據MACAddress去判斷是要給誰(尋址機制要找到的對象)。而因為你和你哥都用同一台ADSL,也就說明外面資料連到ADSL的線只有一條,那麼就必須檢查這個通道是否被正 ...
通訊P.04:實體層 傳輸技術 調變
🥜 前情提要在上一章我們提到了無論是有線還是無線,工程師研發了很多技術,來讓使用效率、可靠性、公平性等等來提高,那麼在這些複雜技術的背後,就是基於三個基本概念,調變、多工、雙工。
調變:發送端將原始資料混入高頻率的波,透過高頻率的波傳送出去,被稱為「調變(Modulation)」,而高頻率的波最容易產生的方式就是電磁波,所以以下調變技術的高頻率的波都是在說電磁波。
解調:接收端將接收的高頻率的波,取出其中的原始資料稱為「解調(Demodulation)」。
多工:多人共同使用一條資訊通道的方法,就像是家裡的WiFi,你也連線,你爸也連線,你哥也連線,請問只有一條資訊通道要怎麼同時給這麼多人用,多工就是為了解決這問題,主要負責讓這條通道更有效率的使用並且更公平的分配。
調變方案那麼我們今天來討論如何實現這些技術,首先根據傳輸方式主要分為類比(電磁波)和數位(電線),而資料也可以區分為類比(麥克風、溫度)和數位(文字、數字),故總共會有4種搭配,其每種搭配都有其數據傳輸的技術:
類比訊號->類比傳輸:科學家發現低頻率的波無法傳遞得很遠,很容易被干擾,於是研發了振幅調變(AM)、頻率 ...
通訊P.03:實體層 介質 電磁波
🥜 前情提要在上一回中,我們介紹了什麼通訊模組有哪七層,每層在做什麼,今天來特別展開聊聊每一層,先從第一層,實體層。
實體層:電腦之間要傳輸訊息,必須透過實體連線(無論有線或無線傳輸)的銜接,將資料轉換成訊號傳遞給對方。而其牽涉到使用的傳輸介質、傳輸類型、傳送技術等等。
今天你用嘴巴說出”Lucas”,之後聲波傳遞到別人的耳廓,你的嘴巴就是發送端的實體層,聲波就是介質,別人的耳廓就是接收端的實體層。
傳輸介質:今天要傳送一個封包,那這個封包要麼傳?用無線還是有線通訊,那麼對應的設備、介質是什麼?
有線通訊:雙絞銅線:有線通訊的一種介質,將兩根絕緣銅導線按一定規格互相旋轉絞在一起(能有效降低射頻干擾-RFI),使用電流傳導來傳遞訊號,容易受電磁波干擾。為了解決問題,於是有了遮蔽式雙絞線(STP)和無遮蔽式雙絞線(UTP)
STP:因有銅網或銅箔環繞保護干擾低,但是不容易佈線並且比較貴。
UTP:費用便宜也容易佈線,因此常用於RJ45接頭的傳輸介質,是目前乙太網路最常用的線材。
同軸電纜:有線通訊的一種介質,由一根銅線製成內導線傳遞訊號,先包覆一層絕緣體,外面再包覆網狀導體防止電 ...
通訊P.02:OSI 通訊模組 封包
🥜 前情提要在上一回中,我們介紹了什麼是協定,以及私自制定協定的下場會是什麼,這回介紹最有名的協定,通訊模組。
通訊協定模型 OSI模型:上回的舉例,時間定義、嘟聲定義,都是平日生活的協定,但是整個通訊傳輸(包含網路傳輸)的協定,都是基於一個模型而制定的,包含802系列的協定制定模型的單位是ISO組織,該模型大概長這樣
今天我要傳遞資料給別人,就必須經過這七層,而這七層,每層都會進行特別處理,就像是日常生活,假設我是A公司的老闆,我要寫信給B公司,就會經過七層進行處理,每層都會進行各自的業務,情況如下
而恰巧這個模式剛好符合OSI七層,只是每層要做的事情,如下圖:
所以可以把七層視為七隻程式或產品,每隻程式或產品要做的事情都不一樣,而今天我要傳送一封信,那麼信的內容就叫做封包,而每層處理完自己的業務,都會把業務成果放在封包前後(除了實體層,因為實體層業務是傳輸),放置於前面的叫做表頭,放置於後面的叫做表尾
就像是
老闆寫完信後,放入信封,給予總經理寫建議
總經理寫完後,又拿個信封包起來,給予部長寫風險評估
部長寫完後,又拿個信封包起來….etc
最後傳到B公司,B公司在一層一層的 ...
通訊P.01:協定 ISO WiFi
協定:為了要讓所有設備都能夠相互交互資料,我們必須要有一個協定,假設你要跟一個人聊天,那麼你們勢必要用同一種語言才能進行溝通,協定亦是如此,更何況網路傳輸的是一堆0和1,那麼你協定也必然要定義前8個0和1是代表什麼意思,後20個0和1是代表什麼意思,這就是網路傳輸的協定
制定協定的組織:今天你要跟我溝通,我們可以建立一個協定,你:Lucas好帥,今天天氣怎樣我:蔡依林好美,今天很冷我們制訂了一個協定
當你說出關鍵字Lucas好帥,就是與我對話
當我說出蔡依林好美,就是我在跟你說話
而如果你沒說Lucas好帥,我就不知道你在跟誰講話?是在跟王力宏還是馬英九講話?這就是一個簡單協定。
但是這個協定只有你和我知道,所以要讓其他人知道,我們的話語權不夠,於是制定協定的人,必須是公信力的大組織,以下舉例:
國際電信聯盟(ITU):聯合國分支機構主要負責確立國際無線電和電信的管理制度與通訊規則,主要包括下列三個委員會
世界頻率註冊委員會(IFRB)
國際無線電委員會(CCIR)
國際電報電話咨詢委員會(CCITT)
這邊舉個例子,為什麼我們撥打電話時候都會有嘟聲,而長嘟聲和短嘟聲都有特別意 ...
前端P.14:單元測試 Mocha Test
🥜 前情提要在上一回中,我們介紹了前端在CI/CD中很常使用的工具 WebPack,今天介紹另一個工具單元測試。
單元測試(Unit Test):就是以程式中最小的邏輯單元寫測試程式,來驗證邏輯是否正確。一般來說,程式中最小的邏輯單元是函式(function),或方法(method)。
為什麼要做 Unit Test?
今天流程是: 拿杯子 -> 裝熱水 -> 拿熱水壺 -> 倒入水杯,如果因為修改了拿杯子這個函數,導致後面三個函數都執行失敗,於是你從倒入水杯往回追,浪費一堆時間。所以為了避免Bug的連動性,盡早知道是 拿杯子 這個單元錯誤。
更快速指出問題點、並顯示正確的是什麼,減少Code Review時間。
先搞懂自己的code要做什麼。然後再讓它完成任務。
先寫測試強迫你寫code前先做規劃
Mocha:以上就是單元測試的說明,那麼我來回顧,首先我們知道怎麼運用WebPack將我們的程式打包再一起,但是沒有進行單元測試,所以只能靠出版後才知道有問題,知道問題後CodeReview一段時間才知道,哪個函數錯誤、應該要出現的結果等等,明顯浪費了一些時 ...
前端P.13:WebPack Loader Plugins
🥜 前情提要在上一回中,我們提到NodeJS可以安裝一些工具,幫助我們開發和出版,這邊介紹一下前端在CI/CD中很常使用的工具 WebPack。
WebPack:對於早期的前端來說,因為硬體和軟體的發展水平,當時開發很簡單,但是現代的前端使用了很多NodeJS工具實做前端,所以出版程式碼,就要使用一堆工具,情況如下
1234執行tsc執行bable執行gulp執行....
明顯很愚蠢,所以有了WebPack。
Webpack是一個模組打包器,他可以集成很多翻譯或是預處理的工具,像是 TypeScript、Babel、SASS …etc。
Webpack是一個具有多功能的優化工具,他可以幫助你 壓縮、複製、清除、抽取…etc。
總之WebPack的目的就是取代你那10幾個工具,因為WebPack自己就有集成那些知名的工具(Loader),讓你使用這些工具更輕鬆容易。
WebPack的Config功能:根據官網介紹必須要有個檔案叫做webpack.config.js,其檔案裡面應該要寫這些配置。
這些配置主要就是敘述:
entry:定義輸入資源,把你要處理的js檔案放到這 ...
前端P.12:NodeJS V8 NPM
🥜 前情提要在上一回中,我們提到模組的概念,而很多模組和工具都是基於,NodeJS這個可以讓JavaScript運行的新環境,這回就特別介紹NodeJS吧。
NodeJS:
NodeJS對於後端來說可以當作Server
NodeJS對於前端來說可以當作開發環境
首先要解釋NodeJS,我們必須在簡單介紹一下V8引擎,V8除了对JavaScript性能的大幅提升,還提供了”嵌入”的功能,簡單說就是能夠使用JavaScript語言來實現C++功能,其中包含讀取本地文件功能。而NodeJS就是使用V8來實作,對於後端可以當作Server但是此處不討論,此處我們討論很多人使用NodeJS開發初一些特出的工具,而這些工具是什麼?要怎麼下載?要怎麼呼叫? … 等等一系列問題。
NVM:首先NodeJS一直改版,所以如果使團隊開發的話我們必須統一使用什麼NodeJS版本,所以有種工具應運而生NVM。NVM開源庫,NVM Windows版本的Release使用者可以去NVM Windows版本的Release下載該工具的安裝程式,根據Git Hub說明進行操作:
根據團隊規定要使用哪種版本,輸入 ...
前端P.11:模組 CommonJS ESM
🥜 前情提要在上一回中,我們提到使用別人的模組亂操作的下場,所以使用閉包來避免讓別人亂操作,但是模組這東西在JavaScript又是個災難。今天就來解析吧。
模組:因為在ES6之前還沒有模組化標準給大家用,在ES6之前都是如果你include兩份JS模組:
第一份為SayHello.js,在window上宣告了temp
第二份為SayHell.js,在window上宣告了temp
而今天想要使用SayHello的某個功能
123function hello (){ console.log('hello')}
temp.hello 預計會是Hello,但是你不知道第二份模組物件名稱衝突了,於是就使用了SayHell的同名功能
123function hello (){ console.log('helllllllll')}
於是變成Hell。
所以呢在ES6之前熱心的JavaScript社群們提出一些模組化加載方案,主要可以分為兩派:CommonJS,而ES6之後推出官方標準,所以我們Jav ...
前端P.10:Scope 汙染 bind
🥜 前情提要上回我們解釋了同步和異步是什麼,而這回解釋作用域Scope的問題。
Scope:JavaScript中Scope 是個必修的問題,在開發中一定會遇到的問題,首先介紹this:
this:首先我們回到C系列,今天我要讓我的全域變數snm = 函數傳入的一個數字參數,函數的參數叫做sum,請問我該如何處理? 答案:使用this。
12345678910111213class Program { private int sum = 20; private void Main() { test(10); } private void test(int sum) { this.sum = sum; Console.WriteLine(this.sum); }}
上述可以得知this功能是指定我現在的作用域來源區域,以此Case是代表 Program Class。
在JavaScript中,因為它是由引擎所解釋
在瀏覽器中,一 ...