自学嵌入式第27天------TCP和UDP,URL爬虫

1. TCP和UDP区别

**TCP(传输控制协议)UDP(用户数据报协议)**是两种主要的传输层协议,它们在数据传输方式上有显著区别:

  • 连接性

    • TCP是面向连接的协议,通信前需通过三次握手建立连接,通信结束后通过四次挥手断开连接。

    • UDP是无连接的协议,发送数据前无需建立连接,直接发送数据包。

  • 可靠性

    • TCP提供可靠传输,确保数据按序到达,丢失或损坏的数据包会重传。

    • UDP不保证可靠性,数据包可能丢失、重复或乱序。

  • 数据顺序

    • TCP保证数据按发送顺序到达。

    • UDP不保证顺序,数据包可能乱序到达。

  • 速度

    • TCP因连接建立、确认和重传机制,速度较慢。

    • UDP无这些机制,传输速度更快。

  • 头部开销

    • TCP头部较大(20字节),包含序列号、确认号等字段。

    • UDP头部较小(8字节),仅包含基本信息。

  • 适用场景

    • TCP适用于要求可靠传输的场景,如网页浏览、文件传输。

    • UDP适用于实时性要求高的场景,如视频流、在线游戏。

2. TCP和UDP的Socket编写流程

TCP Socket编写流程

  • 服务器端

    1. 创建Socket:socket(AF_INET, SOCK_STREAM, 0)

    2. 绑定地址:bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))

    3. 监听连接:listen(sockfd, backlog)

    4. 接受连接:accept(sockfd, (struct sockaddr*)&cliaddr, &clilen)

    5. 读写数据:read()write()

    6. 关闭Socket:close(sockfd)

  • 客户端

    1. 创建Socket:socket(AF_INET, SOCK_STREAM, 0)

    2. 连接服务器:connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))

    3. 读写数据:read()write()

    4. 关闭Socket:close(sockfd)

UDP Socket编写流程

  • 服务器端

    1. 创建Socket:socket(AF_INET, SOCK_DGRAM, 0)

    2. 绑定地址:bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr))

    3. 接收数据:recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&cliaddr, &clilen)

    4. 发送数据:sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&cliaddr, clilen)

    5. 关闭Socket:close(sockfd)

  • 客户端

    1. 创建Socket:socket(AF_INET, SOCK_DGRAM, 0)

    2. 发送数据:sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&servaddr, sizeof(servaddr))

    3. 接收数据:recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL)

    4. 关闭Socket:close(sockfd)

3. TCP为什么安全可靠

TCP的安全可靠性源于以下机制:

  • 三次握手:确保连接建立时双方都准备好通信。

  • 数据包确认与重传:接收方确认收到的数据包,发送方未收到确认则重传。

  • 数据包排序:TCP通过序列号保证数据按序到达。

  • 流量控制:通过滑动窗口机制防止接收方缓冲区溢出。

  • 拥塞控制:通过拥塞窗口和慢启动机制避免网络拥塞。

4. TCP机制

TCP的核心机制包括:

  • 三次握手:建立连接时,客户端和服务器交换SYN和ACK包。

  • 四次挥手:断开连接时,双方交换FIN和ACK包。

  • 数据包确认与重传:接收方确认数据包,发送方未收到确认则重传。

  • 滑动窗口:控制发送方发送数据的速率,防止接收方缓冲区溢出。

  • 拥塞控制:通过慢启动、拥塞避免等算法防止网络拥塞。


TCP(传输控制协议)通过多种机制来保证数据传输的可靠性、效率和流量控制。以下是这些机制的详细解释:


1. 应答机制(Acknowledgment Mechanism)

  • 作用:确保数据包被成功接收。

  • 原理

    • 接收方收到数据后,会向发送方发送一个ACK(确认应答),ACK中包含已成功接收的数据包的序列号。

    • 发送方根据ACK确认数据已成功送达,若未收到ACK,则触发重传机制。

  • 特点

    • 确认的是连续数据的最后一个字节的序列号。

    • 例如,发送方发送序列号为1-1000的数据,接收方收到后会发送ACK=1001,表示期望接收下一个序列号为1001的数据。


2. 超时重传机制(Retransmission Timeout Mechanism)

  • 作用:解决数据包丢失或ACK丢失的问题。

  • 原理

    • 发送方发送数据后启动一个定时器,若在超时时间内未收到ACK,则认为数据包丢失,触发重传。

    • 超时时间(RTO, Retransmission Timeout)是动态计算的,基于网络往返时间(RTT)。

  • 特点

    • 超时重传是TCP可靠性的核心机制之一。

    • 如果多次重传失败,TCP会断开连接。


3. 流量控制机制(Flow Control Mechanism)

  • 作用:防止发送方发送数据过快,导致接收方缓冲区溢出。

  • 原理

    • 接收方通过窗口大小字段(Window Size)告知发送方其缓冲区剩余空间。

    • 发送方根据窗口大小调整发送数据的速率。

  • 特点

    • 窗口大小为0时,发送方会暂停发送,直到接收方通知有可用缓冲区空间。

    • 通过滑动窗口实现动态调整。


4. 滑动窗口机制(Sliding Window Mechanism)

  • 作用:提高数据传输效率,允许发送方在未收到ACK的情况下连续发送多个数据包。

  • 原理

    • 发送方和接收方各自维护一个窗口,窗口大小由接收方的缓冲区空间决定。

    • 发送方窗口内的数据可以连续发送,无需等待ACK。

    • 接收方确认数据后,窗口向前滑动,发送方可以发送新的数据。

  • 特点

    • 滑动窗口大小是动态调整的,受流量控制和拥塞控制影响。

    • 支持累计确认,即ACK确认的是连续数据的最后一个字节。


5. 延时应答机制(Delayed Acknowledgment Mechanism)

  • 作用:减少ACK的数量,提高网络利用率。

  • 原理

    • 接收方收到数据后,不立即发送ACK,而是等待一段时间(通常为200ms)。

    • 如果在等待期间有数据需要发送给发送方,则可以将ACK捎带在数据包中发送。

  • 特点

    • 减少了单独的ACK包,降低了网络开销。

    • 适用于双向通信场景。


6. 捎带应答机制(Piggybacking Acknowledgment Mechanism)

  • 作用:将ACK信息附加在数据包中发送,减少单独发送ACK的开销。

  • 原理

    • 当接收方需要发送数据给发送方时,可以将ACK信息附加在数据包中一起发送。

    • 例如,A发送数据给B,B在回复数据时,将ACK信息附加在回复的数据包中。

  • 特点

    • 适用于双向通信场景,减少了网络中的小包数量。

    • 提高了网络利用率。


总结

机制作用核心原理
应答机制确认数据接收接收方发送ACK确认已接收的数据
超时重传机制解决数据包丢失问题发送方超时未收到ACK时重传数据
流量控制机制防止接收方缓冲区溢出接收方通过窗口大小控制发送方的发送速率
滑动窗口机制提高数据传输效率发送方在窗口内连续发送数据,接收方滑动窗口确认数据
延时应答机制减少ACK数量,提高网络利用率接收方延迟发送ACK,等待可能的捎带机会
捎带应答机制减少单独发送ACK的开销将ACK信息附加在数据包中发送

这些机制共同作用,使得TCP能够在保证可靠性的同时,提高传输效率并适应网络环境的变化。


TCP粘包问题*:

封装自定义数据帧
  • 原理

    • 在每个数据包前添加一个头部,头部包含数据包的长度信息。

    • 接收方先读取头部,获取数据包长度,然后根据长度读取完整的数据包。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

亲测解决笔记本触摸板使用不了Touchpad not working

这个问题可以通过FnFxx来解决,笔记本键盘上Fxx会有一个触摸板图标。如果不行应该玉藻设置中关了,打开即可。 解决办法 在蓝牙,触摸板里打开即可。 Turn it on in settings。

Kubernetes中的 iptables 规则介绍

#作者:邓伟 文章目录 一、Kubernetes 网络模型概述二、iptables 基础知识三、Kubernetes 中的 iptables 应用四、查看和调试 iptables 规则五、总结 在 Kubernetes 集群中,iptables 是一个核心组件, 用于实现服务发现和网络策略。iptables 通…

(九) Java 多线程解析:常见问题、实际开发挑战与解决方案

在 Java 开发领域,多线程编程是面试中的重点考察内容,同时也是实际项目开发中的关键技能。本文将详细探讨 Java 多线程面试中的常见问题,深入剖析实际开发中可能遇到的挑战,并提供具体的解决方案,帮助你在面试和工作中…

deepseek 3FS编译

3FS在ubuntu22.04下的编译(记录下编译过程,方便后续使用) 环境信息 OS ubuntu 22.04内核版本 6.8.0-52-genericlibfuse 3.16.1rust 1.75.0FoundationDB 7.1.66meson 1.0.0ninja 1.10.1 libfuse编译 以下建议均在root下执行 pip3 install…

docker-compose安装redis-主从+哨兵(3台虚拟机一主两从)

一、部署架构 ‌主从结构‌ ‌主节点‌:部署于192.168.56.100‌从节点‌:部署于192.168.56.101和192.168.56.103 ‌哨兵结构‌ 每台服务器部署一个哨兵实例,形成三哨兵集群。 ipredis节点名称sentinel节点名称192.168.56.100redis-masterr…

vue+element 实现蛇形时间轴 拐弯时间轴

公司业务需要做一个如图效果 分享给有需要的人 有更好的意见欢迎交流 核心代码如下 <div style"display: flex; position: relative"><div style"width: 89%; margin: auto; padding: 10px 0"><div v-for"(item, index) in experien…

DeepSeek-R1-671B大模型满血版私有化部署高可用教程-SparkAi系统集成图文教程

DeepSeek官网服务器繁忙的主要原因是由于用户数量激增导致的服务器资源紧张。‌为了解决这一问题&#xff0c;DeepSeek团队已经暂停了API服务充值&#xff0c;以避免对用户造成业务影响。目前&#xff0c;存量充值金额仍可继续调用&#xff0c;但充值功能暂时不可用‌。 DeepSe…

动态扩缩容引发的JVM堆内存震荡:从原理到实践的GC调优指南

目录 一、典型案例&#xff1a;系统发布后的GC雪崩事件 &#xff08;一&#xff09;故障现象 1. 刚刚启动时 GC 次数较多 2. 堆内存锯齿状波动 3. GC日志特征&#xff1a;Allocation Failure &#xff08;二&#xff09;问题定位 二、原理深度解析&#xff1a;JVM内存弹…

OpenCV计算摄影学(14)实现对比度保留去色(Contrast Preserving Decolorization)的函数decolor()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将彩色图像转换为灰度图像。它是数字印刷、风格化的黑白照片渲染&#xff0c;以及许多单通道图像处理应用中的基本工具。 cv::decolor 是 OpenCV…

STM32 ADC模数转换

目录 ADC简介逐次逼近型ADCSTM32的ADC输入通道规则组的转换模式单次转换、非扫描模式连续转换、非扫描模式单次转换、扫描模式连续转换、扫描模式间断模式 数据对齐转换时间校准代码软件触发单次转换非扫描模式 ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模…

Facebook 的历史与发展:从校园网站到全球社交平台

引言 Facebook&#xff0c;这个全球最大的社交网络平台之一&#xff0c;其发展历程充满了创新和变革。从最初的校园网站到如今的全球社交平台&#xff0c;Facebook 不仅改变了人们的沟通方式&#xff0c;也重塑了信息传播和社交互动的模式。 起源&#xff1a;校园内的点子 Fa…

自然语言转SQL之Vanna.ai:AI集成数据库

自然语言转SQL之Vanna.ai&#xff1a;AI集成数据库 一、Vanna.ai是什么二、落地步骤&#xff1a;实现三层需求2.1 官方示例看效果2.2 对接自己的数据库2.3 完全本地化之路 三、构建自己的产品3.1 提问转SQL3.2 执行SQL查询实例2 要实现的功能就是&#xff1a;用中文语言同数据库…

Android 平台架构系统启动流程详解

目录 一、平台架构模块 1.1 Linux 内核 1.2 硬件抽象层 (HAL) 1.3 Android 运行时 1.4 原生 C/C 库 1.5 Java API 框架 1.6 系统应用 二、系统启动流程 2.1 Bootloader阶段 2.2 内核启动 2.3 Init进程&#xff08;PID 1&#xff09; 2.4 Zygote与System Serv…

QT 作业 C++ day5

作业 代码 MyQThread.h class MyThread : public QThread {Q_OBJECT public:MyThread(QObject *parent nullptr); protected:void run() override; signals://向ui界面发送的 "复制进度" 的信号void copy_process_signal(int index); public slots:// "复…

24、如何在C++中创建和管理线程?【中高频】 -

创建线程对象&#xff1a; //无参构造&#xff0c;该线程对象没有关联任何线程函数&#xff0c;也就是它没有启动任何线程:thread t1;//... t1 thread(func, 10);//移动构造&#xff08;调用移动赋值函数&#xff09;t1.join();//含参构造thread t1(func1, 1, 10);//thread 提…

【Altium】22.11版本后如何导出Gerber镜像层

1、 文档目标 解决 22.11 版本后如何导出 Gerber 镜像层的问题 2、 问题场景 Gerber 导出旧版本&#xff0c;在 AD 22.11 之前的 Gerber 导出中是存在镜像层的选择。 图 1 软件更新至 AD22.11 及之后版本&#xff0c;在 Gerber 导出设置中无法选择层镜像进行导出。 图 2 3、…

配置 Thunderbird 以使用 QQ 邮箱

配置 Thunderbird 以使用 QQ 邮箱 本片文章的操作系统为 windws 10 &#xff0c;thunder bird 客户端版本为 128.7.1esr(64位)。注意到其他文章的图片中 thunder bird 的 ui 界面和我这个不一样&#xff0c;导致看起来不太方便&#xff0c;所以这里写一篇博客。不同版本的 thu…

wxWidgets GUI 跨平台 入门学习笔记

准备 参考 https://wiki.wxwidgets.org/Microsoft_Visual_C_NuGethttps://wiki.wxwidgets.org/Tools#Rapid_Application_Development_.2F_GUI_Buildershttps://docs.wxwidgets.org/3.2/https://docs.wxwidgets.org/latest/overview_helloworld.htmlhttps://wizardforcel.gitb…

DeepSeek系列模型技术报告的阅读笔记

DeepSeek系列模型技术报告的阅读笔记 之前仔细阅读了DeepSeek系列模型的主要技术方面内容与发展脉络&#xff0c;以下是DeepSeek系列模型技术报告的笔记&#xff0c;有错误的地方欢迎指正&#xff01; 文章目录 DeepSeek系列模型技术报告的阅读笔记GQADeepseek MoEAbstractIn…

海思Hi3516DV300交叉编译opencv

OpenCV是一个开源的跨平台计算机视觉库&#xff0c;支持C、Python等多种语言&#xff0c;适用于图像处理、目标检测、机器学习等任务。其核心由C编写&#xff0c;高效轻量&#xff0c;提供实时视觉处理功能&#xff0c;广泛应用于工业自动化、医疗影像等领域。 1 环境准备 1…