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

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.xdnf.cn/news/19904.html

相关文章:

  • LangChain实战(十三):Agent Types详解与选择策略
  • 动态IP和静态IP配置上有什么区别
  • 单片机控制两只直流电机正反转C语言
  • 如何保存训练的最优模型和使用最优模型文件
  • 【wpf】WPF开发避坑指南:单例模式中依赖注入导致XAML设计器崩溃的解决方案
  • SpringBoot注解生效原理分析
  • AI落地新趋势:美林数据揭示大模型与小模型的协同进化论
  • Java中 String、StringBuilder 和 StringBuffer 的区别?
  • 小皮80端口被NT内核系统占用解决办法
  • 期货反向跟单—从小白到高手的进阶历程 七(翻倍跟单问题)
  • 【Java】对于XML文档读取和增删改查操作与JDBC编程的读取和增删改查操作的有感而发
  • 加解密安全-侧信道攻击
  • Python分布式任务队列:万级节点集群的弹性调度实践
  • Unity 枪械红点瞄准器计算
  • linux内核 - 服务进程是内核的主要责任
  • dockerfile文件的用途
  • 机器能否真正语言?人工智能NLP面临的“理解鸿沟与突破
  • 键盘上面有F3,四,R,F,V,按下没有反应,维修记录
  • Echo- Go Web Framework的介绍
  • MCP over SSE 通信过程详解:双通道架构下的高效对话
  • 关于牙科、挂号、医生类小程序或管理系统项目 项目包含微信小程序和pc端两部分
  • 《计算机网络安全》实验报告一 现代网络安全挑战 拒绝服务与分布式拒绝服务攻击的演变与防御策略(1)
  • createrepo生成yum仓库元数据xml文件
  • 【机器学习学习笔记】逻辑回归实现与应用
  • 微信小程序预览和分享文件
  • AI生成内容的版权迷局:GPT-4输出的“创意”版权风险与规避之道
  • 解决服务器 DNS 解析失败,从这几步排查开始
  • MiniCPM-V 4.5 模型解析
  • 代码随想录算法训练营第二天| 209.长度最小的子数组
  • 变频器实习DAY42 VF与IF电机启动方式