一份Netty最全面試題!讓面試官難不倒你丈莺! - 簡(jiǎn)書
TCP可靠性表現(xiàn)
面向連接
校驗(yàn)和
確認(rèn)應(yīng)答與序列號(hào)(TCP傳輸時(shí)將每個(gè)字節(jié)的數(shù)據(jù)都進(jìn)行了編號(hào)谓传,這就是序列號(hào))
超時(shí)重傳
流量控制
滑動(dòng)窗口設(shè)置
TCP的粘包/拆包原因
1.UDP首部采用了16bit來指示UDP數(shù)據(jù)報(bào)文的長(zhǎng)度,因此在應(yīng)用層能很好的將不同的數(shù)據(jù)報(bào)文區(qū)分開掌呜,從而避免粘包和拆包的問題凡人。TCP的首部沒有表示數(shù)據(jù)長(zhǎng)度的字段名党。
2.發(fā)兩個(gè)數(shù)據(jù)包時(shí)會(huì)有有三種情況。主要原因是TCP發(fā)送緩沖區(qū)剩余空間的大小挠轴,將會(huì)發(fā)生粘包和拆包传睹。
TCP粘包、拆包解決辦法
1岸晦、發(fā)送端給每個(gè)數(shù)據(jù)包添加包首部欧啤,首部中應(yīng)該至少包含數(shù)據(jù)包的長(zhǎng)度。
2启上、發(fā)送端將每個(gè)數(shù)據(jù)包封裝為固定長(zhǎng)度(不夠的可以通過補(bǔ)0填充)邢隧。
3、可以在數(shù)據(jù)包之間設(shè)置邊界冈在,如添加特殊符號(hào)倒慧,這樣,接收端通過這個(gè)邊界就可以將不同的數(shù)據(jù)包拆分開。
Netty解決方案
Netty默認(rèn)提供了多種編解碼器用于處理半包纫谅,例如:LineBasedFrameDecoder
BIO炫贤、NIO、AIO分別是什么
阻塞 非阻塞? 異步(read write 緩沖)
Netty跟Java NIO有什么不同
越底層的東西越麻煩涉及到多線程系宜,網(wǎng)絡(luò)編程照激,NIO底層還有bug发魄。
框架模塊豐富盹牧,有大量的實(shí)踐,穩(wěn)定励幼,社區(qū)活躍汰寓。
Netty組件
其實(shí)NIOEventLoopGroup就是一個(gè)線程池實(shí)現(xiàn),通過設(shè)置不同的NIOEventLoopGroup方式就可以對(duì)應(yīng)三種不同的Reactor線程模型苹粟。?
channel 都有一個(gè)與之關(guān)聯(lián)的eventLoop綁定一個(gè)線程然后注冊(cè)到selector
當(dāng) channel 創(chuàng)建時(shí)有滑,就會(huì)被自動(dòng)分配到它專屬的?ChannelPipeline 為 ChannelHandler 鏈提供了容器。
Reactor線程模型
單線程模型
多線程模型
主從線程模型
select嵌削、poll毛好、epoll的機(jī)制及其區(qū)別
都是同步多路IO復(fù)用
它僅僅知道了,有I/O事件發(fā)生了苛秕,卻并不知道是哪那幾個(gè)流(可能有一個(gè)肌访,多個(gè),甚至全部)艇劫,我們只能無差別輪詢所有流吼驶,找出能讀出數(shù)據(jù),或者寫入數(shù)據(jù)的流店煞,對(duì)他們進(jìn)行操作蟹演。所以select具有O(n)的無差別輪詢復(fù)雜度,同時(shí)處理的流越多顷蟀,無差別輪詢時(shí)間就越長(zhǎng)酒请。
(2)poll==>時(shí)間復(fù)雜度O(n)
poll本質(zhì)上和select沒有區(qū)別,它將用戶傳入的數(shù)組拷貝到內(nèi)核空間鸣个,然后查詢每個(gè)fd對(duì)應(yīng)的設(shè)備狀態(tài)蚌父, 但是它沒有最大連接數(shù)的限制,原因是它是基于鏈表來存儲(chǔ)的.
(3)epoll==>時(shí)間復(fù)雜度O(1)
epoll可以理解為event poll毛萌,不同于忙輪詢和無差別輪詢苟弛,epoll會(huì)把哪個(gè)流發(fā)生了怎樣的I/O事件通知我們。所以我們說epoll實(shí)際上是事件驅(qū)動(dòng)(每個(gè)事件關(guān)聯(lián)上fd)的阁将,此時(shí)我們對(duì)這些流的操作都是有意義的膏秫。(復(fù)雜度降低到了O(1))
1、表面上看epoll的性能最好,但是在連接數(shù)少并且連接都十分活躍的情況下缤削,select和poll的性能可能比epoll好窘哈,畢竟epoll的通知機(jī)制需要很多函數(shù)回調(diào)。
2亭敢、select低效是因?yàn)槊看嗡夹枰喸児鐾瘛5托б彩窍鄬?duì)的,視情況而定帅刀,也可通過良好的設(shè)計(jì)改善