字節跳動-視頻架構-后端開發(面經總結)


字節跳動-視頻架構-后端開發(面經總結)

時間:7.16
面試方式:視頻面(一面)
部門:字節跳動-視頻架構-后端開發
主要根據簡歷上的內容(項目和技能)來問

 

1. 視頻流的傳輸方式?(項目)
答:點對點傳輸,第三方流媒體服務器傳輸,自主搭建流媒體服務器傳輸;
2. 如何實現內網穿透的?(項目)
3. 項目中是采用UDP-Socket實現心跳包,為什么采用UDP?(項目)
答:心跳包它像心跳一樣每隔固定時間發一次,以此來告訴服務器,這個客戶端還活着。其實TCP和UDP都可以實現心跳包,心跳包采用TCP還是UDP根據項目需要,采用UDP是因為它的速度快,占資源少。
速度快:TCP必須建立連接,而UDP是一個非連接的協議,所以UDP更快;
占資源少:UDP的數據報頭部只有8個字節,而TCP數據報頭部是20個字節;
4. TCP與UDP的區別?
答:
1 基於連接和無連接;
2 TCP是可靠,保證數據正確;UDP不可靠,不保證數據正確;
3 TCP保證數據順序到達;UDP不保證數據順序到達;
4 TCP速度慢,因為TCP必須創建連接;UDP速度較快,不需要建立連接;
5 因為上述開銷,TCP是一個重量級協議;UDP是一個輕量級的協議;
6 一個TCP數據包報頭的大小是20字節;一個UDP數據報報頭是8個字節;
7 TCP有流量控制和擁塞控制;UDP不能進行流量控制;
8 TCP面向字節流;UDP面向報文;
9 應用場景不同,TCP適合對效率要求相對低,但對准確性要求相對高或者是有連接的場景,TCP一般用於文件傳輸(HTTP,HTTPS,FTP等協議),郵件(POP,SMTP等協議),遠程登錄等場景;UDP更適合對效率要求相對高,對准確性要求相對低的場景,UDP一般用於即時通信(QQ聊天),在線視頻(rtsp流速度一定要快,偶爾丟包沒關系),網絡語音電話等場景;
5. TCP四次揮手講下?為什么有TIME_WAIT?
答:

1. A不能保證最后的ACK能達到B,如果最后的ACK丟失, 那么B顯然收不到, B於是發起了重傳FIN的操作, 此時如果A處於CLOSED的狀態, 就沒辦法給對端發ACK了,所以A應該等一段時間,這段時間就是所謂的TIME_WAIT。
2. 保證新舊四元組互不干擾,假設tcp連接是:A(1.2.3.4:8888)------B(6.7.8.9:9999), 這就是一個tcp四元組。 當tcp連接關閉后, 四元組釋放。 后面的新連接可能會重用到這個四元組(有這個可能性), 那么問題就來了: 新四元組和舊四元組完全一致, 他們的網絡包會混亂嗎?所以,可以考慮這樣一個機制:讓舊四元組對應的所有網絡包都消失后(等一段時間),才允許新四元組建立,頗有點鎖的味道。這個等一段時間就是2MSL。
6. TCP比UDP多消耗哪些系統資源?
答:TCP建立連接時三次握手,斷開連接時四次揮手;TCP數據包頭部20字節,UDP數據包頭部8字節;TCP有流量控制和擁塞控制。
7. UDP在內網下有幾種NAT方式?
答:NAT(Network Address Translation)即網絡地址轉換,NAT能將其本地地址轉換成全球IP地址。
考慮到UDP的無狀態特性,目前針對其的NAT實現大致可分為Full Cone、Restricted Cone、Port Restricted Cone和Symmetric NAT四種。
8. 你了解DDoS攻擊嗎?
答:拒絕服務攻擊(簡稱DoS攻擊),亦稱洪水攻擊,其目的在於使目標計算機的網絡或系統資源耗盡,使服務暫時中斷或停止,導致其正常用戶無法訪問。當黑客使用網絡上兩個或以上被攻陷的計算機作為“僵屍”向特定的目標發動“拒絕服務”式攻擊時,稱為分布式拒絕服務攻擊(distributed denial-of-service attack,簡稱DDoS攻擊)。
9. Nginx了解嗎,講一下?
答:Nginx 采用的是多進程(單線程) & 多路IO復用模型。
工作模式:
(1)、Nginx 在啟動后,會有一個 master 進程和多個相互獨立的 worker 進程。
(2)、接收來自外界的信號,向各worker進程發送信號,每個進程都有可能來處理這個連接。
(3)、master 進程能監控 worker 進程的運行狀態,當 worker 進程退出后(異常情況下),會自動啟動新的 worker 進程。
10. Nginx中master進程和worker進程是怎么通信的?
答:
nginx的進程通信分為三種類別:linux 系統與nginx 通信(信號),master 進程與worker進程通信(套接字),worker進程間通信(共享內存)。
(1) linux 系統與nginx 通信
答:linux 系統與nginx是通過信號進行通信的,通過信號控制nginx重啟、關閉以及加載配置文件等。比如:./nginx –s quit 向master進程發送信號。
(2) master 進程與worker進程通信
答:master進程與worker進程通過頻道(channel)進行通信。創建頻道,其實就是socketpair,在啟動worker進程時創建頻道;發送消息,master進程通過ngx_signal_woker_processes向worker進程發送消息;響應消息,worker進程通過ngx_read_channel讀取消息,然后根據command判斷是什么消息。
(3) worker進程間通信
答:worker進程間則是通過共享內存進行通信。它通過 mmap 或者 shmgat 系統調用在內存中創建了一塊連續的線性地址空間,而通過 munmap 或者 shmdt 系統調用可以釋放這塊內存。使用共享內存的好處是當多個進程使用同一塊共享內存時,在任何一個進程修改了共享內存中的內容后,其他進程通過訪問這段共享內存都能夠得到修改后的內容。
11. 為什么worker進程數和CPU數一致?
答:一是Nginx一般只做高並發代理,基本沒用IO操作,算是CPU密集型操作,所以在處理時基本是瞬間完成的,很少出現IO阻塞。二是進程與CPU調度的關系,單個核心處理多個進程的時候,是排隊處理的,所以將worker進程數量設置超過核心數會造成不必要的上下文切換。
12. 多進程上下文切換講下?
答:上下文切換:為了控制進程的執行,內核必須有能力掛起正在CPU上運行的進程,並恢復以前掛起的某個進程的執行。這種行為被稱為進程切換。因此可以說,任何進程都是在操作系統內核的支持下運行的,是與內核緊密相關的。
從一個進程的運行轉到另一個進程上運行,這個過程中經過下面這些變化:
1. 保存處理機上下文,包括程序計數器和其他寄存器。
2. 更新PCB信息。
3. 把進程的PCB移入相應的隊列,如就緒、在某事件阻塞等隊列。
4. 選擇另一個進程執行,並更新其PCB。
5. 更新內存管理的數據結構。
6. 恢復處理機上下文。
注:總而言之就是很耗資源。
13. 講一下同步,異步,阻塞,非阻塞,多路IO復用?
答:當一個同步調用發出后,調用者要一直等待返回消息(結果)通知后,才能進行后續的執行;當一個異步過程調用發出后,調用者不能立刻得到返回消息(結果)。實際處理這個調用的部件在完成后,通過狀態、通知和回調來通知調用者。阻塞調用是指調用結果返回之前,當前線程會被掛起,一直處於等待消息通知,不能夠執行其他業務。非阻塞是指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。
14. Nginx屬於以上哪種類型?
答:Nginx采用異步非阻塞的事件處理機制,由進程循環處理多個准備好的事件,從而實現高並發和輕量級。
15. 講一下epoll?
答:epoll是在2.6內核中提出的,是之前的select和poll的增強版本。相對於select和poll來說,epoll更加靈活,沒有描述符限制。epoll使用一個文件描述符管理多個描述符,將用戶關系的文件描述符的事件存放到內核的一個事件表中,這樣在用戶空間和內核空間的copy只需一次。
16. 講下epoll和select的區別?
答:1.select單個進程能夠監視的文件描述符數量一般是1024,有數量限制,可以通過修改宏定義甚至重新編譯內核來修改,但是會造成效率的降低。
epoll監視的描述符數量不受限制,支持的FD是最大可以打開文件數目。在1GB內存的機器上大約是10萬左右。
2.select每次調用都會對socket集合中所有的socket,如果socket集合較大,效率就會線性下降;epoll不存在這個問題,epoll只會對“活躍”的socket進行操作,每個fd上有個callback函數,只有“活躍”的socket才會主動去調用callback函數,其他idle狀態socket不會。
3.epoll使用mmap加速內核態與用戶態的消息傳遞;Epoll是通過內核與用戶空間mmap處於同一塊內存實現的。避免了不必要的內存拷貝。

 

兩個編程題:
1 給一個有向圖,判斷有向圖中是否有環,如果有環,環的數量是多少?
2 給一個大小為n的數組,尋找比k小的最大數的位置。

 

建議:
1 簡歷上的東西一定要非常熟悉再熟悉;
2 算法題一定要多刷再多刷;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM