Exam
2017 後端工程師面試以及準備經驗(旋轉/Shopline/17/Appier/蝦皮
1. 3 handshake 是什麼?
2. 4 handshake 是什麼?
3. HTTP vs WebSocket vs Socket
| HTTP | WebSocket | Socket | |
|---|---|---|---|
| 傳輸方式 | 單向請求-響應模型 | 雙向通訊, 全雙工 | 雙向通訊, 全雙工 |
| 連接方式 | 無狀態,每次請求獨立, 短暫連接 | 建立持久化的連接, 長期持續連接 | 建立通訊連接, 長期持續連接 |
| 開啟連接 | 客戶端發送請求開啟連接 | 客戶端發送升級請求開啟WebSocket連接 | 客戶端與服務器建立連接 |
| 通訊效率 | 較慢,每次請求需要重新建立連接 | 較快,建立持久化連接後可以直接通訊 | 取決於使用的協定(TCP、UDP 等) |
| 應用場景 | 傳輸資源,例如網頁、圖片、文件等 | 實時通訊,例如聊天室、多人遊戲等 | 網路遊戲、即時通訊、文件傳輸等 |
| 數據格式 | 純文本 | 二進制和文本 | 二進制和文本 |
| 跨域支持 | 需要使用CORS機制 | 支持 | 不支持 |
| 代理支持 | 支持 | 支持 | 不支持 |
| 常用端口號 | 80 | 443 | 不定 |
HTTP是請求/響應式的協定,客戶端向服務器發送請求,服務器返回響應,如網頁、API等。HTTP是短暫連接,每次請求都需要重新建立連接。數據格式為純文本,不支持二進制數據,且需要使用CORS機制進行跨域請求。HTTP協定常用於客戶端向服務器請求資源,如網頁、圖片等。
WebSocket是全雙工的協定,支持客戶端和服務器之間的雙向通信。WebSocket是長期持續連接,可以保持開啟的連接,支持二進制和文本格式的數據傳輸,且不需要使用CORS機制進行跨域請求。WebSocket協定常用於實時通信,如聊天、遊戲等。
Socket是一種通用的全雙工協定,支持客戶端和服務器之間的雙向通信,同時也是長期持續連接,支持二進制和文本格式的數據傳輸。 Socket協定需要客戶端與服務器建立連接, Socket 本身並不是一個協定,而是一個通用的網路通訊接口,可以使用不同的協定來實現通訊。 在比較中,我們通常會把使用 TCP 協定的 Socket 和 WebSocket 進行比較,因為它們都是基於 TCP 協定的雙向通訊協定, 而 TCP 協定是一種可靠的協定,保證了資料的正確性和完整性,適合用於需要高可靠性的應用。 如果使用 UDP 協定的 Socket,則傳輸效率會更高,但可靠性會降低。
- 【筆記】Socket,Websocket,Socket.io的差異
- HTTP: https://developer.mozilla.org/zh-TW/docs/Web/HTTP
- WebSocket: https://developer.mozilla.org/zh-TW/docs/Web/API/WebSockets_API
- Socket: https://en.wikipedia.org/wiki/Network_socket
WebSocket vs Socket
WebSocket和Socket都是實現雙向通信的協定,但它們的實現方式不同,
- WebSocket是在HTTP協定上建立的
- Socket是通用的協定
具體來說,WebSocket協定是在HTTP協定之上建立的,它通過發送一個HTTP請求進行握手協商,升級成為WebSocket連接。一旦WebSocket連接建立成功,就可以通過它進行全雙工通信,從而實現實時通信等功能。
而Socket則是一個通用的協定,它可以用於不同的應用場景,例如實時通信、即時遊戲、P2P文件共享等等。Socket通常需要使用特定的Socket庫來實現,例如Java中的Socket庫、Python中的socket庫等。
總體來說,WebSocket和Socket都是實現雙向通信的協定,但WebSocket是在HTTP協定上建立的,並且更加簡單易用,而Socket則是一個通用的協定,更加靈活可控。具體使用哪種協定,需要根據實際應用場景和需求進行選擇。
4. 什麼是 HTTP2
HTTP/2 改變了傳輸數據的方式,使網站加載更快且更可靠。與 HTTP/1.1 不同, HTTP/2 將多個請求和響應的數據流合併到一個 TCP 連接中,而不是創建多個連接,從而減少了網絡延遲和提高了效率。
以下是 HTTP/2 的主要功能:
- 二進制協議:HTTP/2 將數據分為二進制格式,而不是像 HTTP/1.1 一樣使用文本格式。這使得數據更容易壓縮和解析,從而提高了網站的效率。
- 多路徑傳輸:HTTP/2 允許客戶端和服務器之間的多個請求和響應共享同一個連接,從而減少了建立和拆除連接的成本。這使得網站的加載速度更快。
- 伺服器推送:HTTP/2 允許伺服器在客戶端請求前推送數據,從而加快網站的加載速度。
- 優化效能:HTTP/2 使用新的壓縮算法和首部壓縮,從而降低了網絡流量和延遲。
總之,HTTP/2 是一種更快、更有效率的網絡協議,旨在改善網站的性能和效率。它已經成為現代 Web 技術的重要一環,被廣泛使用和支持。
HTTP1 vs HTTP2
| 特徵 | HTTP/1.1 | HTTP/2 |
|---|---|---|
| 傳輸方式 | 單向傳輸 | 雙向傳輸 |
| 請求數量 | 限制多個請求 | 無限制多個請求 |
| 建立連接 | 建立多個連接 | 單個連接支持多個數據流 |
| 效能優化 | 無首部壓縮、無二進制分帧、無伺服器推送 | 有首部壓縮、有二進制分帧、有伺服器推送 |
| 傳輸速度 | 較慢 | 較快 |
| 安全性 | 無強制加密 | 強制加密 |
簡單來說,HTTP/2 在多方面優於 HTTP/1.1,特別是在效能和安全性方面。 HTTP/2 使用二進制格式、多路徑傳輸、伺服器推送和首部壓縮等技術,這些技術使得網站更快、更可靠,並提高了安全性。 由於 HTTP/2 使用了更高效的傳輸方式和優化效能的特性,因此可以更快地加載網站和頁面,從而提高了用戶體驗。
5. PostgreSQL vs MySQL
- 用途:PostgreSQL 更適用於處理大型、複雜的數據庫,支持高級的數據類型和複雜的查詢。而 MySQL 則更適用於較小的數據庫和簡單的查詢,特別是對於 Web 應用程序和電子商務站點等。
- 可擴展性:PostgreSQL 在可擴展性方面更優秀,因為它可以支持更多的並發用戶和更大的數據集。MySQL 的可擴展性也不錯,但是當數據庫變得非常大時,性能可能會有所下降。
- 安全性:PostgreSQL 在安全性方面更為優秀,支持高級的安全功能,如行級安全性和強制執行權限。MySQL 的安全性也不錯,但是它的安全功能不如 PostgreSQL 那麼強大。
- 查詢性能:MySQL 在簡單的查詢上的性能通常優於 PostgreSQL,但是當處理複雜的查詢時,PostgreSQL 通常會表現得更好。
- 開發生態系統:MySQL 有較大的開發生態系統和社區支持,有豐富的第三方工具和庫可供使用。而 PostgreSQL 的開發生態系統雖然較小,但是有一些優秀的第三方工具和庫可供使用。
如果您需要處理複雜的數據庫、要求高級的安全功能和可擴展性,則建議使用 PostgreSQL; 如果您處理的數據庫較小,需要快速地執行簡單查詢,並且需要較大的開發生態系統和社區支持,則建議使用 MySQL。
| 特點 | PostgreSQL | MySQL |
|---|---|---|
| 類型 | 完整的關聯式數據庫 | 容易擴展的關聯式數據庫 |
| 詞法 | 嚴格 | 寬鬆 |
| 適用性 | 較適合大型企業和複雜的應用 | 較適合中小型企業和簡單的應用 |
| 可擴展性 | 較優秀 | 良好 |
| 安全性 | 更為優秀 | 良好 |
| 查詢性能 | 較適用於處理複雜查詢 | 適用於執行簡單查詢 |
| 效能 | 效能較高 | 效能較高 |
| 優點 | 高級的數據類型和複雜的查詢;高可靠性和可用性 | 簡單易用;快速可擴展 |
| 缺點 | 較複雜;學習曲線較陡峭 | 安全性功能較弱;不支持某些高級功能 |
- PostgreSQL vs MySQL: Which is Better?
- SQLite vs MySQL vs PostgreSQL: A Comparison Of Relational Database Management Systems
6. 各種排序演算法的時間與空間複雜度
| Name | Best Case | Average Case | Worst Case | Memory | Stable | Method Used |
|---|---|---|---|---|---|---|
| Quick Sort (快速排序) | n log n | n log n | n^2 | log n | No | Partitioning |
| Merge Sort (合併排序) | n log n | n log n | n log n | n | Yes | Merging |
| Heap Sort (堆積排序) | n log n | n log n | n log n | 1 | No | Selection |
| Insertion Sort (插入排序) | n | n^2 | n^2 | 1 | Yes | Insertion |
| Tim Sort | n | n log n | n log n | n | Yes | Insertion & Merging |
| Selection Sort (選擇排序) | n^2 | n^2 | n^2 | 1 | No | Selection |
| Shell Sort (希爾排序) | n log n | n^(4/3) | n^(3/2) | 1 | No | Insertion |
| Bubble Sort (氣泡排序) | n | n^2 | n^2 | 1 | Yes | Exchanging |
| Tree Sort (樹排序法) | n log n | n log n | n log n | n | Yes | Insertion |
| Cycle Sort (圈排序) | n^2 | n^2 | n^2 | 1 | No | Selection |
| Strand Sort | n | n^2 | n^2 | n | Yes | Selection |
| Cocktail Shaker Sort (雞尾酒排序) | n | n^2 | n^2 | 1 | Yes | Exchanging |
| Comb Sort (梳排序) | n log n | n^2 | n^2 | 1 | No | Exchanging |
| Gnome Sort (侏儒排序) | n | n^2 | n^2 | 1 | Yes | Exchanging |
| Odd-even Sort (奇偶排序) | n | n^2 | n^2 | 1 | Yes | Exchanging |
7. Google Protobuf 是什麼?
Google Protocol Buffers (Protobuf) 是一種輕量級、高效率的序列化(serialization)資料交換格式,也是一種可擴展的、自描述的資料格式,適用於各種應用程式間的資料通訊或資料存儲。相較於其他傳統的資料序列化格式(例如 XML 和 JSON),Protobuf 更加簡潔、快速、小巧,因此可以在資料量較大的情況下,顯著降低傳輸和存儲的成本。
Protobuf 定義一種結構化的資料格式,並提供一個通用的編解碼器,可以將資料寫入二進位格式,也可以將二進位格式的資料解碼成原始資料。 使用者可以先定義出資料結構,然後利用 Protobuf 的編譯器(protoc)產生程式碼, 以方便序列化和反序列化資料。Protobuf 支援多種語言的編程,例如 C++、Java、Python、Go、Ruby、C# 等等。
Protobuf 提供了許多特點,例如:
- 可讀性好:設計清晰簡潔,簡單易懂。
- 代碼生成:Protobuf 支援多種語言的代碼生成,為使用者節省了大量的時間。
- 支援向前和向後相容:當 Protobuf 資料結構更新時,可以保持舊版和新版的資料格式兼容,不會影響資料互通。
- 高效: Protobuf 序列化後的資料大小比其他序列化工具要小,且解析速度更快。
- 自描述: Protobuf 編碼後的資料包含了自身的結構資訊,方便資料的解析和擴展。
總之,Protobuf 可以大幅提高應用程式的效率,減少傳輸和存儲的成本。它適用於各種場景,例如網絡通訊、分布式系統、資料庫存儲等等。
8. TCP 該如何做流量控制
9. 有用過 Elixir (ruby syntax-like for erlang structure) 嗎
10. C thread 怎麼運作?
11. 該如何 ping 某個 protocol 或是 port?
12. telnet 如果防火牆擋住了會怎麼樣?
13. gRPC
gRPC是一種高效的開源遠程過程調用(RPC)框架,由Google開發並在GitHub上公開發布。它允許不同平台和語言的應用程序通過定義服務接口和方法來相互通信,並使用Google開發的Protocol Buffers(protobuf)作為預設的序列化機制。
相比於其他RPC框架,gRPC具有以下優點:
- 高效性: gRPC使用基於HTTP / 2協議的二進制傳輸,比傳統的文本協議(如XML和JSON)傳輸更快。
- 多語言支持:gRPC支持多種編程語言,包括Java、Python、C ++、Go、Ruby和C#等。
- 跨平台支持:gRPC可以在不同的平台(包括Linux、Windows和MacOS等)上運行,並且兼容許多不同的瀏覽器和移動端設備。
- 自動生成代碼:gRPC提供了自動生成客戶端和服務端代碼的工具,可以大大減少開發人員的工作量和代碼錯誤的機會。
- 支持流式數據傳輸:gRPC支持流式傳輸,允許客戶端和服務端之間交換流數據,而不是單個數據包。
總的來說,gRPC是一個快速、跨平台、多語言的RPC框架,能夠有效地處理大量的數據交換和通信需求。