问题标签 [network-protocols]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
language-agnostic - 使用 TCP 的 connect() 行为
我在客户端调用 connect()。客户端进入 SYN_SENT 状态并发送一个 SYN。现在它得到一个没有 ACK 的 SYN,所以客户端进入 SYN_RCVD 状态。
此时 connect() 是否返回?从技术上讲,您有足够的信息可以在套接字上调用 send() 和 recv()。RFC 本身说,如果您在 SYN_RCVD 状态的套接字上调用 SEND,则:
而且,如果您致电 RECEIVE:
所以我的问题是:connect() 在获得 SYN 后是否返回,然后对 recv() 的调用会阻塞,还是 connect() 本身会阻塞,直到连接完全建立?
c++ - 对于 boost-asio 网络编程,处理响应的最佳方法是什么?
我是网络编程的新手,尤其是异步进程。从 boost-lib 开始
我正在实现一个类,以访问 imap 服务器。一般来说,我可以发送和接收命令和响应
响应在类内的出列队列中排队。我将简单的响应行放入队列中,以供进一步处理。
现在处理排队响应的最佳方法是什么?
- 一个额外的线程来检查(基于时间)队列,是否有新条目?
- 每次将新条目推送到队列时都会进行一些回调?
如何实现和集成此回调?
也许有人对此有一个简短的例子。
谢谢
firewall - 如何编写代码以与 Skype 类似的方式通过 NAT?
有谁知道,Skype 如何重定向 NAT 和防火墙?
xna - 可用的游戏网络协议定义语言和代码生成
我一直在寻找一个好的通用二进制网络协议定义框架,以提供一种以多种语言(例如 Java 后端服务器和 iPhone 前端)编写实时游戏服务器和客户端(想想魔兽世界或雷神之锤 III)的方法用 Objective-C 和 Cocoa 编写的客户端)。
我想支持 Windows 上的 Java Flash 客户端、iPhone 客户端和 C# 客户端(以及 XBOX 上的 XNA 客户端)。
我正在寻找一种通过 TCP/IP 或 UDP 套接字流连接有效发送/接收消息的方法。我不是在寻找可以通过 HTTP Web 服务发送的东西,比如 JSON 或 XML 编组对象。虽然 Hessian 的二进制 web 服务协议是一个非常有趣的解决方案
我想要一种网络协议格式和客户端/服务器基本实现,它允许客户端连接到服务器并在定义的协议中发送任何消息并在协议中接收任何消息,而无需绑定到某种 RPC 端点。我想要在我的协议传入和传出的任何消息的通用流。这样我就可以支持服务器每 100 毫秒向所有客户端发送游戏中各种实体的位置之类的东西。
http - Which encoding is used by the HTTP protocol?
When a browser sends an HTTP request to a web server, what encoding is used to encode the HTTP protocol on the wire? Is it ASCII? UTF8? or UTF16? Or does it specify which encoding it uses in a predefined format (before any decoding takes place?)
P.S
I'm not asking about the actual payload (e.g. HTML) of the request/response. I'm asking about the request line (i.e. GET /index.html HTTP/1.1
) and headers (i.e. Host: google.com
)
c# - 你将如何解决这个数据解析问题?
我们正在为同时开发的一个硬件实现一个模拟器。这个想法是为第 3 方提供一个软件解决方案来测试他们的客户端软件,并为硬件开发人员提供一个参考点来实现他们的固件。
为硬件编写协议的人使用了名为 INCA_XDR 的自定义版本的 SUN XDR。它是一个序列化和反序列化消息的工具。它是用 C 语言编写的,我们希望避免使用任何本机代码,因此我们手动解析协议数据。
该协议本质上相当复杂,数据包可以有许多不同的结构,但它始终具有相同的全局结构:
[头部] [介绍] [数据] [尾部]
如您所见,有很多开销数据,但这是因为该协议需要同时使用 RS232(点对多点)和 TCP/IP (p2p)。
或者它可能具有完全不同的结构:
有时它只是一个 DRCode,没有额外的数据。
基于组和类型字段,模拟器需要执行某些操作。因此,首先我们查看这两个字段,并在此基础上了解对数据的期望,并且必须正确解析它。
然后需要生成响应数据,该数据又具有许多不同的数据结构。一些消息只是生成一个 ACK 或 NACK 消息,而另一些则生成一个带有数据的真实回复。
我们决定把事情分成小块。
首先是 IDataProcessor。
实现此接口的类负责验证原始数据并生成 Message 类的实例。他们不负责通信,他们只是传递一个字节[]
原始数据验证意味着检查标头中的校验和、CRC 和长度错误。
生成的消息被传递给实现 IMessageProcessor 的类。即使原始数据被认为是无效的,因为 IDataProcessor 没有响应消息或其他任何东西的概念,它所做的只是验证原始数据。
为了通知 IMessageProcessor 有关错误,向 Message 类添加了一些附加属性:
它们与协议无关,只存在于 IMessageProcessor
IMessageProcessor 是完成真正工作的地方。由于所有不同的消息组和类型,我决定使用 F# 来实现 IMessageProcessor 接口,因为模式匹配似乎是避免大量嵌套 if/else 和 caste 语句的好方法。(我之前没有使用过 F# 甚至是 LINQ 和 SQL 以外的函数式语言)
IMessageProcessor 分析数据并决定它应该在 IHardwareController 上调用哪些方法。拥有 IHardwareController 似乎是多余的,但我们希望能够将它换成不同的实现,而不是被迫使用 F#。当前的实现是一个 WPF 窗口,但它可能是一个 Cocoa# 窗口或只是一个控制台。
IHardwareController 还负责管理状态,因为开发人员应该能够通过用户界面操作硬件参数和错误。
因此,一旦 IMessageProcessor 调用了 IHardwareController 上的正确方法,它就必须生成响应消息。同样......这些响应消息中的数据可以有许多不同的结构。
最终,IDataFactory 用于将 Message 转换为原始协议数据,准备好发送到负责通信的任何类。(例如,可能需要对数据进行额外封装)
编写这段代码并不“难”,但所有不同的命令和数据结构都需要大量代码,而且我们可以重用的东西很少。(至少就我现在所见,希望有人能证明我错了)
这是我第一次使用 F#,所以我实际上是边学边学。下面的代码远未完成,可能看起来像一团糟。它只实现了协议中的所有消息中的一小部分,我可以告诉你有很多很多。所以这个文件会变得很大!
重要提示:字节顺序通过网络反转(历史原因)
(请注意,在真实来源中,类有不同的名称,比“硬件”更具体)
我希望得到建议、改进代码的方法,甚至是处理问题的不同方法。例如,使用 IronPython 等动态语言会不会让事情变得更容易,我是不是走错了路。你对这样的问题有什么经验,你会改变什么,避免什么等等......
更新:
根据布赖恩的回答,我写下了以下内容:
我可以继续为所有 DR 类型(很多)执行此操作,但我仍然不明白这对我有什么帮助。我已经在 Wikibooks 和 F# Foundations 中读到过它,但我的脑海中还没有出现什么问题。
更新 2
所以,我知道我可以执行以下操作:
但是当消息进入 IMessageProcessor 时,就可以选择它是什么类型的消息,然后调用适当的函数。以上只是附加代码,至少这是理解它的方式,所以我真的在这里错过了这一点......但我没有看到它。
tcp - 应用程序级别的校验和作为 tcp 校验和可能太弱了?
这篇论文(当 CRC 和 TCP 校验和不一致时)表明,由于 TCP 校验和算法相当弱,使用 TCP 时每 1600 万到 100 亿个数据包就会发生未检测到的错误。
是否有任何应用程序开发人员通过在应用程序级别添加校验和来保护数据免受此类错误的影响?
在执行 EJB 远程方法调用 (Java EE 5) 时,是否有任何模式可用于防止此类错误?或者 Java 是否已经自动校验和序列化对象(除了底层网络协议)?
企业软件已经在计算机上运行,不仅执行内存 ECC,而且还在 CPU 内的寄存器等(SPARC 和其他)处进行错误检查。使用 Solaris ZFS 可以防止存储系统(硬盘驱动器、电缆等)的位错误。
因为 TCP,我从不害怕网络误码——直到我看到那篇文章。
为一些非常少的客户端服务器远程接口实现应用程序级校验和可能不是很多工作。但是,在单个数据中心的多台机器上运行的分布式企业软件呢?可能有大量的远程接口。
SAP、甲骨文等企业软件供应商是否都忽略了这类问题?银行呢?股票交易软件呢?
跟进:非常感谢您的所有回答!因此,检查未检测到的网络数据损坏似乎非常罕见 - 但它们似乎确实存在。
难道我不能简单地通过将 Java EE 应用程序服务器(或 EJB 部署描述符)配置为使用 RMI over TLS 并将 TLS 配置为使用 MD5 或 SHA1 并通过配置 Java SE 客户端来解决这个问题吗?这是否是一种获得可靠透明校验和的方法(尽管通过矫枉过正),这样我就不必在应用程序级别实现它?还是我完全混淆了网络堆栈?
java - Java 中无法访问 UDP 客户端
我正在运行一个简单的 UDP Java 服务器,它在连接时收集客户端的 IP 和端口,将信息存储在数据库中。
客户端仍在监听服务器。服务器停止。
之后,服务器想重用数据库信息,到达客户端;并且由于客户端仍在侦听服务器的同一端口,我猜客户端应该接收通信。
我是 UDP 新手,请告诉我实现上述目标的方法。谢谢你。
让我重新表述这个问题,因为我确实尝试了 Stackoverflow 成员建议的方法。
服务器可以在很短的时间内联系到客户端,但在 10 分钟后客户端无法访问;虽然看起来客户端一直准备好监听服务器,但是即使尝试了几次,服务器也无法到达客户端。这可能是什么原因?请让我知道处理这个问题的方法
networking - 为什么我无法通过非浏览器应用程序连接到此 url?
任何人都知道为什么这个 url 拒绝非浏览器应用程序发送的连接请求(wget、curl、elinks!):http ://sube.garanti.com.tr
https://sub.garanti.com.tr/isube/login/en
这是我的银行帐户,我正在尝试使用脚本进行转账,但正如您所见,这个超级安全的服务器不允许我这样做。
有什么建议么?
阿泽
c# - C#中的可靠多播
在 c#/.Net 3.5 中,我有哪些可靠多播的选项?
我不想使用 MSMQ。
我对商业和开源选项持开放态度。
谢谢