Linux 網絡基礎三 (數據鏈路層協議:以太網協議、ARP 協議)

一、以太網

兩個不同局域網的主機傳遞數據并不是直接傳遞的,而是通過路由器 “一跳一跳” 的傳遞過去。

跨網絡傳輸的本質:由無數個局域網(子網)轉發的結果。

所以,要理解數據跨網絡轉發原理就要先理解一個局域網中數據是如何轉發的,它就是以太網協議。

在同一個局域網內的兩太主機是可以直接通信的。

舉例:在局域網通信就好比如,老師上課的時候喊張三的名字,所有人都能聽到,只不過分析發現老師喊的不是自己就忽略掉,而只有張三會處理這個老師發出來的這個消息,那么老師和張三的通信就可以看作是 1 對 1 的直接通信。

  • “以太網” 不是一種具體的網絡,而是一種技術標準。既包含了數據鏈路層的內容,也包含了一些物理層的內容。例如:規定了網絡拓撲結構,訪問控制方式,傳輸速率等。
  • 例如以太網中的網線必須使用雙絞線,傳輸速率有 10M,100M,1000M 等。
  • 以太網是當前應用最廣泛的局域網技術,和以太網并列的還有令牌環網,無線 LAN 等。

?1、以太網幀格式

局域網兩臺主機之間通信必須要封裝 MAC 幀。

以太網的幀格式如下圖所示:

  • 源地址和目的地址是指網卡的硬件地址(也叫 MAC 地址),長度是 48 位,是在網卡出廠時固化的。
  • 幀協議類型字段有三種值,分別對應 IP 協議、ARP 協議和 RARP 協議。
  • 幀末尾是 CRC 校驗碼。

用紅色圈出來的部分就是報頭部分。中間的則是數據部分,數據部分包含上層的報頭加有效載荷(HTTP、TCP、IP 的封裝)。

2、MAC 幀將報頭與有效載荷進行分離 & 向上交付?

如何將報頭與有效載荷分離呢?

MAC 幀的分離方式就是采用定長報頭。直接對前面的 14 個和后邊的 4 個進行提取,剩下的就是有效載荷。

向上交付給哪個協議?

在 MAC 幀的幀頭當中有?2 個字節的類型字段,因此在分離出報頭和有效載荷后,根據該字段將有效載荷交付給對應的上層協議即可。

3、認識 MAC 地址

局域網通信,每臺主機都要有自己的唯一標識(虛擬機中的 MAC 地址不是真實的 MAC 地址,可能會沖突,也有些網卡支持用戶配置 MAC 地址),每一臺機器都要配一張網卡,每一個網卡都有一個序列號,這個序列號就是該網卡的 MAC 地址,用來識別數據鏈路層中相連的節點,在全球范圍內具有唯一性(其實在局域網內保證唯一性就夠了),長度為 48 位(6 個字節),一般用 16 進制數字加上冒號的形式來表示(例如:08:00:27:03:fb:19)。

注意:MAC 地址在網卡出廠時就確定了,不能修改。

4、局域網轉發原理(基于協議)

假設現在要 MAC 1發送數據給 MAC7,那么首先就需要封裝一個 MAC 幀

每臺主機的數據鏈路層都會收到這個 MAC 幀,然后進行報頭和有效載荷的分離,然后查看目的 IP 地址發現是 MAC7,如果發現不是自己,直接把數據幀丟棄,上層根本就不知道收到了這個數據幀;如果發現是自己,就把有效載荷向上交付。

處理結束后,MAC7 也會給 MAC1 一個應答

發送的過程同上。

結論:其實局域網所有的主機都能收到 MAC 幀,只不過如果目標 MAC 地址不等于自己的 MAC 地址,就直接在數據鏈路層丟棄掉。?

由此在局域網中,網卡有一種混雜模式:就是不丟棄任何的數據幀,全部向上交付,這就是局域網抓包工具的原理。
由此也可以看出 HTTPS 數據加密的必要性。

(1)數據碰撞

由于以太網中的所有的主機共享一個通信信道,所以多臺主機同時發送數據,數據之間就可能會產生數據碰撞問題。

舉例:在教室老師想跟李四說話,但是所有人都在互相說話,導致李四聽不到老師的聲音。

解決方法:在同一時刻只允許有一臺主機發送數據

如何保證我在發送數據時,別人也想發送數據成功呢?

兩種方法:

  1. 令牌環:誰拿牌誰就能發消息,類比互斥鎖。
  2. 以太網:如果發生了碰撞,就暫時不發數據,發送主機會休息一段(隨機)時間再嘗試發送。這種方法叫做主機的碰撞檢測和碰撞避免算法

如果我們不斷向局域網發送垃圾數據并且不執行碰撞檢測和碰撞避免,那么就能讓局域網所有主機都無法通信。

那么就可以把局域網看成一個臨界資源,通過碰撞檢測 + 碰撞避免讓任何時刻只有一臺主機能夠發送消息。

局域網中的主機越多越好,還是越少越好呢?

越少越好。

局域網數據幀發送數據的時候,數據幀是越長越好,還是越短越好呢?

數據幀越短越好。數據太長容易造成碰撞問題,但太短的話,能攜帶的信息就比較少,所以不能太短。

(2)交換機

如果局域網過大,就會導致碰撞的概率增加,所以就有了交換機。

  • 交換機可以識別到局部性的碰撞,對碰撞的數據不做轉發。比方說交換機左側發生了碰撞,并不會影響到 MAC3 給 MAC4 發消息。
  • 交換機對正常發送的數據也不會做轉發。比方說 MAC1 是給 MAC5 發消息,那么就沒必要讓交換機的右側收到消息,右側的碰撞概率就減小了。

交換機的核心作用:劃分碰撞域。

?5、對比理解?MAC?地址和?IP?地址

  • IP 地址描述的是路途總體的起點和終點
  • MAC 地址描述的是路途上的每一個區間的起點和終點

IP 就是一個大目標,MAC 就是實現大目標的每一個小目標。

因此數據在路由過程中,源 IP 地址和目的 IP 地址可以理解成是不會變化的,而數據每進行一跳后其源 MAC 地址和目的 MAC 地址都會變化

6、認識 MTU??

MTU(最大傳輸單元)描述的是底層數據幀一次最多可以發送的數據量,這個限制是不同的數據鏈路層對應的物理層產生的。以太網對應 MTU 的值一般是 1500 字節。不同的網絡類型有不同的 MTU。

如果一個數據包從以太網路由到撥號鏈路上,數據包長度大于撥號鏈路的 MTU 了,則需要對數據包進行分片(fragmentation)。

MAC 幀規定有效載荷的長度的范圍是【46~1500】。ARP 數據包的長度不夠 46 字節時,要在后面補填充位。

可以把 MTU 看作發快遞時對包裹的大小限制,不同的數據鏈路層標準的 MTU 是不同的。

(1)MTU 對 IP 協議的影響

由于數據鏈路層 MTU 的限制,如果 IP 層一次發送的字節數超過了 MTU,就需要進行切片。

  • 將較大的 IP 包分成多個小包,并給每個小包打上標簽。
  • 每個小包 IP 協議頭的 16 位標識(id)都是相同的。每個小包的 IP 協議頭的 3 位標志字段中,第 2 位置為 0,表示允許分片,第 3 位來表示結束標記(當前是否是最后一個小包,是的話置為 1,否則置為 0)。
  • 到達對端時再將這些小包,會按順序重組,拼裝到一起返回給傳輸層。一旦這些小包中任意一個小包丟失,接收端的重組就會失敗,但是 IP 層不會負責重新傳輸數據。

補充:數據在路由器轉發的過程路由器也可能會進行切分,因為不同網絡的 MTU 是不同的。這樣我們可以把 IP 協議中的不可切分字段置為 1,如果遇到 MTU 較小的,直接舍棄掉數據,重發重新選擇路徑,這樣就可以選出一條吞吐量大的路徑

(2)MTU 對 UDP 協議的影響

一旦 UDP 攜帶的數據超過 1472(1500 - 20(IP 首部)- 8(UDP 首部)), 那么就會在網絡層分成多個 IP 數據報。

這多個 IP 數據報有任意一個丟失都會引起接收端網絡層重組失敗。那么這就意味著,如果 UDP 數據報在網絡層被分片,整個數據被丟失的概率就大大增加了

(3)MTU?對于?TCP?協議的影響

TCP 作為傳輸控制協議,它需要控制有效載荷數據不能超過某一閾值,還是受制于 MTU。TCP 的單個數據報的最大消息長度,稱為 MSS(Max Segment Size,最大報文段長度)。

TCP 在建立連接的過程中,通信雙方會進行 MSS 協商。最理想的情況下,MSS 的值正好是在 IP 不會被分片處理的最大長度(這個長度仍然是受制于數據鏈路層的 MTU)。

MAC 幀的有效載荷最大為 MTU,TCP 的有效載荷最大為 MSS,由于 TCP 和 IP 常規情況下報頭的長度都是 20 字節,因此一般情況下 MSS = MTU - 20 - 20,而 MTU 的值一般是 1500 字節,因此 MSS 的值一般就是 1460 字節。所以一般建議 TCP 將發送的數據控制在 1460 字節以內,此時就能夠降低數據分片的可能性。

這也解釋了為什么滑動窗口范圍內會有多個報文段,不能直接一起發送,就是因為一次不允許發送太大的單個數據段。

雙方在發送 SYN 的時候會在 TCP 頭部寫入自己能支持的 MSS 值,然后雙方得知對方的 MSS 值之后,選擇較小的作為最終 MSS。

MSS 的值就是在 TCP 首部的 40 字節變長選項中(kind=2)。

如何減少分片?

如果傳輸層控制好一次交給 IP 的數據量不要太大,那么數據在 IP 層自然也就不需要進行分片。

如果 UDP 和?TCP?攜帶的數據過大,超過 MTU,對于 UDP 來說就直接丟包了,對于 TCP 就是數據重傳。所以可以得出切片是不好的。?

(4)MSS?和?MTU?的關系

(5)查看硬件地址和?MTU?

使用?ifconfig?命令,即可查看?ip?地址,mac?地址和?MTU:

二、ARP?協議

注意?:ARP??不是一個單純的數據鏈路層的協議,?而是一個介于數據鏈路層和網絡層之間的協議。

1、ARP 協議的作用

當跨不同子網的兩太主機 A 和 B 通信,最終數據會送到主機 B 局域網中的路由器 D,我們知道 D 和 B 屬于同一個局域網,那么就得封裝 MAC 幀進行通信,但是報文中只含有 B 的 IP 地址,并不知道 B 的 MAC 地址。這就需要有一個過程讓路由器獲取主機 B 的 MAC 地址。

ARP 協議建立了主機 IP 地址和 MAC 地址的映射關系,其作用就是根據 IP 地址來獲取目標主機的 MAC 地址。

在網絡通訊時,源主機的應用程序知道目的主機的 IP 地址和端口號,卻不知道目的主機的硬件地址。數據包首先是被網卡接收到再去處理上層協議的,如果接收到的數據包的硬件地址與本機不符,則直接丟棄。因此在通訊前必須獲得目的主機的硬件地址。

2、ARP?協議的工作流程

舉例:現在在一個教室上課,老師第一次來,不認識每個學生,只知道每個人的學號,那么老師如何知道每個人的姓名呢?—— 可以直接叫學號,然后得到這名同學的反饋,也就建立了學號和姓名的映射關系。

當路由器收到數據要發送給目標主機的時候,就會封裝 ARP 報文,廣播報文,尋找匹配的目標 IP,目標主機收到 ATP 后會封裝一個 ARP 應答,該應答里包含了自己的 MAC 地址。由此路由器就知道了目標主機的 MAC 地址,然后才會把數據包封裝 MAC 幀進行發送。

  • 源主機發出 ARP 請求,詢問 “IP 地址是 192.168.0.1 的主機的硬件地址是多少”,并將這個請求廣播到本地網段(以太網幀首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示廣播)。
  • 目的主機接收到廣播的 ARP 請求,發現其中的 IP 地址與本機相符,則發送一個 ARP 應答數據包給源主機,將自己的硬件地址填寫在應答包中。
  • 每臺主機都維護一個 ARP 緩存表,可以用 arp -a 命令查看。緩存表中的表項有過期時間(一般為 20 分鐘),如果 20 分鐘內沒有再次使用某個表項,則該表項失效,下次還要發 ARP 請求來獲得目的主機的硬件地址。

(1)ARP 的請求過程

假設現在路由器 A 構建 ARP 請求發送給 B。

構建 ARP 請求:

  • 硬件類型指鏈路層的網絡類型,1 為以太網。
  • 協議類型指要轉換的地址類型,0x0800 為 IP 地址。
  • 硬件地址長度對于以太網地址為 6 字節,因為 MAC 地址是 48 位的。
  • 協議地址長度對于 IP 地址為 4 字節,因為 IP 地址是 32 位的。
  • op 字段為 1 表示 ARP 請求,op 字段為 2 表示 ARP 應答。

以太網地址和發送端 IP 地址,對應就是路由器 A 的 MAC 地址和 IP 地址。
目的以太網地址和目的 IP 地址,對應就是主機 B 的 MAC 地址和 IP 地址,因為不知道主機 B 的 MAC 地址,所以填全 F。

這個報文實際上是在 ARP 層封裝的:

報文要先向下交付數據鏈路層進行封裝才會發送到局域網。
所以現在需要添加以太網幀的報頭:

  • 目的 MAC 地址并不知道,所以填全 F。
  • 源地址就填路由器 A 的 MAC 地址。
  • 類型就填 0806,因為 MAC 幀當中的幀類型字段設置為 0806。
  • 最后要加上 CRC 校驗。

MAC 幀封裝完畢后,路由器 A 就可以將封裝好的 MAC 幀以廣播的方式發送到局域網當中了。

假設現在 MAC2 主機收到了這個報文,解包后發現目標 MAC 是全 F,就是廣播的,當識別到 MAC 幀當中的幀類型字段為 0806 后,便知道這是一個 ARP 的請求或應答的數據包,于是會將 MAC 幀的有效載荷向上交付給 ARP 層。
當 ARP 收到數據包后,先比對 op 字段,判斷是請求還是響應。發現是 1 就是請求,然后提取目的IP字段,發現不是自己,就在 ARP 層直接丟棄數據包。

?(2)ARP 的應答過程

構建 ARP 響應:

  • op 填 2,表示應答。
  • 目標 MAC 就填路由器 A。
  • 其他同理 ARP 請求。

為了發送到局域網,所以加下來封裝 MAC 幀報頭:

MAC 幀封裝完畢后,主機 B 就可以將封裝好的 MAC 幀發送到局域網當中了。

所有主機都會收到這個 MAC 幀,看到 MAC 幀報頭中的目的 IP 如果不是自己的,就直接丟棄了,不會傳遞到 ARP 層。
當路由器 A 的 ARP 層收到這個數據包后,先看的 op 字段為 2,于是判定這是一個 ARP 應答,然后就會提取發送端以太網的地址和發送端 IP 地址,此時路由器 D 就拿到了主機 B 的 MAC 地址。

結論:?

  • 任何主機可能之前向目標主機發送過 ARP 請求,也就注定了未來一定會收到對應的 ARP 應答。
  • 任何一臺主機也有可能收到別人發起的 ARP 請求。

所以,局域網中,任何一臺主機收到 ARP 的時候,可能是一個應答,也可能是一個請求。

總結:所有 ARP 層收到數據包后,都會先看 op 字段,如果是 1 請求,那么就構建應答,如果是 2 應答,那么就提取源 IP 和源 MAC 地址就可以知道對方的 IP 和 MAC 地址了。

是不是只會在目標最終的子網中進行 ARP,其它地方是否會發生 ARP 呢?

會,ARP 可能在網絡中的任意一條路徑中發生。

?3、ARP?數據報的格式

因為 ARP 里面包含了 IP,所以?ARP 協議協議屬于 MAC 幀的上層協議

所以 MAC 幀在封裝的時候,不僅僅有 IP 報文,還有可能是 ARP 請求/應答。

注意到源 MAC 地址、目的 MAC 地址在以太網首部和 ARP 請求中各出現一次,對于鏈路層為以太網的情況是多余的,但如果鏈路層是其它類型的網絡則有可能是必要的。

這里的前三個字段是 MAC 幀的報頭,所以真實的 ARP 請求只有后面的部分:

  • 硬件類型指鏈路層的網絡類型,1 為以太網。
  • 協議類型指要轉換的地址類型,0x0800 為 IP 地址。
  • 硬件地址長度對于以太網地址為 6 字節,因為 MAC 地址是 48 位的。
  • 協議地址長度對于 IP 地址為 4 字節,因為 IP 地址是 32 位的。
  • op 字段為 1 表示 ARP 請求,op 字段為 2 表示 ARP 應答。

?后邊四個字段就是用來 ARP 的請求和響應的。如果后邊一些字段不清楚,例如目的 MAC 地址,就可以填成全 F 標識沒有被設置。

4、ARP 緩存表

局域網通信要用到 MAC 地址,所以要使用 ARP 協議通過 IP 得到 MAC 地址,ARP?看起來至少進行一個請求和一個應答,難道每一次發送數據都要用這個流程嗎?

不是,arp 請求成功之后,請求方會暫時將 IP:MAC 地址的映射關系保存起來。

每次發起 ARP 請求后都會建立對應主機 IP 地址和 MAC 地址的映射關系,每臺主機都維護了一個 ARP 緩存表,我們可以用命令:arp -a?進行查看。

注意:緩存表中的表項有過期時間,這個時間一般為 20 分鐘。如果 20 分鐘內沒有再次使用某個表項,那么這個表項就會失效,下次使用時就需要重新發起 ARP 請求來獲得目的主機的硬件地址,這主要是因為?IP 地址是會發生變化的。?

5、RARP 協議

RARP(反向地址轉換協議),是根據 MAC 地址獲取 IP 地址的協議。

在同一局域網內知道了 MAC 地址就可以直接向給主機發送消息了,因此我們可以直接發消息詢問對方的 IP 地址就行了。

6、ARP 欺騙

假設現在有一個局域網,每個主機內部都有 ARP 緩存表如下:

但此時來了一個中間人,它封裝大量假的 ARP 請求發送給 MAC1,里面寫的是?IP4:MAC3,同理給路由器發送?IP1:MAC3。

這樣 MAC3 就成為了中間人,這種操作就叫作?ARP 欺騙

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902823.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902823.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902823.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Azure Data Factory ETL設計與調度最佳實踐

一、引言 在Azure Data Factory (ADF) 中,調度和設計ETL(抽取、轉換、加載)過程需要綜合考量多方面因素,以確保數據處理高效、可擴展、可靠且易于維護。以下將詳細介紹相關關鍵考慮因素、最佳實踐,并輔以具體示例說明…

非序列實現MEMS聚焦功能

zemax非序列模式下有MEMS,但是沒有對應的代碼。無法修改成自己需要的功能 以下是實現MEMS聚焦功能: #include <windows.h> #include <cmath> #include <stdio.h> #include <string.h> #include <algorithm> #undef max #undef min#define D…

android studio sdk unavailable和Android 安裝時報錯:SDK emulator directory is missing

md 網上說的都是更換proxy代理什么的&#xff0c;換網的&#xff0c;還有一些二其他亂七八糟的&#xff0c;根本沒用&#xff0c;感覺很多就是解決不了問題&#xff0c;還賊多賊一致&#xff0c;同質化&#xff0c;感覺很坑人&#xff0c;讓人覺得他們和我的一樣的&#xff0c;…

三維重建模塊VR,3DCursor,MPR與VR的坐標轉換

MPR里的reslicecursor 的坐標與 vtkimage 坐標一致。 但三維窗格里的vtkvolume 的坐標是相對坐標&#xff0c;坐標值依然是MM單位。 用中心點的偏移量比較容易實現&#xff0c;交互中Reslicercursor中心點 距離 vtkimagedata 的中心點 的偏移量&#xff0c;用于vtkvolume即可…

Python Cookbook-6.9 快速復制對象

任務 為了使用 copy.copy&#xff0c;需要實現特殊方法__copy__。而且你的類的__init__比較耗時所以你希望能夠繞過它并獲得一個“空的”未初始化的類實例。 解決方案 下面的解決方案可同時適用于新風格和經典類: def empty_copy(obj):class Empty(obj.__class__):def __in…

kubernets集群的安裝-node節點安裝-(簡單可用)-超詳細

一、kubernetes 1、簡介 kubernetes&#xff0c;簡稱K8s&#xff08;庫伯內特&#xff09;&#xff0c;是用8代替名字中間的8個字符“ubernete”而成的縮寫 云計算的三種主要服務模式——基礎設施即服務&#xff08;IaaS&#xff09;、平臺即服務&#xff08;PaaS&#xff0…

【Linux學習筆記】進程的fork創建 exit終止 wait等待

【Linux學習筆記】進程的fork創建 exit終止 wait等待 &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;Linux學習筆記 文章目錄 【Linux學習筆記】進程的fork創建 exit終止 wait等待前言1.進程創建1.1 fork函數初識1.2fork函數返回值1.3寫時拷…

鴻蒙應用開發證書考試的一點想法

一、介紹&#xff1a; 直接上圖 二、體驗后的想法&#xff1a; 1.知識點在指南API參考最佳實踐里面找 2.沒有明確說明考試不能查第1點的文檔&#xff0c;但是考試只有1個小時&#xff0c;合理分配時間 3.切屏三次后自動提交要注意&#xff0c;每月3次機會下月又有3次機會&a…

含錫廢水處理的經濟效益

主要體現在成本節約和資源回收兩方面&#xff0c;具體收益因處理工藝、廢水濃度及規模差異而不同。以下結合不同技術路線進行量化分析&#xff1a; 一、直接經濟效益 資源回收收益 金屬錫回收&#xff1a; 若廢水中錫濃度為100 mg/L&#xff0c;日處理量100噸&#xff0c;則每…

Base64編碼原理:二進制數據與文本的轉換技術

&#x1f504; Base64編碼原理&#xff1a;二進制數據與文本的轉換技術 開發者的數據編碼困境 作為開發者&#xff0c;你是否曾遇到這些與Base64相關的挑戰&#xff1a; &#x1f4ca; 需要在JSON中傳輸二進制數據&#xff0c;但不確定如何正確編碼&#x1f5bc;? 想要在HT…

day49—雙指針+貪心—驗證回文串(LeetCode-680)

題目描述 給你一個字符串 s&#xff0c;最多 可以從中刪除一個字符。 請你判斷 s 是否能成為回文字符串&#xff1a;如果能&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 示例 1&#xff1a; 輸入&#xff1a;s "aba" 輸出&#xff1a;true…

Kubernetes(k8s) 集群的快速部署

實驗目的 本實驗旨在通過 Kubeadm 工具快速部署一個 Kubernetes 1.28.2 集群&#xff0c;包含 1 個 Master 節點和 2 個 Worker 節點&#xff0c;并驗證集群的基本功能。實驗涉及以下關鍵步驟&#xff1a; 環境準備&#xff1a;配置主機名、關閉防火墻、禁用 SELinux、設置時區…

7年經驗的Java程序員的技術知識概覽(及分階段學習計劃、資源推薦、職業發展建議)

&#x1f91f;致敬讀者 &#x1f7e9;感謝閱讀&#x1f7e6;笑口常開&#x1f7ea;生日快樂?早點睡覺 &#x1f4d8;博主相關 &#x1f7e7;博主信息&#x1f7e8;博客首頁&#x1f7eb;專欄推薦&#x1f7e5;活動信息 文章目錄 **一、技術棧全景與深度要求****1. 核心Java…

28、.NET 中元數據是什么?

在.NET中&#xff0c;元數據&#xff08;Metadata&#xff09;是描述程序結構和類型信息的二進制數據集合&#xff0c;它是.NET運行時&#xff08;CLR&#xff09;的核心基礎組件之一&#xff0c;用于支持程序加載、類型解析、反射、安全校驗等關鍵功能。以下是其核心特性和作用…

Idea中實用設置和插件

目錄 一、Idea使用插件 1.Fitten Code智能提示 2.MyBatisCodeHelperPro 3.HighlightBracketPair? 4.Rainbow Brackets Lite 5.GitToolBox(存在付費) 6.MavenHelperPro 7.Search In Repository 8.VisualGC(存在付費) 9.vo2dto 10.Key Promoter X 11.CodeGlance…

Linux新手快速入門指南

Linux新手快速入門指南&#xff1a;從零到熟練的簡明路線圖 對于剛接觸Linux的新手而言&#xff0c;這個開源世界既充滿機遇又令人望而生畏。本文將通過系統化的學習路徑和實戰技巧&#xff0c;幫助您快速突破入門難關&#xff0c;掌握Linux核心技能。 一、突破認知誤區&#x…

交叉編譯paho.mqtt.c和paho.mqtt.cpp(MQTT客戶端)

一、參考資料 【MQTT】paho.mqtt.cpp 庫的 介紹、下載、交叉編譯、MQTT客戶端例子源碼-CSDN博客 【MQTT】paho.mqtt.c 庫的“介紹、下載、交叉編譯” 詳解&#xff0c;以及編寫MQTT客戶端例子源碼-CSDN博客 二、準備工作 1. 重要說明 paho.mqtt.cpp與paho.mqtt.c&#xff…

Flink 源碼編譯

打包命令 打包整個項目 mvn clean package -DskipTests -Drat.skiptrue打包單個模塊 mvn clean package -DskipTests -Drat.skiptrue -pl flink-dist如果該模塊依賴其他模塊&#xff0c;可能需要先將其他模塊 install 到本地&#xff0c;如果依賴的模塊的源代碼有修改&#…

【Agent實戰】從0到1開發一個Python 解釋器 MCP SSE Server

寫在前面 想象一個場景:LLM Agent(如 AutoGPT、MetaGPT 或我們自己構建的 Agent)在規劃任務后,決定需要運行一段 Python 代碼來處理數據或調用某個 API。它不能直接在自己的環境中執行(通常不具備這個能力,也不安全),而是需要將這段代碼發送給一個專門的外部服務來執行…

HTML word屬性

介紹 CSS word-spacing 屬性&#xff0c;用于指定段字之間的空間&#xff0c;例如&#xff1a; p {word-spacing:30px; }word-spacing屬性增加或減少字與字之間的空白。 注意&#xff1a; 負值是允許的。 瀏覽器支持 表格中的數字表示支持該屬性的第一個瀏覽器版本號。 屬…