文章目錄
- 一、05.18周六
- 1.1)網絡相關
- 1.1.1) 問題01:交換機和路由器的區別是什么?
- 交換機(Switch)
- 路由器(Router)
- 總結
- 1.1.2) 問題02:以太網介紹
- 基本概念
- 物理層和數據鏈路層
- 以太網幀
- 常見以太網類型
- 以太網的優勢
- 總結
- 1.1.3)問題03:以太網中的幀長
- 以太網幀結構
- 幀長度限制
- 幀長度實例
- 關鍵點
- 總結
- 1.2)編程相關
- 1.2.1)問題01:浮點數不準確的原因,以及在 Java和 Pyhton中是怎么解決這個問題的
- 1. 有限的精度
- 2. 二進制表示
- 3. 舍入誤差
- 4. 浮點數運算的非結合性
- 示例
- 應對方法
- 示例:高精度庫
- 總結
- 1.2.2)問題02:Java集合遍歷時的 `fail-fast` 機制介紹
- fail-fast 機制的工作原理
- 示例代碼
- 解決方法
- 總結
- 1.2.3) 問題03:java中的 TheadLocal有哪些副作用
- 二、05.19 周日
- 2.1)安全相關
- 2.1.1)問題01:XSS和CSRF的區別和聯系
- XSS(Cross-Site Scripting)
- CSRF(Cross-Site Request Forgery)
- 區別和聯系
- 總結
一、05.18周六
1.1)網絡相關
1.1.1) 問題01:交換機和路由器的區別是什么?
交換機(Switch)和路由器(Router)都是網絡設備,但它們在網絡中的功能和作用有所不同。以下是它們的主要區別:
交換機(Switch)
-
工作層次:
- 交換機通常工作在數據鏈路層(第二層),但也有一些高級交換機工作在網絡層(第三層)。
-
功能:
- 主要用于在同一局域網(LAN)內連接多個設備,如計算機、打印機等。
- 交換機通過使用 MAC 地址表來轉發數據幀,確保數據幀只發送到目標設備,而不是廣播到所有設備。
-
轉發機制:
- 基于 MAC 地址來學習和轉發數據幀。
- 使用以太網幀交換。
-
用途:
- 提高局域網的效率和安全性。
- 在大型網絡中用于分段和管理網絡流量。
路由器(Router)
-
工作層次:
- 路由器工作在網絡層(第三層)。
-
功能:
- 主要用于連接不同的網絡(如連接局域網和廣域網,或兩個不同的子網)。
- 路由器通過使用 IP 地址來轉發數據包,并決定最佳路徑將數據包發送到目的地。
-
轉發機制:
- 基于 IP 地址來路由和轉發數據包。
- 使用路由表和路由協議(如 OSPF、BGP 等)來確定最佳路徑。
-
用途:
- 提供網絡間的通信和連接互聯網。
- 管理和優化不同網絡之間的流量。
總結
- 交換機:主要用于同一網絡內設備之間的通信,工作在數據鏈路層,通過 MAC 地址來轉發數據幀。
- 路由器:主要用于連接不同網絡,工作在網絡層,通過 IP 地址來路由數據包。
在實際應用中,交換機和路由器常常結合使用,共同構建高效、穩定的網絡結構。
1.1.2) 問題02:以太網介紹
以太網(Ethernet)是一種計算機網絡技術,用于局域網(LAN)中的設備互連。它是目前最廣泛使用的局域網技術,具有高效、可靠和易于擴展的特點。以下是對以太網的詳細介紹:
基本概念
-
起源和發展:
- 以太網由施樂公司的帕洛阿爾托研究中心(PARC)的Robert Metcalfe等人在20世紀70年代發明。
- 最初的以太網標準是10 Mbps(10BASE-T),之后發展到100 Mbps(Fast Ethernet),1 Gbps(Gigabit Ethernet),10 Gbps(10 Gigabit Ethernet),25 Gbps,40 Gbps,100 Gbps等。
-
標準化:
- 以太網技術由IEEE 802.3標準定義。
- IEEE(電氣電子工程師學會)負責制定和維護這些標準。
物理層和數據鏈路層
-
物理層:
- 以太網支持多種物理媒體,包括雙絞線(UTP)、光纖和同軸電纜。
- 典型的雙絞線電纜類型是CAT5e、CAT6和CAT7。
- 光纖用于需要更長距離和更高帶寬的連接。
-
數據鏈路層:
- 使用MAC(媒體訪問控制)地址進行設備識別。
- 采用CSMA/CD(載波偵聽多路訪問/沖突檢測)機制來管理網絡訪問,特別是在半雙工模式下(現代全雙工以太網中CSMA/CD已不再使用)。
以太網幀
- 幀結構:典型的以太網幀包括以下部分:
- 前導碼(Preamble):用于幀同步。
- 幀起始定界符(SFD):標志幀的開始。
- 目標MAC地址:接收設備的MAC地址。
- 源MAC地址:發送設備的MAC地址。
- 類型/長度:標識上層協議或數據長度。
- 數據和填充:實際傳輸的數據,如果數據不足46字節,則使用填充字節。
- 幀校驗序列(FCS):用于錯誤檢測的校驗碼。
常見以太網類型
- 10BASE-T:10 Mbps,通過雙絞線電纜傳輸,最大距離100米。
- 100BASE-TX(Fast Ethernet):100 Mbps,通過雙絞線電纜傳輸,最大距離100米。
- 1000BASE-T(Gigabit Ethernet):1 Gbps,通過雙絞線電纜傳輸,最大距離100米。
- 10GBASE-T:10 Gbps,通過雙絞線電纜傳輸,最大距離55-100米,具體取決于電纜類型。
- 光纖以太網:如1000BASE-SX(短距離多模光纖),1000BASE-LX(長距離單模光纖),適用于更長的距離和更高的帶寬需求。
以太網的優勢
- 高帶寬和低延遲:能夠支持從10 Mbps到100 Gbps及以上的帶寬需求。
- 廣泛的兼容性和標準化:基于IEEE標準,確保不同廠商設備之間的互操作性。
- 簡便的網絡結構:易于安裝和擴展,適用于各種規模的網絡。
- 成本效益:相對于其他專有網絡技術,設備和布線成本較低。
總結
以太網是現代計算機網絡的基礎技術,提供高效、可靠的局域網連接。它的發展和標準化使得各種網絡設備能夠互通,廣泛應用于家庭、企業和數據中心網絡。通過不同類型的以太網技術,可以滿足從小型局域網到大型企業網絡和數據中心的各種需求。
- 以太網中的“以太”一詞,源于19世紀物理學中的假想概念,代表了一種無形的、全能的傳輸介質。盡管物理學中的“以太”概念已經被否定,但這一名稱在網絡技術中被保留下來,象征著以太網技術中數據無形傳輸的特性。以太網以其高效、可靠和標準化的特性,成為了現代局域網的基礎。
1.1.3)問題03:以太網中的幀長
以太網幀(Ethernet frame)是以太網中傳輸數據的基本單位。幀的長度,包括幀頭、數據部分和幀尾,總共必須在某個范圍內,以確保網絡的正常運行。以下是關于以太網幀長度的詳細信息:
以太網幀結構
一個標準的以太網幀包括以下部分:
- 前導碼(Preamble):7字節,用于幀同步。
- 幀起始定界符(SFD, Start Frame Delimiter):1字節,標志幀的開始。
- 目標MAC地址:6字節。
- 源MAC地址:6字節。
- 類型/長度字段:2字節,表示上層協議類型或數據的長度。
- 數據和填充:46到1500字節。
- 幀校驗序列(FCS, Frame Check Sequence):4字節,用于錯誤檢測。
幀長度限制
-
最小幀長度:以太網幀的最小長度為64字節(從目標MAC地址到FCS,包括填充字節)。
- 原因:最小幀長度的限制是為了確保在共享介質(如集線器)上的沖突檢測(CSMA/CD)機制能夠正常工作。如果幀太短,沖突可能在幀傳輸結束后才被檢測到,這會影響沖突檢測和恢復機制。
- 填充:如果數據部分不足46字節,需要進行填充(padding)以滿足最小幀長度要求。
-
最大幀長度:標準以太網幀的最大長度為1518字節(從目標MAC地址到FCS,不包括前導碼和SFD)。
- 原因:最大幀長度的限制主要是為了確保網絡的公平性和避免單幀占用帶寬時間過長,導致其他設備的傳輸延遲。
- Jumbo幀:一些網絡(特別是千兆以太網和更高速的網絡)支持更大的幀,稱為Jumbo幀,通常最大長度為9000字節。這些幀可以提高網絡效率,減少CPU負擔,但需要網絡設備支持。
幀長度實例
7 bytes 1 byte 6 bytes 6 bytes 2 bytes 46-1500 bytes 4 bytes
+--------+----------+----------+---------+-----------+------------------+------+
| Preamble | SFD | Dest MAC | Src MAC | Type/Length | Data & Padding | FCS |
+--------+----------+----------+---------+-----------+------------------+------+
-
最小幀例子:包含最小46字節的數據或填充。
- 64字節 = 6(目標MAC) + 6(源MAC) + 2(類型/長度) + 46(數據或填充) + 4(FCS)
-
最大幀例子:包含最大1500字節的數據。
- 1518字節 = 6(目標MAC) + 6(源MAC) + 2(類型/長度) + 1500(數據) + 4(FCS)
關鍵點
- 最小幀長:64字節,必要時用填充字節補齊。
- 最大幀長:1518字節,不包括前導碼和SFD。
- Jumbo幀:需要設備支持,通常最大9000字節。
總結
以太網幀的長度限制確保了網絡的有效運行和沖突檢測機制的可靠性。通過這些限制,以太網能夠在多種環境下提供高效、可靠的數據傳輸服務。
1.2)編程相關
1.2.1)問題01:浮點數不準確的原因,以及在 Java和 Pyhton中是怎么解決這個問題的
浮點數在計算機中表示方式的限制導致其在某些情況下不夠準確。具體原因主要涉及到以下幾個方面:
1. 有限的精度
浮點數使用有限的位數來表示一個數,這種表示方式限制了能表達的精度。浮點數通常遵循IEEE 754標準,該標準定義了浮點數的格式和精度。以32位單精度浮點數為例,它由1位符號位、8位指數位和23位尾數(小數部分)位組成。這些位數只能表示有限范圍內的數字,并且只能以有限的精度表示它們。
2. 二進制表示
浮點數在計算機中以二進制(基數為2)的形式存儲,而很多十進制小數無法精確地用二進制表示。例如,十進制的小數0.1在二進制中是一個無限循環小數:
0.1 (decimal) = 0.00011001100110011001100110011... (binary)
由于計算機存儲位數有限,必須截斷這個二進制小數,從而引入誤差。
3. 舍入誤差
由于浮點數的有限精度,進行運算時常常需要舍入。例如,兩個浮點數相加、相乘時,結果可能需要舍入到可表示的最接近的浮點數。這種舍入會導致微小的誤差累積,在大量計算或多次運算后,誤差可能變得顯著。
4. 浮點數運算的非結合性
浮點數運算并不總是符合數學上的結合律。例如,對于浮點數,(a + b) + c 不一定等于 a + (b + c)。這是因為每次運算都可能引入舍入誤差,從而影響結果。這種非結合性會在復雜計算中積累誤差。
示例
考慮以下Python代碼示例:
print(0.1 + 0.2)
你可能期望輸出是0.3
,但實際輸出可能是0.30000000000000004
。這是因為0.1和0.2都無法精確表示為二進制浮點數,在相加時引入了舍入誤差。
應對方法
-
提高精度:在某些應用中,可以使用64位雙精度浮點數(double),它提供了更高的精度。然而,盡管雙精度浮點數比單精度浮點數精確得多,但它仍然不能完全避免舍入誤差。
-
使用定點數:對于某些特定應用,特別是財務計算,可以使用定點數表示。這種方法將小數點固定在某一位置,通過整數運算來避免浮點數的舍入誤差。
-
使用高精度庫:在需要高精度計算的應用中,可以使用高精度算術庫。例如,Python 的
decimal
模塊提供了比浮點數更高精度的數值計算。 -
誤差分析和數值穩定性:在設計算法時,盡量減少舍入誤差的影響。例如,通過重構算法以減少浮點數運算次數,或通過誤差分析來確保最終結果的數值穩定性。
示例:高精度庫
在Python中使用decimal
模塊可以顯著提高計算精度。例如:
from decimal import Decimal, getcontext# 設置精度
getcontext().prec = 28# 使用Decimal進行計算
a = Decimal('0.1')
b = Decimal('0.2')
c = a + bprint(c) # 輸出: 0.3
在這個例子中,decimal
模塊能夠準確表示0.1和0.2,并且正確地計算它們的和為0.3,而不會出現浮點數帶來的精度問題。
總結
-
浮點數不準確的根本原因在于它們在計算機中的表示方式受到二進制表示和有限位數的限制。這些限制導致了一些無法避免的舍入誤差和精度問題。在需要高精度的計算場景中,通常需要采用定點數、高精度算術庫或進行精度控制和誤差分析來減小誤差的影響。
-
Python中的decimal模塊能夠準確表示0.1的原因在于它使用十進制浮點數表示法,避免了二進制表示法帶來的舍入誤差問題。通過直接存儲和操作十進制數值,decimal模塊可以提供更高的精度和更可靠的數值計算結果。
-
Java 中的 BigDecimal 類通過使用十進制浮點數表示法,避免了二進制浮點數表示法帶來的精度誤差問題。它提供了精確的小數表示和高精度的算術運算,適用于需要嚴格精度控制的場合,如財務計算和科學計算。
1.2.2)問題02:Java集合遍歷時的 fail-fast
機制介紹
Java 中的 fail-fast
機制是指在遍歷集合(如 ArrayList
、HashMap
等)時,如果在遍歷過程中對集合進行結構性修改(如添加、刪除元素),那么會拋出 ConcurrentModificationException
。這種機制設計的目的是為了及時檢測并報告可能導致不一致性或錯誤的并發修改。
fail-fast 機制的工作原理
在 Java 集合框架中,許多迭代器都實現了 fail-fast
機制。它們通過維護一個稱為 modCount
的修改計數器來跟蹤集合的結構性修改。
modCount
計數器:每當集合被結構性修改時(例如添加或刪除元素),modCount
就會增加。- 迭代器中的
expectedModCount
:迭代器在創建時會保存當前集合的modCount
,稱為expectedModCount
。 - 一致性檢查:在迭代過程中,迭代器會不斷檢查
modCount
是否等于expectedModCount
。如果不相等,則說明集合在迭代過程中被修改過,迭代器會拋出ConcurrentModificationException
。
示例代碼
以下是一個示例,演示了 fail-fast
機制:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class FailFastExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");// 創建迭代器Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);// 嘗試在迭代過程中修改集合if ("B".equals(element)) {list.remove(element); // 這行代碼將觸發 ConcurrentModificationException}}}
}
在上面的代碼中,list.remove(element)
會在迭代過程中修改集合的結構,因此會導致 ConcurrentModificationException
。
解決方法
如果需要在迭代過程中修改集合,可以使用以下幾種方法之一:
-
使用迭代器的
remove
方法:- 迭代器提供了安全的
remove
方法,可以在迭代過程中刪除元素而不會觸發fail-fast
機制。
import java.util.ArrayList; import java.util.Iterator; import java.util.List;public class FailFastExample {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");// 創建迭代器Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);// 使用迭代器的 remove 方法if ("B".equals(element)) {iterator.remove(); // 安全地刪除元素}}} }
- 迭代器提供了安全的
-
使用
CopyOnWriteArrayList
等并發集合:- Java 提供了一些并發集合類,如
CopyOnWriteArrayList
,它們采用了不同的機制來處理并發修改,不會觸發fail-fast
機制。
import java.util.List; import java.util.concurrent.CopyOnWriteArrayList;public class FailFastExample {public static void main(String[] args) {List<String> list = new CopyOnWriteArrayList<>();list.add("A");list.add("B");list.add("C");// 創建迭代器for (String element : list) {System.out.println(element);// 可以安全地修改集合if ("B".equals(element)) {list.remove(element); // 不會觸發 ConcurrentModificationException}}} }
- Java 提供了一些并發集合類,如
總結
fail-fast
機制通過在迭代過程中檢測并報告集合的并發修改,幫助開發者及時發現潛在的并發問題。雖然這種機制提高了集合操作的安全性,但在需要并發修改集合時,應該使用迭代器的 remove
方法或并發集合類來避免 ConcurrentModificationException
。
1.2.3) 問題03:java中的 TheadLocal有哪些副作用
ThreadLocal
是 Java 中用于實現線程本地存儲(Thread-local storage, TLS)的工具類。它可以讓每個線程都擁有自己的數據副本,從而避免了線程安全問題。然而,ThreadLocal
也存在一些副作用,需要注意和避免:
-
內存泄漏風險:如果沒有正確管理
ThreadLocal
,很容易導致內存泄漏。因為ThreadLocal
的值是存儲在線程本地的,如果線程長時間不銷毀或者沒有手動清理ThreadLocal
的值,這些值會一直存在于內存中,無法被垃圾回收器回收。 -
容易造成全局狀態:雖然
ThreadLocal
可以保證線程間數據隔離,但過度使用ThreadLocal
會導致難以追蹤和維護的全局狀態。因為每個線程都有自己的ThreadLocal
值,過多的ThreadLocal
變量會導致代碼難以理解和維護。 -
可能影響性能:雖然
ThreadLocal
可以提高并發性能,但過多或不合理使用ThreadLocal
也可能導致性能問題。因為每個線程都有自己的ThreadLocal
值,當線程數量很多時,ThreadLocal
的管理和維護會帶來額外的開銷。 -
線程池使用需要注意:在使用線程池的情況下,
ThreadLocal
的使用需要格外小心。因為線程池中的線程會被重復使用,如果ThreadLocal
的值沒有被正確清理,可能會導致線程間數據泄漏或混亂。 -
可能導致上下文切換問題:如果
ThreadLocal
的值在不同線程之間頻繁傳遞,可能會導致線程上下文切換的頻繁發生,影響程序性能。
為避免 ThreadLocal
的副作用,可以采取以下措施:
- 適度使用
ThreadLocal
,避免過多的全局狀態。 - 注意清理
ThreadLocal
的值,及時釋放不再需要的資源,避免內存泄漏。 - 在使用線程池的情況下,盡量避免
ThreadLocal
的使用,或者確保每次使用完畢后清理ThreadLocal
的值。 - 注意
ThreadLocal
的生命周期管理,避免長時間保持不變的ThreadLocal
值。
總之,雖然 ThreadLocal
在某些場景下非常有用,但需要注意避免其可能帶來的副作用,合理使用并加以管理。
- 主要是在 線程池復用時會遇到 臟數據和內存泄露問題,解決辦法就是 及時調用 ThreadLocal的 remove() 方法
二、05.19 周日
2.1)安全相關
2.1.1)問題01:XSS和CSRF的區別和聯系
XSS(Cross-Site Scripting,跨站腳本攻擊)和 CSRF(Cross-Site Request Forgery,跨站請求偽造)是兩種常見的網絡攻擊技術,盡管它們的攻擊方式和目的不同,但都有可能導致嚴重的安全問題。以下是對它們的區別和聯系的詳細解釋:
XSS(Cross-Site Scripting)
目的:
- XSS 的目的是向用戶的瀏覽器注入惡意腳本,從而竊取用戶信息、劫持用戶會話、篡改網頁內容或進行其他惡意操作。
類型:
- 存儲型(Stored XSS):惡意腳本存儲在目標服務器上,所有訪問受感染頁面的用戶都會執行這些腳本。
- 反射型(Reflected XSS):惡意腳本通過URL參數或表單提交反射到用戶瀏覽器,并立即執行。
- DOM 型(DOM-based XSS):惡意腳本通過修改頁面的 DOM(文檔對象模型)直接在客戶端執行。
工作原理:
- 攻擊者通過注入惡意腳本到網頁中,當用戶訪問該網頁時,惡意腳本在用戶的瀏覽器中執行,導致用戶信息泄露或其他惡意行為。
防御措施:
- 輸入驗證和輸出編碼:對用戶輸入進行嚴格驗證,并對輸出進行適當的編碼。
- 使用安全的庫和框架:使用已有的安全庫和框架來處理和防止 XSS 攻擊。
- Content Security Policy(CSP):通過配置 CSP 限制頁面中可執行的腳本來源。
CSRF(Cross-Site Request Forgery)
目的:
- CSRF 的目的是通過偽造用戶的身份在用戶不知情的情況下向目標網站發送惡意請求,從而執行未授權的操作(如更改用戶設置、轉賬等)。
工作原理:
- 攻擊者誘導用戶在已登錄目標網站的狀態下訪問攻擊者控制的頁面,該頁面包含偽造的請求,利用用戶的身份和已建立的會話執行惡意操作。
防御措施:
- CSRF 令牌:在表單提交時使用唯一的 CSRF 令牌,并在服務器端驗證該令牌。
- SameSite 屬性:為 cookies 設置
SameSite
屬性,限制跨站請求攜帶 cookies。 - 雙重提交 cookie:將 CSRF 令牌同時存儲在 cookie 和表單中,并在服務器端進行驗證。
區別和聯系
區別:
- 目標:
- XSS 攻擊目標是用戶,通過在用戶瀏覽器中執行惡意腳本來竊取信息或執行操作。
- CSRF 攻擊目標是服務器,通過偽造用戶的請求來執行未授權的操作。
- 攻擊手段:
- XSS 利用網頁中的漏洞注入惡意腳本。
- CSRF 利用用戶已建立的會話和信任關系偽造請求。
- 影響范圍:
- XSS 主要影響用戶,可能導致用戶信息泄露和瀏覽器被劫持。
- CSRF 主要影響服務器,可能導致服務器執行未授權的操作。
聯系:
- 攻擊載體:兩者都可以通過用戶的瀏覽器作為攻擊載體。
- 組合攻擊:XSS 和 CSRF 可以結合使用,攻擊者可以先利用 XSS 獲取用戶的認證信息或 CSRF 令牌,再通過 CSRF 發起進一步攻擊。
總結
XSS 和 CSRF 是兩種不同的網絡攻擊技術,但它們都依賴于用戶的瀏覽器作為攻擊媒介。理解它們的區別和聯系,有助于更好地設計防御策略,保護應用程序和用戶免受這些攻擊的侵害。通過輸入驗證、輸出編碼、CSRF 令牌、SameSite 屬性等措施,可以有效防御這些攻擊。