• 一、网络协议 UDP
    • UDP用户数据报协议:传输层
    • 网络编程模型
      • B/S模型:browser/server(浏览器/服务器)
        • 客户端是通用的客户端(浏览器)
        • 一般只做服务器开发
        • 客户端要加载的数据均来自服务器
      • C/S模型:client/server(客户端/服务端)
        • 客户端是一个专用的客户端
        • 服务器和客户端都需要开发
        • 客户端可保存资源,本地加载,无需所有数据都请求服务器
    • UDP编程流程
      • 套接字:文件描述符(网络通信时,应用层可操作的端口)
      • 发送端
        • socket:int socket(int domain, int type, int protocol
          • 功能:创建通信的套接字
          • 参数:
            • domain:网络层使用什么协议族
              • AF_INET: IPv4
              • AF_INET6:IPv6
            • type:规定传输层的协议
              • SOCK_DGRAM:UDP协议
              • SOCKSTREAM:TCP协议
              • SOCKRAW:原始套接字
            • protocol:0 按照默认协议方式创建
          • 返回值:成功:套接字;失败:-1
        • sendto: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:接收方的地址信息(IP+端口号);addrlen:接收方地址的大小
          • man 7 ip
          • 返回值:成功:实际发送的字节数;失败:-1
        • 网络字节序:大段
        • 主机字节序:小段
        • uint3 2_t htonl(uint32_t hostlong);主机转网络
        • uint1 6_t htons(uint16_t hostshort);主机转网络
        • uint3 2_t ntohl(uint32_t hostlong);网络转主机
        • uint1 6_t ntohs(uint16_t hostshort);网络转主机
        • in_addr_t inet _addr(const char *cp);
          • 功能:将字符串IP地址转换成二进制IP地址形式
        • char *inet _ntoa(struct in_addr in);
          • 功能:将二进制ip转换成字符串
      • 接收端
        • bind:int bind(int sockfd, const struct sockaddr *addr.socklen_t addrlen);
          • 功能:绑定自己的IP地址和端口号
          • 参数:sockfd:套接字;addr:需要绑定的地址;adlrlen:地址大小
          • 返回值:成功:0;失败:-1
        • recvfrom:ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen)
          • 功能:从套接字上接收数据
          • 参数:sockfd:套接字;buf:存放接收数据的内存首地址;len:希望接收的字节数;flags:0:按照默认方式接收(阻塞);src_addr:发送方的地址信息;addrlen:发送发地址的指针
          • 返回值:成功:实际接收到的字节数;失败:-1
    • UDP特点
      • 面向数据包
      • 无需建立连接
      • 尽最大努力交付,不安全、不可靠(数据丢包、乱序)
      • 可实现一对一、一对多的传输
      • 机制简单,资源开销小,数据传输实时性高(VNC、直播)
    • 如何避免UDP丢包
      • 发送方以较慢的速度发送数据,让接收端有足够的时间处理数据
      • 模仿TCP的机制:应答机制
    • 抓包工具 wireshark
      • 网络抓包:抓取通过设备网卡的网络数据,从而调试和分析网络程序
      • 使用:
        • sudo wireshark启动抓包工具
        • 选取要抓取的网卡---》any
        • 选择一个过滤条件
        • 开始抓取
        • 进行一次网络通信
    • UDP报文头部 共8字节

  • 源端口号:发送方网络进程端口号
  • 目标端口号:接收方网络进程端口号
  • 长度:UDP发送的报文的整体长度(UDP头部
  • 二、网络协议 TCP
    • TCP特点
      • 面向数据流
      • 有链接(通信之前必须建立链接)
      • 安全可靠的传输机制
      • 机制复杂、网络资源开销大
      • 本质只能实现一对一的通信(使用TCP并发方式可实现一对多通信)
    • TCP三次握手和四次挥手机制
      • 三次握手
        • TCP建立连接时,需要进行三次握手,为了确保收发双方通信之前都已准备就绪
        • SYN:请求建立链接标志位
        • ACK:相应报文标志位
      • 四次挥手
        • TCP断开连接时,需要进行四次挥手,确保断开连接前双方都已通信结束
        • FIN:请求断开连接标志位
        • ACK:相应报文标志位
        • 服务端在发送ACK、FIN之间依然可以传输数据
    • TCP的编程流程
      • 发送端
        • connect :int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen)
          • 功能:请求与服务端建立连接
          • 参数:sockfd:套接字;addr:要连接的服务端的地址信息;addrleqn:服务端地址大小
          • 返回值:成功:0;失败:-1
        • send :ssize_t send(int sockfd, const void *buf, size_t len, int flags)
          • 功能:发送网络数据
          • 参数:sockfd:网络套接字;buf:要发送的数据首地址;len:发送的字节数;flags:0:按照默认方式发送
          • 返回值:成功:实际发送的字节数;失败:-1
      • 接收端
        • listen :int listen(int sockfd, int backlog);
          • 功能:监听建立三次握手的客户端
          • 参数:sockfd:监听套接字;backlog:最大允许监听的客户端个数
          • 返回值:成功:0;失败:-1
        • accept :int accept(int socket, struct sockaddr *restrict address,socklen_t *restrict address_len);
          • 功能:接收建立三次握手的客户端,并产生一个通讯套接字
          • 参数:socket:监听套接字;address:客户端的地址信息;addresslen:客户端地址长的指针
          • 返回值:成功:通讯套接字;失败:-1
        • recv :ssize _t recv(int sockfd, void *buf, size_t len, int flags);
          • 功能:从网络套接字上接收数据
          • 参数:sockfd:通讯套接字;buf:存放接收数据的首地址;len:期望接收到的字节数;flag:0:默认方式接收(阻塞)
          • 返回值:成功:实际接收到的字节数;失败:-1;对方断开连接时:0
    • TCP粘包问题
      • 发送方应用层发送的多包数据,将来在接收方可能一次读到,多包数据产生了粘连
      • 原因:
        • 发送方速度较快,TCP底层可能对多包数据进行重新组帧
        • 接收方数据处理速度较慢,导致多包数据在接收缓冲区缓存,应用层读时,一次将多包数据读出
      • 解决方法
        • 调整发送速率
        • 发送指定大小,接收方接收指定大小(结构体)
          • 注意:跨平台之间的数据传输时,注意结构体对齐问题
        • 应用层为发送的数据增加分隔符,利用分隔符解析
        • 封装自定义数据帧格式进行发送(协议)

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

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

相关文章

STM32 TIM_SelectInputTrigger()函数

一、函数功能与定位​TIM_SelectInputTrigger()是STM32定时器外设的关键配置函数,用于设置从模式定时器的触发源(Trigger Source)​。其核心作用是将定时器的内部事件或外部信号映射为触发信号(TRGI),进而控…

Lecture 6 Kernels, Triton 课程笔记

本讲座:基准测试/分析 编写内核 总结 编程模型(PyTorch、Triton、PTX)与硬件之间的差距 > 性能奥秘 理解扩展的基准测试 用于理解 PyTorch 函数内部结构的分析(用内核触底) 看 PTX 汇编,了解 CUDA 内核…

Spring Boot 整合网易163邮箱发送邮件实现找回密码功能

在开发用户系统时,发送邮件是一项常见需求,例如用户忘记密码时,通过邮箱发送验证码来验证身份并重置密码。本文将结合 Spring Boot 和 163 邮箱,演示如何实现邮件发送功能。 一、前提条件 普通用户的 163 邮箱可以在 Spring Boot…

如何在mac玩windows游戏?3个工具推荐,不用换电脑!

Mac电脑虽然很流畅,但它也存在局限性,其中一点游戏玩家应该深有体会,那就是无法直接玩Windows专属游戏,只能对着琳琅满目的游戏望眼欲穿。别急,我有办法让你在mac玩windows游戏,下面就来分享我的经验。一、…

自回归(Auto-Regressive, AR),自回归图像生成过程

根据论文中“**T2I Generation via Next-Token Prediction**”一节,自回归(Auto-Regressive, AR)文本到图像(T2I)模型的图像生成过程可分为三个主要步骤,其原理和损失函数如下:---### &#x1f…

在mysql中,modify ,change ,rename to的作用是什么

在 MySQL 中,MODIFY、CHANGE 和 RENAME TO 都是 ALTER TABLE 语句的一部分,用于修改表的结构,但它们的作用和使用场景有所不同。1. MODIFY作用:用于修改表中现有列的定义,但不能修改列名。你可以使用 MODIFY 来更改列的…

【JVM】JVM的内存结构是怎样的?

JVM的内存结构是Java程序运行时内存管理的核心,不同区域有明确的职责。 一、整体划分 包括两大部分,分为线程私有区域(随线程创建/销毁,无需垃圾回收)和线程共享区域(所有线程共用,需要垃圾回收管理)。 线程私有区域:程…

青少年软件编程(python五级)等级考试试卷-客观题(2023年12月)

更多内容和历年真题请查看网站:【试卷中心 -----> 电子学会 ----> 机器人技术 ----> 五级】 网站链接 青少年软件编程历年真题模拟题实时更新 青少年软件编程(python五级)等级考试试卷-客观题(2023年12月&#xff0…

网络编程-创建TCP协议服务器

int socket(int domain, int type, int protocol);头文件&#xff1a; #include <sys/socket.h>#include <netinet/in.h> #include <netinet/ip.h>int skt_tcpfd;int domain;skt_tcpfdsocket(AF_INET,SOCK_STREAM,0);int bind(int sockfd, const struct soc…

ruoyi框架角色分配用户

分配用户&#xff0c;不要将当前正在登录的用户绑定。否则&#xff0c;在加入当前用户之后&#xff0c;取消或者添加其他用户时会被注销当前登录。

Java Stream常见函数与应用案例

1. Java Stream核心概念与基础函数 1.1 Stream API的设计哲学与核心特性 Java Stream API的设计哲学源于函数式编程范式&#xff0c;其核心特性体现在数据处理模式的转变上。与传统集合操作相比&#xff0c;Stream API采用声明式编程风格&#xff0c;支持链式调用&#xff0c;显…

【Canvas与徽章】中国制造金色玻璃光徽章

【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>中国制造金色玻璃光徽章 Draft1</title><style type"tex…

终结系统裸奔:Debian老旧版本安全加固终极指南

核心警示:Debian 8与10已结束官方支持,暴露于0day漏洞风险中。本文提供的加固方案仅为迁移前的临时防护措施,非长久之计。 一、老旧Debian系统的致命隐患 支持状态: Debian 8(Jessie):2018年终止安全更新 Debian 10(Buster):2024年7月结束主流支持 风险清单: 无补…

Ape.Volo项目源码学习(1:源码下载及运行)

Ape.Volo项目是基于 .Net 8 、SqlSugar、Vue2.x、RBAC、前后端分离开箱则用的中后台快速开发框架&#xff0c;其使用Async/Await异步编程&#xff0c;支持CodeFirst模式、RabbitMQ/RedisMQ消息队列、CORS 跨域配置、数据库操作&#xff08;读写分离、多库、分表&#xff09;、支…

2-4.Python 编码基础 - 流程控制(判断语句、循环语句、break 语句与 continue 语句)

一、判断语句 1、if 语句 &#xff08;1&#xff09;基本格式 if 【判断条件】:【满足条件时执行的代码块】&#xff08;2&#xff09;演示 number 10if number > 0:print("这个数是正数")# 输出结果这个数是正数2、if - else 语句 &#xff08;1&#xff09;基本…

大模型自我进化框架SE-Agent:开启软件工程自动化新时代

一、引言&#xff1a;当大模型学会“自我进化” 在软件开发领域&#xff0c;传统模式下人类工程师面对复杂任务时&#xff0c;往往需要经历反复调试、多轮迭代才能产出高质量代码。而随着大语言模型&#xff08;LLM&#xff09;的兴起&#xff0c;一种名为**SE-Agent&#xff…

UE官方文档学习 C++ TAarry 查询(四)多种查询方式

一.IndexofByKey 返回索引通过值&#xff0c;返回来查找键。二IndexOfByPredicate通过定义二元谓词&#xff0c;来判定是否有符合谓词判定的元素。符合条件True的&#xff0c;才返回Index。这里所谓Lamda,函数就是 把函数当作参数输入&#xff0c;里面的参数值传递前加个[]。这…

根据Wireshark捕获数据包时间和长度绘制电脑发射信号波形

下一期&#xff1a; 根据Wireshark捕获数据包时间和长度绘制路由器发送给电脑数据的信号波形-CSDN博客 一、Wireshark采集数据 数据格式&#xff1a; 在我的另一篇博客中详细介绍了怎么导出数据&#xff1a; Wireshark导出数据包时间和长度-CSDN博客 通过MATLAB加载数据&a…

Suno API 接入指南:快速上手与高效集成

随着 AI 技术的发展&#xff0c;音乐生成已经逐渐成为开发者和创作者探索的新方向。Suno API 提供了一套简洁的接口&#xff0c;让我们能够通过代码快速生成音乐、歌词&#xff0c;甚至旋律。本文将带你从零开始&#xff0c;完成 Suno API 的接入与调用&#xff0c;并分享一些高…

React Hooks原理深潜:从「黑魔法」到「可观测」的蜕变之旅

文章目录【技术栈深潜计划】React Hooks原理深潜&#xff1a;从「黑魔法」到「可观测」的蜕变之旅一、引言&#xff1a;为什么我们需要“深潜”Hooks&#xff1f;二、基石&#xff1a;没有JavaScript闭包&#xff0c;就没有Hooks2.1 闭包的精简回顾2.2 Hooks与闭包的关联三、核…