理解TCP半关闭:像水管一样的网络连接控制

从全关闭到半关闭:为什么需要这种机制?

想象你和朋友正在通电话讨论一个重要项目:

  • 全关闭:就像突然挂断电话,双方都无法再说话
  • 半关闭:你说"我说完了,你还有什么要补充的吗?"——你不再说话但还能听对方说

这正是TCP半关闭的实际意义。在网络编程中,有时我们需要这种"我说完了但还想听你说"的状态。

深入理解套接字和"流"

在这里插入图片描述

1. 什么是套接字流?

把两台主机之间的TCP连接想象成连接两个水桶的两根水管:

  • 一根水管负责A→B的数据流动(输出流)
  • 另一根负责B→A的数据流动(输入流)
  • 这两根水管共同组成了一个完整的套接字连接

2. 为什么流是单向的?

这与现实中的水管原理相同:

  • 水只能单向流动(靠压力差)
  • 要实现双向流动必须用两根独立的水管
  • 关闭其中一根不影响另一根的工作

shutdown()函数:精准的流量控制阀门

shutdown()函数就像水管上的精密阀门,可以单独关闭某一方向的流动:

#include <sys/socket.h>int shutdown(int sockfd, int how);

how参数选项

  • SHUT_RD:关闭输入流(不再接收数据)
  • SHUT_WR:关闭输出流(不再发送数据)
  • SHUT_RDWR:同时关闭(等同于close)

典型应用场景

  1. 文件传输结束通知

    • 发送方传完文件后关闭输出流
    • 但仍保持输入流接收确认消息
  2. HTTP协议

    • 客户端发送完请求后可以半关闭输出
    • 等待服务器响应
  3. 数据库查询

    • 发送完SQL语句后可以半关闭
    • 只保留接收结果的通道

文件传输实战:如何正确使用半关闭

发送方代码框架

// 1. 发送文件数据
while ((read_cnt = fread(buf, 1, BUF_SIZE, fp)) > 0) {write(sock, buf, read_cnt);
}// 2. 半关闭:通知接收方数据已发完
shutdown(sock, SHUT_WR); // 3. 接收确认消息
read(sock, buf, BUF_SIZE); 
printf("Server message: %s\n", buf);// 4. 完全关闭
close(sock);

接收方代码框架

// 1. 接收文件数据
while ((read_cnt = read(sock, buf, BUF_SIZE)) > 0) {fwrite(buf, 1, read_cnt, fp);
}// 2. 收到EOF(发送方已SHUT_WR)
printf("File transfer complete\n");// 3. 发送确认消息
write(sock, "File received", 13);// 4. 完全关闭
close(sock);

缓冲区设计的艺术

在文件传输中,缓冲区大小设置很有讲究:

  1. 不必过分追求精确

    • TCP本身会处理分包和重组
    • 常见缓冲区大小(如4K、8K)通常效果很好
  2. 平衡内存和效率

    #define BUF_SIZE 4096 // 4K缓冲区是个不错的起点
    char buf[BUF_SIZE];
    
  3. 循环读写是关键

    • 必须循环直到处理完所有数据
    • 单次读写不能假设处理了全部数据

半关闭的注意事项

  1. 资源释放

    • shutdown后仍需close释放套接字资源
    • 半关闭不是完全的资源释放
  2. 状态感知

    • 接收方read返回0表示对方已SHUT_WR
    • 这是判断半关闭的重要标志
  3. 错误处理

    if (shutdown(sock, SHUT_WR) == -1) {perror("shutdown error");// 错误处理逻辑
    }
    
  4. 协议设计

    • 应用层协议需要明确半关闭的含义
    • 避免接收方无限等待

为什么不是所有场景都需要半关闭?

就像不是所有通话都需要"你说完了吗?"的确认:

  • 简单请求-响应:不需要
  • 持续对话:不需要
  • 但以下情况很有价值:
    • 大文件传输
    • 需要明确结束标志的协议
    • 需要接收确认的长连接

总结

TCP半关闭提供了比close更精细的连接控制能力:

  1. 更优雅的结束方式:明确传达结束意图
  2. 更高效的资源利用:避免不必要的等待
  3. 更灵活的协议设计:支持复杂交互模式

掌握半关闭技术,能让你的网络程序像优秀的电话沟通一样:知道何时该说,何时该听,何时可以礼貌地结束对话。这种精准控制正是高级网络编程的重要技能之一。
制能力:

  1. 更优雅的结束方式:明确传达结束意图
  2. 更高效的资源利用:避免不必要的等待
  3. 更灵活的协议设计:支持复杂交互模式

掌握半关闭技术,能让你的网络程序像优秀的电话沟通一样:知道何时该说,何时该听,何时可以礼貌地结束对话。这种精准控制正是高级网络编程的重要技能之一。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88995.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88995.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88995.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

衡石科技技术手册--仪表盘过滤控件详解

过滤控件说明 过滤控件 的定义 过滤控件用于在仪表盘中过滤图表数据&#xff0c;分为仪表盘内过滤控件和全局过滤控件。 过滤控件结构说明 字段类型描述uidSTRING过滤控件唯一识别 idappIdLONG过滤控件所属的应用 iddataAppIdLONG字段来源是数据包时的数据包 iddashboar…

ASP.NET Core中数据绑定原理实现详解

在ASP.NET Core 中&#xff0c;数据绑定是将 HTTP 请求中的数据&#xff08;如表单、查询字符串、请求体等&#xff09;映射到控制器动作方法参数或模型对象的过程。以下将从原理、核心组件、执行流程及关键机制等方面详细解析其实现逻辑。 一、数据绑定的核心原理与组件 1. 数…

牛客:HJ24 合唱队[华为机考][最长递增子集][动态规划]

学习要点 求最长递增字列求最长递减子列 题目链接 合唱队_牛客题霸_牛客网 题目描述 解法&#xff1a;动归求最长递增子列 #include <iostream> #include <vector> using namespace std;int main() {int n;while (cin >> n) {// 输入的数组int tmp;vect…

C语言的相关基础概念和常用基本数据类型

1.相关概念变量与常量的定义常量&#xff1a;在程序运行中其值不能改变的量。变量&#xff1a;在程序运行中其值可以改变的量。存储器的区分 RAMROM中文名易失存储器不易失存储器特点掉电丢失数据&#xff0c;但存取快掉电不丢失数据&#xff0c;但存取幔标识符标识符只能…

Spring boot整合dubbo+zookeeper

Spring boot整合dubbozookeeper 下文将简述springboot整合dubbozookeeper实现apiproviderconsumer模式&#xff0c;Api用于定于interface,provider和consumer依赖Api,provider实现api接口&#xff0c;consumer调用provider。 spring boot版本&#xff1a;3.5.3 jdk版本&#xf…

ImportError: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32‘ not found

简介&#xff1a;在复现 VLM-R1 项目并尝试将其中的 GRPO 算法应用到自己的任务时&#xff0c;按照官方文档配置好环境后&#xff0c;运行过程中遇到了一个非常离谱的错误&#xff1a; ImportError: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32 not found 这个问题极…

基于Spring Boot的生活用品电商网站的设计与实现

第1章 摘要随着电商行业的飞速发展&#xff0c;生活用品电商网站作为线上购物的一部分&#xff0c;逐渐成为消费者日常购物的重要渠道。为提升网站的管理效率和用户体验&#xff0c;设计并实现了一款基于Spring Boot的生活用品电商网站。该系统通过合理的架构设计&#xff0c;提…

数据结构 单链表(1)

1.概念和结构概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。通过指针链接次序实现的要怎么理解呢?这是一张链表的结构图:与顺序表不同的是&#xff0c;链表里的每节“车厢” (仔细观察这…

Python爬虫实战:研究PyMongo库相关技术

1. 引言 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地获取这些数据并进行存储和分析,成为了数据科学领域的重要研究方向。网络爬虫作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 MongoDB 作为一种流行的 NoSQL 数据库,能够灵…

【世纪龙科技】迈腾B8汽车整车检测与诊断仿真实训系统

在汽车技术日新月异的今天&#xff0c;如何培养既懂理论又精实践的高素质汽修人才&#xff0c;成为职业教育领域亟待突破的课题。江苏世纪龙科技凭借深厚的技术积淀与教育洞察&#xff0c;重磅推出《汽车整车检测与诊断仿真实训系统》&#xff0c;以迈腾B8为原型&#xff0c;通…

.net服务器Kestrel配置Nginx作为反向代理

.NET服务器Kestrel配置Nginx作为反向代理 在ASP.NET Core应用程序的部署过程中&#xff0c;Kestrel是一款轻量级的跨平台Web服务器。不过&#xff0c;直接将其暴露在互联网上并非明智之举。为了增强安全性、提升性能以及提高可伸缩性&#xff0c;我们可以借助Nginx作为反向代理…

MyBatis 在执行 SQL 时找不到名为 name 的参数

MyBatis 在执行 SQL 时找不到名为 name 的参数&#xff0c;因为当接口方法有多个参数时&#xff0c;没有使用 Param(“name”) 明确指定参数名。 其他人说只有springboot1.x的版本才会出现该问题&#xff0c;但是我在使用2.x的版本时也出现了该问题Not found 参数 于是便回根溯…

【Git】git的回退功能

Git 的回退功能非常强大&#xff0c;但因为有多个命令&#xff0c;初学者很容易混淆。我们来系统地梳理一下最核心的几个“回退”指令&#xff1a;git reset、git revert 和 git restore。 我会按照使用场景和安全级别来为你讲解。核心区别&#xff1a;reset vs revert 这是最重…

STM32新建工程

1、新建工程 Keil5中&#xff0c;新建Project&#xff0c;选择STM32Project文件夹&#xff0c;在此文件夹下新建一个文件夹“STM32工程模板”&#xff0c;然后给工程文件起名字“Project”选择器件型号 2、添加启动文件 新建start文件夹复制启动文件&#xff1a;固件库文件夹……

网络传输过程

https传输过程客户端发起HTTPS请求操作&#xff1a;用户在浏览器输入 https://www.example.com 技术细节&#xff1a; 客户端向服务器443端口发起TCP连接 发送Client Hello消息&#xff08;包含支持的TLS版本、加密套件、客户端随机数&#xff09; 安全意义&#xff1a;建立安全…

【LeetCode 3440. 重新安排会议得到最多空余时间 II】解析

目录LeetCode中国站原文原始题目题目描述示例1&#xff1a;示例2&#xff1a;示例3&#xff1a;示例4&#xff1a;讲解1. 新规则&#xff0c;新挑战2. 收益从何而来&#xff1f;两种可能性的诞生3. 我们的终极策略4. 当策略被压缩到极致第一次遍历&#xff1a;从左到右&#xf…

C++卸载了会影响电脑正常使用吗?解析C++运行库的作用与卸载后果

卸载C运行库可能导致常用软件瘫痪&#xff01;这些不起眼的组件为Photoshop、游戏等提供关键支持&#xff0c;多个版本共存是正常现象&#xff0c;随意清理会引发程序报错甚至闪退。一、前言&#xff1a;C不是“编程语言”那么简单很多用户在电脑中看到“Microsoft Visual C Re…

前端vue对接海康摄像头流程

1、拆包摄像头、插电源2、下载SADP&#xff08;设备网络搜索&#xff09;&#xff0c;连接设备&#xff0c;获取ip地址 下载地址&#xff1a;https://partners.hikvision.com/tools 找到自己的设备类型DS开头3、摄像头链接wifi、网线 登录设备预览配置网页-配置网络-可预览等 4…

org.casic.javafx.control.PaginationPicker用法

org.casic.javafx.control.PaginationPicker 是 CASIC&#xff08;或某位作者&#xff09;基于 JavaFX 自制的分页控件&#xff0c;功能比官方 Pagination 更完整&#xff0c;支持&#xff1a;首页 / 上一页 / 下一页 / 尾页按钮页码快速跳转每页条数自定义总数据量、当前页码、…

下载 | Win10 2021精简版,预装应用极少!(7月更新、Win 10 IoT LTSC 2021版、适合老电脑安装)

⏩ 【资源A047】Win10 IoT LTSC 2021精简版 &#x1f536;Windows 10 IoT 企业版 LTSC 2021 正式版更新中。LTSC是长期服务渠道版本&#xff0c;网友俗称“老坛酸菜版”&#xff0c;相当于精简版Win10&#xff0c;精简了很多预装应用&#xff0c;同时更新频率也更低&#xff0c…