当前位置: 首页 > java >正文

嵌入式学习日记(33)TCP

UDP特点

    1. 面向数据包
2. 无需建立连接
3. 尽最大努力交付,不安全、不可靠(数据丢包、乱序)
4. 可实现一对一、一对多的传输
5. 机制简单,资源开销小,数据实时性高(VNC、直播)

如何避免UDP丢包:
1.发送方以较慢的速度发送数据,让接收方又足够的时间处理数据。
2. 模仿TCP的机制:应答机制

wireshark

网络抓包:抓取通过设备网卡的网络数据,从而调试和分析网络程序。

使用:1.sudo wireshark启动抓包工具
2. 选取要抓取的网卡---》any
3. 选择一个过滤条件
4. 开始抓取
5. 进行一次网络通信

UDP报文头部

UDP头部:总共8字节

源端口号:发送方网络进程端口号
目标端口号:接收方网络进程端口号
长度:UDP发送的报文的整体长度(UDP头部+UDP正文)
校验和:数据差错校验

网络协议-TCP
TCP : 传输层       传输控制协议(流式套接字)
复习:
UDP的特点:
1. 面向数据包
2. 无连接
3. 尽最大努力交付,不安全不可靠(数据丢包、数据乱序)
4. 机制简单,资源开销小,数据实时性高
5. 可实现一对一、一对多的通信    

TCP的特点

 1. 面向数据流
2. 有连接(通信之前必须建立连接)
3. 安全可靠的传输机制
4. 机制复杂,网络资源开销大
5. 本质只能实现一对一的通信(使用TCP并发方式可实现一对多通信)


TCP三次握手和四次挥手机制

TCP三次握手:TCP建立连接时,需要进行三次握手,为了确保收发双方通信之前都已准备就绪。

TCP四次挥手:TCP断开连接时,需要进行四次挥手,确保断开连接前双方都已通信结束。

 int connect(int sockfd, const struct sockaddr *addr, addrlen);
功能:请求与服务端建立连接
参数:
sockfd:套接字
addr:要连接的服务端的地址信息
addrlen:服务端地址大小
返回值:
成功:0
失败:-1

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送网络数据
参数:
sockfd:网络套接字
buf:要发送的数据首地址
len:发送的字节数
flags:0 :按照默认方式发送
返回值:
成功:实际发送的字节数
失败:-1

int listen(int sockfd, int backlog);
功能:监听建立三次握手的客户端
参数:
sockfd:监听套接字
backlog:最大允许监听的客户端个数
返回值:
成功:0
失败:-1

int accept(int socket, struct sockaddr *restrict address,socklen_t *restrict address_len);
功能:接收建立三次握手的客户端,并产生一个通讯套接字
参数:
socket:监听套接字
address:客户端的地址信息
address_len:客户端地址长的指针
返回值:
成功:通讯套接字
失败:-1


ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:从网络套接字上接收数据
参数:
sockfd:通讯套接字
buf:存放接收数据的首地址
len:期望接收到的字节数
flag : 0:默认方式接收(阻塞)
返回值:
成功:实际接收到的字节数
失败:-1
对方断开连接:0

TCP粘包问题
TCP粘包问题:发送方应用层发送的多包数据,将来在接收方可能一次读到,多包数据产生了粘连。

原因:
1. 发送方速度较快,TCP底层可能对多包数据进行重新组帧;
2. 接收方数据处理速度较慢,导致多包数据在接收缓冲区缓存,应用层读时,一次将多包数据读出。

解决粘包问题的常用方法:
1.  调整发送速率
2.  发送指定大小,将来接收方也接受指定大小。
结构体
注意:
1. 跨平台之间的数据传输时,注意结构体对齐问题。
32bits平台<-->64位平台

 3. 应用层位发送的数据增加分隔符,利用分隔符解析
hello world\nhow are you\n

 4. 封装自定义数据帧格式进行发送(协议),严格根据协议进行解析。
AA  C0  00 00 00 F0 00 BB 10 A0  00 00 00 10 校验 BB  AA  C0  00 00 00 F0 00 BB 10 A0  00 00 00 10 校验 BB AA  C0  00 00 00 F0 00 BB 10 A0  00 00 00 10 校验 BB
帧头:AA
帧尾:BB
有效数据长度:C0
有效数据:00 00 00 F0 00 BB 10 A0  00 00 00 10
校验: 8位和校验
16位和校验
CRC校验

重点

 1. UDP和TCP区别
2. TCP三次握手和四次挥手
3. TCP粘包问题及解决方法
4. TCP客户端和服务端的编程流程

http://www.xdnf.cn/news/18542.html

相关文章:

  • 【UnityAS】Unity Android Studio 联合开发快速入门:环境配置、AAR 集成与双向调用教程
  • CMake link_directories()详细介绍与使用指南
  • STM32F1 GPIO介绍及应用
  • C/C++三方库移植到HarmonyOS平台详细教程(补充版so库和头文件形式)
  • 凌霄飞控开发日志兼新手教程——基础篇:认识基本的文件内容和相关函数作用(25电赛备赛版)
  • 【序列晋升】12 Spring Boot 约定优于配置
  • Spring发布订阅模式详解
  • Python 调用 sora_image模型 API 实现图片生成与垫图
  • 【论文】Zotero文献管理
  • 为什么应用会突然耗尽所有数据库连接
  • 轮廓检测技术不仅能精确计算图像中的轮廓数量,还能完整记录每个轮廓包含的所有像素点坐标
  • 【0基础3ds Max】捕捉工具详解
  • 宋红康 JVM 笔记 Day06|虚拟机栈
  • [激光原理与应用-318]:结构设计 - Solidworks - 草图
  • 损耗源:导线电阻与趋肤效应
  • 深度学习②【优化算法(重点!)、数据获取与模型训练全解析】
  • 线上日志排查问题
  • MCP 与 Function Calling 打开真实世界的两种“母体”方式
  • Spring 框架深度解析:从核心原理到实战应用
  • GitLab CI :深入剖析 gl-sbom-report.cdx.json 解码“数字身份证”
  • linux下的网络编程
  • 快速入门Vue3——初体验
  • 6020角度双环控制一种用于电机控制的策略
  • 智能合约漏洞检测技术综述:守护区块链世界的“自动售货机”
  • 在通义灵码中配置MCP服务
  • uniapp使用map打包app后自定义气泡不显示解决方法customCallout
  • JavaWeb前端05(Vue工程化,Vue组件两种风格:组合式API 和 选项式API)及简单案例)
  • 豆包 + 蘑兔,破解写歌难题!
  • 知识蒸馏 Knowledge Distillation 论文 Generalized Knowledge Distillation (GKD) 目标函数的演化
  • 【Cmake】Cmake概览