- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对我来说,数据包碎片是如何发生的似乎非常模糊,因为它从未在我的本地测试中发生过,而且在通知我的应用程序我实际收到一些信息之前,我不知道该怎么做才能处理碎片化的数据包。
这是我从连接的客户端套接字接收的方式
var asynchronousState = (AsynchronousState) ar.AsyncState; // AsynchronousState is an entity that Holds each connected socket's Buffer, IPEndPoint and so on...
try {
Socket socket = asynchronousState.Socket;
int length = socket.EndReceive(ar);
if (0 != length) {
if (null != ClientReceive) {
var bytes = new byte[length];
Array.Copy(asynchronousState.Buffer, bytes, length);
ClientReceive(asynchronousState, bytes);
Array.Clear(asynchronousState.Buffer, 0, asynchronousState.Buffer.Length);
}
if (socket.Connected) {
socket.BeginReceive(asynchronousState.Buffer, 0, asynchronousState.Buffer.Length, SocketFlags.None, HandleAsyncReceive, asynchronousState);
return;
}
}
DisposeSocket(asynchronousState);
}
catch (SocketException exception) {
if (exception.SocketErrorCode != SocketError.Disconnecting &&
exception.SocketErrorCode != SocketError.NotConnected &&
exception.SocketErrorCode != SocketError.ConnectionReset &&
exception.SocketErrorCode != SocketError.ConnectionAborted &&
exception.SocketErrorCode != SocketError.Shutdown) {
Console.WriteLine(exception);
Core.Logger.Log(exception);
}
DisposeSocket(asynchronousState);
}
我如何构建我的数据包
public class ExchangeMessage : PacketStructure //Packet Structure is a custom builder similar to `BinaryWrite/Reader` : This returns a byte[] or builds from a byte[]
{
public int Length;
public int Type;
public byte[] PublicKey
{
get { return ReadArray(140, 4); }
set { WriteArray(value, 4); }
}
public ExchangeMessage(byte[] receivedPacket) : base(receivedPacket) {}
public ExchangeMessage(int length, int type) : base(length, type)
{
Length = length;
Type = type;
}
}
现在,每当我收到期望应用程序能够反序列化或重建我的数据包的内容时,我都会调用 ClientReceive
事件处理程序。 如果数据包被分割怎么办?
我很困惑,因为通过研究这个主题,我发现他们之间有很多不同的意见,我对此表示怀疑 如果你自己构建你的数据包,它不会碎片化!
最佳答案
Sockets API 不会向您传送数据包片段,只会传送完整的数据包。 TCP/IP 堆栈将缓冲接收到的片段,直到它有一个完整的数据包,如果丢失了一些片段,整个数据包将被丢弃,并且必须完整地重新传输。
这是路径 MTU 检测提高性能的原因之一——它可以防止信道中间碎片和相应的数据包错误率增加。发送较小的数据包会导致同样多的错误,但可以通过选择性 ACK 处理整个丢失的数据包,这比丢弃部分数据包的接收片段要有效得多。
如果您使用较低级别的网络 API,您可能会看到数据包碎片。
请注意,TCP 数据包与 send()
调用并非 1:1 对应。 Nagle 算法可以将多个写入组合成一个数据包,大于路径 MTU 的单个写入将生成多个数据包。我认为这就是鲍勃在他的评论中所暗示的。
碎片、数据包丢失和重传都在 TCP/IP 内部处理。您的应用程序无需担心。您的应用程序应将 TCP 套接字视为字节流。
您输入的字节以相同的顺序输出。无法保证需要多长时间以及一次输出多少,这超出了您的控制范围。
由于您希望将数据视为具有结构,而不仅仅是字节,因此您必须自己添加该结构。长度前缀和记录分隔符都是执行此操作的常用方法。
例如,HTTP 对命令/响应和元数据使用记录分隔符。 HTTP 命令和所有 header 由 \r\n
分隔。缺点是如果分隔符出现在数据中,则需要对其进行转义。 This example is borrowed from wikipedia .
HTTP/1.1 200 OK
Date: Mon, 23 May 2005 22:38:34 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
ETag: "3f80f-1b6-3e1cb03b"
Content-Type: text/html; charset=UTF-8
Content-Length: 131
Accept-Ranges: bytes
Connection: close
<html>
<head>
<title>An Example Page</title>
</head>
<body>
Hello World, this is a very simple HTML document.
</body>
</html>
也使用长度前缀。 Content-Length
header 给出了负载的长度。这允许任何字节出现在有效负载中。
关于c# - 处理 TCP 数据包碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22238695/
我今天在这里看到了 Ayende 关于 NH 分片的文章 http://ayende.com/blog/4252/nhibernate-shards-progress-report .我第一次听说 N
我正在尝试使用 Scrapy 和 Cloudflare 抓取 URL,但我无法获得任何结果: 2018-07-09 22:14:00 [scrapy.core.engine] INFO: Spider
我用于调试日志的Graylog2服务器上存在一些磁盘问题。现在有未分配的分片: curl -XGET http://host:9200/_cat/shards graylog_292 1 p STAR
我正在做一个小机器人,它应该提供来自网站(ebay)的信息并使用 splinter 和 python 将其放入列表中。我的第一行代码: from splinter import Browser wit
我正在尝试通过 splinter 从模态框的下拉菜单中选择内容。我很容易找到这个下拉菜单,例如: (Pdb) dropdown = next(i for i in my_browser.find_by
我的 APC 总是达到 100% 碎片。我的 VPS 有 1GB 内存,APC 分配给它 256mb,但它只使用了 256mb 中平均 100mb(最大 150mb)的内存。 我必须重新启动 php-
所以我正在使用 python splinter library测试一个网络应用程序,当我检查一个元素是否存在并且我手动找到每个元素来操作它时,我遇到了一个问题。 问题是,当输入列表大于 4 项或更多时
我尝试从具有以下 html 代码的下拉列表中选择“本地主机”: Local Host ah005 这是我的 pyt
我正在使用 Spring 和 Thymeleaf 开发应用程序,我想知道如何使用 thymeleaf 片段。 Thymeleaf 与 JSP 的优点是我们不必运行应用程序来查看模板,但是,当我们将模板
我在 linux 上用 ping 做了一些测试,我有点好奇 DF 位和碎片是如何工作的。我一直在发送一些带有命令 -M do 的包和一些带有 -M dont 的包,我意识到即使发送小于 MTU 的包,
我尝试从原始 H264 视频数据创建片段 MP4,以便我可以在互联网浏览器的播放器中播放它。我的目标是创建实时流媒体系统,媒体服务器会将碎片化的 MP4 片段发送到浏览器。服务器将缓冲来自 Raspb
在 mongodb 中。如果你想构建一个有两个分片的生产系统,每个分片都是一个具有三个节点的副本集,你必须启动多少 mongod 进程? 为什么答案是9? 最佳答案 因为每个分片需要 3 个副本 x
我是 python 和 scrapy 的新手。我正在尝试遵循 Scrapy 教程,但我不明白 storage step 的逻辑. scrapy crawl spidername -o items.js
1、Sharding 的应用场景一般都那些? 当数据库中的数据量越来越大时,不论是读还是写,压力都会变得越来越大。试想,如果一张表中的数据量达到了千万甚至上亿级别的时候,不管是建索引,优化缓存等,
我正在通过以太网发送 2000 字节 JSON(以太网 MTU 1500 字节),因为我的数据包大于以太网 MTU,所以我的消息被分段,如您在下面的 Wireshark 捕获中看到的那样。现在我正在尝
我决定为我的文档实现以下 ID 策略,它将文档“类型”与 ID 结合起来: doc.id = "docType_" + Guid.NewGuid().ToString("n"); // create
是否可以编写 ip6tables 规则来阻止格式错误的 ipv6 分段数据包。这基本上是为了我们电器盒的ipv6认证。我们运行在:rhel 5.5 和内核:2.6.18-238.1.1.el5 我们目
有很多关于 .NET LOH 的可用信息,并且已经在各种文章中进行了解释。但是,似乎有些文章不够精确。 过时信息 在Brian Rasmussen's answer (2009), program m
我还有一个 Unresolved 问题 HERE关于一些可能涉及 LOH 碎片以及其他未知数的绝望内存问题。 我现在的问题是,公认的做事方式是什么?如果我的应用程序需要在 Visual C# 中完成,
经过 20 年的专业发展,我仍然发现自己对数据库性能的某些方面一无所知。这是那些时代之一。这里和其他地方有数以千计的关于表和索引碎片及其对性能影响的问题。我知道基本的注意事项,但有时似乎没有“好的”答
我是一名优秀的程序员,十分优秀!