草庐IT

tcp - 在接受之前拒绝 TCP 连接?

coder 2023-09-17 原文

winsock 中有 3 个不同的 accept 版本。除了符合标准的基本 accept 之外,还有 AcceptEx 似乎是最先进的版本(由于它具有重叠的 io 功能),以及 WSAAccept。后者支持条件回调,据我所知,它允许在连接请求被接受之前拒绝它们(当启用 SO_CONDITIONAL_ACCEPT 选项时)。其他版本均不支持此功能。

因为我更喜欢使用重叠 io 的 AcceptEx,我想知道为什么这个功能只在更简单的版本中可用?

我不太了解 TCP 的内部工作原理,无法判断在连接被接受之前拒绝连接和在连接建立后立即断开套接字之间实际上有什么区别吗?如果有,是否有任何方法可以使用 AcceptEx 模拟 WSAAccept 功能?

有人可以阐明这个问题吗?

最佳答案

建立连接后,远程端会发送一个设置了SYN 标志的数据包。服务器用SYN,ACK 数据包应答,然后远程端发送一个ACK 数据包,其中可能已经包含数据。

有两种方法可以中断 TCP 连接的形成。第一个是重置连接——这与连接到没有人监听的端口时看到的常见“连接被拒绝”消息相同。在这种情况下,原始的SYN 数据包被一个RST 数据包应答,它立即终止连接并且是无状态的。如果 SYN 被重新发送,RST 将从每个收到的 SYN 数据包生成。

第二个是一旦建立就关闭连接。在 TCP 级别,无法立即关闭双向连接 - 您唯一可以说的是“我不会再发送任何数据”。发生这种情况是为了当初始 SYNSYN,ACKACK 交换完成时,服务器发送一个 FIN 数据包到远端。在大多数情况下,用 FIN 告诉另一端“我不会再发送任何数据”会使另一端也关闭连接,并发送它自己的 FIN 数据包。以这种方式终止的连接与由于某种原因没有发送数据的正常连接没有任何不同。这意味着 TCP 连接的正常状态跟踪和挥之不去的关闭状态将持续存在,就像正常连接一样。

现在,在 C API 方面,这看起来有点不同。在端口上调用 listen() 时,操作系统开始接受该端口上的连接。这意味着它开始向连接回复 SYN,ACK 数据包,无论 C 代码是否调用了 accept()。因此,在 TCP 端,连接是在接受之前还是之后以某种方式关闭没有区别。唯一的额外问题是监听套接字有积压,这意味着在它开始向远程端发出 RST 之前它可以等待的未接受连接的数量。

但是,在 Windows 上,SO_CONDITIONAL_ACCEPT 调用允许应用程序控制积压队列。这意味着服务器不会对SYN 数据包做出任何 响应,直到应用程序对连接进行操作。这意味着,在此级别拒绝连接实际上可以在不创建状态的情况下向网络发送 RST 数据包。

因此,如果您无法以某种方式在您正在使用 AcceptEx 的套接字上启用 SO_CONDITIONAL_ACCEPT 功能,它将以不同的方式显示在网络上。然而,实际上并没有多少地方使用直接的 RST 功能,所以我认为对此的要求一定意味着一个非常专业的系统。对于大多数常见用例,接受套接字然后关闭它是正常的行为方式。

关于tcp - 在接受之前拒绝 TCP 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1752219/

有关tcp - 在接受之前拒绝 TCP 连接?的更多相关文章

  1. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  2. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  3. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  4. ruby - rbenv 安装权限被拒绝 - 2

    大家好,我正在尝试设置一个开发环境,并且我一直在关注以下教程:Linktotutorial我做得不是很好,除了最基本的版本控制内容外,我对终端命令没有任何实际经验。我点击了第一个链接并尝试运行source~/.bash_profile我得到了错误;mkdir:/usr/local/rbenv/shims:权限被拒绝mkdir:/usr/local/rbenv/versions:权限被拒绝现在每次我加载终端时都会出现错误。bash_profile的内容;exportPATH=/usr/local/rbenv/bin:$PATHexportRBENV_ROOT=/usr/local/rbe

  5. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  6. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  7. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  8. ruby - 在好的 Ruby 代码中没有注释是否被认为是可以接受的? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭5年前。Improvethisquestion我审查了一些用Ruby编写的专业代码,没有发现任何评论。代码读起来相当清晰,但没有self记录。我应该期望专业编写的Ruby代码有注释吗?或者,是否有一些Ruby原则认为注释不是必需的?

  9. ruby-on-rails - 在所有延迟的作业之前 Hook - 2

    是否可以在所有delayed_job任务之前运行一个方法?基本上,我们试图确保每个运行delayed_job的服务器都有我们代码的最新实例,所以我们想运行一个方法来在每个作业运行之前检查它。(我们已经有了“check”方法并在别处使用它。问题只是关于如何从delayed_job中调用它。) 最佳答案 现在有一种官方方法可以通过插件来做到这一点。这篇博文通过示例清楚地描述了如何执行此操作http://www.salsify.com/blog/delayed-jobs-callbacks-and-hooks-in-rails(本文中描述

  10. ruby-on-rails - 连接字符串时如何在 <%=%> block 内输出 html_safe? - 2

    考虑一下:现在这些情况:#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2#output:http://domain.com/?foo=1&bar=2我需要用其他字符串输出URL。我如何保证&符号不会被转义?由于我无法控制的原因,我无法发送&。求助!把我的头发拉到这里:\编辑:为了澄清,我实际上有一个像这样的数组:@images=[{:id=>"fooid",:url=>"http://

随机推荐