是否需要通过 TCP 进行应用程序级重传和确认?

2023-12-02

我有以下疑问:

1) TCP 是否保证数据包的传送,因此如果使用的传输协议是 TCP,则是否需要应用程序级重传。假设我已经在客户端和服务器之间建立了 TCP 连接,并且服务器向客户端发送消息。然而,客户端离线并仅在 10 小时后返回,那么 TCP 堆栈是否会处理重新传输并将消息传递给客户端,或者服务器上运行的应用程序是否需要处理它?

2) 与上述问题相关的是,如果传输协议是TCP,是否需要应用程序级ACK。应用程序 ACK 的原因之一是,如果没有它,应用程序将不知道远程端何时收到消息。除此之外还有什么原因吗?意思是消息本身的传递是否得到保证?


TCP 是否保证数据包的传送,因此如果使用的传输协议是 TCP,则是否需要应用程序级重传

TCP 保证将消息流字节传送到 TCP 连接另一端的 TCP 层。因此应用程序不必担心重传的细微差别。然而,在将其视为绝对之前,请先阅读我的答案的其余部分。

然而,客户端离线并仅在 10 小时后返回,那么 TCP 堆栈是否会处理重新传输并将消息传递给客户端,或者服务器上运行的应用程序是否需要处理它?

不,不是真的。尽管 TCP 对各个 TCP 数据包具有一定程度的重试逻辑,但如果远程端点断开连接,它也无法执行重新连接。换句话说,它最终会“超时”等待从远程端获取 TCP ACK 并进行几次重试。但最终会放弃并通过套接字接口通知应用程序远程端点连接处于死亡或关闭状态。典型的模式是,当客户端应用程序检测到它丢失了与服务器的套接字连接时,它要么向应用程序的用户界面报告错误,要么重试连接。无论哪种方式,如何处理失败的 TCP 连接都是应用程序级别的决定。

如果传输协议是 TCP,是否需要应用程序级 ACK

是的,一点没错。大多数客户端-服务器协议都有一些消息请求/响应对的概念。 TCP 套接字只能向应用程序指示应用程序“发送”的数据是否已成功排队到内核的网络堆栈。它不保证远程端套接字顶部的应用程序实际上“得到它”或“处理它”。当处理消息时,TCP 之上的协议应该提供某种响应指示。这里使用 HTTP 作为一个很好的例子。想象一下,如果应用程序向服务器发送 HTTP POST 消息,但服务器没有确认(例如 200 OK)。客户端如何知道服务器处理了它?

在网络地址转换器 (NAT) 和代理服务器的世界中,空闲的 TCP 连接(彼此之间没有数据)可能会失败,因为 NAT 或代理代表实际端点关闭连接,因为它感知到缺少数据发送。解决方案是采用某种周期性的“ping”和“pong”协议,应用程序可以通过该协议在没有数据要发送的情况下保持 TCP 连接处于活动状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否需要通过 TCP 进行应用程序级重传和确认? 的相关文章

  • 套接字返回“没有这样的文件或目录”

    Linux 海湾合作委员会 4 4 2 我正在做一些套接字编程 但是 当我尝试从套接字函数分配 sockfd 时 我不断收到此错误 Socket operation on non socket 非常感谢您的任何建议 if defined l
  • 用 C 语言进行非阻塞 udp 套接字编程:我能得到什么?

    我在理解从非阻塞 UDP 套接字返回什么recv recvfrom 时遇到问题 与 TCP 相比更具体一点 如果我错了 请纠正我 阻塞套接字 TCP 或 UDP 在缓冲区中有一些数据之前不会从 recv 返回 这可以是一定数量的字节 TCP
  • socketcan如何处理仲裁?

    我非常了解 CAN 协议的工作原理 当两个节点尝试同时使用网络时 较低 id 的 CAN 帧会获得优先级 而另一个节点会检测到这一点并停止 当使用 socketcan 时 这似乎被抽象化了 我们只需像任何文件描述符一样写入和读取 我可能误解
  • TCP 中推送标志和紧急标志之间的区别

    我试图理解带有标志的 TCP 段之间的区别PSH和旗帜URG 我阅读了 RFC 但仍然无法获取它 其中一个在将数据发送到进程之前是否缓冲数据 而另一个则没有 它们是两种截然不同的机制 PSH 和 PUSH 函数 当您发送数据时 您的TCP缓
  • Python - 将整数或字符串发送到 Spark-Streaming

    我可以通过 CSV 文件发送我的数据 首先 将我的随机数写入CSV文件然后发送 但是可以直接发送吗 我的套接字代码 import socket host localhost port 8080 s socket socket socket
  • 什么时候 htonl(x) != ntohl(x) ? (或者什么时候在同一台机器上网络字节顺序的转换不等效?)

    关于htonl http linux die net man 3 htonl and ntohl http linux die net man 3 htonl 这两行代码何时计算结果为 false htonl x ntohl x htonl
  • 无法连接到非阻塞套接字

    这让我抓狂 我必须在 php 5 3 中创建一个非常简单的非阻塞套接字脚本 其中客户端连接到服务器 两者都使用非阻塞套接字 我试过了phpsocket守护进程 http code google com p phpsocketdaemon 和
  • C# 套接字数据报溢出

    我是 C 新手 我有一个关于udp套接字的小问题 我有一个聊天服务器 它接收特定结构的数据包 udp 数据报 为什么程序在套接字缓冲区已满时才接收数据 难道以后的一切就不应该失去吗 也许会出现数据包碎片 数据包结构 udp headers
  • ConnectionTimeout 与 SocketTimeout

    我正在使用的库有问题 可能是图书馆的问题 也可能是我用错了 基本上 当我这样做时 超时以毫秒为单位 ignitedHttp setConnectionTimeout 1 v short ignitedHttp setSocketTimeou
  • python 中的原始套接字和 sendto

    我正在努力将 scapy 与twisted 集成 但我在 OSX 上遇到了这个非常奇怪的错误 我似乎无法弄清楚 基本上我无法通过原始套接字发送有效的 TCP 数据包 包括 IP 标头 这就是我正在做的 import socket from
  • Ubuntu:无法通过套接字“/var/run/mysqld/mysqld.sock”连接到本地 MySQL 服务器 (2)

    我有 Ubuntu 14 04 安装了 LAMP 并运行 Owncloud 的服务器 我尝试安装文书工作 https github com twostairs paperwork wiki Installing Paperwork on U
  • SO_REUSEPORT 可以在 Unix 域套接字上使用吗?

    Linux 内核 gt 3 9 允许通过设置在内核负载平衡的进程之间共享套接字SO REUSEPORT http lwn net Articles 542629 http lwn net Articles 542629 这如何用于类型的套接
  • 10G 链路的 netcat 和 iperf 结果存在巨大差异

    我很困惑看到 netcat 和 iperf 结果之间的巨大差异 我有 10 G 链路连接我的服务器和客户端 iperf 的速度约为 10Gb s 但 netcat 的速度仅为约 280 MB s 可能是什么错误 对于 Iperf Serve
  • Flask / Werkzeug - 套接字卡在 CLOSE_WAIT 中

    我遇到过一种情况 API 构建于Flask 宁静 https github com flask restful flask restful间歇性变得无反应 目前它从 Werkzeug 运行 我知道它仅用于非生产用途 并且是单线程的 让事情变
  • 使用 TcpClient 通过 C# 通过 TCP 发送多个文件

    我正在尝试使用 C TcpClient 通过 TCP 发送多个文件 对于单个文件来说它效果很好 但是当我有多个文件时 它只发送第一个文件 这是我的代码 发送文件 try TcpClient tcpClient new TcpClient N
  • 选择时的套接字阻塞和超时

    我目前正在创建一个回显服务器 该服务器在空闲 maxWaitTime 后断开客户端连接 我希望程序会阻塞套接字 直到客户端发送数据 但是当我在 gdb 中运行该程序时 它会通过 select 并阻塞 Readline 我知道 retval
  • express.io VS express + socket.io 有什么用处?

    我在这里发现了 socket io 和聊天示例 https github com rauchg chat example blob master index js https github com rauchg chat example b
  • Java 客户端到服务器未知来源

    我有一个简单的乒乓球游戏 需要通过网络工作 服务器将创建一个带有球和 2 个球棒位置的游戏 当客户端连接到服务器时 服务器将创建一个名为 PongPlayerThread 的新类 它将处理客户端到服务器的输入和输出流 我的服务器工作100
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • 如何在Windows上模拟socket.socketpair

    标准Python函数套接字 套接字对 https docs python org 3 library socket html socket socketpair不幸的是 它在 Windows 上不可用 从 Python 3 4 1 开始 我

随机推荐

  • 如何修复 Core Image 的 CILanczosScaleTransform 滤镜边框伪影?

    我想为 iOS 实现图像缩小算法 读完核心图像后CILanczosScaleTransform非常适合它 我通过以下方式实现了它 public func resizeImage image UIImage targetWidth CGFlo
  • 在扩展方法中更改数组大小不起作用?

    所以基本上我写了我的小Add数组类型的扩展方法 using System using System Linq public static class Extensions public static void Add
  • MVC(3) 句柄更新

    我正在经历Codeplex 上的本教程 这是 MusicStore 应用程序 在一个场景中 它是将音乐唱片添加到购物篮中 然后它还允许用户删除它 根据我的理解 它是通过在 Controller 中实现的 Ajax 回发来实现的 让我困惑的是
  • 如何在mysql的select中使用if/else条件

    如何在 mysql 中的 select 语句上使用 if else 条件 如果类型 初始读取 Select the Initial Column from table name否则如果 Type 最终读取 Select the Final
  • AngularJs动态下载响应

    我写了一个基于指令斯科特的回答 你会像这样使用它
  • jqgrid - 工具栏文本 - 这是一个好方法吗?

    我已指定userdata在 JSON 响应中 取决于值title财产 标题将发生变化以反映title财产 工具栏中的文本 网格标题和数据表标题之间 将发生变化 HTML table table div div JSON colModel n
  • 如何使用 CSS 拆分表格单元格中的字符串(例如长 URL)?

    情况是这样的 我正在尝试一些 MySpace 页面自定义 如果你有曾经尝试过 stackoverflow 我相信您明白这有多么令人沮丧 基本上它可以通过 CSS 在一组特定的规则内进行自定义 例如不允许使用 字符 多么有用 看看这个blog
  • if 语句中多个条件的 Python 简写[重复]

    这个问题在这里已经有答案了 if x y z print x y 这是 if x y and y z 的简写吗 它在我的代码中有效 但我不确定当多个条件不都是 或 时如何解释 或者以上面的后一种形式写出 是的 如中所述文档 比较可以是任意链
  • 如何在 MATLAB 中为符号变量赋予数字?

    我尝试使用以下代码在 MATLAB 中声明一个符号变量 syms a 我对这个变量进行了计算 一切都很好 但我的问题是 我不知道如何给变量一个数字并得到数字结果 例如我的代码的答案是 answer exp 10 a 例如我想给 a 40并得
  • 当更新 sphinx.conf 中的索引时,总是需要在 sphinx 中重新启动 searchd 吗?

    如果我更新 sphinx conf 文件中的资源 我可以使用 rotate 重新索引 一切正常 如果我更新 sphinx conf 中的索引或添加新索引 rotate 不起作用 我必须重新启动 searchd 我这样做是否正确 我觉得 ro
  • 当不涉及真正的 I/O 调用时,异步链的所有级别是否都需要ConfigureAwait(false)?

    在 Azure Document Db Client SDK 之上实现可重用适配器类型的库 该库可以在任何地方运行 不仅可以在 ASP NET Core Web 服务中运行 还可以在命令行应用程序 ASP NET Web Api 等中运行
  • R 中的 Unicode 变量名称

    我正在开发一个玩具项目 并尝试使用一些 unicode 变量名称来匹配我试图实现的论文 以下代码在 Windows 上的 R 3 4 3 RStudio 版本 1 1 456 和 OSX 上的 R 3 5 1 上运行良好 gt lt fun
  • 如何将 Thunderbird 扩展与 Lightning 集成

    我目前正在为一个项目进行初步研究 如果可行的话 该项目将包含带有 Lightning 集成的 Thunderbird 扩展 我的问题是这样的 如何使用 Thunderbird 扩展以编程方式更改 Lightning 中的 CSS 具体来说
  • Rails 2.3.9 查询参数的编码

    是否可以让rails 将查询参数解码为utf8 如果我有类似 foo param 的东西 我尝试访问控制器中的参数 该参数被编码为 ASCII 8BIT 这会导致很多事情被破坏 因为我们的许多其他字符串都是用 UTF 8 编码的 而 rub
  • 获得授权属性的许可?

    我已经实现了我自己的Authorize属性 我注意到当我使用时它会查询以检查权限 Authorize 有什么方法可以获取该权限并在应用该权限的当前控制器中使用它Authorize属性而无需重写和重新查询控制器中的代码 是的你可以 如果您将
  • iOS 8 下不显示键盘

    当专注于我的应用程序的文本字段时 它们都无法调出键盘 我无法输入任何字母 不过iOS 8之前还可以 我尝试旋转屏幕 发现键盘显示在屏幕范围之外 检查视图框架 它是1024 768 似乎是正确的 最后发现是模拟器的问题 不是iOS 8的bug
  • 无法转换为尺寸:膨胀布局时类型=0x1 [重复]

    这个问题在这里已经有答案了 我的 XML 文件
  • 正则表达式 - 如何用 PHP 替换字符串的最后 3 个单词

    尝试将最后 3 个单词封装在 span tag str Lorem ipsum dolor sit amet h2 preg replace w s w s w span 1 span str 这里是 h2 preg replace w s
  • 使用 Pyspark 进行虚拟编码 [重复]

    这个问题在这里已经有答案了 我希望使用 Pyspark 语法将分类变量虚拟编码为数值变量 如下图所示 我读入这样的数据 data sqlContext read csv data txt sep header true 在 python 中
  • 是否需要通过 TCP 进行应用程序级重传和确认?

    我有以下疑问 1 TCP 是否保证数据包的传送 因此如果使用的传输协议是 TCP 则是否需要应用程序级重传 假设我已经在客户端和服务器之间建立了 TCP 连接 并且服务器向客户端发送消息 然而 客户端离线并仅在 10 小时后返回 那么 TC