标签: tcp

低延迟 10GbE -> 1GbE 网络的 TCP 拥塞控制?

我有一台与交换机有 10GbE 连接的服务器,以及 10 个客户端,每个客户端与同一交换机有 1GbE 连接。

在每个客户端上并行运行 nuttcp,我可以将 10 个 TCP 数据流以接近线速的速度同时推送到服务器(即,所有 10 个客户端同时每秒传输 100 兆字节)。

然而,当我改变方向并将数据从服务器发送到客户端时——即 10 个 TCP 流,一个发送到每个客户端——TCP 重传会猛增,性能下降到每秒 30、20 甚至 10 兆字节每个客户。我想提高这些数字,因为这种流量模式代表了我关心的某些应用程序。

我已经通过在与类似服务器的 10GbE 连接上执行相同的实验来验证我的服务器能够使 10GbE 链路饱和。我已经确认我的任何端口都没有错误。

最后,当我强行限制(限制)接收方的 TCP 窗口大小时,我可以获得更高的带宽(30-40 兆字节/秒);如果我把它限制得非常低,我可以让重传为零(带宽低得离谱)。

因此,我有理由相信我正在超限交换机中的缓冲区,从而导致由于拥塞而导致数据包丢失。然而,我认为 TCP 的拥塞控制应该可以很好地处理这个问题,最终稳定在 50% 以上的线速。

所以我的第一个问题很简单:哪种 TCP 拥塞控制算法最适合我的情况?有很多可用的,但它们似乎主要针对有损网络或高带宽高延迟网络或无线网络......这些都不适用于我的情况。

第二个问题:还有什么我可以尝试的吗?

networking linux tcp

11
推荐指数
1
解决办法
1902
查看次数

NAT 网关 - 最大连接限制

我知道足够的网络是危险的。NAT 的底层细节并不是我特别了解的。

今天早些时候,我无意中发现自己参与了关于将一堆节点置于 NAT 网关后面的讨论。(1 个公共 IP 地址和 X 个私有 LAN 地址)。我调用了 TCP 协议中源和目标端口字段的 16 位限制(http://www.ietf.org/rfc/rfc793.txt - 第 15 页)并提到它会将我们限制为大约 65,000 个连接( 65536)。——我对那个答案不再那么有信心了。你能帮我提供一些细节吗?

我知道我们这边的传入端口(服务器端口)可以接受与 sourceIP x SourcePort 组合一样多的连接。让我们暂时忽略这些,重点关注源自 LAN、通过 NAT 网关并在随机端口的随机主机上结束的连接。

在普通的 [Linux] 系统上,我认为每个源 IP 的每个端口只能有 1 个传出连接。如果我们假设我们生活在一个简单的世界中,其中每个系统只有 1 个 IP 地址,那么“正常系统”将被限制为绝对最大 65536 个连接。

1) 在 TCP 中是单源 IP 限制为 65536 MAX 理论传出连接?

2) 还是每个远程主机的限制实际上是 65536 个连接?

2) [Written another way]:同一个源端口可以用于不同的remoteHostIP:RemotePort组合吗?

例如:(以下可以吗?)

Source IP   |Source Port |Remote IP|Remote Port   
192.168.0.20:36500   -->    8.8.8.8:23
192.168.0.20:36500   -->    8.8.4.4:23
Run Code Online (Sandbox Code Playgroud)

3) 问题 1 …

networking nat tcp

11
推荐指数
1
解决办法
2万
查看次数

通过“telnet 到端口”测试测量延迟的最佳方法是什么,最好使用内置的 Linux 工具?

我正在编写一个测量网络延迟的 Graphite/Diamond 收集器。具体来说,它应该测量打开与远程服务器上端口的连接所需的时间。它需要通过脚本工作,即键盘上没有人以交互方式运行。

举个例子,给 telnet 提供一个虚构的参数,它可以完全满足我的需要。

time telnet --close-connection-immediately-after-established somehost.somedomain.com 1234

Trying somehost.somedomain.com...
Connected to somehost.somedomain.com.
Escape character is '^]'.
Connection closed automatically after established.

real    0m3.978s
user    0m0.001s
sys 0m0.003s
Run Code Online (Sandbox Code Playgroud)

基本上,在上面的示例中,仅使用内置工具输出 3.978 的命令行方式是什么?

您可以将 telnet 包装在我想的预期脚本中并使其出现问题:

^]
close
Run Code Online (Sandbox Code Playgroud)

……但那看起来相当丑陋。有任何想法吗?

linux time port tcp test

11
推荐指数
1
解决办法
2万
查看次数

有没有办法查看实际过滤 TCP 端口通信的内容?

nmap -p 7000-7020 10.1.1.1
Run Code Online (Sandbox Code Playgroud)

将输出所有过滤的端口

Starting Nmap 6.40 ( http://nmap.org ) at 2015-03-04 12:18 EET
Nmap scan report for 10.1.1.1
Host is up (0.00091s latency).
PORT     STATE    SERVICE
7000/tcp filtered afs3-fileserver
7001/tcp filtered afs3-callback
7002/tcp filtered afs3-prserver
7003/tcp filtered afs3-vlserver
7004/tcp filtered afs3-kaserver
7005/tcp filtered afs3-volser
7006/tcp filtered afs3-errors
7007/tcp filtered afs3-bos
7008/tcp filtered afs3-update
7009/tcp filtered afs3-rmtsys
7010/tcp filtered ups-onlinet
7011/tcp filtered unknown
7012/tcp filtered unknown
7013/tcp filtered unknown
7014/tcp filtered unknown
7015/tcp filtered unknown
7016/tcp filtered unknown
7017/tcp …
Run Code Online (Sandbox Code Playgroud)

firewall tcp port-scanning nmap

11
推荐指数
3
解决办法
4万
查看次数

如何设置持久的 TCP 性别更改代理?

我有一个提供程序 (A),它想通过传入的 TCP 连接向我们发送数据。不幸的是,消费服务 (B) 无法接收入站 TCP 连接。此外,它没有静态 IP,这是另一个要求。

解决此问题的一种方法是将传入 TCP A 端口连接到另一个 TCP 端口 B 的服务,以便消费者可以与 B 建立出站连接。

这不是一个独特的问题[1] [2],使用 socat 我可以做出非常接近我想要的东西:

socat -d -d -d -u TCP4-LISTEN:PORT-A,reuseaddr TCP4-LISTEN:PORT-B,reuseaddr

但是,这存在以下问题:

  • 如果 B 断开连接,则无法重新连接。使用TCP4-LISTEN:PORT-B,reuseaddr,fork,可以连接但不接收数据。
  • 在 A 建立连接之前 B 无法连接(可克服)
  • 只能建立一个连接到PORT-B(可克服的)

有没有办法调整命令,使其成为“永久”并抵抗失败?

proxy tcp socat

11
推荐指数
1
解决办法
2108
查看次数

强制转发器 DNS 请求为 TCP 模式

我已经在多宿主服务器上的 SLES10(当前绑定 9.6)上设置了一个 DNS 服务器。该服务器可以从所有内部网络进行查询,并为所有内部网络提供答案。我们有两个独立的 DNS“主”区域。这些区域中的每一个都由许多权威的 Windows-DNS 服务器提供服务。

现在我的 linux-server 是这些区域之一(私有内部区域)的辅助 DNS 服务器,并充当另一个区域(公共内部区域)的转发器。

直到最近,这种设置都没有问题。现在我得到 - 在查询公共内部区域时(例如通过hostlinux 客户端上的命令)错误消息

;; 截断,在 TCP 模式下重试

一个wireshark-dump揭示了这个原因:第一个查询在UDP模式下发出,答案不适合UDP(由于权威NS的列表太长),然后在TCP模式下重试,提供正确答案。

现在的问题是: 我可以将绑定配置为在 TCP 模式下查询转发器而不先尝试 UDP 吗?

更新:尝试使用 ASCII 艺术...

+--------------+   +--------------+   +-----------------+
| W2K8R2 DNS   |   | SLES 10 DNS  |   | W2K8R2 DNS      |
| Zone private +---+ All internal +---+ Zone public     |
| internal 2x  |   |   Zones      |   | internal 30+ x  |
+--------------+   +-+----------+-+   +-----------------+
                     |          |
                  +--+---+   +--+---+
                  |Client|   |Client| …
Run Code Online (Sandbox Code Playgroud)

domain-name-system bind tcp sles10

10
推荐指数
1
解决办法
2万
查看次数

我的 TIME_WAIT 在 Mac OS X 上在哪里?

TIME_WAIT在 Mac OS X 上没有

通常,当 TCP 连接关闭时,close()首先被调用的那一侧的套接字将保持在该TIME_WAIT状态。

当其中一个对等方是 Mac OS X (Lion) 机器时,如果在 Mac 端首先调用,则在 Mac上不TIME_WAIT列出 by 。然而,似乎插座实际状态,因为试图调用一次(不使用套接字选项)会导致失败。netstat -anclose()TIME_WAITlisten()SO_REUSEADDRlisten()

等待 2*MSL(Maximum Segment Lifetime,在 Mac OS X Lion 上为 15 秒,由 报告sysctl net.inet.tcp.msl)清除TIME_WAIT状态,并且listen()可以再次调用而不会出错。

为什么我看不到插座TIME_WAIT

测试

这里有两个简单的 Python 测试程序。

服务器

#!/usr/bin/env python

import socket

HOST = ''
PORT = 50007
l = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
l.bind((HOST, PORT))
l.listen(1)
print("Listening …
Run Code Online (Sandbox Code Playgroud)

tcpip mac-osx netstat tcp socket

10
推荐指数
1
解决办法
3281
查看次数

分片的 TCP 分片在 TCP 服务器中保留多长时间

假设给定的 TCP 片段被分成两个 IP 数据报,第一个数据报到达 TCP 服务器,但第二个数据报从未到达。

一定时间后,TCP 服务器发送一个keepalive,并确定客户端是存活的。那么 TCP 服务器如何处理这个第一个数据报?是等待第二个数据报到达,还是丢弃第一个数据报?

ip tcp

10
推荐指数
1
解决办法
2923
查看次数

如何使用 netcat 或类似工具将 0x80 字节发送到 tcp 端口?

我试图让 Memcached 服务器像使用二进制协议一样响应。如果可能,请仅通过命令行回答,任何编程语言中都没有代码片段。

tcp netcat binary

10
推荐指数
1
解决办法
3万
查看次数

如何使用 netsh 命令从 Windows 中的 TCP 端口转储原始数据?

我有一个看似简单的问题,但事实证明很难找到答案。

该站点具有高度安全的 Windows Server 2019 安装和连接到它的设备,该设备在某个 TCP 端口上运行。

我需要一个来自该端口的原始数据样本,需要几分钟,然后转储到一个二进制文件中。它需要尽可能原始(即,当我们从本地 .NET 应用程序连接到同一端口时,它需要类似于我们将从 TCP 流中读取的内容)。

这是非常优选仅使用内置的Windows工具,这个(即netsh),但最坏情况windumptelnet也很好。

networking windows tcp netsh

10
推荐指数
1
解决办法
1070
查看次数