網絡基礎3-1(細談IP協議頭, 網絡層,子網劃分,路由選擇,數據鏈路層,以太網幀格式,MAC地址,再談ARP協議)

IP協議

IP協議頭格式

在這里插入圖片描述

  1. 4位版本號(version): 指定IP協議的版本, 對于IPv4來說, 就是4
  2. 4位頭部長度(header length): IP頭部的長度是多少個。32bit, 也就是 length * 4 的字節數. 4bit表示大 的數字是15, 因此IP頭部大長度是60字節
  3. 8位服務類型(Type Of Service): 3位優先權字段(已經棄用), 4位TOS字段, 和1位保留字段(必須置為0). 4位 TOS分別表示: 最小延時, 大吞吐量, 高可靠性, 小成本. 這四者相互沖突, 只能選擇一個. 對于 ssh/telnet這樣的應用程序, 小延時比較重要; 對于ftp這樣的程序, 大吞吐量比較重要.
  4. 16位總長度(total length): IP數據報整體占多少個字節. 64K
  5. 16位標識(id): 唯一的標識主機發送的報文. 如果IP報文在數據鏈路層被分片了, 那么每一個片里面的這個 id都是相同的.
  6. 3位標志字段: 第一位保留(保留的意思是現在不用, 但是還沒想好說不定以后要用到). 第二位置為1表示禁 止分片, 這時候如果報文長度超過MTU, IP模塊就會丟棄報文. 第三位表示"更多分片", 如果分片了的話, 后一個分片置為1, 其他是0. 類似于一個結束標記
  7. 13位分片偏移(framegament o?set): 是分片相對于原始IP報文開始處的偏移. 其實就是在表示當前分片在原報文中處在哪個位置. 實際偏移的字節數是這個值 * 8 得到的. 因此, 除了后一個報文之外, 其他報 文的長度必須是8的整數倍(否則報文就不連續了).
  8. 8位生存時間(Time To Live, TTL): 數據報到達目的地的大報文跳數. 一般是64. 每次經過一個路由, TTL -= 1, 一直減到0還沒到達, 那么就丟棄了. 這個字段主要是用來防止出現路由循環
  9. 8位協議: 表示上層協議的類型
  10. 16位頭部校驗和: 使用CRC進行校驗, 來鑒別頭部是否損壞.
  11. 32位源地址和32位目標地址: 表示發送端和接收端.
  12. 選項字段(不定長, 多40字節): 略

網絡層

功能:地址管理與路由選擇

路由選擇

在復雜的網絡傳輸中對數據的傳輸選擇一條合適路徑

IP地址不能隨意分配,因為隨意分配就有很大概率造成IP地址沖突(數據無法發送)
解決方法:將IP地址的分配規范起來
每個路由器都能夠組建一個局域網,這個局域網就應該具有自己的網絡標識(網絡號),這個路由器向自己組建的局域網中的主機分配的IP地址都應該包含這個網絡標識
同時為了在局域網中,能夠唯一標識一個主機,IP地址中還應該包含主機標識(主機號)
IP地址的組成:網絡號+主機號
IP地址的分配規范起來后,只需要對網絡號的取值進行規范就可以了,相鄰的網絡不能具備相同的網絡號
一個路由器上相連的所有網絡網絡號不能相同,因為這些網絡都屬于相鄰網絡,數據到了路由器上之后,一旦網絡號沖突就會導致路由器不知道數據該給誰

網段的劃分

IP地址分為兩個部分, 網絡號和主機號

  1. 網絡號: 保證相互連接的兩個網段具有不同的標識;
  2. 主機號: 同一網段內, 主機之間具有相同的網絡號, 但是必須有不同的主機號;

早期將IP地址劃分為五類

  1. A類 0.0.0.0到127.255.255.255
  2. B類 128.0.0.0到191.255.255.255
  3. C類 192.0.0.0到223.255.255.255
  4. D類 224.0.0.0到239.255.255.255
  5. E類 240.0.0.0到247.255.255.255

隨著Internet的飛速發展,這種劃分方案的局限性很快顯現出來,大多數組織都申請B類網絡地址, 導致B類地址很快就 分配完了, 而A類卻浪費了大量地址;

  1. 例如, 申請了一個B類地址, 理論上一個子網內能允許6萬5千多個主機. A類地址的子網內的主機數更多.
  2. 然而實際網絡架設中, 不會存在一個子網內有這么多的情況. 因此大量的IP地址都被浪費掉了.

現在的網段劃分

CIDR(Classless Interdomain Routing):
  1. 引入一個額外的子網掩碼(subnet mask)來區分網絡號和主機號;
  2. 子網掩碼也是一個32位的正整數. 通常用一串 “0” 來結尾;
  3. 將IP地址和子網掩碼進行 “按位與” 操作, 得到的結果就是網絡號;
  4. 網絡號和主機號的劃分與這個IP地址是A類、B類還是C類無關;

示例

有一個網絡ip:192.168.122.132,netmask:255.255.255.0;現在要將這個網絡平均劃分為四個子網,請問每個子網ip地址范圍以及子網掩碼
解:

	通過ip地址和子網掩碼得到的原網絡的主機號個數:256通過ip地址和子網掩碼得到原網絡的網絡號192.168.122.0平均劃分四個子網,則每個子網主機號個數64個;0~63 就是00111111按位取反子網掩碼 = 255.255.255.192192.168.122.0 ~ 192.168.122.63   255.255.255.192192.168.122.64 ~ 192.168.122.127 192.168.122.128 ~ 192.168.122.191192.168.122.192 ~ 192.168.122.255

注意事項

  1. 相鄰的網絡不能具有相同的網絡號
  2. RFC1918規定,能夠用于組建私網的網段,只有以下幾種網段:
10.*.*.*   172.16.*.* ~ 172.31.*.*  192.168.*.*

特殊的ip地址

  1. 主機號全為1的IP地址:192.168.122.132 255.255.255.0 局域網的udp廣播地址 例如:192.168.122.255
  2. 主機號全為0的IP地址:網絡號—標識一個網絡 例如:192.168.122.0
  3. 每一個局域網中,這兩個主機號是不能分配給主機的,意味著主機號雖然有256個,但是能夠分配給主機的只有254個
  4. 127.0.0.1 本地回環網卡地址----虛擬網卡地址—用于本機內的網絡回環測試

注意事項

  1. 一個路由器可以配置兩個IP地址, 一個是WAN口IP, 一個是LAN口IP(子網IP).
  2. 路由器LAN口連接的主機, 都從屬于當前這個路由器的子網中.
  3. 不同的路由器, 子網IP其實都是一樣的(通常都是192.168.1.1). 子網內的主機IP地址不能重復. 但是子網之 間的IP地址就可以重復了
  4. 每一個家用路由器, 其實又作為運營商路由器的子網中的一個節點. 這樣的運營商路由器可能會有很多級, 外層的運營商路由器, WAN口IP就是一個公網IP
  5. 子網內的主機需要和外網進行通信時, 路由器將IP首部中的IP地址進行替換(替換成WAN口IP), 這樣逐級 替換, 終數據包中的IP地址成為一個公網IP. 這種技術稱為NAT(Network Address Translation,網絡地址轉換).
  6. 如果希望我們自己實現的服務器程序, 能夠在公網上被訪問到, 就需要把程序部署在一臺具有外網IP的服 務器上. 這樣的服務器可以在阿里云/騰訊云上進行購買.

路由選擇

  1. 當IP數據包, 到達路由器時, 路由器會先查看目的IP;
  2. 路由器決定這個數據包是能直接發送給目標主機, 還是需要發送給下一個路由器;
  3. 依次反復, 一直到達目標IP地址
    在這里插入圖片描述
    在這里插入圖片描述
    那么如何判定當前這個數據包該發送到哪里呢? 這個就依靠每個節點內部維護一個路由表;

路由表

在這里插入圖片描述

  1. 路由表可以使用route命令查看
  2. 如果目的IP命中了路由表, 就直接轉發即可;
  3. 路由表中的后一行,主要由下一跳地址和發送接口兩部分組成,當目的地址與路由表中其它行都不匹配 時,就按缺省路由條目規定的接口發送到下一跳地址

鏈路層

功能:負責相鄰設備結點之間的數據幀傳輸;eth–以太網協議;交換機

以太網

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

以太網幀格式

在這里插入圖片描述

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

MAC地址:

物理網卡設備的硬件地址 uint8_t mac[6],負責定位相鄰的設備

  1. MAC地址用來識別數據鏈路層中相連的節點;
  2. 長度為48位, 及6個字節. 一般用16進制數字加上冒號的形式來表示(例如: 08:00:27:03:fb:19)
  3. 在網卡出廠時就確定了, 不能修改. mac地址通常是唯一的(虛擬機中的mac地址不是真實的mac地址, 可 能會沖突; 也有些網卡支持用戶配置mac地址).

MTU–最大傳輸單元

在這里插入圖片描述
MTU相當于發快遞時對包裹尺寸的限制. 這個限制是不同的數據鏈路對應的物理層, 產生的限制.

  1. 以太網幀中的數據長度規定小46字節,大1500字節,ARP數據包的長度不夠46字節,要在后面補填充 位;
  2. 大值1500稱為以太網的大傳輸單元(MTU),不同的網絡類型有不同的MTU;
  3. 如果一個數據包從以太網路由到撥號鏈路上,數據包長度大于撥號鏈路的MTU了,則需要對數據包進行分 片(fragmentation);
  4. 不同的數據鏈路層標準的MTU是不同的;

MTU對IP協議的影響

由于數據鏈路層MTU的限制, 對于較大的IP數據包要進行分包.

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

MTU對UDP協議的影響

  1. 一旦UDP攜帶的數據超過1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就會在網絡層分成多個IP數據報.
  2. 這多個IP數據報有任意一個丟失, 都會引起接收端網絡層重組失敗. 那么這就意味著, 如果UDP數據報在 網絡層被分片, 整個數據被丟失的概率就大大增加了
  3. udp傳輸過程中,任意一個分片出問題,整個數據包都會被丟棄,分片越多,危險越高
  4. 因此udp數據包在應用層都需要由用戶根據mss分割成合適的大小

一個報文最大大小64K包含ip頭部 udp頭部數據大小不能超過64K - 20 - 8

udp數據大小 mtu < size < 64K - 20 - 8 就會在網絡層進行數據分片,到了對端就會進行分片重組
在這里插入圖片描述

MTU對TCP協議的影響

  1. TCP的一個數據報也不能無限大, 還是受制于MTU. TCP的單個數據報的大消息長度, 稱為MSS(Max Segment Size);
  2. TCP在建立連接的過程中, 通信雙方會進行MSS協商
  3. 理想的情況下, MSS的值正好是在IP不會被分片處理的大長度(這個長度仍然是受制于數據鏈路層的 MTU).
  4. 雙方在發送SYN的時候會在TCP頭部寫入自己能支持的MSS值
  5. 然后雙方得知對方的MSS值之后, 選擇較小的作為終MSS
  6. MSS的值就是在TCP首部的40字節變長選項中(kind=2);
  7. MSS–最大報文段大小—實際的最大數據大小:MTU-IP頭部-TCP頭部1500 - 20 - 20 = 1460

ARP協議

ARP協議的作用

ARP協議建立了主機 IP地址 和 MAC地址 的映射關系.

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

ARP協議格式在這里插入圖片描述

  1. 注意到源MAC地址、目的MAC地址在以太網首部和ARP請求中各出現一次,對于鏈路層為以太網的情況 是多余的,但如果鏈路層是其它類型的網絡則有可能是必要的
  2. 硬件類型指鏈路層網絡類型,1為以太網;
  3. 協議類型指要轉換的地址類型,0x0800為IP地址;
  4. 硬件地址長度對于以太網地址為6字節
  5. 協議地址長度對于和IP地址為4字節;
  6. op字段為1表示ARP請求,op字段為2表示ARP應答

ARP協議的工作流程

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

在以太局域網內數據包傳輸依靠的是MAC地址,IP地址與MAC對應的關系依靠ARP表,每臺安裝有TCP/IP協議的主機(包括網關)都有一個ARP緩存表。該表中保存這網絡中各個電腦的IP地址和MAC地址的對照關系。
ip地址動態分配,上一次保存的關系就失效了,所以保存時間不會很長

局域網的ARP攻擊

你給我一個請求,我不是你的請求對象,但是我還是給了你的響應信息,然后你就把數據發給我了。

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

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

相關文章

c++常見并且必須記住的問題

一、基礎知識 基本語言 1、說一下static關鍵字的作用 ?2、說一下C和C的區別 3、說一說c中四種cast轉換 4、請說一下C/C 中指針和引用的區別&#xff1f; 5、給定三角形ABC和一點P(x,y,z)&#xff0c;判斷點P是否在ABC內&#xff0c;給出思路并手寫代碼 6、怎么判斷一個…

網絡中典型協議--(DNS,輸入url后, 發生的事情. ,ICMP,NAT)

DNS&#xff08;Domain Name System&#xff09; DNS是一整套從域名映射到IP的系統 域名服務器發展背景 TCP/IP中使用IP地址和端口號來確定網絡上的一臺主機的一個程序. 但是IP地址不方便記憶. 于是人們發明了一種叫主機名的東西, 是一個字符串, 并且使用hosts文件來描述主機…

高級IO--1 ---(五種典型IO,阻塞IO,非阻塞IO,信號驅動IO,異步IO, IO多路轉接)

高級IO&#xff1a; 五種典型IO&#xff1a; 阻塞IO/非阻塞IO/信號驅動IO/異步IO/IO多路轉接 IO多路轉接模型&#xff1a;select/poll/epoll 五種典型IO 阻塞IO IO操作的流程&#xff1a;等待IO操作條件具備&#xff0c;然后進行數據拷貝 為了完成IO操作發起調用&#xff…

IO多路轉接模型----(select的模型,select的優缺點,poll的模型,poll的優缺點)

IO多路轉接模型&#xff1a;select/poll/epoll 對大量描述符進行事件監控(可讀/可寫/異常) select模型 用戶定義描述符的事件監控集合 fd_set&#xff08;這是一個位圖&#xff0c;用于存儲要監控的描述符&#xff09;; 用戶將需要監控的描述符添加到集合中&#xff0c;這個描…

IO多路轉接模型-----epoll

epoll&#xff1a; Linux下性能最高的多路轉接模型 epoll 有3個相關的系統調用. epoll_create 功能&#xff1a;創建epoll&#xff0c;在內核中創建eventpoll結構體&#xff0c;size決定了epoll最多監控多少個描述符&#xff0c;在Linux2.6.8之后被忽略&#xff0c;但是必須…

再寫順序表(c語言實現,外加冒泡排序,二分查找)

概念 順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構&#xff0c;一般情況下采用數組存儲。在數組 上完成數據的增刪查改。 順序表一般可以分為&#xff1a; 靜態順序表&#xff1a;使用定長數組存儲。動態順序表&#xff1a;使用動態開辟的數組存儲。 頭…

再寫單鏈表(不帶頭單鏈表)

單鏈表 實際中鏈表的結構非常多樣&#xff0c;以下情況組合起來就有8種鏈表結構&#xff1a; 單向、雙向帶頭、不帶頭循環、非循環 雖然有這么多的鏈表的結構&#xff0c;但是我們實際中最常用還是兩種結構&#xff1a; 無頭單向非循環鏈表&#xff1a;結構簡單&#xff0…

再寫雙向循環鏈表

#pragma once #include<assert.h> #include<malloc.h> #include<stdio.h> typedef int DLDataType;//定義鏈表結點結構 typedef struct DListNode{DLDataType value;struct DListNode *prev; //指向前一個結點struct DListNode *next; //指向后一個結點 } DL…

鏈表題目--1 刪除鏈表中所有等于val的值

注意事項 要刪除的結點相鄰第一個結點就是要刪除的結點 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val){if(headNULL){return NULL;}struct …

鏈表題目--2 求鏈表的中間結點 和 求鏈表中倒數第k個結點

求鏈表的中間結點 思路 一個走兩步&#xff0c;一個走一步。一個走到尾&#xff0c;另外一個就走到了中間 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* middleNode(struct ListNode* head…

鏈表題目---3 合并兩個有序單鏈表 和 分割鏈表

合并兩個有序單鏈表 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){if(l1 NULL){return l2;}else if(l2 NULL){return l1;}struc…

鏈表題目---4 刪除鏈表中重復的結點 和 判斷鏈表是否為回文鏈表

刪除鏈表中重復的結點 /* struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {} }; */ class Solution { public:ListNode* deleteDuplication(ListNode* pHead){if(pHead NULL){return NULL;}ListNode *prev NULL; //用于刪除的結點, 是…

鏈表題目----5 相交鏈表 和 環形鏈表 和 返回鏈表開始入環的第一個節點

相交鏈表 思路 鏈表交叉不可能是x型因為有可能兩個鏈表不等長&#xff0c;所以我們必須讓他們從同一起跑位置去起跑從同一起跑位置出發&#xff0c;依次比較每個結點的地址是否相同 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct L…

鏈表題目---6 復制帶隨機指針的鏈表

思路 將新結點放在老結點的后面 復制random 將鏈表拆開 /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node() {}Node(int _val, Node* _next, Node* _random) {val _val;next _next;random _random;} }; */ class Solution { publi…

括號匹配問題(c和c++版本實現)

括號匹配問題 思路 遇見左括號入棧&#xff0c;遇見一個右括號彈出棧頂元素右括號入棧前如果棧已經為空&#xff0c;則不匹配如果不為空則讀取并彈出&#xff0c;彈出來的元素與右括號做比較&#xff0c;必須匹配&#xff0c;不匹配返回false;如果最后棧里還有元素&#xff0c…

用隊列實現棧 AND 用棧實現隊列

用隊列實現棧 思路 入隊列就是入棧出隊列的時候&#xff0c;就是把前面size-1個隊列中的元素先出&#xff0c;這樣最后一個元素就成隊首元素了&#xff0c;再把出去的元素再次入隊列讀棧頂元素&#xff0c;過程和第二步是一樣的&#xff0c;就是彈出后&#xff0c;再把它入隊列…

最小棧的實現(設計一個支持 push,pop,top 操作,并能在常數時間內檢索到最小元素的棧。)

最小棧的實現 思路 兩個棧&#xff0c;左邊棧接受元素&#xff0c;右邊棧存最小的元素入棧時&#xff0c;先入左邊棧&#xff0c;隨后進行比較&#xff0c;左邊和右邊棧頂元素進行比較&#xff0c;如果新元素小&#xff0c;就把新元素放在右邊的棧頂位置&#xff0c;如果新元素…

再寫循環隊列----c++實現

再寫循環隊列 class MyCircularQueue { public:/** Initialize your data structure here. Set the size of the queue to be k. */MyCircularQueue(int k) {array (int *)malloc(sizeof(int)*k);capacity k;size 0;front 0;rear 0;}/** Insert an element into the circu…

再談二叉樹(二叉樹概念,二叉樹的性質,二叉樹的存儲結構)

樹的概念 樹的概念 樹是一種非線性的數據結構&#xff0c;它是由n&#xff08;n>0&#xff09;個有限結點組成一個具有層次關系的集合。把它叫做樹是因 為它看起來像一棵倒掛的樹&#xff0c;也就是說它是根朝上&#xff0c;而葉朝下的。它具有以下的特點&#xff1a;每個…

二叉樹題目----1 前序中序后序遍歷二叉樹并返回相應的遍歷(不是打印)

前序遍歷 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*//*** Note: The returned array must be malloced, assume caller calls free().*/ int *array; int size;void _preorde…