- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在浏览开源代码库时,我想到了一个有趣的场景。假设在成功建立 TCP 连接后,TCP 客户端必须发送一个序列号 = 101 的数据包。相反,它发送一个序列号为 201 的 FIN。现在 TCP 服务器认为 FIN 乱序并将其排队并等待一个数据包到达。我的问题是,根据 RFC,如果服务器收到序列号 = 101 且长度 = 150 的数据包,TCP 端点的行为应该是什么。它是否会覆盖之前发送的 FIN?或者服务器修剪数据包直到 FIN 序列号?或者它依赖于 TCP 实现?
最佳答案
根据RFC 793中的一些段落
"3.如果连接处于同步状态(ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT), 任何 Not Acceptable 段(超出窗口序列号或 Not Acceptable 确认号)必须只引出一个空的 包含当前发送序号的确认段 以及指示下一个预期序列号的确认 被接收,并且连接保持在相同的状态。”
....
“考虑处理传入段的一种自然方式是 想象一下,他们首先测试了正确的序列号(即, 它们的内容位于预期的“接收窗口”范围内 在序列号空间),然后他们通常排队 并按序号顺序处理。
当一个片段与其他已经接收到的片段重叠时,我们会重建 段只包含新数据,并调整标题字段 保持一致。”
...
我的回复:请记住,如果发生这种情况,那是因为客户端的 TCP 行为不佳。不是乱序,而是带有 FIN 标志的段中的错误序列。或者可能是一次攻击。
当服务器端的 TCP 收到 SEQ=201 的报文段时,它会将这个报文段存储一段有限的时间,并会发回一个 101 的 ACK,因为它正在等待该 SEQ 号。那么当 SEQ=101 的报文段到达时,接收端的 TCP 在接收到 SEQ=101 的报文段后会有一个新的接收窗口。从第一个到达的 SEQ=201 段开始,它应该只获取字节 251 之后的数据(在我的测试中,它没有这样做,而是从 SEQ=101 的段中删除了重叠的字节——这可能取决于实现),如果有的话,并接受 FIN。接收方 TCP 将发回一个 ACK。当服务器端关闭套接字时,接收方 TCP 将发回一个 [FIN, ACK] 段。
为了测试它,我有一个完全按照您描述的方式执行的客户端(这是用用户空间中的原始套接字完成的,不可能用 TCP 套接字模拟它。服务器是一个简单的 nodejs 服务器),一个 FIN 段是发送,15 秒后发送前一段。服务器读取接收到的数据,并在 10 秒后关闭套接字。
这是 tcpdump,你可以看到 TCP 服务器端响应:
[rodolk@localhost ~]$ sudo tcpdump -i p2p1 -vv tcp
tcpdump: listening on p2p1, link-type EN10MB (Ethernet), capture size 65535 bytes
19:33:03.648216 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
192.168.56.101.16345 > 192.168.56.1.webcache: Flags [S], cksum 0x5f49 (correct), seq 523645, win 500, length 0
19:33:03.649826 IP (tos 0x0, ttl 128, id 26590, offset 0, flags [DF], proto TCP (6), length 44)
192.168.56.1.webcache > 192.168.56.101.16345: Flags [S.], cksum 0x1ac8 (correct), seq 1576251572, ack 523646, win 8192, options [mss 1460], length 0
19:33:03.651208 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
192.168.56.101.16345 > 192.168.56.1.webcache: Flags [.], cksum 0x5091 (correct), seq 1, ack 1, win 500, length 0
19:33:03.651567 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 74)
192.168.56.101.16345 > 192.168.56.1.webcache: Flags [F.], cksum 0x8121 (correct), seq 122:156, ack 1, win 500, length 34
19:33:03.651891 IP (tos 0x0, ttl 128, id 26591, offset 0, flags [DF], proto TCP (6), length 40)
192.168.56.1.webcache > 192.168.56.101.16345: Flags [.], cksum 0x5314 (correct), seq 1, ack 1, win 65392, length 0
19:33:18.652083 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 171)
192.168.56.101.16345 > 192.168.56.1.webcache: Flags [P.], cksum 0xf973 (correct), seq 1:132, ack 1, win 500, length 131
19:33:18.652834 IP (tos 0x0, ttl 128, id 26593, offset 0, flags [DF], proto TCP (6), length 40)
192.168.56.1.webcache > 192.168.56.101.16345: Flags [.], cksum 0x5313 (correct), seq 1, ack 157, win 65237, length 0
19:33:28.661041 IP (tos 0x0, ttl 128, id 26594, offset 0, flags [DF], proto TCP (6), length 40)
192.168.56.1.webcache > 192.168.56.101.16345: Flags [F.], cksum 0x5312 (correct), seq 1, ack 157, win 65237, length 0
19:33:28.961756 IP (tos 0x0, ttl 128, id 26595, offset 0, flags [DF], proto TCP (6), length 40)
192.168.56.1.webcache > 192.168.56.101.16345: Flags [F.], cksum 0x5312 (correct), seq 1, ack 157, win 65237, length 0
关于sockets - FIN 数据包乱序并覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31261519/
while(fin >> a) 或 while(fin.eof()) 不会工作。在第一种情况下,fin 流变量一直将文件中的最后一个字符作为输入。 我的输入文件是这样的: ab5c71,lj4j6v7
我正在研究如何使用 python 套接字发送 TCP FIN。 我尝试使用 socket.socket.close 并发出 TCP RST 而不是 TCP FIN。有人可以让我知道API是什么吗? 最
我有一个关于在 C++ 中正确使用 fin 和循环的问题。我有一个文件,我从中读取了 78 行数据,其中包括滑雪胜地名称、海拔高度,然后是 12 个数字,即每月降水量。该程序应该从该文件中读取,然后将
谁能提供一种算法来验证新加坡 FIN? 我知道新加坡的 NRIC 我可以通过模 11 验证它,然后将结果与查找表进行比较,但找不到 FIN 的类似查找表。 我也不确定模 11 是否是正确的验证方法。
我必须在两种情况下测试我的应用程序......即 1.连接发起者从服务器接收FIN 2.连接发起者向服务器发送FIN 我有 www 服务器作为服务器,windows 虚拟机作为客户端。我在 80 上做
在浏览开源代码库时,我想到了一个有趣的场景。假设在成功建立 TCP 连接后,TCP 客户端必须发送一个序列号 = 101 的数据包。相反,它发送一个序列号为 201 的 FIN。现在 TCP 服务器认
在 Clojure 中 Koans :fin 用于atoms.clj。这是一个例子: (def atomic-clock (atom 0)) "Atomic atoms are atomic"
我正在研究一些从文件读取信息并将其存储在结构中的代码。它正在处理我扔给它的所有文件,除了一个文件外,其中有许多其他错误。 如果文件中有错误,它将跳过其后的一行,但我不确定为什么。我的代码如下: voi
我已经定义了一个运算符,+-(忽略这个可怕的名字),如下: infixr 10 +- (+-) : Fin (S n) -> Fin (S m) -> Fin (S (n + m)) (+-) {n}
我正在尝试加载文件,但无法获取它。这是命令.. void Apple::loadDictionary(std::vector& ret) { std::ifstream fin("words");
我正在 Linux 下测试 SSH 连接。 通过使用 tcpdump,我注意到在常见的 SSH 数据包数据中设置了 TCP FIN 标志。出于测试目的,我想实现将带有 TCP FIN 标志的数据包作为
当 TCP 应用程序退出时,它会发送一个 FIN 数据包。 考虑一个连接到始终监听的服务器(服务器从不退出)的 tcp 客户端。 如果tcp客户端在几次数据包交换后突然退出,它是否总是向服务器发送FI
我有以下 Java 代码: Socket s = new Socket(); s.connect(mySockAddr, myTimeout); 假设我不使用套接字,我需要在服务器端连接关闭时检测到它
我正在尝试弄清楚如何实现优雅的断开连接(4 次握手)。 首先,我使用以下代码发送一个 FIN 数据包: shutdown(socket, SD_SEND); 这将导致发送套接字发送流被关闭。现在当对方
我已经编写了一个创建套接字的 C 代码,到目前为止它运行良好。在 TCP 的 RFC 中,我发现可以发送一个 FIN 标志来告诉其他主机我想退出或对话。 FIN 标志并不意味着其他主机无法发送更多数据
我想检查新加坡的 NRIC/FIN 用户输入数据是否正确。 [A-Z] [0-9]{7} [A-Z] 是正确的正则表达式吗?我是否需要检查第一个字符是 S/F/T/G?如果我需要检查其他情况,请告诉我
我们可以像这样枚举列表的元素: -- enumerate-ℕ = zip [0..] enumerate-ℕ : ∀ {α} {A : Set α} -> List A -> List (ℕ × A)
我有一个 azure 的VM,它充当TCP服务器(监听端口的java程序)。 TCP 客户端 (ncat) 位于公司网络中。中间有一个公司防火墙。客户端通过发送消息来发起与服务器的连接,之后服务器保持
我一直在使用org.apache.commons.net.telnet连接到控制流并向摄像头发送命令。我发送数据流请求并打开一个新线程,该线程从相机传感器扫描图像并将数据作为原始字节发送给我。我正在使
当尝试在 Idris 上实现 mod : Nat -> (m : Nat) -> Fin m 函数时,我注意到明显的算法不起作用,因为在循环和增加时结果, idris 不会相信它还在射程之内。这个片段
我是一名优秀的程序员,十分优秀!