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.mzph.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])…