這是flannel最後一篇,我原本不準備介紹udp,因為這種方案的網路損耗實在是太多,大約一半損耗,vxlan大約是30%損耗。但基本的udp使用我還是想和大家分享一下的,主要是tun裝置的使用。
像udp的registernetwork和vxlan一樣,我就不單獨說了backend/udp/udp_network.go。
func (n *network) run(ctx context.context) ()
// one for each goroutine below
wg := sync.waitgroup{}
defer wg.wait()
wg.add(1)
go func() ()
log.info("watching for new subnet leases")
evts := make(chan subnet.event)
wg.add(1)
go func() ()
for
}}
defer裡面做資源**,主要啟動兩個協程,乙個是runcproxy另乙個是watchleases,至於watchleases我在之前說過,這裡的效果是一樣主要新增route。主要講解一下runcproxy
func runcproxy(tun *os.file, conn *net.udpconn, ctl *os.file, tunip ip.ip4, tunmtu int)
c, err := conn.file()
if err != nil
defer c.close()
c.run_proxy(
c.int(tun.fd()),
c.int(c.fd()),
c.int(ctl.fd()),
c.in_addr_t(tunip.networkorder()),
c.size_t(tunmtu),
c.int(log_errors),
)}
他是乙個用golang呼叫c去實現的backend/udp/proxy.c。
while( !exit_flag )
if( fds[pfd_ctl].revents & pollin )
process_cmd(ctl);
if( fds[pfd_tun].revents & pollin || fds[pfd_sock].revents & pollin )
do while( activity );
}
核心是這裡的tun_to_udp和udp_to_tun分別是tun到udp和udp到tun。具體看**,以udp_to_tun為例:
static
int udp_to_tun(int sock, int tun, char *buf, size_t buflen)
tun_send_packet(tun, buf, pktlen);
_active:
return
1;}
這個裡面先從sock獲取sock_recv_packet,然後通過tun傳送出去tun_send_packet,這樣完成udp的拆包,封裝包和這個流程是反過來了,在封裝過程會用到目的位址(route)
static
int tun_to_udp(int tun, int sock, char *buf, size_t buflen)
if( !decrement_ttl(iph) )
sock_send_packet(sock, buf, pktlen, next_hop);
_active:
return
1;}
至於route怎麼維護的和之前是一樣的,只不過是c語言版本的。這樣就完成流量的overlay。 《Spark核心原始碼分析與開發實戰》讀書筆記之一
第1章 spark系統概述 1.1 spark是什麼 1.spark比hadoop快在 1 spark使用記憶體計算,而hadoop使用io 2 hadoop的計算是按部就班一步一步進行的,而spark則是提前生成了dag,優化了運算路徑 1.2 spark生態系統bdas 1.bdas 伯克利資料...
HashMap原始碼分析與實現
hash雜湊將乙個任意的長度通過某種 hash函式演算法 演算法轉換成乙個固定的值。移位 map 地圖 x,y儲存 總結 通過hash出來的乙個值,然後通過這個值定位到map然後把value儲存到這個map中。初始化容量,1左移4位 16容量 static final int default ini...
手寫jQuery與原始碼分析
所以,jquery以物件的方式繫結到window物件,實現相關操作。function global,factory window,function window 生成原型物件並覆蓋prototype物件 jquery.fn jquery.prototype 物件if typeof selector ...