嵌软面试每日一阅----通信协议篇(二)之TCP

一. TCP和UDP的区别

  1. 可靠性

    TCP:✅ 可靠传输(三次握手 + 重传机制)

          UDP:❌ 不可靠(可能丢包)

  1. 连接方式

    • TCP:面向连接(需建立/断开连接)

    • UDP:无连接(直接发送数据包)

  2. 传输效率

    • TCP:慢(需保证可靠性)

    • UDP:快(无额外控制开销)

  3. 适用场景

    • TCP:文件传输(FTP)、邮件、网页(HTTP)

    • UDP:实时视频、在线游戏、直播(DNS、VoIP)

⚡ 核心结论

  • 要可靠 → TCP(牺牲速度保数据完整)

  • 要速度 → UDP(牺牲可靠保实时性)!

二. TCP通信如何保证通信的可靠性?

🔥 TCP可靠性极简核心机制

  1. 数据分段与重组
    → 按序切割数据包,接收端按序列号重组,确保顺序正确。

  2. 确认应答(ACK)
    → 接收方每收一包必回ACK,未收到ACK则触发重传。

  3. 超时重传
    → 动态计算超时时间,ACK超时自动重发,直到确认成功。

  4. 流量控制(滑动窗口)
    → 窗口大小动态调整,匹配接收方处理能力,防数据堆积。

  5. 拥塞控制
    → 慢启动 + 拥塞避免 + 快速恢复,动态降速防网络过载。

  6. 数据校验和
    → 每包计算校验和,校验失败则丢弃并重传,确保数据完整。

  7. 连接管理
    → 三次握手建连(防半开连接) + 四次挥手断连(保数据传完)。

  8. 序列号机制
    → 包头含唯一序列号,识别丢失/重复包,保证数据不丢不乱。

⚡ 终极目标
所有机制协同 → 数据不丢失、不重复、不乱序,实现可靠传输!

一句话总结:TCP靠 ACK重传保到达、滑动窗口控流量、拥塞算法防堵网、校验序列保完整

三. TCP为什么是三次握手?

目标:确保双方发送和接收能力正常,防止失效请求误触发连接。

流程图


步骤核心

  1. 第一次握手(SYN):客户端发起连接,证明客户端发送能力正常

  2. 第二次握手(SYN+ACK):服务端确认收到并同意连接,证明服务端收发能力正常

  3. 第三次握手(ACK):客户端确认服务端响应,证明客户端接收能力正常

⚡ 本质:三次握手后,双向通信通道确认可靠

四. 为什么是四次挥手?

目标:全双工通信需双方独立关闭通道,确保数据传完且无残留。

流程图

步骤核心

  1. 第一次挥手(FIN):客户端关闭发送通道(仍可接收数据)。

  2. 第二次挥手(ACK):服务端确认关闭请求,但可能继续发送剩余数据

  3. 第三次挥手(FIN):服务端数据发完后关闭发送通道

  4. 第四次挥手(ACK):客户端确认,双方彻底断开连接

⚡ 本质:全双工需独立关闭,四次保证双方数据传完且无残留

五. TCP两次握手可能引发的问题

  1. 资源浪费与半开连接

    • 问题:若客户端首次SYN因网络延迟未到达服务器,客户端超时重发SYN并完成两次握手。当延迟的SYN最终到达时,服务器误认为新连接请求,分配资源等待数据 → 资源浪费

    • 结果:服务器维护大量无效半开连接,消耗内存和端口资源。

  2. 无法防止历史连接干扰

    • 问题:客户端因网络波动发送多个SYN,旧的SYN可能延迟到达服务器。两次握手下,服务器会接受所有SYN请求,导致重复建立连接

    • 结果:同一端口多连接竞争,数据包错乱或覆盖。

  3. 双向通信能力未完全确认

    • 问题:两次握手仅确认了客户端→服务器的发送能力服务器→客户端的收发能力,但未验证客户端←服务器的接收能力

    • 结果:客户端可能未正确接收服务器的初始数据,导致丢包或乱序。

  4. 无法抵御SYN洪泛攻击

    • 问题:攻击者伪造大量SYN请求,服务器仅需两次握手即分配资源 → 服务器资源耗尽

    • 对比三次握手:第三次ACK需客户端真实响应,过滤无效请求。

⚡ 核心结论:三次握手通过双向能力验证 + 序列号同步,解决两次握手的资源泄露、历史连接干扰及安全性缺陷,确保可靠连接建立。

注:文章随手记录,如有错误,评论区交流

<think>好的,用户现在想要了解如何用C/C++实现李峋同款的跳动爱心。之前用户已经询问过Qt串口通信,现在转向图形相关的爱心效果,可能用户对编程有较广泛的兴趣,或者在做某个项目需要结合硬件和图形界面。 首先,用户提到的“李峋同款跳动的爱心”应该是指影视剧中的动态爱心效果,可能是个在控制台或图形窗口中跳动的爱心动画。需要确认用户的需求是控制台实现还是图形界面,比如使用OpenGL或者Qt的图形库。不过考虑到用户之前接触过Qt,可能更倾向于图形界面,但C/C++的控制台动画也是种常见做法,尤其是使用ASCII字符来模拟动画。 接下来需要分析实现方法。控制台下的跳动爱心通常利用数学公式生成爱心的形状,结合颜色变化和动态缩放来模拟跳动效果。在Windows下可能需要使用Windows API来设置控制台颜色和光标位置,而Linux/macOS则可能使用ANSI转义码。 用户可能需要详细的步骤,包括爱心坐标的计算、控制台颜色的设置、动画循环的实现。同时需要代码示例,最好能跨平台或者注明不同系统的适配方法。另外,用户可能希望代码简洁,容易理解和修改。 考虑到用户可能没有图形库的经验,优先选择控制台实现,因为依赖较少,适合快速实现。但需要注意不同系统的兼容性,比如Windows和Unix-like系统在控制台处理上的差异。例如,Windows使用SetConsoleCursorPosition和SetConsoleTextAttribute,而其他系统使用ANSI转义码。 代码结构大致分为:初始化(隐藏光标、设置颜色)、计算爱心形状的坐标、动态调整爱心大小以实现跳动效果,以及循环刷新显示。可能需要用到数学公式,比如心形曲线的参数方程,或者使用预定义的字符矩阵来绘制爱心。 同时,需要处理用户的退出操作,比如检测按键事件来终止程序,或者在循环中设置退出条件。此外,动画的流畅性取决于刷新速率,可能需要使用睡眠函数来控制帧率。 最后,可能需要注意事项,比如编译时的平台相关代码处理,或者颜色不支持时的回退方案。用户可能还希望了解如何调整爱心的大小、颜色变化或跳动速度,所以代码中的参数应该易于修改。 总结来说,需要提供个简洁的C/C++控制台程序,实现跳动的爱心动画,包含跨平台处理,代码注释清晰,并解释关键步骤和数学原理,方便用户理解和自定义。</think>以下是个用 C/C++ 实现的**控制台跳动爱心**代码(灵感来自《点燃我,温暖你》中李峋的爱心代码),结合数学公式与颜色动画效果,支持 Windows/Linux/macOS 平台: --- ### 代码实现 ```cpp #include <iostream> #include <cmath> #include <windows.h> // Windows 专用 API(Linux/macOS 可用 ANSI 转义码替代) // 设置控制台光标位置(跨平台建议使用 ncurses 库) void setCursorPos(int x, int y) { #ifdef _WIN32 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos = { (SHORT)x, (SHORT)y }; SetConsoleCursorPosition(hConsole, pos); #else std::cout << "\033[" << y + 1 << ";" << x + 1 << "H"; // ANSI 转义码 #endif } // 隐藏光标 void hideCursor() { #ifdef _WIN32 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cursorInfo; GetConsoleCursorInfo(hConsole, &cursorInfo); cursorInfo.bVisible = false; SetConsoleCursorInfo(hConsole, &cursorInfo); #else std::cout << "\033[?25l"; #endif } // 设置控制台颜色(示例仅 Windows,其他系统可用 ANSI) void setColor(int color) { #ifdef _WIN32 HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hConsole, color); #else std::cout << "\033[38;5;" << color << "m"; #endif } // 爱心数学公式:笛卡尔心形线变形 bool heartShape(float x, float y, float scale) { x /= scale; y /= scale; float heart = pow(x*x + y*y - 1, 3) - x*x*y*y*y; return heart <= 0; } int main() { hideCursor(); float scale = 1.0; bool expanding = false; while (true) { // 清屏(简单模拟) system("cls"); // 动态缩放系数 scale += expanding ? 0.05 : -0.05; if (scale <= 0.5) expanding = true; if (scale >= 1.5) expanding = false; // 遍历坐标绘制爱心 for (float y = 1.5; y > -1.5; y -= 0.05) { for (float x = -1.5; x < 1.5; x += 0.025) { if (heartShape(x, y, scale)) { setColor(12); // 红色(Windows) std::cout << "*"; } else { std::cout << " "; } } std::cout << std::endl; } // 控制动画速度 Sleep(50); } return 0; } ``` --- ### 关键原理 1. **心形方程** 使用变形后的笛卡尔心形线公式: ```math (x^2 + y^2 - 1)^3 - x^2 y^3 \leq 0 ``` 当坐标点满足该不等式时,绘制爱心符号。 2. **动态缩放** 通过 `scale` 参数周期性变化(0.5~1.5),实现爱心的"跳动"效果。 3. **控制台动画** - 使用 `system("cls")` 清屏(实际项目建议用更高效方式) - 通过 `Sleep()` 控制帧率 - 隐藏光标避免闪烁 4. **颜色控制** Windows 使用 `SetConsoleTextAttribute`,其他系统可用 ANSI 转义码实现彩色输出。 --- ### 运行效果 - 控制台中会出现个红色爱心,持续缩放跳动 - 类似影视剧中的终端动态效果(需调整参数优化动画流畅度) --- ### 跨平台适配建议 1. **Linux/macOS** - 安装 `ncurses` 库替代 Windows API - 使用 ANSI 转义码控制颜色和光标 - 将 `Sleep(50)` 改为 `usleep(50000)` 2. **增强效果** - 修改公式实现不同形状爱心 - 添加渐变颜色(如粉红到深红) - 增加随机粒子效果 如果需要完整跨平台版本或图形界面(如 OpenGL/Qt 实现),可以进步补充说明!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值