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,一经查实,立即删除!

相关文章

鸿蒙的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可让您构建强大的自动化…

【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网站 点击右上角圈出来…

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

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

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…

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…

使用Apache Mahout制作 推荐引擎

目录 创建工程 基本概念 关键概念 基于用户与基于项目的分析 计算相似度的方法 协同过滤 基于内容的过滤 混合方法 创建一个推荐引擎 图书评分数据集 加载数据 从文件加载数据 从数据库加载数据 内存数据库 协同过滤 基于用户的过滤 基于项目的过滤 添加自定…

javaEE-网络编程4.TCP回显服务器

目录 TCP流套接字编程 一.API介绍 ServerSocket类 构造方法&#xff1a; ​编辑方法&#xff1a; Socket类 构造方法&#xff1a; 方法&#xff1a; 二、TCP连接 三、通过TCP实现回显服务器 TCP服务端&#xff1a; 1.创建Socket对象 2.构造方法 3.start方法 TCP客…

数据库1-4讲

各种名词区分 内模式也叫物理模式、存储模式。 概念模式也叫全局模式、逻辑模式。 外模式也叫用户模式。 笛卡尔积&#xff1a;D1、D2、D3集合中任取一个的所有可能情况。 因此上述笛卡尔积的基数22312 关系模型的三个完整性&#xff1a; 实体完整性&#x…

UnityWebGl:打包成webgl后UGUI不显示文字(中文)问题

是由于unity默认使用的是Arial,导致打包成webgl时中文不显示 解决方案&#xff1a; 可在电脑C盘下&#xff0c;路径为C:\Windows\Fonts 找个中文简体的字体文件放到unity里面&#xff0c;格式必须为. ttf

朴素贝叶斯方法

一般来说训练时的一个实例有很多属性用一个<a1,a2,....,an>来表示一个数据&#xff0c;那么此时根据最大后验概率的计算公式可以得出&#xff1a; 其中&#xff0c; H 是目标值集合。 估计每个 P&#xff08;hi&#xff09;很容易&#xff0c; 只要计算每个目标值 hi出现…