1. 程式人生 > 其它 >golang位元組跳動校招面經

golang位元組跳動校招面經

這是位元組跳動2022年的一個校招面經,題目來自網路,參考答案為本人撰寫。由於是面試,所以答案相對簡潔,想要詳盡瞭解,請自查參考書

1.https加密過程?

https加密採用了非對稱加密+對稱加密 混合的加密方式,通過非對稱加密的方式傳送對稱祕鑰,而後用對稱祕鑰進行加密。這樣做的方式是因為非對稱加密的耗時長,而對稱加密相對不安全。https加密的過程可簡單概括為如下圖示:

 

2.session,cookie的區別

1、Cookie 在客戶端(瀏覽器),Session 在伺服器端。

2、Cookie的安全性一般,他人可通過分析存放在本地的Cookie並進行Cookie欺騙。在安全性第一的前提下,選擇Session更優。重要互動資訊比如許可權等就要放在Session中,一般的資訊記錄放Cookie就好了。

3、單個Cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個Cookie。

4、Session 可以放在 檔案、資料庫或記憶體中,比如在使用Node時將Session儲存在redis中。由於一定時間內它是儲存在伺服器上的,當訪問增多時,會較大地佔用伺服器的效能。考慮到減輕伺服器效能方面,應當適時使用Cookie。

5、Session 的執行依賴Session ID,而 Session ID 是存在 Cookie 中的,也就是說,如果瀏覽器禁用了 Cookie,Session 也會失效(但是可以通過其它方式實現,比如在 url 中傳遞 Session ID)。

6、使用者驗證這種場合一般會用 Session。因此,維持一個會話的核心就是客戶端的唯一標識,即Session ID。

3.瞭解token嗎?

1、Token的引入:Token是在客戶端頻繁向服務端請求資料,服務端頻繁的去資料庫查詢使用者名稱和密碼並進行對比,判斷使用者名稱和密碼正確與否,並作出相應提示,在這樣的背景下,Token便應運而生。

2、Token的定義:Token是服務端生成的一串字串,以作客戶端進行請求的一個令牌,當第一次登入後,伺服器生成一個Token便將此Token返回給客戶端,以後客戶端只需帶上這個Token前來請求資料即可,無需再次帶上使用者名稱和密碼。

3、使用Token的目的:Token的目的是為了減輕伺服器的壓力,減少頻繁的查詢資料庫,使伺服器更加健壯。

4.網路通訊中的埠號是來幹什麼的?

想想這樣一個場景,伺服器中有A,B兩個服務,這兩個服務分別為A、B兩個客戶端提供登入驗證功能。假設A客戶端上某個使用者輸入使用者名稱密碼後向伺服器發起請求,要求驗證使用者名稱密碼是否正確,顯然,他應該在伺服器上找到A服務進行驗證,如果找的是B服務,可能A輸入的使用者名稱密碼是正確的也無濟於事。那麼,怎麼讓A客戶端對應找到伺服器上的A服務呢?這時候埠便應運而生,即,假設我們設定A服務埠號為8080,B服務埠號8081,那麼A客戶端只要對應找到8080埠就可以進行驗證了。當然,A,B兩個客戶端也要有埠號,否則A服務不知道返回資料給誰

5.tcp是有序的協議嗎?怎麼保證?

是有序的,TCP連線中,資料流必須以正確的順序傳送給對方。TCP的可靠性是通過順序編號確認(ACK)實現的。TCP在開始傳送一個段時,為準備重傳而首先將該段插入到傳送佇列中,同時啟動時鐘。然後,如果收到了接收端對該段的ACK資訊,就將該段從佇列中刪去。如果在時鐘規定的時間內,ACK未返回,那麼就從傳送佇列中再次送出這個段。TCP在協議中就對資料可靠傳輸做了保障,握手與斷開都需要通訊雙方確認,資料傳輸也需要雙方確認成功,在協議中還規定了:分包、重組、重傳等規則;

tcp協議補充:

1、在傳遞資料之前,會有三次握手來建立連線。

2、應用資料被分割成TCP認為最適合傳送的資料塊(按位元組編號,合理分片)。這和UDP完全不同,應用程式產生的資料報長度將保持不變。(將資料截斷為合理的長度

3、當TCP發出一個段後,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。(超時重發

4、當TCP收到發自TCP連線另一端的資料,它將傳送一個確認。這個確認不是立即傳送,通常將推遲幾分之一秒。(對於收到的請求,給出確認響應)(之所以推遲,可能是對包做完整校驗)

5、TCP將保持它首部和資料的校驗和。這是一個端到端的校驗和,目的是檢測資料在傳輸過程中的任何變化。如果收到段的校驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段。(校驗出包有錯,丟棄報文段,不給出響應,TCP傳送資料端,超時時會重發資料

6、既然TCP報文段作為IP資料報來傳輸,而IP資料報的到達可能會失序,因此TCP報文段的到達也可能會失序。如果必要,TCP將對收到的資料進行重新排序,將收到的資料以正確的順序交給應用層。(對失序資料進行重新排序,然後才交給應用層

7、既然IP資料報會發生重複,TCP連線的接收端必須丟棄重複的資料。(對於重複資料,能夠丟棄重複資料

8、TCP還能提供流量控制。TCP連線的每一方都有固定大小的緩衝空間。TCP的接收端只允許另一端傳送接收端緩衝區所能容納的資料。這將防止較快主機致使較慢主機的緩衝區溢位。(TCP可以進行流量控制,防止較快主機致使較慢主機的緩衝區溢位),TCP使用的流量控制協議是可變大小的滑動視窗協議。

9、TCP還能提供擁塞控制。當網路阻塞時,減少資料的傳送。

6.滑動視窗是幹什麼的?

流量控制,滑動視窗的思想是:允許傳送方不必等確認到來就可以繼續傳送下面的分組,但規定一個上限。若多個分組的確認未到時,則暫停傳送。

7.資料庫的事務是幹什麼用的?保持事務一致性

8.資料庫索引介紹一下?

以上兩個問題可以參考我上一篇部落格:《golang北京小廠面試覆盤》

9.B+ Tree和B Tree 的區別?

1.在B+書中,葉節點包含了全部關鍵字,即在非葉節點中出現的關鍵字也會出現在葉節點中,而在B樹中,葉節點包含的關鍵字和其他節點包含的關鍵字是不重複的

2.B+樹可以從任意葉子節點開始遍歷葉子節點,即葉子節點是相互索引的

10.程序,執行緒,協程的區別

程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。每個程序都有自己的獨立記憶體空間,擁有自己獨立的堆和棧,既不共享堆,亦不共享棧,程序由作業系統排程。

 執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,而擁有自己獨立的棧和共享的堆,共享堆,不共享棧,執行緒也由作業系統排程(標準執行緒是這樣的)。

協程是一種使用者態的輕量級執行緒,協程的排程完全由使用者控制。協程和執行緒一樣共享堆,不共享棧,協程由程式設計師在協程的程式碼裡顯示排程。協程擁有自己的暫存器上下文和棧。

在go中 ,協程可以由程式設計師排程而不是由系統排程,同時,協程相較於執行緒切換速度更快

 11.mysql的索引有那些型別?

1) 普通索引

普通索引是 MySQL 中最基本的索引型別,它沒有任何限制,唯一任務就是加快系統對資料的訪問速度。

2) 唯一索引

唯一索引與普通索引類似,不同的是建立唯一性索引的目的不是為了提高訪問速度,而是為了避免資料出現重複。

3) 主鍵索引

顧名思義,主鍵索引就是專門為主鍵欄位建立的索引,也屬於索引的一種。

主鍵索引是一種特殊的唯一索引,不允許值重複或者值為空。

4) 空間索引

空間索引是對空間資料型別的欄位建立的索引,使用 SPATIAL 關鍵字進行擴充套件。

5) 全文索引

全文索引主要用來查詢文字中的關鍵字,只能在 CHAR、VARCHAR 或 TEXT 型別的列上建立。在 MySQL 中只有 MyISAM 儲存引擎支援全文索引。

12.什麼是聯合索引?

兩個或更多個列上的索引被稱作聯合索引,聯合索引又叫複合索引。對於複合索引:Mysql從左到右的使用索引中的欄位,一個查詢可以只使用索引中的一部份,但只能是最左側部分。

比如有一條語句是這樣的:select * from users where area=’beijing’ and age=22;

如果我們是在area和age上分別建立單個索引的話,由於mysql查詢每次只能使用一個索引,所以雖然這樣已經相對不做索引時全表掃描提高了很多效率,但是如果在area、age兩列上建立複合索引的話將帶來更高的效率。如果我們建立了(area, age,salary)的複合索引,那麼其實相當於建立了(area,age,salary)、(area,age)、(area)三個索引,這被稱為最佳左字首特性。
因此我們在建立複合索引時應該將最常用作限制條件的列放在最左邊,依次遞減。