ICMP 協議
定義
網際控制訊息協定,全稱 Internet Control Message Protocol。主要功能是用來 偵測網路當前的狀況
,因為透過 IP 在網路傳遞資料不怎麼可靠,傳遞過程必須經過 多個路由器
轉發才能夠送達目的地,那麼為了確保轉發前能夠安全送達,所以就有了 ICMP 協議。
位址解析協定,全名 Address Resolution Protocol,位於 網路存取層
與 網路層
(TCP/IP
模型) 中,負責將 32bit
IP
Address 轉換成 48bit
乙太網地址(MAC
Address) 的協議,用來 獲取目的 IP Address 的實體位址
,並且藉由添加 Ethernet Header 使用實體網路來傳遞。反之,若是要將 MAC Address 轉換成 IP Address,則是使用 RARP
協議。
ARP 協議只會作用於相同的網路區段下,若是兩台主機處於不同網域,則 ARP 就會直接請求所屬網域內Default Gateway 的實體位址,而不是目標主機的實體位址。
眾所周知,如果我們使用 go
關鍵字進行協程的操作時,如果 主協程
沒有等待其他協程的話,直接結束會導致 任務無法完全執行
。
範例如下:
1 | func main(){ |
一般來說,最暴力解的方式就是 讓主協程睡一會
,等待子協程完成再來去完成主協程的任務。
1 | time.Sleep(3 * time.Second) |
但是這樣做非常沒有效率,且 sleep
的期間子協程可能早就已經結束了。
近期對於 golang 的 goroutine 非常感興趣,因為只要在 func 面前下一個關鍵字
go dosomething()
,就能過用同步的方式來達到異步的效果。然而,goroutine 是額外開啟一個輕量化的執行緒去執行我們的任務,如果需要在一個大量開啟 goroutines 情境下使用的話,系統很容易因為無節制的使用 goroutines 而大規模進行擴充與銷毀,這樣會造成 GC (Garbage Collection) 產生大量的壓力,從而影響我們的系統整體的效能。
並且
runtime
和GC
都是 goroutine,如果 goroutine 的規模太過於龐大,記憶體無法有效進行調度,Go Scheduler
就會阻塞 goroutine,導致Processor
Local Queue 累積,造成記憶體溢出,最後有可能整個行程直接崩潰。