Linux:初識計算機網絡


網絡發展

獨立模式: 計算機之間相互獨立

在這裏插入圖片描述

網絡互聯: 多臺計算機連接在一起, 完成數據共享;

在這裏插入圖片描述

局域網LAN: 計算機數量更多了, 通過交換機和路由器連接在一起;

在這裏插入圖片描述

  • 交換機:實現主機之間的數據交換

  • 路由器:不但時間數據交換,並且實現數據的路徑選擇

  • 網絡以覆蓋範圍劃分:局域網(1KM內),城域網(10KM內),廣域網

  • 組網方式:以太網/令牌環網

網絡通信

在複雜的網絡通信中,必須保證每個主機都有自己唯一的標識,只有這樣纔是實現精確的點對點通信

通過IP地址和端口可以實現不同主機之間的進程間通信了

IP地址

網絡中主機的唯一標識 - IP地址

  • IPV4:uint32_t — 無符號四個字節的整數(不到43億) - IP地址是不夠用的

我們通常也使用 “點分十進制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用點分割的每一個數字表示一個 字節, 範圍是 0 - 255;

DHCP - 動態地址分配技術;NAT:網絡地址轉換技術

  • IPV6:uint8_t addr[16] 但是不向前兼容IPV4 - IPv6的地址長度爲128位,是IPv4地址長度的4倍

網絡通信中的每條數據都必須具備:

源IP地址/目的IP地址 - 表示數據從哪個主機來,到哪個主機去

  • 目的IP地址:能夠讓網絡中的路由器爲每一條數據根據目的地址選擇不同的路徑到達對端主機
  • 源IP地址:能夠讓對端主機知道數據是誰發送,以便於回覆數據

端口

主機如何確定由哪個進程處理數據 - 端口

IP地址使網絡中主機與主機之間的通信,但是主機上有很多進程。所以通信中必須標識一條數據應該由哪個進程處理

概念:

在一臺主機上唯一標識一個進程,當操作系統接收到一條網絡數據能夠知道應該交給哪個進程處理

  • 類型uint16_t 無符號兩個字節的整數 0~65535

  • 特性:一個進程可以使用多個端口,但是一個端口只能被一個進程佔用

  • 網絡中的每條數據都必須具備:源端口/目的端口(標識數據從哪個進程中來,到哪個進程去)

IP地址 + 端口號能夠標識網絡上的某一臺主機的某一個進程

提問:爲什麼不使用pid標識進程?

進程每一次的重新 pid 都會發生變化,但是端口不會

網絡字節序

字節序概念:

cpu對內存中的數據進行存取的順序(取決於cpu的架構)

  • x86-小端
  • MIPS-大端

字節序分類:

0x01020304 — 01是高位;04是低位
uchar a[4] — a[0] - 低地址;a[4] - 高地址

  1. 大端字節序:低地址存高位

a[0] = 01;a[1] = 02;a[2] = 03;a[3] = 04

  1. 小端字節序:低地址存低位

a[0] = 04;a[1] = 03;a[2] = 02;a[3] = 01

低地址和高地址:指的是一個數據在內存空間中使用的地址是從低到高的
低位和高位:指的是一個數據的二進制位從右到左,是越來越高的

網絡字節序:

內存中的多字節數據相對於內存地址有大端和小端之分, 磁盤文件中的多字節數據相對於文件中的偏移地址也有大端小端之分, 網絡數據流同樣有大端小端之分. 那麼如何定義網絡數據流的地址呢?

  • 發送主機通常將發送緩衝區中的數據按內存地址從低到高的順序發出
  • 接收主機把從網絡上接到的字節依次保存在接收緩衝區中,也是按內存地址從低到高的順序保存
  • 因此,網絡數據流的地址應這樣規定:先發出的數據是低地址,後發出的數據是高地址.
    在這裏插入圖片描述

爲了防止網絡通信中因爲兩端主機的主機字節序不同而造成數據二義所訂立的標準

  • TCP/IP協議規定,不管兩端通信主機是大端還是小端,反正在網絡通信的時候都要講數據轉換爲網絡字節序(大端字節序)然後再進行傳輸
  • 接收端接收到數據之後,從網絡字節序轉換爲主機字節序再進行處理

並不是所有的數據都需要轉換,需要轉換的數據關鍵點在於內存中一次存儲單位大於一個字節的數據:short/int/long/float/double ;

字符串char buf[1024]是按字節爲存儲單位,因此字符串不涉及字節序轉換

如何判斷一個主機的字節序是大端還是小端
#include <iostream>
using namespace std;

union tmp {
	int a;
	char b;	// b 就是 a[0]
}tmp;

int main() {
	tmp.a = 1;
	
	if (tmp.b == 1) {
		cout << "計算機是小端字節序\n";
	}
	else {
		cout << "計算機是大端字節序\n";
	}
	return 0;
}

協議(約定)

網絡通信協議:網絡通信中數據格式的約定

  • 計算機生產廠商有很多;
  • 計算機操作系統, 也有很多;
  • 計算機網絡硬件設備, 還是有很多;
  • 如何讓這些不同廠商之間生產的計算機能夠相互順暢的通信? 就需要有人站出來, 約定一個共同的標準, 大家都來遵守, 這就是 網絡協議;

例如

兩個不同地區的人使用普通話通話- --普通話就是通信協議

協議分層

  • 對通信協議在不同的通信環境中進行封裝,不同層次使用不同協議,提供不同的服務
  • 將通信環境劃分出來通信的實現更加簡單,更容易形成規範

在這裏插入圖片描述

  • 這個例子中, 我們的協議只有兩層(實際的網絡通信會更加複雜, 需要分更多的層次)
  • 分層最大的好處在於 “封裝” . 面向對象例子

網絡通信環境中的協議分層:

OSI七層模型:

應用層/表示層/會話層/傳輸層/網絡層/鏈路層/物理層

在這裏插入圖片描述

TCP/IP五層模型:

應用層/傳輸層/網絡層/鏈路層/物理層

TCP/IP是一組協議棧/協議簇: 其中包含許多協議,IP和TCP協議只是其中比較典型的兩種而已

  1. 應用層:負責應用程序之間的數據溝通(描述應用數據如何組織解析以及描述信息)

典型協議:

  • HTTP(超文本傳輸協議): web服務器用這種協議和瀏覽器交互
  • DNS(域名解析服務): 將域名解析爲ip地址
  • FTP(文件傳輸協議): 可以在下載或上傳文件的時候使用

例如:

qq是一個應用程序,qq與qq之間的通信使用的協議就是qq的協議;應用程序是程序員編寫的,因此應用層的協議也是程序員自己定義的。

  1. 傳輸層:負責不同主機上進程間的數據傳輸(描述端口信息標識從哪個進程到哪個進程)

典型協議:

  • TCP(傳輸控制協議): 面向連接、可靠傳輸、面向字節流
  • UDP(用戶數據報協議): 無連接、不可靠、面向數據報

例如:

qq發送的數據保證是發送給qq的,而不會發送給其他程序。

傳輸層的協議都會包含有端口信息

  1. 網絡層:負責地址管理與路由選擇(描述IP信息標識從哪個主機到哪個主機)

典型協議: IP(網際互連協議)

設計IP的目的是提高網絡的可擴展性

  • 解決互聯網問題,實現大規模、異構網絡的互聯互通
  • 分割頂層網絡應用和底層網絡技術之間的耦合關係,以利於兩者的獨立發展

典型設備:路由器(實現數據的路由轉發)

網絡層的協議都會包含有IP的地址信息

  1. 鏈路層:負責相鄰設備之間的數據幀識別以及傳輸(描述MAC地址信息從哪個設備到哪個設備)

典型協議: Ethernet(以太網協議)

典型設備:交換機

  1. 物理層:負責物理光電信號的傳輸

典型協議:以太網協議(計算機局域網技術)
典型設備:集線器(將多根網線集合成一根)

在這裏插入圖片描述

協議分層:

根據提供的服務不同,分出不同的通信層次,在每個層次使用不同的協議實現數據格式約定 – 將複雜的網絡通信環境簡化清晰

網絡通信中的數據傳輸流程

在這裏插入圖片描述

  • 發送端主機的層層數據封裝: tcp/ip模型中的五層,層層對原始數據進行描述
  • 接收端主機的層層數據分用: tcp/ip模型中的五成,層層對網絡數據進行解析得到原始數據的過程

如果本篇博文有幫助到您,請留個贊激勵博主吶

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章