【Linux】探索网络编程:TCP/UDP协议解析与Socket应用实例

news2024/10/6 2:26:21

文章目录

  • 前言:
  • 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.coloradmin.cn/o/1894048.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树的链式访问 与 二叉树专题

目录 二叉树的前、中、后序遍历求二叉树第K层节点的个数二叉树查找值为x的节点leetcode相同的树对称二叉树二叉树的前序遍历另一棵子树牛客 二叉树的遍历 二叉树的前、中、后序遍历 1.前序遍历&#xff1a;先访问根节点&#xff0c;再访问左子树&#xff0c;最后访问右子树 根…

花键参数确定的流程是怎么样的?

继续花键的话题&#xff0c;今天跟小伙伴们一同学习一下&#xff1a;渐开线花键的参数确定的一般流程及基本方法。 前面有好几篇介绍了花键的基本参数的概念&#xff0c;包括规格、模数、齿数、压力角等等。以及花键的定心方式&#xff0c;内外花键的配合方式。那么这些参数的…

抬头显示器HUD原理及特性

HUD基本原理 抬头数字显示仪(Head Up Display)&#xff0c;又叫平视显示系统&#xff0c;它的作用&#xff0c;就是把时速、导 航等重要的行车信息&#xff0c;投影到驾驶员前风挡玻璃上&#xff0c;让驾驶员尽量做到不低头、不转头 就能看行车信息。 HUD成像为离轴三反的过程&…

零一万物: Yi Model API的使用

一、获取API Key 通过官方网址注册账号并且认证: 零一万物大模型开放平台 创建API Key 二、安装及调用 安装OpenAI SDK ​ 零一万物API 接口兼容 OpenAI 的 Python SDK&#xff0c;只需要简单配置即可使用。 安装 OpenAI SDK。请确保使用的 Python 版本至少为 3.7.1&a…

ESP32CAM物联网教学06

ESP32CAM物联网教学06 拍照上传互联网 在上节课中&#xff0c;小智的物联网视频小车&#xff0c;在与家用的云台监控摄像头的PK中&#xff0c;各具优势&#xff0c;难分高下&#xff0c;这让小智下定决心&#xff0c;再次增强物联网小车的功能&#xff0c;提升小车的智能水平。…

Lumion专业3D渲染三维场景设计软件下载,Lumion强大的三维渲染软件

Lumion&#xff0c;这款软件具备令人瞩目的渲染速度&#xff0c;能够以闪电般的速度生成令人叹为观止的图像、视频和360全景图&#xff0c;让设计师们能够在短时间内将创意转化为视觉盛宴。 Lumion软件内置了一系列可定制的预先配置的HDR天空环境&#xff0c;这些天空环境不仅丰…

Spring启动时,将SpringContext设置到Util中(SpringContextUtil)

场景 在Spring应用开发中&#xff0c;为简化代码或者在静态方法中获取Spring应用的上下文&#xff0c;需要把SpringContext设置到类属性上。经过对源码的分析和实践&#xff0c;使用Spring的事件监听器监听ApplicationPreparedEvent事件是最佳的方式。 通过ApplicationPrepar…

STM32工业自动化控制系统教程

目录 引言环境准备工业自动化控制系统基础代码实现&#xff1a;实现工业自动化控制系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 控制系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业自动化与优化问题解决方案与优化收尾与总结 1. 引言 工业自动化控制系统利用…

mac 11 变编译安装nginx

mac 11 变编译安装nginx 记录一次安装过程 所需要的包 pcre: https://sourceforge.net/projects/pcre/files/pcre/OpenSSL: https://www.openssl.org/source/Nginx: https://nginx.org/en/download.html如果没有pcre 和Openssl,报错如下 把pcre和Openssl 解压到nginx 目录下…

通过9大步骤,帮助企业在数字化转型中搭建数据分析的报表体系!

引言&#xff1a;在数字化转型中&#xff0c;企业搭建数据分析的报表体系是一个系统性的过程&#xff0c;需要综合考虑业务需求、数据来源、技术平台等多个方面。此外从报表生命周期的角度来说&#xff0c;从产生、使用以及最后消亡退出体系&#xff0c;都需要通盘考虑&#xf…

新手拍短视频的些许建议

1、尽早行动&#xff0c;拒绝完美主义&#xff0c;有手机就能上车&#xff0c;一开始别花太多时间在打磨细节上。总是要准备好了后再做&#xff0c;就总比别人慢一步&#xff0c;可能永远也追不上了&#xff1b; 2、坚持发&#xff0c;度过难熬的启动期就行&#xff0c;不要走…

6个步骤实现Postman接口压力测试(建议收藏)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 这里讲是postman做接口并发测试&#xff0c;基础用法不做赘述 1、第一步接口可以通的情况下点击…

Node.js下载及安装详细教程

目录 Node.js安装详细教程 下载安装环境变量配置文件结构配置npm在安装全局模块时的路径和缓存cache的路径测试常见命令 Node.js安装详细教程 &#x1f441;官网下载地址:Download | Node.js (nodejs.org) 下载速度慢的话 可以使用网盘下载&#xff1a; https://pan.quark.…

flask项目部署总结

这个部署的时候要用虚拟环境&#xff0c;cd进项目文件夹 python3 -m venv myenv source myenv/bin/activate激活 之后就安装一些库包之类的&#xff0c;&#xff08;flask&#xff0c;requests,bs4,等等&#xff09; 最重要的是要写.flaskenv文件并且pip install 一个能运行…

新手教学系列——【Ubuntu】SSH配置详解

在使用Ubuntu进行远程管理和开发时,SSH(Secure Shell)是必不可少的工具。SSH不仅提供安全的远程登录功能,还支持安全的文件传输和端口转发。然而,有时我们可能会遇到SSH连接中断的问题。本文将详细介绍如何配置SSH以提高其稳定性,并解释关键配置项。 为什么会出现SSH连接…

去中心化 RAG 先行者,KIP Protocol 如何保护数据所有权、激活 AI 资产

AI 时代&#xff0c;人人都应实现 KnowledgeFi 的梦想或许并不遥远&#xff0c;KIP Protocol 正在生动践行这一价值理念&#xff0c;带动去中心化数字产权的创建与盈利&#xff0c;面向 CryptoAI 的蓝海市场迈出创新探索的技术步伐&#xff0c;朝着 Web3 行业打造去中心化 AI 的…

Matlab/simulink三段式距离/低阻抗保护

距离1段仿真波形如下所示 距离2段仿真波形如下所示 距离3段仿真波形如下所示

STM32智能农业监控系统教程

目录 引言环境准备智能农业监控系统基础代码实现&#xff1a;实现智能农业监控系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 控制系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;农业监控与优化问题解决方案与优化收尾与总结 1. 引言 智能农业监控系统利用STM32嵌…

vienna整流器过零畸变原因分析

Vienna整流器是一种常见的三电平功率因数校正&#xff08;PFC&#xff09;整流器&#xff0c;广泛应用于电源和电能质量控制领域。由于其高效率、高功率密度和低谐波失真的特点&#xff0c;Vienna整流器在工业和电力电子应用中具有重要地位。然而&#xff0c;在实际应用中&…

亮相2024世界人工智能大会,扫描全能王AIGC“黑科技”助力敦煌遗书数字化修复

7月4日&#xff0c;2024年世界人工智能大会&#xff08;简称“大会”&#xff09;在上海举行。这次这场科技与创新的盛会上&#xff0c;一张古朴、典雅的卷轴吸引了众人的目光。这张被修复的卷轴脱胎于敦煌遗书系列古籍&#xff0c;在被机器拍摄扫描后&#xff0c;卷轴上脏污、…