Linux应用软件编程--网络通信(传输层:udp协议,tcp协议,应用层:http协议)

网络通信:不同主机,进程间通信,分为广域网和局域网

OSI  七层模型:是一种理论模型

应用层:通信传输的数据内容   http、FTP、TFTP、MQTT

表述层:数据加密,解密操作,压缩,解压缩

会话层:建立数据传输通道

传输层:数据传输方式   UDP  TCP

网络层:实现数据路由     路由器

数据链路层:封装成帧,点对点通信(局域网内通信),差错检测     交换机

物理层:定义物理设备标准,比如网线,光纤等传输介质 (比特流  0   1)

TCP/IP   4层模型:工业生产所用的模型

应用层:HTTP, HTTPS(超文本传输协议) (基于TCP)

              FTP : 文件传输协议(基于TCP)

              TFTP:简单文件传输协议(基于UDP)

              MQTT: 消息遥测传输协议(物联网)

              DNS :域名解析服务 

传输层:UDP : 用户数据报协议    面向数据包

               TCP:传输控制协议       面向数据流

网络层:IPv4、IPv6

网络接口层:ARP:地址解析协议

TCP/IP      5层模型
应用程:
传输层:
网络层:
数据链路层:
物理层:

先了解一些概念:

标记主机:

MAC:硬件地址 : 局域网通信

IP:软件地址

端口号:同一主机,区分不同的网络进程,2字节的无符号整形数据,0-65535

ARP:地址解析协议,用于IP地址和MAC地址的转换

网络层:IP协议:IPv4:32bits;IPv6:128bits;点分十进制:如192.168.1.148

linux上查看ip地址:ifconfig;windows上查看ip地址:ipconfig

网络通信模型:

B/S : Browser----》Server;1. 通用的客户端

C/S : Client-----》Server;1. 专用的客户端;2.  客户端也可保存资源

UDP:用户数据报协议

特点:1. 无连接  ;2. 面向数据包;3. 不安全不可靠(尽最大努力交付),可能存在丢包和乱序的问题;4.可实现一对一, 一对多通信 

UDP的缺点:

1. 无连接,有可能接收方未准备就绪

2. 发送速度和数据接收速度不匹配,导致缓冲区满,造成数据丢失

解决办法:

1. 控制数据发送速度。

2. 模仿tcp增加应答机制

应用场景:1. 允许数据丢失(视频画面传输,游戏,直播);2. 实时性高

下图是编程步骤:

int socket(int domain, int type, int protocol);

功能:创建一个通讯的套接字

参数:

    domain: 网络协议族

    AF_INET:   IPv4

    AF_INET6: IPv6

    type: 表示传输层协议类型:SOCK_STREAM:   tcp,OCK_DGRAM:    udp

    protocol:0 : 默认普通正常模式

返回值:成功:文件描述符;失败:-1

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

功能:向目标地址发送数据

参数:

    sockfd:通讯套接字

    buf:要发送的数据内容首地址

    len : 内容字节数

    flags : 0:默认方式发送

    dest_addr:数据接收方的地址

    addrlen:接收方的地址大小

返回值:成功:实际发送的字节数;失败:-1

struct sockaddr_in {
               sa_family_t    sin_family;          /* address family: AF_INET */
               in_port_t      sin_port;               /* port in network byte order */
               struct in_addr sin_addr;           /* internet address */
           };

           /* Internet address. */
           struct in_addr {
               uint32_t       s_addr;                /* address in network byte order */
           };

int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

功能:绑定套接字和自己的地址信息

参数:

    sockfd:套接字

    addr : 自己的地址信息

    addrlen:地址的大小

返回值:成功:0;失败:-1

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

功能:接收udp发送的数据

参数:

    sockfd:接收数据的套接字

    buf:保存接收数据的首地址

    len:期待收到的字节数

    flags:0:默认方式接收

    src_addr: 保存发送发地址信息的空间首地址

    addrlen:发送方地址信息大小的首地址

返回值:成功:返回实际收到的字节数;失败:-1

这里注意:网络字节序是大端;主机字节序是小端,学习一些转换用的函数

htons: 将主机字节序(小端)的short类型转换成网络字节序(大端)

htonl: 将主机字节序(小端)的long类型转换成网络字节序(大端)

ntohs:将网络字节序转换成主机字节序

ntohl:inet_ntoa():将二进程整形ip转换成字符串ip

           inet_addr() : 将字符串ip转换成网络字节序的二进制ip

TCP :传输控制协议

特点:

1. 有连接

2. 面向字节流(流式套接字)

3. 安全可靠的传输协议:.三次握手、四次挥手机制;应答机制....等一系列机制

4. 只能实现一对一通信

应用:要求数据安全可靠的场景下:HTTP、FTP、MQTT

三次握手:tcp为了确保通信双方都已准备就绪,在建立连接时,要进行三次握手操作。由客户端主动发起。

四次挥手:tcp为了确保断开连接时,通信双发都收发数据结束,在断开连接时,进行四次挥手,由任意一方发起。

TCP软件编程步骤:

int listen(int sockfd, int backlog);

功能:负责监听需要建立连接的客户端

参数:

    sockfd:

    backlog:允许同时监听的客户端的个数

返回值:成功:0;失败:-1

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

功能:接收完成三次握手的客户端

参数:

    sockfd:监听套接字

    addr:建立连接的客户端地址

    addrlen:客户端地址大小的指针

返回值:成功:通讯套接字;失败:-1

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

功能:接收数据

返回值:成功:实际收到字节数;失败:-1;对方断开连接:不再阻塞, 返回0

tcp粘包问题:tcp接收端接收到的数据多包发生了粘连。

为什么:

1. tcp协议面向的是字节流的协议,接收方不知到数据的大小,也不确定一次读取多少数据,从而造成粘包;

2. 接收缓冲区数据没有及时读走,导致多包数据在接收缓冲区一起被读走

如何解决:

1. 控制数据的发送速率。

2. 发送指定大小的数据
    结构体

    发 : sizeof(结构体);

    收:  sizeof(结构体);

    但是存在结构体在不同平台字节对齐不一致,指针大小不同的问题。

3. 封装数据帧,应用层根据封装的数据帧进行解析

    帧头 :    1个字节  0xAA   0x5A   0xA5   0x7E

    数据长度:1个字节/2个字节    有效数据的字节数(不包含帧头和帧尾)

    校验:8bits和校验:数据累加求和取低8bits

               16bits和校验:数据累加求和取低16bits

               CRC校验:

    帧尾: 1个字节     0xBB  0x55  0xA5

TCP相关机制:

关于安全可靠的机制:

  1. 三次握手和四次挥手,在前面已经说过了,可以翻过去看看

  2. 应答机制 : tcp在发送数据时,会给数据的每个字节进行编号,每个数据包的第一个字节的编号        即为序列号,每个数据包的最后一个字节的编号加一即为确认序列号,客户端或服务端每发送        一次数据,就会发送一次序列号,然后对方会发送确认序列号应答。

3. 超时重传机制:如果在一定时间对方没有应答,就重新发送没有被应答的数据包

4. 流量控制机制:

    tcp的流量控制主要通过以下两个机制实现:

    滑动窗口:TCP使用滑动窗口来进行流量控制。接收方在TCP报文段的首部中通过"接收窗口"win字段告知自己的可接收数据量,即剩余的缓冲区大小。发送方根据接收方提供的窗口大小来决定发送数据的量,保证接收方能及时处理和接收数据。

发送方维护一个发送窗口,表示可以连续发送的数据量;

接收方维护一个接收窗口,表示还有多少空间可以接收数据;

发送方根据接收方提供的接收窗口大小来动态调整发送窗口的大小,以控制发送的数据量。

    基于确认的流量控制:能确保发送方不会超出接收方的处理能力。接收方通过发送确认(ACK)报文来告知发送方已成功接收数据的字节数。发送方根据接收到的确认信息来调整发送数据的速率,避免发送过多的数据。

发送方发送数据后,等待接收方发送确认报文。

接收方收到数据后,发送确认报文,确认已成功接收数据。

发送方根据接收到的确认信息来调整发送窗口和发送速率,以控制数据的发送。


关于提高效率的机制:

1. 延迟应答:tcp的每一次应答并不是发送一次应答一次,而是可以延迟一段时间后应答,在此时间中可以进行接收数据的操作。

2. 滑动窗口机制:可以看前文

3. 捎带应答:应用层传输数据时,可以捎带把应答报文传输给对方


标志位:

1. URG: 紧急指针标志, 为1时表示紧急指针有效, 该报文应该优先传送。

2. ACK: 确认应答标志

3. PSH:  表示发送数据,提示接收端从TCP接收缓冲区中读走数据,为接收后续数据腾出空间

4. RST: 重置连接标志

5. SYN: 表示请求建立一个连接

6. FIN: finish标志, 表示释放连接

在了解http协议之前,先了解这几个概念

1. 万维网服务器如何标记数据资源       url:统一资源定位符:标记万维网文档

在此端口号可以省略

2. 万维网客户端和万维网服务器之间如何通信。  http

3. 万维网客户端如何展示数据: html

应用层:http协议:超文本传输协议;默认端口号:80 (备用端口8080),面向文本,http基于传输层的tcp实现(超文本:集文字,图像,音频,链接等于一体的文本)

通信过程:

1.建立tcp连接

2. 客户端给服务器发送http请求报文

3. 服务端发送http响应报文给客户端

4. 断开tcp连接

先在此了解一下请求报文和响应报文:


 

HTTP报文格式:

请求报文:请求行、消息报头、请求正文

响应报文:状态行、消息报头、响应正文

请求方式:

GET     请求获取Request-URI所标识的资源

POST    在Request-URI所标识的资源后附加新的数据

HEAD    请求获取由Request-URI所标识的资源的响应消息报头

PUT     请求服务器存储一个资源,并用Request-URI作为其标识

DELETE  请求服务器删除Request-URI所标识的资源

TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断

OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

CONNECT 用于代理服务器

状态码:

1xx:指示信息--表示请求已接收,继续处理

2xx:成功--表示请求已被成功接收、理解、接受

3xx:重定向--要完成请求必须进行更进一步的操作

4xx:客户端错误--请求有语法错误或请求无法实现

5xx:服务器端错误--服务器未能实现合法的请求

200 OK      //客户端请求成功

400 Bad Request  //客户端请求有语法错误,不能被服务器所理解

401 Unauthorized //请求未经授权 

403 Forbidden  //服务器收到请求,但是拒绝提供服务

404 Not Found  //请求资源不存在,eg:输入了错误的URL

500 Internal Server Error //服务器发生不可预期的错误

503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66359.shtml

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

相关文章

Android中的LoadedApk:使用指南与核心代码解析

Android中的LoadedApk:使用指南与核心代码解析 引言 在Android系统中,LoadedApk是一个非常重要的内部类,它代表了已加载的APK文件。LoadedApk类在Android应用程序的运行过程中扮演着关键角色,负责管理应用程序的资源、类加载器、…

鸿蒙的APP真机调试以及发布

目录: 1、创建好鸿蒙项目2、创建AGC项目3、实现自动签名3.1、手动方式创建签名文件和密码 4、运行项目5、无线真机调试 1、创建好鸿蒙项目 2、创建AGC项目 (1)在File->Project Structure->Project->Signing Configs中进行登录。(未…

n8n - AI自动化工作流

文章目录 一、关于 n8n关键能力n8n 是什么意思 二、快速上手 一、关于 n8n n8n是一个具有原生AI功能的工作流自动化平台,它为技术团队提供了代码的灵活性和无代码的速度。凭借400多种集成、原生人工智能功能和公平代码许可证,n8n可让您构建强大的自动化…

redis cluster 主节点挂了,如何保证消息不丢失

redis cluster 主节点挂了,从节点切换成主节点时,如何保证消息不丢失 在 Redis Cluster 中,主节点挂掉后,能够确保消息不丢失的关键在于以下几个机制: 1. Redis Cluster 的数据复制机制 Redis Cluster 使用了主从复…

【Shell脚本】Docker构建Java项目,并自动停止原镜像容器,发布新版本

本文简述 经常使用docker部署SpringBoot 项目,因为自己的服务器小且项目简单,因此没有使用自动化部署。每次将jar包传到服务器后,需要手动构建,然后停止原有容器,并使用新的镜像启动,介于AI时代越来越懒的…

jmeter 中 BeanShell 预处理程序、JSR223后置处理程序使用示例

1. 各个组件如何新建的? 2. "http请求" 组件内容样例: "消息体数据" 源码: {"task_tag": "face_detect","image_type": "base64","extra_args": [{"model"…

K8s高可用集群之Kubernetes集群管理平台、命令补全工具、资源监控工具部署及常用命令

K8s高可用集群之Kubernetes管理平台、补全命令工具、资源监控工具部署及常用命令 1.Kuboard可视化管理平台2.kubectl命令tab补全工具3.MetricsServer资源监控工具4.Kubernetes常用命令 1.Kuboard可视化管理平台 可以选择安装k8s官网的管理平台;我这里是安装的其他开…

Centos源码安装MariaDB 基于GTID主从部署(一遍过)

MariaDB安装 安装依赖 yum install cmake ncurses ncurses-devel bison 下载源码 // 下载源码 wget https://downloads.mariadb.org/interstitial/mariadb-10.6.20/source/mariadb-10.6.20.tar.gz // 解压源码 tar xzvf mariadb-10.5.9.tar.gz 编译安装 cmake -DCMAKE_INSTA…

github gitbook写书

github创建新的仓库 在仓库中添加目录 ‘SUMMARY.md # Summary * [简介](README.md)gitbook 新建一个site https://www.gitbook.com/ 注册账号 取名字 一路 next,注意选免费版 最后 gitbook同步到github 你在主页可以看到 刚刚的test网站 点击右上角圈出来…

Rust 泛型、特征与生命周期详解

Rust 泛型、特征与生命周期详解 泛型编程 泛型函数 // 泛型函数&#xff1a;找出最大值 fn largest<T: PartialOrd>(list: &[T]) -> &T {let mut largest &list[0];for item in list {if item > largest {largest item;}}largest }fn main() {let…

colnames看似简单,却能优化数据处理流程

引言 在数据处理和分析中&#xff0c;变量名称是至关重要的&#xff0c;它们决定了数据的可读性和操作的简便性。在R语言中&#xff0c;colnames 函数以其简单的语法设计&#xff0c;提供了高效管理数据框列名的能力&#xff0c;尤其是在复杂的爬虫任务中显得尤为重要。本篇文…

2025新春烟花代码(一)HTML5夜景放烟花绽放动画效果

标题预览效果 标题HTML代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34&…

软件项目体系建设文档,项目开发实施运维,审计,安全体系建设,验收交付,售前资料(word原件)

软件系统实施标准化流程设计至关重要&#xff0c;因为它能确保开发、测试、部署及维护等各阶段高效有序进行。标准化流程能减少人为错误&#xff0c;提升代码质量和系统稳定性。同时&#xff0c;它促进了团队成员间的沟通与协作&#xff0c;确保项目按时交付。此外&#xff0c;…

通过shell脚本定时采集数据到HDFS

第一步&#xff1a;创建shell脚本&#xff08;在虚拟机1下的/export/data目录下执行vi uploadHDFS.sh命令&#xff0c;编辑shell脚本文件&#xff0c;具体代码如下&#xff1a;&#xff09; 第二步&#xff1a;执行shell脚本&#xff08;确保Hadoop集群处于启动状态&#xff0c…

如何进一步提高Oracle lgwr的写性能?

今天在我们的一个项目中&#xff0c;客户非常关系Oracle的log file sync、db file parallel write性能。 由于我们的分布式存储zdatax已经是nvme了&#xff0c;因此db file parallel write的性能足够好了&#xff0c;平均等待时间也就0.13ms。 然后log file sync 确高达0.6ms…

HTML5 进度条(Progress Bar)详解

HTML5 进度条&#xff08;Progress Bar&#xff09;详解 进度条是用于显示任务完成进度的控件&#xff0c;常用于加载、上传或下载等操作。HTML5提供了原生的<progress>元素&#xff0c;使得创建进度条变得简单和直观。 1. 基本用法 <progress>元素的基本语法如…

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World 2025/1/3 14:06 百度&#xff1a;android studio helloworld android studio hello world kotlin helloword kotlin 串口 no run configurations added android studio no run configurations added 1、…

一机多实例:如何在一台机器上高效运行多个 MySQL 服务

前言 在实际开发和测试环境中&#xff0c;我们经常需要运行多个 MySQL 实例来模拟不同的数据库环境。例如&#xff0c;在一台服务器上运行多个数据库服务以节约硬件资源&#xff0c;或者同时运行不同版本的 MySQL 进行功能兼容性测试。MySQL 本身支持通过配置多实例运行&#…

STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

前言 有需要帮忙代做51和32小车或者其他单片机项目&#xff0c;课程设计&#xff0c;报告&#xff0c;PCB原理图的小伙伴&#xff0c;可以在文章最下方加我V交流咨询&#xff0c;本篇文章的小车所有功能实现的代码还有硬件清单放在资源包里&#xff0c;有需要的自行下载即可&a…

微服务篇-深入了解 Elasticsearch DSL 查询和 RestClient 查询、数据聚合(Bucket 聚合、带条件聚合、Metric 聚合)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 DSL 查询 1.1 叶子查询 1.1.1 全文检索查询 1.1.2 精确查询 1.2 复合查询 1.2.1 bool 查询 1.3 排序 1.4 分页 1.4.1 深度分页 1.5 高亮 1.5.1 实现高亮 2.0 Rest…