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

嵌入式学习日记(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.dtcms.com/a/346831.html

相关文章:

  • OpenFeign相关记录
  • 【嵌入式】【搜集】RTOS相关技术信息整理
  • Ubuntu2204server系统安装postgresql14并配置密码远程连接
  • 【python与生活】如何自动总结视频并输出一段总结视频?
  • FastAPI + SQLAlchemy 数据库对象转字典
  • 【力扣 Hot100】每日一题
  • C++之list类的代码及其逻辑详解 (中)
  • Java线程的几种状态 以及synchronized和Lock造成的线程状态差异,一篇让你搞明白
  • Linux服务器Systemctl命令详细使用指南
  • GitLab CI:安全扫描双雄 SAST vs. Dependency Scanning 该如何抉择?
  • 智慧园区人车混行误检率↓78%!陌讯动态决策算法实战解析
  • html链接的target属性
  • Win11 下卸载 Oracle11g
  • 《文字的本体论突围:从工具论到符号学革命的范式转换》
  • B.30.01.1-Java并发编程及电商场景应用
  • 算法 ---哈希表
  • 从0到1:数据库进阶之路,解锁SQL与架构的奥秘
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(6):51-60语法
  • 为什么存入数据库的中文会变成乱码
  • 从罗永浩访谈李想中学习现代家庭教育智慧
  • C++编程语言:标准库:第36章——字符串类(Bjarne Stroustrup)
  • 【秋招笔试】2025.08.23美团研发岗秋招笔试题
  • 超越基础:Glide 高级优化与自定义实战
  • 氟锑酸与氢氧化铯的反应:从化学原理到计算模拟
  • Science Robotics 通过人机交互强化学习进行精确而灵巧的机器人操作
  • 文生3D实战:用[灵龙AI API]玩转AI 3D模型 – 第7篇
  • 【C标准库】详解<stdio.h>标准输入输出库
  • 数字化转型模型工作手册
  • 一种解决使用 PotPlayer 播放 Alist 的 Webdav 时提示 无法在 FTP/WebDAV/HTTP 上修改该文件夹 的方法
  • 深入理解纹理与QtOpenGL的实现