[後臺開發面經系列彙總]深信服四輪面經(包含題解)

此係列文章首於後臺開發四面面經,因爲排版看起來稍微舒服很多。內容以及觀點僅個人感受,不妥之處直接私我!目的爲了大家能更好的知道面試題難度以及如何準備,希望能讓大家少浪費時間尋找資料,多點時間學點乾貨!因爲篇幅原因,大部分題目題解簡潔,但有相關書籍推薦進階閱讀,望諒解!

深信服偏向安全類公司,做VPN起家。技術棧c/c++系列偏多。

一 面試情況

注意了,有些同學可能不需要筆試環節,通過在牛客尋找內推,簡歷合格直接通知面試,效率非常高(這一點我的印象非常深刻),各自都不耽擱,如果合適兩三天一定出結果,不合適就是不匹配!

1 一面(電話面25分鐘)

一面基礎面,注重的c/c++語法基礎。參看書籍見Linux後臺開發必看。

  • 自我介紹

姓名,學校,和崗位的匹配度等。

  • 阻塞非阻塞區別

阻塞,非阻塞:進程/線程要訪問的數據是否就緒,進程/線程是否需要等待;

同步,異步:訪問數據的方式,同步需要主動讀寫數據,在讀寫數據的過程中還是會阻塞;,異步只需要I/O操作完成的通知,並不主動讀寫數據,由操作系統內核完成數據的讀寫。

對unix來講:阻塞式I/O(默認),非阻塞式I/O(nonblock),I/O複用(select/poll/epoll)都屬於同步I/O,因爲它們在數據由內核空間複製回進程緩衝區時都是阻塞的(不能幹別的事)。只有異步I/O模型(AIO)是符合異步I/O操作的含義的,
即在1數據準備完成、2由內核空間拷貝回緩衝區後通知進程,在等待通知的這段時間裏可以幹別的事。

  • c/c++如何相互調用

(1)C 調用C++的函數或變量,在C++的頭文件聲明爲extern “C” ,C調用的時候只使用extern 聲明。

(2)extern “C” { } ,聲明用於C++中,告訴編譯器對{ }中聲明的函數或變量使用C的方式生成(或尋找)目標符號。

  • 如何處理殭屍進程

如果父進程在子進程之前終止,則所有的子進程的父進程都會改變爲init進程,我們稱這些進程由init進程領養。這時使用ps命令查看後可以看到子進程的父進程ppid已經變爲了1。

​ 而當子進程在父進程之前終止時,內核爲每個終止子進程保存了一定量的信息,所以當終止進程的父進程調用wait或waitpid時,可以得到這些信息。這些信息至少包括進程ID、該進程的終止狀態、以及該進程使用的CPU時間總量。其他的進程所使用的存儲區,打開的文件都會被內核釋放。

​ 一個已經終止、但是其父進程尚未對其進行善後處理(獲取終止子進程的有關信息,釋放它仍佔用的資源)的進程被稱爲殭屍進程。ps命令將殭屍進程的狀態打印爲Z。

當子進程終止時,內核就會向它的父進程發送一個SIGCHLD信號,父進程可以選擇忽略該信號,也可以提供一個接收到信號以後的處理函數。對於這種信號的系統默認動作是忽略它。

​ 我們不希望有過多的殭屍進程產生,所以當父進程接收到SIGCHLD信號後就應該調用 wait 或 waitpid 函數對子進程進行善後處理,釋放子進程佔用的資源。

在UNIX 系統中,一個進程結束了,但是他的父進程沒有等待(調用wait / waitpid)他, 那麼他將變成一個殭屍進程。(查看進程表中可以通過Z標示查看殭屍進程)

  • 三次握手中,第二次握手丟失如何處理

[三次握手協議]中,服務器維護一個未連接隊列,該隊列爲每個客戶端的SYN包(syn=j)開設一個條目,該條目表明服務器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連接在服務器處於 Syn_RECV狀態,當服務器收到客戶的確認包時,刪除該條目,服務器進入ESTABLISHED狀態。

三次握手協議

服務器發送完SYN-ACK包,如果未收到客戶確認包,服務器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該連接信息從半連接隊列中刪除。

半連接存活時間是指半連接隊列的條目存活的最長時間,也即服務器從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連接存活時間爲Timeout時間、SYN_RECV存活時間。

  • send函數成功表明什麼

send()用於向一個已經連接的socket發送數據,如果無錯誤,返回值爲所發送數據的總數,否則返回SOCKET_ERROR。注意成功地完成send()調用並不意味着數據傳送到達。只是把數據放到緩衝區,數據的傳送依賴於建立的TCP鏈接。

  • time_wait狀態什麼時候產生

主動關閉方收到被動關閉方的FIN包併發送出ACK時進入TIME_WAIT

1)可靠地實現TCP全雙工連接的終止

TCP協議在關閉連接的四次握手過程中,最終的ACK是由主動關閉連接的一端(後面統稱A端)發出的,如果這個ACK丟失,對方(後面統稱B端)將重發出最終的FIN,因此A端必須維護狀態信息(TIME_WAIT)允許它重發最終的ACK。如果A端不維持TIME_WAIT狀態,而是處於CLOSED 狀態,那麼A端將響應RST分節,B端收到後將此分節解釋成一個錯誤(在java中會拋出connection reset的SocketException)。

因而,要實現TCP全雙工連接的正常終止,必須處理終止過程中四個分節任何一個分節的丟失情況,主動關閉連接的A端必須維持TIME_WAIT狀態 。

2)允許老的重複分節在網絡中消逝

TCP分節可能由於路由器異常而“迷途”,在迷途期間,TCP發送端可能因確認超時而重發這個分節,迷途的分節在路由器修復後也會被送到最終目的地,這個遲到的迷途分節到達時可能會引起問題。在關閉“前一個連接”之後,馬上又重新建立起一個相同的IP和端口之間的“新連接”,“前一個連接”的迷途重複分組在“前一個連接”終止後到達,而被“新連接”收到了。爲了避免這個情況,TCP協議不允許處於TIME_WAIT狀態的連接啓動一個新的可用連接,因爲TIME_WAIT狀態持續2MSL,就可以保證當成功建立一個新TCP連接的時候,來自舊連接重複分組已經在網絡中消逝。

  • tcp如何保證可靠性

TCP提供一種面向連接的、可靠的字節流服務。
面向連接:意味着兩個使用TCP的應用(通常是一個客戶和一個服務器)在彼此交換數據之前必須先建立一個TCP連接。在一個TCP連接中,僅有兩方進行彼此通信。廣播和多播不能用於TCP。
TCP通過下列方式來提供可靠性:
1、應用數據被分割成TCP認爲最適合發送的數據塊。這和UDP完全不同,應用程序產生的數據報長度將保持不變。 (將數據截斷爲合理的長度)
2、當TCP發出一個段後,它啓動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。
(超時重發)
3、當TCP收到發自TCP連接另一端的數據,它將發送一個確認。這個確認不是立即發送,通常將推遲幾分之一秒 。 (對於收到的請求,給出確認響應) (之所以推遲,可能是要對包做完整校驗)
4、 TCP將保持它首部和數據的檢驗和。這是一個端到端的檢驗和,目的是檢測數據在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段。 (校驗出包有錯,丟棄報文段,不給出響應,TCP發送數據端,超時時會重發數據)
5、既然TCP報文段作爲IP數據報來傳輸,而IP數據報的到達可能會失序,因此TCP報文段的到達也可能會失序。如果必要,TCP將對收到的數據進行重新排序,將收到的數據以正確的順序交給應用層。 (對失序數據進行重新排序,然後才交給應用層)
6、既然IP數據報會發生重複,TCP的接收端必須丟棄重複的數據。(對於重複數據,能夠丟棄重複數據)
7、TCP還能提供流量控制。TCP連接的每一方都有固定大小的緩衝空間。TCP的接收端只允許另一端發送接收端緩衝區所能接納的數據。這將防止較快主機致使較慢主機的緩衝區溢出。(TCP可以進行流量控制,防止較快主機致使較慢主機的緩衝區溢出)TCP使用的流量控制協議是可變大小的滑動窗口協議。
字節流服務::
兩個應用程序通過TCP連接交換8bit字節構成的字節流。TCP不在字節流中插入記錄標識符。我們將這稱爲字節流服務(bytestreamservice)。
TCP對字節流的內容不作任何解釋:: TCP對字節流的內容不作任何解釋。TCP不知道傳輸的數據字節流是二進制數據,還是ASCII字符、EBCDIC字符或者其他類型數據。對字節流的解釋由TCP連接雙方的應用層解釋。

  • seq爲1000,發送了1000個數據,下一個seq是多少?

2001

  • 使用過捕包工具嗎,說一下抓一個明文http過程

講述一下wireshark使用方法,以及http明文並可擴展到密文https。

  • gcc優化參數介紹幾個

-O設置一共有五種:-O0、-O1、-O2、-O3和-Os。
-O0:這個等級(字母“O”後面跟個零)關閉所有優化選項,也是CFLAGS或CXXFLAGS中沒有設置-O等級時的默認等級。這樣就不會優化代碼,這通常不是我們想要的。
-O1:這是最基本的優化等級。編譯器會在不花費太多編譯時間的同時試圖生成更快更小的代碼。這些優化是非常基礎的,但一般這些任務肯定能順利完成。
-O2:-O1的進階。這是推薦的優化等級,除非你有特殊的需求。-O2會比-O1啓用多一些標記。設置了-O2後,編譯器會試圖提高代碼性能而不會增大體積和大量佔用的編譯時間。
-O3:這是最高最危險的優化等級。用這個選項會延長編譯代碼的時間,並且在使用gcc4.x的系統裏不應全局啓用。自從3.x版本以來gcc的行爲已經有了極大地改變。在3.x,-O3生成的代碼也只是比-O2快一點點而已,而gcc4.x中還未必更快。用-O3來編譯所有的軟件包將產生更大體積更耗內存的二進制文件,大大增加編譯失敗的機會或不可預知的程序行爲(包括錯誤)。這樣做將得不償失,記住過猶不及。在gcc 4.x.中使用-O3是不推薦的。
-Os:這個等級用來優化代碼尺寸。其中啓用了-O2中不會增加磁盤空間佔用的代碼生成選項。這對於磁盤空間極其緊張或者CPU緩存較小的機器非常有用。但也可能產生些許問題,因此軟件樹中的大部分ebuild都過濾掉這個等級的優化。使用-Os是不推薦的。

二面(50分鐘)

我的深信服二面全是項目面,所以在簡歷上一般把自己更加熟悉的項目放在上面,不過問題不大,因爲一般面試官會說:“請介紹一下你熟悉的項目”。那麼鑑於每個人的項目不同,我就在這提上幾點可能是公共的問題。

  • 項目背景,項目人員構成,自己所擔任角色
  • 你在此項目中做了什麼
  • 在做這個項目中的難點是什麼,又遇到困難?如何解決的
  • 項目擴展性如何?

三面(30分鐘)

我也不知道三面是個什麼意思,深信服大部分都是一共三面。在我的記憶裏,三面面試官很和藹,跟我說了一下規劃,甚至聊了下他以前的故事,so,這裏的三面也給大家帶來不了什麼。

四面(hr面)

hr都是我的偶像,他們的應變能力讓小藍常常不知所措。比如上一句問你最討厭的人,下一句就是如果以後你的上司也是這樣的怎麼處理呢,哭唧唧!下面也整理一下hr常問問題

  • 你最擅長的技術方向是什麼?
  • 現在幾個offer?
  • 最大優缺點
  • 對加班的看法
  • 薪資的要求
  • 工作中你難以和同事,上司相處,你該怎麼辦
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章