網絡基礎2(分層模型,通信過程,以太網,ARP協議格式和具體功能詳解)

分層模型

OSI七層模型
在這里插入圖片描述
OSI模型

1 物理層:主要定義物理設備標準,如網線的接口類型、光纖的接口類型、各種傳輸介質的傳輸速率等。它的主要作用是傳輸比特流(就是由1、0轉化為電流強弱來進行傳輸,到達目的地后再轉化為1、0,也就是我們常說的數模轉換與模數轉換)。這一層的數據叫做比特。

2 數據鏈路層:定義了如何讓格式化數據以幀為單位進行傳輸,以及如何讓控制對物理介質的訪問。這一層通常還提供錯誤檢測和糾正,以確保數據的可靠傳輸。如:串口通信中使用到的115200、8、N、1

3 網絡層:在位于不同地理位置的網絡中的兩個主機系統之間提供連接和路徑選擇。Internet的發展使得從世界各站點訪問信息的用戶數大大增加,而網絡層正是管理這種連接的層。

4 傳輸層:定義了一些傳輸數據的協議和端口號(WWW端口80等),如:TCP(傳輸控制協議,傳輸效率低,可靠性強,用于傳輸可靠性要求高,數據量大的數據),UDP(用戶數據報協議,與TCP特性恰恰相反,用于傳輸可靠性要求不高,數據量小的數據,如QQ聊天數據就是通過這種方式傳輸的)。 主要是將從下層接收的數據進行分段和傳輸,到達目的地址后再進行重組。常常把這一層數據叫做段。

5 會話層:通過傳輸層(端口號:傳輸端口與接收端口)建立數據傳輸的通路。主要在你的系統之間發起會話或者接受會話請求(設備之間需要互相認識可以是IP也可以是MAC或者是主機名)。

6 表示層:可確保一個系統的應用層所發送的信息可以被另一個系統的應用層讀取。例如,PC程序與另一臺計算機進行通信,其中一臺計算機使用擴展二一十進制交換碼(EBCDIC),而另一臺則使用美國信息交換標準碼(ASCII)來表示相同的字符。如有必要,表示層會通過使用一種通格式來實現多種數據格式之間的轉換。

7 應用層:是最靠近用戶的OSI層。這一層為用戶的應用程序(例如電子郵件、文件傳輸和終端仿真)提供網絡服務。

8 TCP/IP四層模型
TCP/IP網絡協議棧分為應用層(Application)、傳輸層(Transport)、網絡層(Network)和鏈路層(Link)四層。如下圖所示:
在這里插入圖片描述
TCP/IP模型
一般在應用開發過程中,討論最多的是TCP/IP模型。

通信過程

兩臺計算機通過TCP/IP協議通訊的過程如下所示:
在這里插入圖片描述
TCP/IP通信過程
上圖對應兩臺計算機在同一網段中的情況,如果兩臺計算機在不同的網段中,那么數據從一臺計算機到另一臺計算機傳輸過程中要經過一個或多個路由器,如下圖所示:
在這里插入圖片描述

跨路由通信

鏈路層有以太網、令牌環網等標準,鏈路層負責網卡設備的驅動、幀同步(即從網線上檢測到什么信號算作新幀的開始)、沖突檢測(如果檢測到沖突就自動重發)、數據差錯校驗等工作交換機是工作在鏈路層的網絡設備,可以在不同的鏈路層網絡之間轉發數據幀比如十兆以太網和百兆以太網之間、以太網和令牌環網之間),由于不同鏈路層的幀格式不同,交換機要將進來的數據包拆掉鏈路層首部重新封裝之后再轉發。

網絡層的IP協議是構成Internet的基礎。Internet上的主機通過IP地址來標識, Inter-net上有大量路由器負責根據IP地址選擇合適的路徑轉發數據包,
數據包從Internet上的源主機到目的主機往往要經過十多個路由器。 路由器是工作在第三層的網絡設備,同時兼有交換機的功能,可以在不同的鏈路層接口之間轉發數據包, 因此路由器需要將進來的數據包拆掉網絡層和鏈路層兩層首部并重新封裝。IP協議不保證傳輸的可靠性,數據包在傳輸過程中可能丟失,可靠性可以在上層協議或應用程序中提供支持。網絡層負責點到點(ptop,point-to-point)的傳輸(這里的“點”指主機或路由器),而傳輸層負責端到端(etoe,end-to-end)的傳輸(這里的“端”指源主機和目的主機)。傳輸層可選擇TCP或UDP協議。

TCP是一種面向連接的、可靠的協議,有點像打電話,雙方拿起電話互通身份之后就建立了連接,然后說話就行了,這邊說的話那邊保證聽得到,并且是按說話的順序聽到的,說完話掛機斷開連接。也就是說TCP傳輸的雙方需要首先建立連接,之后由TCP協議保證數據收發的可靠性,丟失的數據包自動重發,上層應用程序收到的總是可靠的數據流,通訊之后關閉連接。

UDP是無連接的傳輸協議,不保證可靠性,有點像寄信,信寫好放到郵筒里,既不能保證信件在郵遞過程中不會丟失,也不能保證信件寄送順序。使用UDP協議的應用程序需要自己完成丟包重發、消息排序等工作。

目的主機收到數據包后,如何經過各層協議棧最后到達應用程序呢?

其過程如下圖所示:
在這里插入圖片描述

1	以太網驅動程序首先根據以太網首部中的“上層協議”字段確定該數據幀的有效載荷(payload,指除去協議首部之外實際傳輸的數據)
是IP、ARP還是RARP協議的數據報,然后交給相應的協議處理。2	假如是IP數據報,IP協議再根據IP首部中的“上層協議”字段確定該數據報的有效載荷是TCP、UDP、ICMP還是IGMP,
然后交給相應的協議處理。3	假如是TCP段或UDP段,TCP或UDP協議再根據TCP首部或UDP首部的“端口號”字段確定應該將應用層數據交給哪個用戶進程。

IP地址是標識網絡中不同主機的地址,而端口號就是同一臺主機上標識不同進程的地址,IP地址和端口號合起來標識網絡中唯一的進程。

雖然IP、ARP和RARP數據報都需要以太網驅動程序來封裝成幀,但是從功能上劃分,

ARP和RARP屬于鏈路層
IP屬于網絡層。

雖然ICMP、IGMP、TCP、UDP的數據都需要IP協議來封裝成數據報,但是從功能上劃分

ICMP、IGMP與IP同屬于網絡層,
TCP和UDP屬于傳輸層。

協議格式

數據包封裝

傳輸層及其以下的機制由內核提供,應用層由用戶進程提供(后面將介紹如何使用socket API編寫應用程序),應用程序對通訊數據的含義進行解釋,而傳輸層及其以下處理通訊的細節,將數據從一臺計算機通過一定的路徑發送到另一臺計算機。應用層數據通過協議棧發到網絡上時,每層協議都要加上一個數據首部(header),稱為封裝(Encapsulation),如下圖所示:
在這里插入圖片描述

不同的協議層對數據包有不同的稱謂,**在傳輸層叫做段(segment),在網絡層叫做數據報(datagram),在鏈路層叫做幀(frame)。**數據封裝成幀后發到傳輸介質上,到達目的主機后每層協議再剝掉相應的首部,最后將應用層數據交給應用程序處理。


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

在這里插入圖片描述
其中的源地址和目的地址是指網卡的硬件地址(也叫MAC地址),長度是48位,是在網卡出廠時固化的。可在shell中使用ifconfig命令查看,“HWaddr 00:15:F2:14:9E:3F”部分就是硬件地址。協議字段有三種值,分別對應IP、ARP、RARP。幀尾是CRC校驗碼。
以太網幀中的數據長度規定最小
46字節
,最大1500字節,ARP和RARP數據包的長度不夠46字節,要在后面補填充位。最大值1500稱為以太網的最大傳輸單元(MTU),不同的網絡類型有不同的MTU,如果一個數據包從以太網路由到撥號鏈路上,數據包長度大于撥號鏈路的MTU,則需要對數據包進行分片(fragmentation)。ifconfig命令輸出中也有“MTU:1500”。注意,MTU這個概念指數據幀中有效載荷的最大長度,不包括幀頭長度。


ARP數據報格式
在網絡通訊時,源主機的應用程序知道目的主機的IP地址和端口號,卻不知道目的主機的硬件地址,而數據包首先是被網卡接收到再去處理上層協議的,如果接收到的數據包的硬件地址與本機不符,則直接丟棄。因此在通訊前必須獲得目的主機的硬件地址。ARP協議就起到這個作用。源主機發出ARP請求,詢問“IP地址是192.168.0.1的主機的硬件地址是多少”,并將這個請求廣播到本地網段(以太網幀首部的硬件地址填FF:FF:FF:FF:FF:FF表示廣播),目的主機接收到廣播的ARP請求,發現其中的IP地址與本機相符,則發送一個ARP應答數據包給源主機,將自己的硬件地址填寫在應答包中。
每臺主機都維護一個ARP緩存表,可以用arp -a命令查看。緩存表中的表項有過期時間(一般為20分鐘),如果20分鐘內沒有再次使用某個表項,則該表項失效,下次還要發ARP請求來獲得目的主機的硬件地址。

想一想,為什么表項要有過期時間而不是一直有效?

ARP數據報的格式如下所示:
在這里插入圖片描述

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

看一個具體的例子。

請求幀如下(為了清晰在每行的前面加了字節計數,每行16個字節):
以太網首部(14字節)
0000: ff ff ff ff ff ff 00 05 5d 61 58 a8 08 06
ARP幀(28字節)
0000: 00 01
0010: 08 00 06 04 00 01 00 05 5d 61 58 a8 c0 a8 00 37
0020: 00 00 00 00 00 00 c0 a8 00 02

填充位(18字節)
0020: 00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00

以太網首部:目的主機采用廣播地址,源主機的MAC地址是00:05:5d:61:58:a8,上層協議類型0x0806表示ARP。

ARP幀:硬件類型0x0001表示以太網,協議類型0x0800表示IP協議,硬件地址(MAC地址)長度為6,協議地址(IP地址)長度為4,op為0x0001表示請求目的主機的MAC地址,源主機MAC地址為00:05:5d:61:58:a8,源主機IP地址為c0 a8 00 37(192.168.0.55),目的主機MAC地址全0待填寫,目的主機IP地址為c0 a8 00 02(192.168.0.2)。

由于以太網規定最小數據長度為46字節,ARP幀長度只有28字節,因此有18字節填充位,填充位的內容沒有定義,與具體實現相關。
應答幀如下:
以太網首部
0000: 00 05 5d 61 58 a8 00 05 5d a1 b8 40 08 06
ARP幀
0000: 00 01
0010: 08 00 06 04 00 02 00 05 5d a1 b8 40 c0 a8 00 02
0020: 00 05 5d 61 58 a8 c0 a8 00 37

填充位
0020: 00 77 31 d2 50 10
0030: fd 78 41 d3 00 00 00 00 00 00 00 00

以太網首部:目的主機的MAC地址是00:05:5d:61:58:a8,源主機的MAC地址是00:05:5d:a1:b8:40,上層協議類型0x0806表示ARP。

如果源主機和目的主機不在同一網段,ARP請求的廣播幀無法穿過路由器,源主機如何與目的主機通信?

ARP一般只在局域網(同網段中)起作用,部分路由器有ARP代理功能,但也不可能所廣域網上所有的地址都代理了。
在跨網段訪問時,當發現目的地址不是本網段IP時,將會把數據包發送給網關處理(一般網關就是路由器來做的),路由器此時就發揮他的路由功能進行IP路由.
當到達目的網段后,再在目的網段使用ARP解析出目的主機的MAC地址,實現通信。
綜上,ARP只用于同一局域網通信(特殊情況下可以跨網段,ARP代理時),當源和目的不在同一網段時,跨網段這部分由中間的具有路由功能的設備來進行處理,如路由器。

具體過程

、主機A有數據發往主機B,數據封裝IP之后發現沒有主機B的mac地址;
然后查詢ARP,ARP回應:“我在192.168.3.0/24網段,目標地址在192.168.4.0/24,不屬于同一網段,需要使用默認網關”;
ARP發現默認網關是192.168.3.2,但是沒有網關mac地址,需要先進行查詢2、主機將數據包先放到緩存中,然后發送ARP查詢報文:
封裝自己的mac地址為源mac,目標mac地址寫全F的廣播地址,請求網關192.168.3.2的mac地址。然后以廣播方式發送出去3、路由器收到廣播數據包,首先將原192.168.3.1添加到自己的mac地址表中,對應mac地址為0800.0222.2222。
路由發現是請求自己的mac地址,然后路由回復一個ARP應答:
封裝自己的IP地址為源IP自己的mac地址為源mac,主機A的IP為目的IP主機A的mac為目的mac,
發送一個單播應答“我是192.168.3.2.我的mac地址為 0800.0333.2222”4、主機收到應答后,將網關mac地址對應192.168.4.2(跨網關通信,其他網段IP地址的mac地址均為網關mac)
,然后將緩存中的數據包,封裝網關mac地址進行發送5、路由收到數據包,檢查目的IP地址,發現不是給自己的,決定要進行路由,然后查詢路由表,
需要發往192.168.4.0網段中的192.168.4.2地址。路由準備從相應接口上發出去,然后查詢mac地址表,發現沒有主機B的映射。
路由器發送arp請求查詢主機B的mac地址(原理同2、3步,主機B收到請求后首先會添加網關的mac地址,然后單播回復arp請求)。6、路由器收到主機B的mac地址后,將其添加到路由mac地址表中,
然后將緩存中的數據2層幀頭去掉,封裝自己的mac地址為源mac,主機B的mac地址為目的mac(源和目的IP地址不變),
加上二層幀頭及校驗,發送給主機B。7、主機B收到數據之后,進行處理,發送過程結束。

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

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

相關文章

為github帳號添加SSH keys

使用git clone命令從github上同步github上的代碼庫時,如果使用SSH鏈接(如我自己的beagleOS項目:gitgithub.com:DamonDeng/beagleOS.git),而你的SSH key沒有添加到github帳號設置中,系統會報下面的錯誤&…

網絡基礎3(IP段格式,UDP數據報格式,TCP數據報格式)

IP段格式 IP數據報的首部長度和數據長度都是可變長的,但總是4字節的整數倍。 對于IPv4,4位版本字段是4。4位首部長度的數值是以4字節為單位的,最小值為5,也就是說首部長度最小是4x520字節,也就是不帶任何選項的IP首部…

Linux 開發路線

Linux 開發路線: 使用 linux—〉linxu 系統編程開發---〉驅動開發和分析 linux 內核 開始學 linux 內核:最好有三件寶物:《深入理解 linux 內核》《LINUX內核源代碼情景分析》和源代碼。 《深》是綱,《情》是目。最后深入代碼 Linux 內核原理:比較淺顯…

堆的應用(堆排序,TopK問題)

堆的應用 1)排序 堆排序 選擇排序 既可以找到最大的放在最后 也可以找到最小的方最前 但是,堆排序不能找最小的放在最前 因為把最小數放在最前,會破壞掉堆的原來的順序,除非重新建堆 1, 2,9&#xff0c…

有名管道和無名管道的區別

1)無名管道:管道是半雙工的,數據只能向一個方向流動;需要雙方通信時,需要建立起兩個管道;只能用于父子進程或者兄弟進程之間(具有親緣關系的進程)。 單獨構成一種獨立的文件系統:管道…

網絡基礎4(TCP三次握手,四次握手,TCP流量控制,TCP狀態轉換 , TCP異常斷開,設置TCP屬性,端口復用)

TCP協議 TCP通信時序 下圖是一次TCP通訊的時序圖。TCP連接建立斷開。包含大家熟知的三次握手和四次握手。 TCP通訊時序 在這個例子中,首先客戶端主動發起連接、發送請求,然后服務器端響應請求,然后客戶端主動關閉連接。 兩條豎線表示通訊的…

linux編程手冊讀書筆記第一章(20140329)

(2)管道、FIFO、套接字、設備(比如終端、偽終端)都支持非阻塞模式。(因為無法通過open()來獲取管道和套接字的文件描述符。所以要啟用非阻塞標志,就必須使用fcntl(&#…

排序(基本概念及分類,直接插入排序和希爾排序)

排序的概念 排序:所謂排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。 穩定性:假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序&a…

Linux編程手冊讀書筆記第二章(20140330)

內核:管理和分配計算機資源(即CPU、RAM和設備)的核心軟件層Linux內核可執行文件采用/boot/vmlinuz或類似的路徑名,“z”表明內核是經過壓縮的可執行文件。內核主要任務: (1&#xff…

直接交換排序

直接交換排序 缺點:進行一些重復性比較,解決放法:堆排序 選擇排序優化 //如果當前的數大于假定最大的數 //改變下標 //如果當前的數小于假定最小的數 //改變下標 //遍歷數組跳到下一個元素 //如果最大的數沒有在它的位置上 //交換 //交換…

Linux編程手冊讀書筆記第三章(20140407)

外殼函數執行一條中斷機器指令(int 0x80),引發處理器從用戶態切換到核心態,并執行系統中斷0x80的中斷矢量所指向的代碼。(在2.6內核及glib 2.3.2之后的版本都支持sysenter指令,進入內核的速度更快&#xff…

Linux編程手冊讀書筆記第四章(20140407)

標準文件描述符定義在<unistd.h>中&#xff0c;STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO打開一個文件&#xff1a;open&#xff08;&#xff09; &#xff03;include<sys/stat.h> #include<fcntl.h> int open(const char *pathname, int flags, …/* …

快速排序概念及實現

快速排序 快速排序是Hoare于1962年提出的一種二叉樹結構的交換排序方法&#xff0c; 其基本思想為&#xff1a; 任取待排序元素序列中的某元素作為基準值&#xff0c;按照該排序碼將待排序集合分割成兩子序列&#xff0c;左子序列中所有元素均小于基準值&#xff0c;右子序列…

Linux編程手冊讀書筆記第五章(20140408)

改變已打開文件性質&#xff1a;fcntl&#xff08;&#xff09; #include<fcntl.h> int fcntl(int fd, int cmd, …); (1) 調用失敗返回&#xff0d;1 &#xff08;2&#xff09;fcntl函數有5種功能&#xff1a; a. 復制一個現有的描述符&#xff08;cmd&#xff1d;F_D…

歸并排序概念及其實現

基本思想&#xff1a; 歸并排序&#xff08;MERGE-SORT&#xff09;是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一個非常典型的應用。將已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每個…

##連接符和#符的使用

C語言中如何使用宏C&#xff08;和C&#xff09;中的宏&#xff08;Macro&#xff09;屬于編譯器預處理的范疇&#xff0c;屬于編譯期概念&#xff08;而非運行期概念&#xff09;。下面對常遇到的宏的使用問題做了簡單總結。 關于#和## 在C語言的宏中&#xff0c;#的功能是將其…

計數排序和基數排序

適用于數據集中在某個范圍中&#xff0c; //統計每個數據出現的次數 計數排序&#xff1a;鴿巢原理 1找范圍 2給空間 3記次數 4回收 for(int i 0;i<size; i) {temp[array[i]]; }for(int i0;i<range;i&#xff09;{while(temp[i])array[index]i;}代碼實現 時間復雜度&…

信號量sem_wait()的使用

閑來無事&#xff0c;我給大家講下UNIX/Linux下信號量函數的使用。首先你得知道什么叫信號量&#xff0c;什么時候要用信號量。這個嘛&#xff0c;主要就是用來保護共享資源的&#xff0c;也就是說如果你想限制某個&#xff08;些&#xff09;資源在同一時刻只能有一&#xff0…

C++起始(關鍵字,命名空間,缺省參數,函數重載(c語言為什么不支持函數重載))

1. C關鍵字(C98) 2. 命名空間 在C/C中&#xff0c;變量、函數和后面要學到的類都是大量存在的&#xff0c;這些變量、函數和類的名稱將都存在于全局作用 域中&#xff0c;可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化&#xff0c;以避免命名沖突或名字污…

va_list和vsnprintf、getopt

原理解釋&#xff1a; VA_LIST 是在C語言中解決變參問題的一組宏&#xff0c;在<stdarg.h>頭文件下。 VA_LIST的用法&#xff1a; &#xff08;1&#xff09;首先在函數里定義一具VA_LIST型的變量&#xff0c;這個變量是指向參數的指針 &#xff08;2&a…