【Linux網絡與網絡編程】02.初識Socket編程

1. 數據傳輸的目的

前一篇文章中我們講解了網絡傳輸的流程,那么網絡傳輸的目的是什么呢?難道我們只是將數據從一臺主機傳輸到另一臺主機嗎?

當然不是的!因為數據是給人用的。比如:聊天是人在聊天,下載是人在下載,瀏覽網頁是人在瀏覽? 但是人是怎么看到聊天信息的呢?怎么執行下載任務呢?怎么瀏覽網頁信息呢?是通過啟動的 qq,迅雷,瀏覽器。 而啟動的 qq,迅雷,瀏覽器都是進程。換句話說,進程是人在系統中的代表,只要把數據給進程就相當于人就拿到了數據。 所以數據傳輸到主機是手段,將數據傳達給主機的進程才是目的。 但是系統中,同時會存在非常多的進程,當數據到達目標主機之后,怎么轉發給目標進程?這就要在網絡的背景下,在系統中標識主機的唯一性。

2. 認識端口號

端口號(port)是傳輸層協議的內容。

端口號是一個 2 字節 16 位的整數,用來標識一個進程,告訴操作系統,當前的這個數據要交給哪一個進程來處理。IP 地址 + 端口號能夠標識網絡上的某一臺主機的某一個進程。因此一個端口號只能被一個進程占用,但是一個進程可以綁定多個端口號。

?我們有這樣的問題:那為什么不使用PID來標識進程的唯一性呢?而是使用端口號來標識?

這是為了避免網絡與系統的耦合度過高,參考LWP和線程的關系。?

端口號范圍劃分:

? 0 - 1023: 知名端口號,HTTP、?FTP、SSH 等這些廣為使用的應用層協議,他們的端口號都是固定的。

?1024 - 65535: 操作系統動態分配的端口號,客戶端程序的端口號就是由操作系統從這個范圍分配的。

3.?認識Socket編程

現在我們知道,IP 地址用來標識互聯網中唯一的一臺主機,port 用來標識該主機上唯一的一個網絡進程,那么IP+Port 就能表示互聯網中唯一的一個進程。在通信的時候,本質是兩個互聯網進程代表人來進行通信,{srcIp, srcPort,dstIp,dstPort} 這樣的 4 元組就能標識互聯網中唯二的兩個進程。所以網絡通信的本質就是進程間通信我們把 ip+port 叫做套接字 socket。

4. 傳輸層的典型代表

如果我們了解了系統,也了解了網絡協議棧,我們就會清楚,傳輸層是屬于內核的,那么我們要通過網絡協議棧進行通信,必定調用的是傳輸層提供的系統調用來進行的網絡通信。

下圖是對TCP協議和UDP協議的簡略介紹:?

5. 網絡字節序

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

發送主機通常將發送緩沖區中的數據按內存地址從低到高的順序發出,接收主機把從網絡上接到的字節依次保存在接收緩沖區中,也是按內存地址從低到高的順序保存。因此,網絡數據流的地址應這樣規定:先發出的數據是低地址,后發出的數據是高地址

TCP/IP 協議規定:網絡數據流應采用大端字節序,即低地址高字節。不管這臺主機是大端機還是小端機,都會按照這個 TCP/IP 規定的網絡字節序來發送/接收數據。如果當前發送主機是小端,就需要先將數據轉成大端,否則就忽略, 直接發送即可。

為使網絡程序具有可移植性,使同樣的 C 代碼在大端和小端計算機上編譯后都能正常運行,可以調用以下庫函數做網絡字節序和主機字節序的轉換。

#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);

?6. Socket編程接口

// 創建 socket 文件描述符 (TCP/UDP, 客戶端 + 服務器)
int socket(int domain, int type, int protocol);
//參數:
//    domain:需要指定域/協議簇
//    type:類型
//    protocol:協議,一般置0即可
//返回值:
//    成功返回socket文件描述符,失敗則返回-1// 綁定端口號 (TCP/UDP, 服務器)
int bind(int socket, const struct sockaddr *address,socklen_t address_len);
//參數:
//    socket:需要綁定的socket文件描述符
//    address:綁定的結構
//    address_len:綁定結構的大小

Socket API是一層抽象的網絡編程接口,適用于各種底層網絡協議,如 IPv4、IPv6。以及后面要講的 UNIX Domain Socket。然而,各種網絡協議的地址格式并不相同。

?

IPv4 和 IPv6 的地址格式定義在 netinet/in.h 中,IPv4 地址用 sockaddr_in 結構體表示,包括 16 位地址類型,16 位端口號和32 位 IP 地址。IPv4、IPv6 地址類型分別定義為常數 AF_INET、AF_INET6。這樣,只要取得某種 sockaddr 結構體的首地址,不需要知道具體是哪種類型的 sockaddr 結構體,就可以根據地址類型字段確定結構體中的內容。socket API 可以都用 struct sockaddr * 類型表示,在使用的時候需要強制轉化成 sockaddr_in。這樣的好處是程序的通用性可以接收 IPv4、IPv6以及 UNIX Domain Socket 各種類型的 sockaddr 結構體指針做為參數。

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

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

相關文章

電腦連不上手機熱點會出現的小bug

一、問題展示 注意: 不要打開 隱藏熱點 否則他就會在電腦上 找不到自己的熱點 二、解決辦法 把隱藏熱點打開即可

CUDA專題3:為什么GPU能改變計算?深度剖析架構、CUDA?與可擴展編程

1. 簡介 1.1. 使用 GPU 的優勢 圖形處理器(GPU)在相近的成本和功耗范圍內,能夠提供比中央處理器(CPU)更高的指令吞吐量和內存帶寬。許多應用程序利用這些優勢,在 GPU 上的運行速度遠超 CPU(參見《GPU 應用》)。其他計算設備(如 FPGA)雖然能效也很高,但其編程靈活性…

Linux輸入系統應用編程

什么是輸入系統 Linux 輸入系統是處理用戶輸入設備(如鍵盤、鼠標、觸摸屏、游戲手柄等)的軟件架構。在應用編程層面&#xff0c;它提供了與這些輸入設備交互的接口。 主要組成部分 輸入設備驅動層&#xff1a;直接與硬件交互的驅動程序 輸入核心層&#xff1a;內核中的輸入子…

StarRocks BE宕機排查

StarRocks BE宕機排查 排查是否OOM dmesg -T|grep -i oom #排查是否oom原因&#xff1a; 2.X版本OOM原因 BE 的配置文件 (be.conf) 中 mem_limit 配置不合理&#xff0c;需要配置mem_limit(機器總內存-其他服務占用內存-1~2g(系統預留)) 比如機器內存40G&#xff0c;上面有…

邏輯回歸(Logistic Regression)模型的概率預測函數

以二分類問題為例&#xff0c;常見的損失函數有 負對數似然損失(neg log-likelihood loss)&#xff0c;交叉熵損失(cross entropy loss)&#xff0c;deviance loss指數損失(exponential loss)。 前三者雖然名字不同&#xff0c;但卻具有相同的表達形式。此外&#xff0c;neg …

函數式組件中的渲染函數 JSX

在 Vue.js 和 React 等現代前端框架中&#xff0c;函數式組件已成為一種非常流行的設計模式。函數式組件是一種沒有內部狀態和生命周期方法的組件&#xff0c;其主要功能是接受 props 并渲染 UI。隨著這些框架的演進&#xff0c;渲染函數和 JSX&#xff08;JavaScript XML&…

Android 動態設置默認Launcher(默認應用 電話-短信-瀏覽器-主屏幕應用))

Android 動態設置默認Launcher(默認應用 電話-短信-瀏覽器-主屏幕應用&#xff09;) 文章目錄 場景需求參考資料思路期待效果 實現方案源碼流程分析和思路實現DefaultAppActivityHandheldDefaultAppFragmentHandheldDefaultAppPreferenceFragmentDefaultAppChildFragmentDefaul…

Qt下載模板到本地文件內容丟失問題

上源碼 關鍵點已標注在源碼中 A, B… // 保存的文件路徑后綴QString dateTime Myapp::getCurrentTimeDescYMDHms().replace(" ", "").replace("-", "").replace(":", "");// 臨時文件名稱QString newFileName Q…

【數學建模】動態規劃算法(Dynamic Programming,簡稱DP)詳解與應用

動態規劃算法詳解與應用 文章目錄 動態規劃算法詳解與應用引言動態規劃的基本概念動態規劃的設計步驟經典動態規劃問題1. 斐波那契數列2. 背包問題3. 最長公共子序列(LCS) 動態規劃的優化技巧動態規劃的應用領域總結 引言 動態規劃(Dynamic Programming&#xff0c;簡稱DP)是一…

藍橋杯備考------>雙指針(滑動窗口)

來看哈我們這道例題 我們第一種想法應該就是暴力求解&#xff0c;枚舉每個子數組 當我們枚舉第一個數的時候&#xff0c;我們要從第一個數開始挨個枚舉每個結尾 如圖&#xff0c;以第一個數開頭的最長不重復數我們就枚舉完了 然后我們讓兩個指針全部到第二個數 再枚舉第二個…

python實現股票數據可視化

最近在做一個涉及到股票數據清洗及預測的項目&#xff0c;項目中需要用到可視化股票數據這一功能&#xff0c;這里我與大家分享一下股票數據可視化的一些基本方法。 股票數據獲取 目前&#xff0c;我已知的使用python來獲取股票數據方式有以下三種: 爬蟲獲取&#xff0c;實現…

【15】Selenium 爬取實戰

一、selenium適用場景 二、爬取目標 三、爬取列表頁 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;加載列表頁 &#xff08;3&#xff09;解析列表頁 &#xff08;4&#xff09;main 四、爬取詳情頁 &#xff08;1&#xff09;加載詳情頁 &#xff08;2…

如何封裝一個上傳文件組件

#今天用el-upload感到很多不方便&#xff0c;遂決定自己封裝一個。注&#xff1a;本文不提供表面的按鈕樣式和文件上傳成功后的樣式&#xff0c;需要自己創建。本文僅介紹邏輯函數# 1&#xff0c;準備幾個表面用來指引上傳的元素 2&#xff0c;創造統一的隱藏文件上傳輸入框&…

【計網】數據包

期末復習自用的&#xff0c;處理得比較草率&#xff0c;復習的同學或者想看基礎的同學可以看看&#xff0c;大佬的話可以不用浪費時間在我的水文上了 1.數據包的定義&#xff1a; 數據包是網絡通信中的基本單元&#xff0c;它包含了通過網絡傳輸的所有必要信息。數據包的結構…

HTTP抓包Websocket抓包(Fiddler)

近期時常要和各個廠商的java云平臺打交道&#xff1a;登錄、上傳、下載等&#xff0c;程序的日志雖必不可少&#xff0c;但前期調試階段&#xff0c;免不了遇到問題&#xff0c;這時有一個稱手的抓包工具就顯得尤為重要了。 Fiddler Everywhere是一款跨平臺的網絡調試工具&…

Git和GitCode使用(從Git安裝到上傳項目一條龍)

第一步 菜鳥教程-Git教程 點擊上方鏈接&#xff0c;完成Git的安裝&#xff0c;并了解Git 工作流程&#xff0c;知道Git 工作區、暫存區和版本庫的區別 第二步 GitCode官方幫助文檔-SSH 公鑰管理 點擊上方鏈接&#xff0c;完成SSH公鑰設置 第三步&#xff08;GitCode的官方引…

基于 WebAssembly 的 Game of Life 交互實現

一、前言 在前期的實現中&#xff0c;我們使用 Rust 編寫核心邏輯&#xff0c;并通過 WebAssembly 將其引入到 Web 環境中&#xff0c;再利用 JavaScript 進行渲染。接下來&#xff0c;我們將在這一基礎上增加用戶交互功能&#xff0c;使模擬過程不僅能夠自動演化&#xff0c;…

【keil】單步調試

一、步驟 1、打開stc-isp軟件 2.打開keil仿真設置&#xff0c;選擇對應的單片機型號 3.點擊將所選目標單片機設置為仿真芯片&#xff0c;點擊下載&#xff0c;按一下單片機打下載按鈕 4.此時已經將仿真程序下載到單片機 5.此時點擊options,找到debug選擇STC Montor 51 Driv…

c++弱指針實現原理

在 C 中&#xff0c;弱指針&#xff08;std::weak_ptr&#xff09;是一種特殊的智能指針&#xff0c;其核心目標是?解決 std::shared_ptr 的循環引用問題?&#xff0c;同時不增加對象的引用計數。它的實現原理基于與 std::shared_ptr 共享的 ?控制塊&#xff08;Control Blo…

【ManiSkill】環境success條件和reward函數學習筆記

1. “PickCube-v1” info["success"]&#xff1a;用于指示任務是否成功完成 布爾型張量&#xff0c;在環境的evaluate()方法中計算并返回&#xff1a; "success": is_obj_placed & is_robot_static這確保了機器人不僅能將物體準確放置在目標位置&am…