每日八股-7.1
- 網絡
- 1.能說說 TCP 報文頭部都包含哪些關鍵字段嗎?
- 2.TCP 是如何確保數據傳輸的可靠性的?你能詳細談談嗎?
- 3.你能解釋一下 TCP 滑動窗口是如何設計的?它主要解決了什么問題?
- 4.TCP 協議的擁塞控制是如何實現的?你能詳細說說它的過程嗎?
- 5.在 IP 地址 10.100.122.2/24 中,斜杠后面的數字 24 代表什么意思?
- 6.什么是 SQL 注入攻擊?應該如何避免?
網絡
1.能說說 TCP 報文頭部都包含哪些關鍵字段嗎?
TCP 頭部包含了不少重要的字段。主要有源端口號和目的端口號,它們都是 16 位的,用來標識發送方和接收方的應用程序。然后是 32 位的序列號和 32 位的確認應答號,這兩個字段對于保證數據的可靠性和順序性非常關鍵。還有一些 控制位,比如 SYN 用于發起連接,ACK 用于確認,FIN 用于關閉連接,RST 用于重置連接等等。此外,頭部還包括 4 位的首部長度,16 位的窗口大小用于流量控制,16 位的校驗和用于數據完整性校驗,以及一些可選字段。
2.TCP 是如何確保數據傳輸的可靠性的?你能詳細談談嗎?
TCP 為了保證數據傳輸的可靠性,采取了一系列關鍵措施。首先,在連接建立階段,TCP 通過三次握手來確保雙方都具備正常的發送和接收能力,并且能夠防止舊的連接請求被誤用。其次,在數據傳輸階段,每個 TCP 報文都會被分配一個序列號,接收方可以根據序列號對亂序到達的數據包進行排序。同時,接收方會發送確認應答(ACK)來告知發送方已經成功接收到了哪些數據。
如果發送方在一定時間內沒有收到某個數據包的確認應答,就會觸發超時重傳機制,重新發送丟失的數據包。另外,如果發送方連續收到三個相同的確認應答(冗余 ACK),發送方會立即進行快速重傳,而無需等待超時。為了避免發送方發送過快導致接收方處理不過來,TCP 引入了流量控制機制,通過滑動窗口來限制發送方發送數據的速率。最后,為了避免網絡出現擁塞,TCP 還實現了擁塞控制機制,通過慢啟動、擁塞避免、擁塞發生和快速恢復等算法來動態調整發送速率,確保網絡不會過載,從而保證數據的可靠傳輸。
3.你能解釋一下 TCP 滑動窗口是如何設計的?它主要解決了什么問題?
TCP 的滑動窗口機制在發送方和接收方的內核中都維護著一個緩沖區,并且在這個緩沖區上定義了一個窗口。對于發送方來說,發送窗口的大小決定了在沒有收到確認應答之前,可以連續發送的最大數據量。有了發送窗口,發送方就不需要每發送一個數據包就等待確認,可以批量發送,從而大大提高了發送效率。
對于接收方來說,接收窗口的大小表示了接收緩沖區當前可用的空間大小。接收方會將這個接收窗口的大小通過 ACK 報文告知發送方。這樣,發送方就知道接收方的接收能力,從而可以根據接收方的窗口大小來調整自己的發送速率,避免發送過多的數據導致接收方處理不過來而丟包,這就是流量控制。總的來說,滑動窗口機制主要解決了串行發送-確認方式效率低下的問題,并實現了流量控制,保證了數據傳輸的可靠性。
4.TCP 協議的擁塞控制是如何實現的?你能詳細說說它的過程嗎?
TCP 的擁塞控制是通過一系列算法來實現的,主要包括慢啟動、擁塞避免、擁塞發生時的處理(超時重傳和快速重傳)以及快速恢復。
-
慢啟動: 連接建立初期,發送方以較低的速率發送數據,逐步探測網絡的承載能力,指數級地增加發送窗口。
-
擁塞避免: 當發送窗口達到慢啟動閾值后,發送窗口以線性方式緩慢增長,避免過快地填滿網絡。
-
當網絡發生擁塞,可能會出現丟包。TCP 通過兩種方式檢測丟包:
- 一是超時重傳,這種重傳方式系統默認網絡已經出現了嚴重阻塞,如果發送方在一定時間內沒有收到 ACK,就會認為發生了擁塞,此時會將慢啟動門限設置為當前擁塞窗口的一半,并將擁塞窗口重置為1,然后重新開始慢啟動。
- 二是快速重傳,這種方式系統默認網絡出現了輕微阻塞,因為接收方還可以發送包,并且發送方還可以接收到;當發送方連續收到三個重復的 ACK 時,會認為發生了丟包,會立即重傳丟失的報文,并進入快速恢復階段。在快速恢復階段,擁塞窗口會減半,然后每收到一個重復的 ACK,擁塞窗口會增加一個 MSS,當收到被重傳的報文的 ACK 后,擁塞窗口會設置為當前的慢啟動門限,然后進入擁塞避免階段,繼續線性增長。
這些機制使得 TCP 能夠根據網絡狀況動態調整發送速率,避免網絡過載。
5.在 IP 地址 10.100.122.2/24 中,斜杠后面的數字 24 代表什么意思?
在 IP 地址 10.100.122.2/24 中,斜杠后面的數字 24 表示的是子網掩碼的位數。在 CIDR(Classless Inter-Domain Routing)表示法中,這個數字說明了子網掩碼中前面有多少個連續的“1”。對于 /24 來說,它對應的子網掩碼是 255.255.255.0,換算成二進制就是前 24 位是 1,后 8 位是 0。這個子網掩碼的作用是用來劃分 IP 地址中的網絡部分和主機部分。前 24 位(10.100.122)是網絡號,用于標識一個特定的網絡,而后 8 位(2)是主機號,用于標識該網絡中的一個特定設備。通過將 IP 地址和子網掩碼進行與運算,就可以得到該 IP 地址所屬的網絡號。
6.什么是 SQL 注入攻擊?應該如何避免?
SQL 注入攻擊是指攻擊者通過在 HTTP 請求中插入惡意的 SQL 代碼,使得后端服務器在構建和執行 SQL 查詢語句時,將這些惡意代碼也當作正常的 SQL 命令來執行,從而達到竊取數據、修改數據甚至控制服務器的目的。
舉個簡單的例子,如果一個查詢用戶信息的接口通過拼接字符串的方式構建 SQL 語句,攻擊者可以在傳入的用戶 ID 參數中加入惡意的 SQL 代碼,比如 0 OR 1=1,這樣就會導致查詢返回所有用戶的信息,造成數據泄露。更嚴重的,攻擊者甚至可以注入 DROP TABLE 這樣的語句來刪除整個數據庫。
為了預防 SQL 注入攻擊,我認為可以采取以下幾個關鍵措施:
最重要也是最有效的方法是 使用參數化查詢或者預編譯語句。這種方式會將 SQL 語句的結構和參數分開處理,用戶輸入的數據會作為參數傳遞給 SQL 語句,而不是直接拼接在 SQL 語句中。這樣可以防止惡意代碼被當作 SQL 命令來執行。
其次,需要對 用戶輸入的數據進行嚴格的驗證和過濾。在后端接收到前端傳遞的參數后,要對其進行檢查,確保輸入的數據符合預期的格式和類型,并且移除任何可能包含惡意代碼的部分。可以使用白名單機制來限制允許輸入的內容。
最后,應該 遵循最小權限原則。在數據庫中,應用程序使用的賬戶應該只被授予完成其工作所需的最小權限。這樣即使發生了 SQL 注入攻擊,攻擊者能夠進行的操作也會受到限制,從而減少損失。
總而言之,使用參數化查詢或者預編譯語句是防止 SQL 注入攻擊最根本和最有效的方法。