這是字節跳動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)三個索引,這被稱為最佳左前綴特性。
因此我們在創建復合索引時應該將最常用作限制條件的列放在最左邊,依次遞減。