實際上一臺主機中,報文并沒有通過網絡層直接發送出去,而是交給了自己的下一層協議——數據鏈路層!!
一、理解數據鏈路層
網絡層交付給鏈路層之前,會先做決策再行動(會先查一下路由表,看看目標網絡是不是在當前子網中,如果不在就發送給下一跳的路由器,封裝路由器的mac幀報頭? ? ? 在的話就發給自己子網內的機器? 封裝該機器的mac幀報頭)?
所以IP層解決的是跨網絡問題,但是數據鏈路層解決的是同一個子網內跨主機的問題!!!
二、以太網
2.1 認識以太網
? ?"以太網" 不是一種具體的網絡, 而是一種技術標準; 既包含了數據鏈路層的內容, 也包含了一些物理層的內容. 例如: 規定了網絡拓撲結構, 訪問控制方式, 傳輸速率等;
數據鏈路層解決的是直接相連的主機(包括電腦、路由器、手機等)之間進行數據交付的問題!!!?
例如以太網中的網線必須使用雙絞線; 傳輸速率有10M, 100M, 1000M等;
以太網是當前應用最廣泛的局域網技術; 和以太網并列的還有令牌環網, 無線LAN等;
2.2 以太網幀格式
?類型是0800,就是正常ip報文,類型是0806則是ARP請求(用IP去廣播詢問mac地址),類型是0835則是RARP請求(就是用mac地址去問ip地址)
問題1:mac幀是如何解包和封裝的??
——>通過定長報文(長度由MTU決定)
問題2:如何做到分用?
——>局域網通信過程中,其實所有的主機都能收到報文(吃瓜群眾很多,意思就是大家都能收到只不過和自己對比之后發現不是自己的就會丟棄),但是當他解開mac幀報頭后發現目的mac幀地址是自己的地址,才會把報文向上交付,否則就丟棄??
2.3 局域網通信原理
? ? ? 當我信息從上層交付到網絡層的時候,此時我會在網絡層查一下當前的路由表(決策),看看目標網絡是否在當前的子網里,如果在的話就直接封裝到該主機的mac幀地址報頭發到自己的局域網中,如果不在的話,就會找到默認下一跳的路由器然后封裝到該路由的的mac幀地址報頭,前往下一個網絡尋找。
? ? ? 每當到達一個子網的入口路由器時,都會先解開mac報頭向上交付給網絡層,然后再搜索網絡層的路由表判斷當前報文是否在該網絡,然后根據決策繼續封裝新的mac報頭。
? ? ?然后當到達某個網絡的入口路由器確認該報文要發給該網絡的主機的時候,就會封裝目標主機的mac幀然后直接發到局域網中,只有目標主機可以收到報文,其他主機收到報文后會丟棄。
2.4 理解mac地址和ip地址?
mac地址:
? ? ? ? MAC地址用來識別數據鏈路層中相連的節點;
? ? ? ? 長度為48位, 及6個字節. 一般用16進制數字加上冒號的形式來表示(例如: 08:00:27:03:fb:19)
? ? ? ?在網卡出廠時就確定了, 不能修改. mac地址通常是唯一的(虛擬機中的mac地址不是真實的mac地址, 可能會沖突; 也有些網卡支持用戶配置mac地址).
我們會發現在局域網通信的這個過程中,源IP和目標IP一致不變,但是源mac地址和目的mac地址一直在變!?
源IP和目的IP相當于是 :你從哪里來,要到哪里去?——>東土大唐-西天?
源mac地址和目的mac地址相當于是:你上一站從哪來,下一站要到哪去?——>車遲國-火焰山
IP地址描述的是路途總體的起點和終點; MAC地址描述的是路途上的每一個區間的起點和終點;?
2.5 認識MTU和MSS
MTU相當于發快遞時對包裹尺寸的限制. 這個限制是不同的數據鏈路對應的物理層, 產生的限制.
? ? ? ?以太網幀中的數據長度規定最小46字節,最大1500字節,ARP數據包的長度不夠46字節,要在后面補填充位;
? ? ? ? 最大值1500稱為以太網的最大傳輸單元(MTU),不同的網絡類型有不同的MTU;?
2.5.1 MTU對IP協議的影響(分片)
由于數據鏈路層MTU的限制, 對于較大的IP數據包要進行分包.
將較大的IP包分成多個小包, 并給每個小包打上標簽;
每個小包IP協議頭的 16位標識(id) 都是相同的;
每個小包的IP協議頭的3位標志字段中, 第2位置為0, 表示允許分片, 第3位來表示結束標記(當前是否是最 后一個小包, 是的話置為1, 否則置為0);
到達對端時再將這些小包, 會按順序重組, 拼裝到一起返回給傳輸層;
一旦這些小包中任意一個小包丟失, 接收端的重組就會失敗. 但是IP層不會負責重新傳輸數據;(而是由TCP負責)
?問題1:為什么切片不在數據鏈路層、不在TCP層做,而是在IP層做??
?——>因為如果是在最底層的數據鏈路層做分片,我們還需要去面對不同的物理網絡的驅動程序做更改(不屬于OS的范疇了,而是硬件廠商的范疇)
? ? ? ? ?而如果是在上層的傳輸層或者應用層做分片,我們還要具體關心是哪種協議,每種協議還得自己實現關于切片的模塊,一方面增加了路由器的復雜度,另一方面處理效率也低,路由器在處理IP層以上的高層協議一般采用純粹的軟件來完成,那樣效率會更低。
? ? ? 而IP層是軟件設計里常用的適配層,我們只需要讀取IP頭信息,至于里面傳輸的是TCP/UDP/ICMP/OSPF/GRE/ESP協議我們并不關心,也不需要關心!!所以由IP層做分片是成本最低的選擇!!當然最后組裝也要有由IP層來組裝
問題2:IP層是如何組裝的呢???
前置問題a:你怎么知道這個IP被分片了呢??
——>片偏移!=0 || 更多分片==1? (反之沒有分片就是片偏移==0 &&更多分片==0)
前置問題b:你怎么確保所有的片都聚到一起了那??
——>
丟了第一個的情況:只需查看這些分片中是否有13位片偏移為0的分片,如果存在,則第一片分片沒有丟失;如果不存在,則第一片分片丟失
丟中間的情況:只需對這些分片按片偏移量進行排序,在遍歷這些分片時,檢查 該分片的片偏移量 * 8 + 該分片的有效載荷大小 == 下一片的片偏移量 * 8,如果等于,表示中間沒有分片丟失;如果不等于,表示中間有分片丟失。
丟最后一個的情況:只需查看這些分片中是否存在MF 為 0的分片即可,如果存在,則最后一片分片沒有丟失;如果不存在,則最后一片分片丟失。
——>?所以16位標識+更多分片+片偏移 可以確保我們的報文安穩收到!!
問題3:建不建議分片呢??
——>?ip中其中一個分片丟失了,那么整個報文都會被丟棄重發!!分片會增加丟包的概率
?數據測試:假設有3000字節,每一個分片都要20報頭,但是一個分片長度最多1500
2.5.2 MTU對UDP協議的影響?
? ? ?一旦UDP攜帶的數據超過1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就會在網絡層分成多個IP數據報.
? ? ? 這多個IP數據報有任意一個丟失, 都會引起接收端網絡層重組失敗. 那么這就意味著, 如果UDP數據報在 網絡層被分片, 整個數據被丟失的概率就大大增加了.
2.5.3?MTU對于TCP協議的影響
? ? ? ?TCP的一個數據報也不能無限大, 還是受制于MTU. TCP的單個數據報的最大消息長度, 稱為MSS(Max Segment Size); TCP在建立連接的過程中, 通信雙方會進行MSS協商.
? ? ? 最理想的情況下, MSS的值正好是在IP不會被分片處理的最大長度(這個長度仍然是受制于數據鏈路層的MTU).
? ? ? 雙方在發送SYN的時候會在TCP頭部寫入自己能支持的MSS值.(三次握手時協商,因為一旦分片,那么雙方由于硬件差異MTU可能會不一樣,所以需要統一一下MSS由TCP來控制)
? ? ?然后雙方得知對方的MSS值之后, 選擇較小的作為最終MSS. MSS的值就是在TCP首部的40字節變長選項中(kind=2);
2.5.4 MSS和MTU的關系
?查看硬件地址和MTU
?
使用ifcon?g命令, 即可查看ip地址, mac地址, 和MTU;?
2.6?數據碰撞
? ? ? ? ?因為局域網中一臺主機往局域網中發消息的時候,所有主機都會收到,如果此時有多臺主機都在發消息,那么就會出現數據碰撞的問題!!
? ? ? ? ?所以為了避免數據蹦裝,我們就得想辦法保證任何一個時刻只有一個主機在發送消息,所以我們需要有碰撞避免算法,來將所有主機發送消息的時間給錯開(有些主機需要等一等)
? ? ?可是如果一個局域網主機太多了,那么碰撞的可能性還是會很大,因此如果一些不法分子通過其中一臺主機瘋狂局域網塞垃圾數據,那么也很容易造成局域網癱瘓!!?
? ? ?除了碰撞避免算法,其實在還有交換機(劃分碰撞域)的存在。
? ? ?其實我們的硬件有MTU的限制而產生分片,除了本身硬件的原因,還有一個原因就是避免數據幀一次發送過大,才能讓報文更方便進入局域網中,在時間維度上讓報文盡可能岔開發送(所以一般是46-1500)
? ? ?可是鏈路層對ip層說:哥們,你一次數據別發太大,我扛不住
? ? ?ip說:這不關我的事,我就是個跑腿的,發多少又不是我說了算的,可靠性是tcp保證的!
? ? 鏈路層:我不管,反正我最大就1500,?你去跟tcp商量一下,想想辦法
? ? ip對tcp說:因為我還有自己的報頭,所以你最大就給我1480吧,別超過了
? ?tcp說:好吧,可是我自己也有報頭,那我除了20個報頭,我剩下最多可以有1460的有效載荷,而這個有效載荷就是MMS!!
? ? ? 這就是為什么滑動窗口要一塊塊發送而不是整體發送,這是因為有MSS在約束他!!但是因為不同主機硬件有差異,MTU有差異,所以我們的TCP在三次握手的時候必須通過選型和對方協商一下,以最小的為準,這樣避免在通信的時候不會出現太多的分片和組裝,也避免了對方因數據包太大而無法接收的情況!!
三、ARP協議
? ? ? ? ?雖然我們在這里介紹ARP協議, 但是需要強調, ARP不是一個單純的數據鏈路層的協議, 而是一個介于數據鏈路層和網絡層之間的協議;?
3.1 為什么要有ARP協議
? ? ? ? ?所謂的數據,要發送到目標網絡,本質上是通過無數個連續的子網實現的!!?
??
?在網絡通訊時,源主機的應用程序知道目的主機的IP地址和端口號,卻不知道目的主機的硬件地址;
? ? ? 數據包首先是被網卡接收到再去處理上層協議的,如果接收到的數據包的硬件地址與本機不符,則直接丟棄(需要重新封裝mac幀),因此在通訊錢必須獲取目的主機的mac地址
?因此ARP協議就是用來建立主機IP地址和MAC地址的映射關系的!!
?3.2 APR的報頭
ARP協議是屬于mac幀的上層協議,但是歸屬到數據鏈路層!?
ARP報頭:
?注意到源MAC地址、目的MAC地址在以太網首部和ARP請求中各出現一次,對于鏈路層為以太網的情況是多余的,但如果鏈路層是其它類型的網絡則有可能是必要的。
硬件類型指鏈路層網絡類型,1為以太網;(一般固定)
協議類型指要轉換的地址類型,0x0800為IP地址;(一般固定)
硬件地址長度對于以太網地址為6字節;(一般固定)
協議地址長度對于和IP地址為4字節;(一般固定)
op字段為1表示ARP請求,op字段為2表示ARP應答。(重要,決定這個報文是請求還是應答)
?3.3 模擬一次ARP過程
?1、填寫ARP請求
?
? ? ? 前4個基本固定,而請求的op為1,后面四個地址我們唯獨不知道目的mac地址,我們填FF:FF:FF:FF:FF:FF
2、給ARP請求封裝mac幀報頭
?請求的mac幀類型是0806 而我們不知道以太網的目標地址,可以填FF:FF:FF:FF:FF:FF表示廣播給該子網內的全部主機
?3、該ARP請求被丟到了網絡中,然后各個主機收到后先開始解析mac報頭
4、假設我們的非目標主機解開mac報頭后發現該報頭的目標mac地址是?FF:FF:FF:FF:FF:FF,說明這個是廣播報文所以必須受理。他會接著將該arp請求交給arp軟件層
?5、因為我們收到的arp報文可能是響應,也可能是請求,因此我們首先要先看op,看看是請求還是響應,然后我們發現是請求
?6、于是我們確認是請求后,然后看一下目的IP是不是我自己,發現不是我自己,于是我就把報文丟棄!同理其他的非目標主機也會在此時丟棄該報文
注意:因為是廣播 所有非目標主機都受理了,所以報文在ARP軟件層被丟棄的!!
7、唯獨目標主機在收到該請求后,重復上述步驟發現里面存的目標IP地址正好是自己的地址,于是他要給開始給對方回復ARP響應
?8、此時我們通過之前的arp請求可以知道源主機的mac地址和ip地址,于是給對方定向發送了arp請求
9、因為此時是定向,不是廣播,所以所有的非目標主機在收到之后直接在mac幀層丟棄了!?然后我們將選項該為2.意思是響應
10、當該子網的入口路由器收到該報文之后,交給了ARP軟件層,通過op確認目標主機發來的響應之后,?然后會讀取發送端的mac地址,確認這就是我們想要找的主機的mac地址,然后建立了在自己的arp表里面建立了映射
11、此時我們再將之前的報文向下交付給mac幀層的時候,就可以通過映射找到該目標ip的mac幀地址,重新給他封裝mac幀表頭,將報文發送給目標主機。
?總結:
1、因為主機可能會收到arp的應答,也可會收到arp的請求,因此無論是收到任何的arp報文,都是先看OP,這決定是該報文是請求還是應答!!
2、如果是請求,意味著需要查看一下自己的目的以太網的ip看看是不是和自己的ip一樣,確認之后再根據發送端的ip和mac地址發送響應回去。
3、如果是應答,意味著就可以建立該報文的發送端的ip和mac地址的映射關系,而之前發送過來的報文就可以在向下交付的時候通過查這個映射知道自己目標主機的mac地址從而封裝mac幀報頭
4、請求以廣播形式所有主機都得受理,只不過非目標主機會在arp軟件層丟棄,而響應是定向發送,所以非目標主機是在mac幀層被丟棄!
3.4 APR周邊知識總結
1、主機的mac地址的ip地址會被主機緩存起來,臨時緩存起來
? ? ? 每臺主機都維護一個ARP緩存表,可以用arp -a命令查看。緩存表中的表項有過期時間(一般為20分鐘),如 果20分鐘內沒有再次使用某個表項,則該表項失效,下次還要發ARP請求來獲得目的主機的硬件地址
?問題1:為什么要有緩存表呢??
——>
(1) 減少網絡通信量:
當主機需要發送數據到另一個IP地址時,它會首先檢查ARP緩存表中是否已經存在該IP地址對應的MAC地址。如果存在,則直接使用該MAC地址發送數據,無需發送ARP請求進行廣播查詢,從而減少了網絡通信量,提高了通信效率。
(2) 加快網絡通信速度:
緩存表減少了查找MAC地址所需的時間,因為查詢緩存通常比廣播ARP請求并等待響應要快得多。這有助于加快數據包在網絡中的傳輸速度。
問題2:為什么表項要有過期時間而不是一直有效呢??
——>
(1)確保數據的有效性:
? ? ?網絡設備的MAC地址可能會因為多種原因發生變化,如設備重啟、故障恢復或更換網絡接口卡等。如果ARP緩存表中的表項一直有效,那么即使MAC地址已經發生變化,發送方仍然可能使用舊的MAC地址發送數據,導致數據無法正確到達目的地。設置過期時間可以確保緩存中的MAC地址保持最新。
(2) 防止緩存污染和攻擊
? ? ? ?在某些情況下,惡意用戶可能會嘗試通過發送偽造的ARP響應來污染其他主機的ARP緩存表,從而導致數據包被發送到錯誤的目的地。設置過期時間可以限制這種攻擊的影響范圍,因為即使緩存被污染,表項也會在一段時間后失效。
(3)節省系統資源
? ? ? ?隨著時間的推移,ARP緩存表中可能會積累大量的表項。如果表項一直有效,那么這些表項將占用 大量的系統資源(如內存)。設置過期時間可以允許系統定期清理不再需要的表項,從而釋放系統資源供其他應用使用。
2、 我們可以通過自己的IP和子網掩碼,獲取網絡號,然后拼接IP地址,ping(一個網絡工具,通過發送ICMP回聲請求信息到目標主機并等待回應)所有的主機從而得到所有主機的IP和mac
3、如果我收到了多次同樣的arp應答,我會以最新的為主
4、A主機到B主機,不僅僅是在目標網絡,其實中間過程每經過一次路由器(下一跳),就是從該子網的入口路由器到出口路由器,在沒有緩存的情況下一般都需要用arp去詢問路由器的mac地址!
3.5 ARP欺騙?
?一開始,我們雙方互相給對方發送過arp請求,所以雙方都建立了對方主機的ip和mac映射
可?
3.5.1 單向欺騙(有感覺,會被強制斷網)
? ? ?中間主機通過定向向源主機發送虛假的arp響應,然后修改了源主機的arp映射表,從而定向地讓你的目標主機斷網!!
3.5.2 雙向欺騙(沒有感覺,但數據會被窺探)?
? ? ?中間主機都給雙方發送arp響應,這樣雙方再給對方發消息的時候都會推送給中間人,此時中間的信息會被窺探,但你并不能察覺!
?文心一言搜索:arp的欺騙工具欺騙? ? 可以跟室友商量,想辦法讓室友斷網