flannel 實戰與原始碼分析(七)

2021-07-31 05:31:40 字數 1932 閱讀 6999

這是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 ...