LinuxTCP/UDP基礎概念

TCP(傳輸控制協議)

TCP 是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。它的主要特點包括:

  • 面向連接:在傳輸數據之前,需要通過“三次握手”建立連接;傳輸結束后,通過“四次揮手”斷開連接。

  • 可靠傳輸:使用確認機制、重傳機制和滑動窗口機制等確保數據無差錯、不丟失、不重復且按序到達。

  • 全雙工通信:允許通信雙方在同一時刻互相發送和接收數據。

UDP(用戶數據報協議)

UDP 是一種無連接的傳輸層協議,它的特點如下:

  • 無連接:發送數據前無需建立連接,直接將數據報發送到目標地址。

  • 不可靠傳輸:不保證數據的可靠到達,可能會出現數據丟失、重復或亂序的情況。

  • 開銷小:UDP 首部只有 8 個字節,相較于 TCP 20 字節的首部,開銷更小,傳輸效率更高。

三次握手和四次揮手

三次握手(建立 TCP 連接)

  1. 客戶端向服務器發送 SYN 包:客戶端選擇一個初始序列號?seq = x,向服務器發送一個 SYN 包,請求建立連接。

  2. 服務器響應 SYN + ACK 包:服務器收到 SYN 包后,選擇自己的初始序列號?seq = y,并將客戶端的序列號加 1(ack = x + 1),然后發送一個 SYN + ACK 包給客戶端。

  3. 客戶端發送 ACK 包:客戶端收到 SYN + ACK 包后,將服務器的序列號加 1(ack = y + 1),并發送一個 ACK 包給服務器,此時連接建立成功。

  4. 如圖:

四次揮手(關閉 TCP 連接)

  1. 客戶端發送 FIN 包:客戶端完成數據傳輸后,向服務器發送一個 FIN 包,表示請求關閉連接。

  2. 服務器發送 ACK 包:服務器收到 FIN 包后,發送一個 ACK 包給客戶端,表示同意關閉客戶端到服務器的連接。

  3. 服務器發送 FIN 包:服務器完成數據傳輸后,向客戶端發送一個 FIN 包,表示請求關閉服務器到客戶端的連接。

  4. 客戶端發送 ACK 包:客戶端收到 FIN 包后,發送一個 ACK 包給服務器,表示同意關閉服務器到客戶端的連接,此時連接關閉。

  5. 如圖:

C 語言代碼實例

TCP 服務器端代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 8888
#define BUFFER_SIZE 1024int main() {int server_socket, client_socket;struct sockaddr_in server_addr, client_addr;socklen_t client_addr_len = sizeof(client_addr);char buffer[BUFFER_SIZE];// 創建套接字server_socket = socket(AF_INET, SOCK_STREAM, 0);if (server_socket == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}// 初始化服務器地址結構memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(PORT);// 綁定套接字到指定地址和端口if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("bind failed");close(server_socket);exit(EXIT_FAILURE);}// 監聽連接if (listen(server_socket, 5) == -1) {perror("listen failed");close(server_socket);exit(EXIT_FAILURE);}printf("Server listening on port %d...\n", PORT);// 接受客戶端連接client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_addr_len);if (client_socket == -1) {perror("accept failed");close(server_socket);exit(EXIT_FAILURE);}printf("Client connected.\n");// 接收和發送數據while (1) {memset(buffer, 0, BUFFER_SIZE);ssize_t recv_len = recv(client_socket, buffer, BUFFER_SIZE - 1, 0);if (recv_len <= 0) {break;}printf("Received from client: %s\n", buffer);// 回顯數據給客戶端send(client_socket, buffer, recv_len, 0);}// 關閉套接字close(client_socket);close(server_socket);return 0;
}

TCP 客戶端代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define SERVER_IP "127.0.0.1"
#define PORT 8888
#define BUFFER_SIZE 1024int main() {int client_socket;struct sockaddr_in server_addr;char buffer[BUFFER_SIZE];// 創建套接字client_socket = socket(AF_INET, SOCK_STREAM, 0);if (client_socket == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}// 初始化服務器地址結構memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);server_addr.sin_port = htons(PORT);// 連接到服務器if (connect(client_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("connect failed");close(client_socket);exit(EXIT_FAILURE);}printf("Connected to server.\n");// 發送和接收數據while (1) {memset(buffer, 0, BUFFER_SIZE);printf("Enter message to send (or 'quit' to exit): ");fgets(buffer, BUFFER_SIZE - 1, stdin);if (strcmp(buffer, "quit\n") == 0) {break;}// 發送數據到服務器send(client_socket, buffer, strlen(buffer), 0);// 接收服務器的響應memset(buffer, 0, BUFFER_SIZE);ssize_t recv_len = recv(client_socket, buffer, BUFFER_SIZE - 1, 0);if (recv_len > 0) {printf("Received from server: %s", buffer);}}// 關閉套接字close(client_socket);return 0;
}

UDP 服務器端代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define PORT 9999
#define BUFFER_SIZE 1024int main() {int server_socket;struct sockaddr_in server_addr, client_addr;socklen_t client_addr_len = sizeof(client_addr);char buffer[BUFFER_SIZE];// 創建套接字server_socket = socket(AF_INET, SOCK_DGRAM, 0);if (server_socket == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}// 初始化服務器地址結構memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(PORT);// 綁定套接字到指定地址和端口if (bind(server_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {perror("bind failed");close(server_socket);exit(EXIT_FAILURE);}printf("UDP Server listening on port %d...\n", PORT);// 接收和發送數據while (1) {memset(buffer, 0, BUFFER_SIZE);ssize_t recv_len = recvfrom(server_socket, buffer, BUFFER_SIZE - 1, 0, (struct sockaddr *)&client_addr, &client_addr_len);if (recv_len > 0) {printf("Received from client: %s\n", buffer);// 回顯數據給客戶端sendto(server_socket, buffer, recv_len, 0, (struct sockaddr *)&client_addr, client_addr_len);}}// 關閉套接字close(server_socket);return 0;
}

UDP 客戶端代碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>#define SERVER_IP "127.0.0.1"
#define PORT 9999
#define BUFFER_SIZE 1024int main() {int client_socket;struct sockaddr_in server_addr;socklen_t server_addr_len = sizeof(server_addr);char buffer[BUFFER_SIZE];// 創建套接字client_socket = socket(AF_INET, SOCK_DGRAM, 0);if (client_socket == -1) {perror("socket creation failed");exit(EXIT_FAILURE);}// 初始化服務器地址結構memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);server_addr.sin_port = htons(PORT);// 發送和接收數據while (1) {memset(buffer, 0, BUFFER_SIZE);printf("Enter message to send (or 'quit' to exit): ");fgets(buffer, BUFFER_SIZE - 1, stdin);if (strcmp(buffer, "quit\n") == 0) {break;}// 發送數據到服務器sendto(client_socket, buffer, strlen(buffer), 0, (struct sockaddr *)&server_addr, server_addr_len);// 接收服務器的響應memset(buffer, 0, BUFFER_SIZE);ssize_t recv_len = recvfrom(client_socket, buffer, BUFFER_SIZE - 1, 0, NULL, NULL);if (recv_len > 0) {printf("Received from server: %s", buffer);}}// 關閉套接字close(client_socket);return 0;
}

代碼解釋

TCP 代碼

  • 服務器端

    1. 創建 TCP 套接字。

    2. 綁定到指定的地址和端口。

    3. 監聽客戶端連接請求。

    4. 接受客戶端連接。

    5. 接收客戶端發送的數據,并將數據回顯給客戶端。

    6. 關閉連接。

  • 客戶端:

    1. 創建 TCP 套接字。

    2. 連接到服務器。

    3. 發送數據給服務器。

    4. 接收服務器的響應。

    5. 關閉連接。

UDP 代碼

  • 服務器端

    1. 創建 UDP 套接字。

    2. 綁定到指定的地址和端口。

    3. 接收客戶端發送的數據,并將數據回顯給客戶端。

  • 客戶端:

    1. 創建 UDP 套接字。

    2. 發送數據到服務器。

    3. 接收服務器的響應。

    4. 關閉套接字。

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

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

相關文章

MP3、WAV、RM、PNG格式

MP3、WAV、RM、PNG格式 MP3 是一種音頻壓縮格式,采用了 MPEG-1 Audio Layer 3 或 MPEG-2 Audio Layer 3 編碼標準.MP3 格式能夠以較小的文件大小存儲高質量的音頻,可在多種設備如手機、MP3 播放器、電腦上播放,是目前應用最廣泛的音頻格式之一. MPEG-1 是MPEG(Moving Pictu…

力扣hot100:滑動窗口——找到字符串中所有字母異位詞

題目鏈接&#xff1a;找到字符串中所有字母異位詞 考慮用滑動窗口&#xff0c;窗口大小固定為字符串p的長度&#xff0c;用一個for循環控制子串的結束位置。 怎么判斷是字母異位詞&#xff1f; 1、排序&#xff1a;字符串中所有符合條件的字母異位詞與目標串p在經過排序后是…

人工智能通識速覽一(神經網絡)(編輯中)

上篇&#xff1a;人工智能通識速覽一&#xff08;機器學習&#xff09; 人工智能通識速覽一&#xff08;機器學習&#xff09;&#xff08;編輯中&#xff09;-CSDN博客https://blog.csdn.net/siper12138/article/details/146512068?sharetypeblogdetail&sharerId1465120…

【數據標準】數據標準化框架體系-基礎類數據標準

導讀&#xff1a;數據標準化的四大基礎類標準&#xff08;業務術語、業務規則、命名規范、代碼標準&#xff09;是企業數據治理的核心支柱。主要作用體現在?消除業務與技術間的語義鴻溝?&#xff08;通過統一術語與命名規范&#xff09;&#xff0c;?保障數據全生命周期的質…

可發1區的超級創新思路(python\matlab實現):MPTS+Lconv+注意力集成機制的Transformer時間序列模型

首先聲明,該模型為原創!原創!原創!且該思路還未有成果發表,感興趣的小伙伴可以借鑒! 應用場景 該模型主要用于時間序列數據預測問題,包含功率預測、電池壽命預測、電機故障檢測等等。 一、模型整體架構(本文以光伏功率預測為例) 本模型由多尺度特征提取模塊(MPTS)…

深入解析C#中的解釋器模式:原理與應用

解釋器模式&#xff08;Interpreter Pattern&#xff09;是一種行為型設計模式&#xff0c;旨在為特定的語言提供解釋和執行的能力。該模式將語言的文法規則封裝在類中&#xff0c;使得能夠靈活、動態地對這些規則進行解釋。在實際開發中&#xff0c;尤其是處理一些定制的表達式…

LeetCode知識點整理

1、Scanner 輸入&#xff1a; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);// 讀取整數int num scanner.nextInt();// 讀取一行字符串String line scanner.nextLine();scanner.close();…

紅寶書第二十一講:詳解JavaScript的模塊化(CommonJS與ES Modules)

紅寶書第二十一講&#xff1a;詳解JavaScript的模塊化&#xff08;CommonJS與ES Modules&#xff09; 資料取自《JavaScript高級程序設計&#xff08;第5版&#xff09;》。 查看總目錄&#xff1a;紅寶書學習大綱 一、模塊化的意義&#xff1a;分而治之 模塊化解決代碼依賴混…

Android Product Flavors 深度解析與最佳實踐:構建多版本應用的全方位指南

1. 高效配置模板 1.1 現代化多維度配置 (Kotlin DSL) android {flavorDimensions listOf("version", "market", "environment")productFlavors {register("free") {dimension "version"applicationIdSuffix ".free…

QListView開發入門

1. QListView 基礎介紹 QListView 是 Qt 框架中用于顯示項目列表的控件&#xff0c;屬于模型/視圖架構的一部分。它提供了一種靈活的方式來顯示和操作項目列表。 主要特點&#xff1a; 基于模型/視圖架構 支持多種視圖模式&#xff08;列表、圖標&#xff09; 內置選擇、編…

Cookie可以存哪些指?

Cookie是一種小型文本文件&#xff0c;通常由服務器生成并發送到用戶瀏覽器中保存。它可以用于存儲一些簡單但非常有用的信息&#xff0c;以便于后續請求時自動附帶回服務器使用。下面是Cookie能夠存儲的一些典型內容類別及用途說明&#xff1a; 會話標識符(Session ID) 這是最…

非手性分子發光有妙招:借液晶之力,實現高不對稱圓偏振發光

*本文只做閱讀筆記分享* 一、圓偏振發光研究背景與挑戰 圓偏振發光&#xff08;CPL&#xff09;材料在3D顯示、光電器件等領域大有用處&#xff0c;衡量它的一個重要指標是不對稱發光因子&#xff08;glum&#xff09;。早期CPL材料的glum值低&#xff0c;限制了實際應用。為…

CSS中的em,rem,vm,vh詳解

一&#xff1a;em 和 rem 是兩種相對單位&#xff0c;它們常用于 CSS 中來設置尺寸、字體大小、間距等&#xff0c;主要用于更靈活和響應式的布局設計。它們與像素&#xff08;px&#xff09;不同&#xff0c;不是固定的&#xff0c;而是相對于其他元素的尺寸來計算的。 1. em …

《非暴力溝通》第十二章 “重獲生活的熱情” 總結

《非暴力溝通》第十二章 “重獲生活的熱情” 的核心總結&#xff1a; 本章將非暴力溝通的核心理念延伸至生命意義的探索&#xff0c;提出通過覺察與滿足內心深處的需要&#xff0c;打破“義務性生存”的桎梏&#xff0c;讓生活回歸由衷的喜悅與創造。作者強調&#xff0c;當行動…

MySQL數據庫精研之旅第五期:CRUD的趣味探索(上)

專欄&#xff1a;MySQL數據庫成長記 個人主頁&#xff1a;手握風云 目錄 一、CRUD簡介 二、Create新增 2.1. 語法 2.2. 示例 三、Retrieve檢索 3.1. 語法 3.2. 示例 一、CRUD簡介 CURD是對數據庫中的記錄進行基本的增刪改查操作&#xff1a;Create(創建)、Retrieve(檢索…

【銀河麒麟系統常識】需求:安裝.NET SDK

前提 網絡狀態正常(非離線安裝)&#xff1b; 終端命令如下所示 根據不同系統的版本&#xff0c;自行選擇&#xff0c;逐行執行即可&#xff1b; # 基于 Ubuntu/Debian 的銀河麒麟系統 wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O…

行業智能體大爆發,分布式智能云有解

Manus的一夜爆紅&#xff0c;在全球范圍內引爆關于AI智能體的討論。 與過去一般的AI助手不同&#xff0c;智能體&#xff08;AI Agent&#xff09;并非只是被動響應&#xff0c;而是主動感知、決策并執行的應用。Gartner預測&#xff0c;到2028年&#xff0c;15%的日常工作決策…

工作記錄 2017-03-13

工作記錄 2017-03-13 序號 工作 相關人員 1 修改郵件上的問題。 開始處理操作日志部分。 測試了C#和MySql的連接。 更新RD服務器。 郝 更新的問題 1、 修改了CMS1500的打印&#xff0c;NDC的內容用了小的字體。 2、在Cliams List中可以查看Job的Notes。 3、Payment Po…

【七層分析框架:寒門貴子消亡的系統性絞殺】

七層分析框架&#xff1a;寒門貴子消亡的系統性絞殺 第一層&#xff1a;教育資源斷層 結論&#xff1a;基礎教育投入差已達量子級差距 機制&#xff1a; 北京海淀小學生均經費&#xff08;&#xffe5;47,800&#xff09; 云南山區&#xff08;&#xffe5;6,200&#xff09;…

Codeforces Round 1014 (Div. 2)(A-D)

題目鏈接&#xff1a;Dashboard - Codeforces Round 1014 (Div. 2) - Codeforces A. Kamilka and the Sheep 思路 最大值-最小值 代碼 void solve(){int n;cin>>n;vi a(n10);int mx0;int miinf;for(int i1;i<n;i){cin>>a[i];mimin(mi,a[i]);mxmax(mx,a[i])…