【Linux】網絡新兵連

歡迎來到?破曉的歷程的 博客

??不負時光,不負己??

引言

在上一篇博客中,我們簡單的介紹了一些Linux網絡一些比較基本的概念。本篇博客我們將開始正式學習Linux網絡套接字的內容,那么我們開始吧!

1.網絡中的地址管理

大家一定知道每一臺主機都會存在一個ip地址,其實并不是這么簡單,今天我們就來系統介紹一下。

1.1ip地址

IP協議有兩個版本, IPv4和IPv6. 我們整個的課程, 凡是提到IP協議, 沒有特殊說明的, 默認都是指IPv4。IPv6其實是針對IPv4地址不足提出的解決方案,目前世界上IPV6做的比較好的國家就是我們。

  • IP地址是在IP協議中, 用來標識網絡中不同主機的地址;具有唯一性。
  • 對于IPv4來說, IP地址是一個4字節, 32位的整數;
  • 對于IPv6來說,IP地址是一個16個字節,128位的整數。
  • 我們通常也使用 “點分十進制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用點分割的每一個數字表示一個字節, 范圍是 0 - 255;
1.1.1源IP和目的IP

在IP數據包頭部中, 有兩個IP地址, 分別叫做源IP地址, 和目的IP地址,用來表示這個數據是從哪臺主機發出來的,要發給哪一臺主機。

1.2MAC地址

每一臺連入網路的設備都必須需要網卡,每一張網卡在出廠時都有一個唯一性的編號,這個標號就是MAC地址。MAC同樣具有全網內唯一性,通常用于處于局域網中主機之間相互通信。

MAC地址長度為6個字節,48個比特位。一般用16進制加上冒號的形式來表示,例如:
08:00:27:33:fd:45。

1.3兩套地址體系的區別

在Linux下查看ip地址和MAC地址的命令為:

[user@VM-8-5-centos ~]$ ifconfig

在這里插入圖片描述

在這張圖片中,展示的是Linux系統下通過ifconfig命令查看的網絡配置信息,特別是關于以太網接口eth0的詳細配置。接下來,我們分析一下這些內容:

  1. 以太網接口eth0:

    • 狀態標志(flags): 4163<UP,BROADCAST,RUNNING,MULTICAST> 表示該接口已啟用(UP)、支持廣播(BROADCAST)、正在運行(RUNNING)以及支持多播(MULTICAST)。
    • MTU(最小傳輸單元): mtu 1500 表示該接口的最大傳輸單元為1500字節,這是以太網的標準MTU值。
    • IPv4地址和子網掩碼: inet 10.0.8.5 netmask 255.255.252.0 表示該接口的IPv4地址是10.0.8.5,子網掩碼是255.255.252.0,用于確定IP地址的網絡部分和主機部分。
    • 廣播地址: broadcast 10.0.11.25 是該網絡中的廣播地址,用于向同一子網內的所有設備發送數據包。
    • IPv6地址和前綴長度: inet6 fe80::5054:ff:fe35:3d28 prefixlen 64 scopeid 0x20< 表示該接口還配置了一個IPv6的鏈路本地地址,前綴長度為64位。注意這里文本被截斷,但基本意思是明確的。
    • MAC地址: ether 52:54:00:35:3d:28 是該接口的物理地址,也稱為MAC地址,用于在鏈路層唯一標識網絡接口。
  2. 接收(RX)和發送(TX)統計:

    • 顯示了接口接收和發送的數據包數量、字節數以及相關的錯誤統計(如錯誤、丟棄、溢出等),這些信息對于診斷網絡性能問題非常有用。
  3. 環回接口(lo):

    • lo 是環回接口,用于本機內部通信。它也有自己的IPv4和IPv6地址(127.0.0.1和::1),以及相應的接收和發送統計。

錯誤消息:

  • 圖片中并未直接顯示明顯的錯誤消息,但提到了“RX errors 0 dropped 0 overruns 0 frame 0”和“TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0”,這些值都為0,表示在接收和發送過程中沒有遇到錯誤、丟棄、溢出、幀錯誤、傳輸錯誤、丟棄、溢出、載波丟失或沖突。
    接下來,張三又上場了。張三買了一輛自行車,他想挑戰一下自己,所以他覺定騎車從北京到上海。如圖:
    在這里插入圖片描述
    北京是起點,上海是終點。從北京到上海沿途要經過很過地方,例如天津。
    假如張三途中經過了天津,然后然后不知道該往哪個方向走了,邊找個一個當地人說:“你好,我從北京來,要騎自行車去上海,來到了咱們這里,不知道該怎么走了,你可以幫幫我嗎?”。這個當當地人便熱情的對張三說:“你應該繼續往西走,然后二十公里處,你再找人問問”。就這樣張三又繼續向西走了二十公里。然后又找了一個人問路,路人得知他要去上海,從西邊來,就告訴他應該轉彎向南走。
    張三口中有幾套地址呢?
  • 從哪來,到哪去。到哪去是終極目標,就是目的IP。從哪來是源IP。:為我們未來的每個階段提供方向目標,方便路徑選擇。IP地址提供的是方向選擇。
  • 上一站從哪來,下一站到哪去。張三每到一處,這個地址就會發生變化。像這種從一個節點,跳轉到下一個相鄰的節點的地址,我們稱之為MAC地址。

在這里插入圖片描述
如圖所示,跨網絡數據進行傳輸時,需要路由器。所以路由器必須要同時連接兩個甚至多個局域網。數據該往哪個方向傳輸由IP地址決定。但是數據在長距離傳輸的過程中會經過多個路由節點,相鄰路由節點的選擇由MAC地址決定。

2.端口號

IP(公網IP)地址決定網絡中主機的唯一性。但是僅僅需要IP地址就可以實現數據的傳輸嗎?
打開快手刷視頻時,為什么視頻資源可以準確的顯示在快手APP頁面,而不是出現在微信APP頁面呢?
在這里插入圖片描述
我們把數據從主機A傳輸到主機B是目的嗎?真正通信的不是這兩個機器,而是這兩個機器上的應用(人)。但是有可能主機A上不止一個應用(進程),可能同時還會有其他的進程,例如快手打開的同時,微信也開著。那么用什么來標識客戶端或者服務器主機進程的唯一性呢?端口號
為了更好的表示一臺主機上,服務器進程或者客戶端進程的唯一性,我們采用端口號來標識主機上的不同進程。端口號保證主機唯一性即可,即一臺主機上一個端口號只能綁定一個進程,不同主機上的相同端口號綁定的進程可以不同。

公網IP地址(標識主機全網唯一性)+主機上的端口號=表示該進程在全網中的唯一性

在這里插入圖片描述
所以,網絡通信的本質就是進程間通信嘛!其中的臨界資源就是網絡。
通信是在做什么?通信不就是IO的過程嘛。所以,我們所有的網絡行為只有兩種:①從網絡中接收數據②發送數據到網絡中。
IP保證全網唯一,port保證本機唯一。一個進程可以綁定多個端口號。

進程已經有pid了,為什么還要有端口號呢?
①系統是系統,網絡是網絡。做到互相解耦。維護成本低
②一般都是客戶端主動向服務器發送請求。需要客戶端快速的找到服務器進程。決定了服務器的IP和端口不能隨便改變。所以決定了不能使用輕易會改變的值。pid不太滿足這個條件。

所以,客戶端向服務器發送消息時,要不要把客戶端的ip和端口號發給服務器呢?要,因為服務器還有將消息發回給客戶端。這就決定了在發送數據時,一定會多發一部分數據——以協議的形式呈現。

3.網絡字節序

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

  • 發送主機通常將發送緩沖區中的數據按內存地址從低到高的順序發出;
  • 接收主機把從網絡上接到的字節依次保存在接收緩沖區中,也是按內存地址從低到高的順序保存;
  • 因此,網絡數據流的地址應這樣規定:先發出的數據是低地址,后發出的數據是高地址.
  • TCP/IP協議規定,網絡數據流應采用大端字節序,即低地址高字節.
  • 不管這臺主機是大端機還是小端機, 都會按照這個TCP/IP規定的網絡字節序來發送/接收數據;
  • 如果當前發送主機是小端, 就需要先將數據轉成大端; 否則就忽略, 直接發送即可。

那么,如果需要轉化的話,轉化的過程需要誰來完成呢?需要程序員自己來完成轉換工作。當然,操作系統也給我們提供了相應的接口,我們調用即可。
接下來,我們簡單介紹一下這些接口

 #include <arpa/inet.h>uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);

這些函數名很好記,h表示host,n表示network,l表示32位長整數,s表示16位短整數。
例如htonl表示將32位的長整數從主機字節序轉換為網絡字節序,例如將IP地址轉換后準備發送。
如果主機是小端字節序,這些函數將參數做相應的大小端轉換然后返回;
如果主機是大端字節序,這些 函數不做轉換,將參數原封不動地返回。

網絡套接字

4.套接字

IP+port就可以表示一臺主機的進程在網絡中的唯一性,其中IP+Port合起來被稱為網絡套接字。
接下里,我們先見一下關于網絡套接字創建,綁定端口,使用的相關函數。

// 創建 socket 文件描述符 (TCP/UDP, 客戶端 + 服務器)
int socket(int domain, int type, int protocol);
// 綁定端口號 (TCP/UDP, 服務器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
// 開始監聽socket (TCP, 服務器)
int listen(int socket, int backlog);
// 接收請求 (TCP, 服務器)
int accept(int socket, struct sockaddr* address,
socklen_t* address_len);
// 建立連接 (TCP, 客戶端)
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);

套接字的種類其實是比較多的。有

  • 網絡套接字:主要用于網絡跨主機之間通信,同時支持本地通信。
  • 原始套接字:我們一般的套接字訪問的都是傳輸層的接口,原始套接字可以繞過傳輸層訪問底層的數據和接口。
  • Unix域間套接字:只能夠支持本地通信。

由于有三套不同的套接字,所以按理來說,操作系統要設計三套不同的接口分別對應三套不同的套接字。但是這對使用者來說簡直是災難,使用者要同時掌握三套接口。所以,為了方便使用,操作系統進行了如下的設計:
在這里插入圖片描述
我們發現:struct sockaddr_in和struct sockaddr_un的接口不同,這使用起來就很麻煩。所以操作系統就設計了struct sockaddr結構。在使用時,就必須進行強制類型轉換。

寫到這里,本篇博客的內容就結束了,我們下期博客再見!

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

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

相關文章

GraphRAG——一個基于圖的檢索增強生成的開源項目【送源碼】

GraphRAG 最近幾天&#xff0c;微軟團隊開源了GraphRAG&#xff0c;這是一種基于圖&#xff08;Graph&#xff09;的檢索增強生成方法。 先說說RAG吧&#xff0c;檢索增強生成&#xff0c;相當于是從一個給定好的知識庫中進行檢索&#xff0c;接入LLM模型&#xff0c;讓模型生…

(十六)視圖變換 正交投影 透視投影

視圖變換 代碼實驗 #include <glad/glad.h>//glad必須在glfw頭文件之前包含 #include <GLFW/glfw3.h> #include <iostream> #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h"//GLM #include <glm/glm.hpp> #include <glm/gtc/m…

C++初探究(2)

引用 對于一個常量&#xff0c;想要將其進行引用&#xff0c;則使用普通的引用相當于權限擴大&#xff08;常量為只讀&#xff0c;但此處的引用參數為可讀可寫&#xff09;&#xff0c;C編譯器會報錯. 例如&#xff1a; const int a 10;int& ra a;//權限放大&#xff0…

邏輯回歸不是回歸嗎?那為什么叫回歸?

RNN 邏輯回歸不是回歸嗎&#xff1f;那為什么叫回歸&#xff1f;邏輯回歸的基本原理邏輯函數&#xff08;Sigmoid函數&#xff09;二元分類 為什么叫做“回歸”&#xff1f;邏輯回歸的應用場景總結 邏輯回歸不是回歸嗎&#xff1f;那為什么叫回歸&#xff1f; 邏輯回歸&#x…

Python大數據分析——決策樹和隨機森林

Python大數據分析——決策樹和隨機森林 決策樹決策樹節點字段的選擇信息熵條件熵信息增益信息增益率 基尼指數條件基尼指數基尼指數增益 決策樹函數 隨機森林函數 決策樹 圖中的決策樹呈現自頂向下的生長過程&#xff0c;深色的橢圓表示樹的根節點&#xff1b;淺色的橢圓表示樹…

Java項目:基于SSM框架實現的農家樂信息管理平臺含前后臺【ssm+B/S架構+源碼+數據庫+答辯PPT+開題報告+畢業論文】

一、項目簡介 本項目是一套基于SSM框架實現的農家樂信息管理平臺 包含&#xff1a;項目源碼、數據庫腳本等&#xff0c;該項目附帶全部源碼可作為畢設使用。 項目都經過嚴格調試&#xff0c;eclipse或者idea 確保可以運行&#xff01; 該系統功能完善、界面美觀、操作簡單、功…

招投標信息采集系統:讓您的企業始終站在行業前沿

一、為何招投標信息如此關鍵&#xff1f; 在經濟全球化的大背景下&#xff0c;招投標活動日益頻繁&#xff0c;成為企業獲取項目、拓展市場的主流方式之一。招投標信息采集&#xff0c;作為企業戰略決策的前置環節&#xff0c;其重要性不言而喻。它不僅關乎企業能否第一時間發…

WPF 初識依賴屬性

依賴屬性的意義和作用 核心模塊內存共享&#xff0c;節省空間數據綁定、樣式、模板、動畫。。。。如果沒有依賴屬性&#xff0c;這個框架就是一個控件框架 相當于Winform 依賴屬性的基本定義 基本過程&#xff1a;聲明、注冊、包裝 在需要寫依賴屬性的類中&#xff0c;繼承…

快速將一個網址打包成一個exe可執行文件

一、電腦需要node環境 如果沒有下面有安裝教程&#xff1a; node.js安裝及環境配置超詳細教程【Windows系統安裝包方式】 https://blog.csdn.net/weixin_44893902/article/details/121788104 我的版本是v16.13.1 二、安裝nativefier 這是一個GitHub上的開源項目&#xff1a…

C 語言函數

1.0 函數的創建和使用 在C語言中&#xff0c;函數是一種封裝了特定功能的代碼塊&#xff0c;可以被程序中的其他部分調用。函數可以接受輸入參數&#xff0c;并且可以返回一個值。定義一個函數的基本語法如下 #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" …

numpy、ffmpeg都在cpu上面跑

ffmpeg: ffmpeg不支持在GPU上運行。ffmpeg是一個用于處理多媒體數據的工具&#xff0c;它主要在CPU上運行。雖然某些特定的ffmpeg功能&#xff08;如某些視頻編解碼器&#xff09;可以利用GPU進行硬件加速&#xff0c;但這需要特定的硬件和驅動支持&#xff0c;并且并非所有操…

阿里云人工智能平臺PAI部署開源大模型chatglm3之失敗記錄--update:最后成功了!

想學習怎么部署大模型&#xff0c;跟著網上的帖子部署了一個星期&#xff0c;然而沒有成功。失敗的經歷也是經歷&#xff0c;記在這里。 我一共創建了3個實例來部署chatglm3&#xff0c;每個實例都是基于V100創建的&#xff08;當時沒有A10可選了&#xff09;&#xff0c;其顯…

算法工程師第六天(● 454.四數相加II ● 383. 贖金信 ● 15. 三數之和 ● 18. 四數之和 ● 總結 )

參考文獻 代碼隨想錄 一、四數相加 II 給你四個整數數組 nums1、nums2、nums3 和 nums4 &#xff0c;數組長度都是 n &#xff0c;請你計算有多少個元組 (i, j, k, l) 能滿足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#…

x86芯片定制,Ethercat芯片定制,IP服務,適用于運動控制,工業總線等軟硬一體機

x86芯片定制&#xff0c;Ethercat芯片定制 X86平臺 我們的研發工程師已經積累了非常豐富的主板、整機設計經驗&#xff0c;對接您的產品規格場景需求&#xff0c;快速交付樣機&#xff0c;包含主板、BOX整機、平板電腦、CPCI等形態產品。降本、長生命周期、快速交付、及時響應…

C# 如何防止反編譯?C#程序加密混淆保護方法大全

在C#開發中&#xff0c;由于.NET程序集&#xff08;assemblies&#xff09;是基于中間語言&#xff08;Intermediate Language, IL&#xff09;編譯的&#xff0c;這些程序集可以被反編譯回接近原始源代碼的形式。為了保護代碼不被輕易反編譯&#xff0c;開發者可以采取以下幾種…

springsecurity(學習自用)

springsecurity 學習資源&#xff1a; https://blog.csdn.net/qq_45525848/article/details/131142179 springbootspring security 認證&#xff1a; 判斷用戶是否是系統合法用戶過程授權: 判斷系統內用戶可以訪問或具有訪問那些資源權限過程 創建一個springboot項目 如果只…

IEC62056標準體系簡介-2.IEC62056標準體系及對象標識系統(OBIS)

1. IEC 62056標準體系 IEC 62056標準體系目前共包括六部分&#xff0c;見圖1&#xff1a; 第61部分&#xff1a;對象標識系統第62部分&#xff1a;接口類第53部分&#xff1a;COSEM應用層第46部分&#xff1a;使用HDLC&#xff08;High Level Data Link Control&#xff09;協…

Linux多進程和多線程(八)多線程

多線程 線程定義線程與進程線程資源 線程相關命令 pidstat 命令 top 命令ps 命令常見的并發方案 1. 多進程模式2. 多線程模式 創建線程 1. pthread_create() 示例:創建一個線程 2. pthread_exit() 退出線程3. pthread_join() 等待線程結束 示例: 線程分離 創建多個線程 示例 1:…

前端面試題35(在iOS和Android平臺上,實現WebSocket協議有哪些常見的庫或框架?)

在iOS和Android平臺上&#xff0c;實現WebSocket協議有許多成熟且被廣泛使用的庫和框架。下面是一些推薦的選項&#xff1a; iOS 平臺 SocketRocket 簡介&#xff1a;這是由Facebook開源的庫&#xff0c;專門為iOS和Mac OS X設計&#xff0c;提供WebSocket連接的功能。它基于S…

Blender新手入門筆記收容所(一)

基礎篇 基礎操作 視角的控制 控制觀察視角&#xff1a;鼠標中鍵平移視圖&#xff1a;Shift鼠標中鍵縮放視圖&#xff1a;滾動鼠標中鍵滾輪 選中物體后&#xff1a;移動物體快捷鍵G&#xff0c;移動后單擊鼠標就會定下來。 進入移動狀態后&#xff1a;按Y會沿著Y軸移動進入移動…