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

20250903的学习笔记

一、TCP编码

(1)核心过程详解

1. 建立连接:三次握手

在 connect() 和 accept() 之间,内核自动完成了 TCP 的三次握手,确保双方都准备好收发数据。

  • 编码体现:你无需在代码中手动实现握手,但必须理解 connect() 会阻塞直到握手成功或失败。

2. 数据传输:循环读写

这是编码的核心。TCP 是面向字节流的,它不保证 send() 和 recv() 的一次调用能处理完所有数据。

  • 发送端 (send)

    • 关键send() 的返回值表示实际成功放入内核发送缓冲区的字节数,这个值可能小于你要求发送的长度(len)。

    • 编码模式:必须循环发送,确保所有数据都被处理。

    c

    const char *data = "Hello, World!";
    size_t total_sent = 0;
    size_t len = strlen(data) + 1; // 包括字符串结束符while (total_sent < len) {ssize_t bytes_sent = send(conn_fd, data + total_sent, len - total_sent, 0);if (bytes_sent == -1) {perror("send");break;}total_sent += bytes_sent;
    }
  • 接收端 (recv)

    • 关键recv() 的返回值表示实际从内核接收缓冲区读取到的字节数

      • > 0:成功读取到的字节数。

      • = 0:对方已优雅地关闭连接(FIN)。

      • -1:出错。

    • 编码模式:必须循环读取,直到收完预期长度的数据或连接关闭。

    c

    char buffer[1024];
    size_t total_received = 0;
    size_t expected_len = 100; // 假设我们预期要接收100字节while (total_received < expected_len) {ssize_t bytes_received = recv(conn_fd, buffer + total_received, sizeof(buffer) - total_received - 1, 0);if (bytes_received == 0) {printf("Peer has closed the connection.\n");break;} else if (bytes_received == -1) {perror("recv");break;}total_received += bytes_received;
    }
    buffer[total_received] = '\0'; // 如果当字符串使用,添加结束符
3. 关闭连接

TCP 连接是双全工的,可以独立关闭每一方的读写。

  • shutdown():更优雅地控制连接关闭方向。

    • SHUT_WR:关闭写端。发送 FIN 给对方,表明“我数据发完了,但还可以收”。这是优雅关闭的常见方式。

    • SHUT_RD:关闭读端(较少用)。

    • SHUT_RDWR:等同于先后调用 SHUT_RD 和 SHUT_WR

  • close():将套接字引用计数减1。当引用计数为0时,系统会发送 FIN 并完全关闭连接,释放资源。

二、TCP和UDP的对比

特性TCPUDP
连接类型面向连接(三次握手)无连接
可靠性可靠传输(确认、重传、排序)不可靠传输(不保证数据到达)
延迟高延迟(连接建立和可靠传输的开销)低延迟(无连接建立和可靠传输的开销)
数据边界面向字节流(不保留数据边界)面向数据报(保留数据边界)
流量控制有(滑动窗口机制)
拥塞控制有(拥塞控制算法)
适用场景文件传输、网页浏览、电子邮件等视频流、语音通信、实时游戏等

http://www.dtcms.com/a/364921.html

相关文章:

  • 百度发布Comate AI IDE,我要把Cursor卸载了!
  • 机器学习从入门到精通 - 逻辑回归为什么是分类之王?深入决策边界与概率校准
  • 《嵌入式硬件(一):裸机概念与80c51单片机基础》
  • “十五五”国家科技创新规划-建议
  • 百度智能云「智能集锦」自动生成短剧解说,三步实现专业级素材生产
  • Netty + WebSocket:搭建快速且稳定的双向通信通道
  • word文档中从某一页开始页码全是1
  • Wpf程序屏幕居中问题修复全记录
  • 39.Ansible: 包含与导入
  • FastVLM:高效视觉编码助力视觉语言模型突破高分辨率效率瓶颈
  • 独家|字节Seed部门增发百万期权,大模型战线开启“锁人”模式
  • 【golang长途旅行第37站】Redis连接池
  • MMD动画(一)模型、动作、音乐导入
  • 【大前端】React 父子组件通信、子父通信、以及兄弟(同级)组件通信
  • 科技赋能田园:数字化解决方案开启智慧农业新篇章
  • centos9 docker启动不起来,docker启动发生堵塞问题!
  • 【明道云】[工作表控件5] 手机控件的格式化处理
  • 【机器学习】实战:市场增长点分析挖掘项目
  • SyncBack 备份同步软件: 使用增量备份, 节省网络传输及存储成本
  • 【NVIDIA B200】2.all_reduce_perf NVIDIA B200 8-GPU 系统 All-Reduce 性能深度解析
  • 力扣115:不同的子序列
  • 热烈庆祝 | 一二三物联网携这款产品入选2025年度山东省首台(套)技术装备生产企业及产品名单
  • Day20 JavaScript 进阶核心:IIFE、代码规范、调试与对象模型
  • AI优化SEO关键词策略指南
  • 时序数据库选型指南:Apache IoTDB快速部署与实战应用
  • 时序数据库IoTDB的核心优势
  • mysql第五天学习 Mysql全局优化总结
  • 如何使文件夹内的软件或者文件不受windows 安全中心的监视
  • FastGPT社区版大语言模型知识库、Agent开源项目推荐
  • 智慧用电安全解决方案:打造全流程可视化管控