【Linux】探索網絡編程:TCP/UDP協議解析與Socket應用實例

文章目錄

  • 前言:
  • 1. 預備知識
    • 1.1 理解源IP地址和目的IP地址
    • 1.2 認識端口號
    • 1.3 理解"端口號"和"進程ID"
    • 1.4 理解源端口號和目的端口號
    • 1.5 認識TCP協議
    • 1.6 認識UDP協議
    • 1.6 TCP vs UDP 可靠性
    • 1.7 網絡字節序
  • 2. socket 編程接口
    • 2.1 socket 常見API
    • 2.2 sockaddr結構
  • 3. 簡單的UDP網絡程序
    • 3.1 UDP實現簡易聊天室:
  • 總結:

前言:

在現代信息技術飛速發展的今天,網絡通信已經成為我們日常生活和工作中不可或缺的一部分。無論是通過電子郵件、社交媒體還是在線會議,網絡通信都扮演著至關重要的角色。而在這背后,是復雜的網絡協議和編程技術支撐著這一切的運行。本文旨在深入探討網絡編程的基礎知識,特別是UDP和TCP這兩種常用的傳輸層協議,以及它們在socket編程中的應用。通過本文,讀者將能夠理解源IP地址、目的IP地址、端口號等概念,并學習如何使用socket編程接口來創建網絡應用程序。此外,本文還將介紹網絡字節序的概念,以及如何通過轉換函數確保網絡程序的可移植性。最后,通過一個簡單的UDP網絡程序實例,我們將展示如何實現一個回聲服務器和簡易聊天室,讓讀者對網絡編程有更直觀的認識。

1. 預備知識

1.1 理解源IP地址和目的IP地址

在IP數據包頭部中, 有兩個IP地址, 分別叫做源IP地址, 和目的IP地址。

思考: 我們光有IP地址就可以完成通信了嘛? 想象一下發qq消息的例子, 有了IP地址能夠把消息發送到對方的機器上,但是還需要有一個其他的標識來區分出, 這個數據要給哪個程序進行解析。

1.2 認識端口號

  1. 我們上網,無非兩種動作:a. 把遠端的數據拉取到本地 b. 把我的數據發送到遠端
  2. 大部分的網絡通信行為,都是用戶觸發的。計算機中,誰表示用戶呢?進程!(客戶端服務,服務端服務)
  3. 把數據發送到目標主機,不是目的,是手段。正真的目的,是把數據交給這個主機上的某一個服務(進程)(服務必須具有唯一的標識:端口號)
  4. 網絡通信的本質,其實是進程幫我們進行網絡通信,無論是對于C還是S
  5. IP(唯一的一臺主機)+ port(該主機的唯一的一個進程) = 互聯網中唯一的一個進程
  6. client -> server: client進程 -> server進程
    client進程 = client ip + client port = client是互聯網中唯一的一個進程
    server進程 = server ip + server port = server是互聯網中唯一的一個進程
    唯一的找到彼此(src ip, src port; dst ip, dst port)(socket通信)

結論: 網絡通信的本質:其實就是進程間通信!
進程間通信:看到公共的資源(網絡)

1.3 理解"端口號"和"進程ID"

我們之前在學習系統編程的時候, 學習了 pid 表示唯一一個進程; 此處我們的端口號也是唯一表示一個進程. 那么這兩者之間是怎樣的關系?

  • PID 是操作系統用來標識一個進程的唯一編號。
  • 端口號 是網絡通信中用來標識主機上特定服務的數字。

它們之間沒有直接關系,PID用于操作系統內部管理,而端口號用于網絡通信。另外, 一個進程可以綁定多個端口號; 但是一個端口號不能被多個進程綁定。

1.4 理解源端口號和目的端口號

傳輸層協議(TCP和UDP)的數據段中有兩個端口號, 分別叫做源端口號和目的端口號. 就是在描述 “數據是誰發的, 要發給誰”;

1.5 認識TCP協議

此處我們先對TCP(Transmission Control Protocol 傳輸控制協議)有一個直觀的認識; 后面我們再詳細討論TCP的一些細節問題.

  • 傳輸層協議
  • 有連接
  • 可靠傳輸
  • 面向字節流

1.6 認識UDP協議

此處我們也是對UDP(User Datagram Protocol 用戶數據報協議)有一個直觀的認識; 后面再詳細討論.

  • 傳輸層協議
  • 無連接
  • 不可靠傳輸
  • 面向數據報

1.6 TCP vs UDP 可靠性

TCP 要保證可靠性,就需要做更多的工作——TCP協議一定更復雜——接口會更多一些。
UDP 協議一定更簡單。

1.7 網絡字節序

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

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

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

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

2. socket 編程接口

2.1 socket 常見API

// 創建 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);

2.2 sockaddr結構

socket編程,是有不同種類的,有的是專門用來進行本地通信的(unix socket),有的是用來專門跨網絡通信的(inet socket),有的是用來進行網絡管理的(raw socket)。

統一接口 -> C語言寫的 -> 統一類型 -> struct sockaddr

在這里插入圖片描述

3. 簡單的UDP網絡程序

bind: socket = ip + port; 文件信息和網絡信息給關聯起來

   #include <sys/types.h>          /* See NOTES */#include <sys/socket.h>int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

填充信息:
在這里插入圖片描述

sin_addr —— 16位地址類型: AF_INET、 32位IP地址
sin_port —— 16位端口號
sin_zero —— 8字節填充

在這里插入圖片描述
如何理解 “192.168.1.2” <==> 4字節IP地址之間互相轉換

// 4字節 轉 字符串
struct IP
{uint8_t p1;uint8_t p2;uint8_t p3;uint8_t p4;
}struct IP *temp = (struct IP*)&ipaddr;
to_string(temp->p1) + "." + to_string(temp->p2) + ...
// 字符串 轉 4字節
struct IP temp;
temp.p1 = stoi(substr("."));
uint32_t ipint = (int)temp;

127.0.0.1 : 本地環回
在這里插入圖片描述

./udpserver 127.0.0.1 8888

127.0.0.1 : 本地環回,可以實現本地通信,常用于進行代碼測試
在這里插入圖片描述
recvfrom(接收消息)

// 接收信息ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);// buf: 輸出型緩沖區// len: 期望長度// 返回值: 實際讀到的長度// src_addr: 輸出型參數(ip 與 port)// addrlen: 輸出型參數

有人給你發了消息,你想不想知道誰給你發的? 為什么? 因為我還要給別人回消息
你通過什么信息,只到只到對方是誰? socket 對方的 IP 和 port!

sendto(發送消息)

// 發送信息ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

使用公網ip,我們的服務器,無法直接bind公網ip(云服務器不允許),也嚴重不推薦,bind公網ip,或者任何一個確定的ip。
在這里插入圖片描述

實現一個回聲服務器:
在這里插入圖片描述
在這里插入圖片描述
終端輸出也是一個文件,不同的終端窗口是不同的文件。
在這里插入圖片描述

3.1 UDP實現簡易聊天室:

gitee:https://gitee.com/q-haodong/test_-linux/tree/master/20240702_udp_echo_sever
在這里插入圖片描述
在這里插入圖片描述

總結:

本文從網絡通信的基本概念出發,逐步深入到TCP和UDP協議的細節,并探討了它們在socket編程中的應用。通過預備知識的介紹,我們理解了源IP地址、目的IP地址、端口號等在網絡通信中的重要性。同時,我們也學習了網絡字節序的概念,以及如何通過特定的函數進行主機字節序和網絡字節序之間的轉換,以確保程序的兼容性和可移植性。在socket編程接口部分,我們介紹了創建socket文件描述符、綁定端口號、監聽socket、接收請求、建立連接等常見API的使用。最后,通過實現一個UDP回聲服務器和簡易聊天室的示例,我們展示了UDP協議在實際網絡編程中的應用。通過本文的學習,讀者不僅能夠掌握網絡編程的基礎知識,還能夠獲得實際編程的經驗,為進一步深入學習和探索網絡編程打下堅實的基礎。

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

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

相關文章

Pandas數據清洗實戰:精準捕捉并優雅過濾異常值,讓數據分析更可靠!

1.describe()&#xff1a;查看每一列的描述性統計量 # 導包 import numpy as np import pandas as pddf pd.DataFrame(datanp.random.randint(0,10,size(5,3)),indexlist("ABCDE"),columns["Python","NumPy","Pandas"]) dfdf.descri…

2024年7月5日 十二生肖 今日運勢

小運播報&#xff1a;2024年7月5日&#xff0c;星期五&#xff0c;農歷五月三十 &#xff08;甲辰年庚午月庚午日&#xff09;&#xff0c;法定工作日。 紅榜生肖&#xff1a;狗、羊、虎 需要注意&#xff1a;雞、牛、鼠 喜神方位&#xff1a;西北方 財神方位&#xff1a;正…

聯合查詢(多表查詢)

多表查詢是對多張表的數據取笛卡爾積&#xff08;關聯查詢可以對關聯表使用別名&#xff09; 數據準備 insert into classes(name, desc) values (計算機系2019級1班, 學習了計算機原理、C和Java語言、數據結構和算法), (中文系2019級3班,學習了中國傳統文學), (自動化2019級5…

土地規劃與文化遺產保護:在發展浪潮中守護歷史的脈絡

在這個日新月異的時代&#xff0c;城市化進程如火如荼&#xff0c;土地規劃作為引導城市發展方向的關鍵&#xff0c;承載著平衡發展與保護的重任。在追求現代化的同時&#xff0c;保護文化遺產不僅是對過去的尊重&#xff0c;更是對未來負責。本文旨在深入探討如何在土地規劃實…

uniapp----- 判斷小程序版本有沒有更新

const updateManager uni.getUpdateManager();// 當向小程序后臺請求完新版本信息&#xff0c;會進行回調updateManager.onCheckForUpdate(function (res) {console.log(是否有新版本, res.hasUpdate);});// 當新版本下載完成&#xff0c;會進行回調updateManager.onUpdateRea…

為了SourceInsight從Linux回到Windows

什么是SourceInsight 現在上網搜索這個軟件&#xff0c;大多數說他是一個代碼閱讀軟件&#xff1b;但是在官方的說法里面&#xff0c;這是一款支持多語言的編輯器。大概長這樣&#xff1a; 看起來十分老舊是吧&#xff0c;但是他其實他已經是第四代了哈哈哈。其實這個軟件是我…

字典樹模板+位運算

P3879 [TJOI2010] 閱讀理解 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) trie樹板子題&#xff0c;稍微有一丟丟不一樣&#xff0c;套用字典樹模板稍加修改就能過 手搓字典樹代碼&#xff1a; char ch[1010][26], cnt[1010], idx; void insert(string s)//插入 {int p 0…

高校搭建AIGC新媒體實驗室,創新新聞教育教學模式

高校作為人才培養的重要陣地&#xff0c;必須緊跟時代步伐&#xff0c;不斷創新教育教學模式&#xff0c;提升跨界融合育人水平&#xff0c;通過AIGC新媒體實驗室探索創新人才培養模式。AIGC新媒體實驗室不僅能夠高效賦能高校宣傳媒體矩陣&#xff0c;也可以助力教學實踐與AIGC…

ISA95-Part3-通訊協議的解析與開發指南

在 MES/MOM 系統中實現 ISA-95 標準的通信協議部分,通常涉及以下幾個關鍵步驟和應用場景: 一、關鍵步驟和應用場景: 1. ~協議選擇~: - MES/MOM 系統需選擇符合 ISA-95 標準的通信協議,常用的有 OPC UA(OLE for Process Control Unified Architecture)、XML、以及基于 H…

5分鐘讀懂GPS-RTK實時動態技術,建議收藏!

由于”智慧工地“理念的興起和發展&#xff0c;目前越來越多的企業將信息技術手段融合于施工現場安全管理&#xff0c;構建智能化的安全監管模式。基于此&#xff0c;藍牙LORA融合定位技術、UWB超寬帶定位技術、GPS-RTK定位技術等信息技術也越來越頻繁出現在大眾視野。然而&…

記錄通過Cloudflare部署屬于自己的docker鏡像源

引言 由于最近國內無法正常拉取docker鏡像&#xff0c;然而找了幾個能用的docker鏡像源發現拉取回來的docker鏡像不是最新的版本&#xff0c;部署到Cloudflare里Workers 和 Pages&#xff0c;拉取docker 鏡像成功&#xff0c;故記錄部署過程。 部署服務 登錄Cloudflare后&…

Android Gradle開發與應用(一): Gradle基礎

Gradle是一種基于Groovy語言的構建工具&#xff0c;用于自動化構建、測試和部署Android應用程序。它提供了一種靈活和可擴展的方式來管理項目的構建過程&#xff0c;并且可以輕松地集成到Android開發工作流程中。 本文將介紹Gradle的基礎知識&#xff0c;包括Gradle的安裝和配…

軟設之面向對象開發流程

面向對象開發流程分為 1.面向對象分析 2.面向對象設計 3.面向對象程序設計 4.面向對象測試 其中 面向對象分析包括 認定對象 組織對象 對象間的互相租用 基于對象的操作 識別類及對象&#xff1a; 識別類及對象 定義屬性 定義服務 識別關系 識別包 面向對象程…

C++ 智能指針內存泄漏問題

shared_ptr相互嵌套導致循環引用 代碼示例 #include <iostream> #include <memory> using namespace std;class B;class A { public:std::shared_ptr<B> b_ptr;~A() { std::cout << "A destroyed\n"; } };class B { public:std::shared_pt…

數據結構 1.1 數據結構的基本概念

本章總覽&#xff1a; 一.什么是數據 1.數據 數據是信息的載體&#xff0c;是描述客觀事物屬性的數、字符及所有能輸入到計算機中并被計算機程 序識別和處理的符號的集合。數據是計算機程序加工的原料。 早期計算機只能處理純數值的問題&#xff0c;如世界第一題計算機ENI…

轉讓北京文化傳媒公司帶營業性演出經紀許可證

影視文化傳播倡導將健康的影視文化有效傳播給觀眾&#xff0c;從而構建觀眾與電影制作者的良 性溝通與互動&#xff0c;是溝通電影制作者與電影受眾的重要橋梁。影視文化泛指以電影&#xff0c;電視方式所進行的全部文化創造&#xff0c;即體現為電影&#xff0c;電視全部的存在…

Java-List集合堆內存溢出

Java-List集合堆內存溢出 情況一情況二對照分析對照規定堆內存 情況一 往List<Object>的集合中不斷插入元素&#xff0c;集合底層的數組會不斷擴容&#xff0c;從0 -> 10 -> 10 10>>1…。最終出現堆內存溢出&#xff0c;是在擴容數組大小的時候。這里的過程…

【應屆應知應會】SQL常用知識點50道

SueWakeup 個人主頁&#xff1a;SueWakeup 系列專欄&#xff1a;借他一雙眼&#xff0c;愿這盛世如先生所愿 個性簽名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陸離 本文封面由 凌七七~? 友情提供 目錄 數據庫的概念 (什么是數據庫) RDBMS NOSQL 數據庫的分類 …

Qt涂鴉板

Qt版本&#xff1a;Qt6 具體代碼&#xff1a; 頭文件 dialog.h #ifndef DIALOG_H #define DIALOG_H#include <QDialog>QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACEclass Dialog : public QDialog {Q_OBJECTpublic:Dialog(QWidget *parent n…

0145__contain_of的原理與實現

contain_of的原理與實現_contain of-CSDN博客