我有一台与交换机有 10GbE 连接的服务器,以及 10 个客户端,每个客户端与同一交换机有 1GbE 连接。
在每个客户端上并行运行 nuttcp,我可以将 10 个 TCP 数据流以接近线速的速度同时推送到服务器(即,所有 10 个客户端同时每秒传输 100 兆字节)。
然而,当我改变方向并将数据从服务器发送到客户端时——即 10 个 TCP 流,一个发送到每个客户端——TCP 重传会猛增,性能下降到每秒 30、20 甚至 10 兆字节每个客户。我想提高这些数字,因为这种流量模式代表了我关心的某些应用程序。
我已经通过在与类似服务器的 10GbE 连接上执行相同的实验来验证我的服务器能够使 10GbE 链路饱和。我已经确认我的任何端口都没有错误。
最后,当我强行限制(限制)接收方的 TCP 窗口大小时,我可以获得更高的带宽(30-40 兆字节/秒);如果我把它限制得非常低,我可以让重传为零(带宽低得离谱)。
因此,我有理由相信我正在超限交换机中的缓冲区,从而导致由于拥塞而导致数据包丢失。然而,我认为 TCP 的拥塞控制应该可以很好地处理这个问题,最终稳定在 50% 以上的线速。
所以我的第一个问题很简单:哪种 TCP 拥塞控制算法最适合我的情况?有很多可用的,但它们似乎主要针对有损网络或高带宽高延迟网络或无线网络......这些都不适用于我的情况。
第二个问题:还有什么我可以尝试的吗?
我知道足够的网络是危险的。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 …
我正在编写一个测量网络延迟的 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)
……但那看起来相当丑陋。有任何想法吗?
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) 我有一个提供程序 (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
但是,这存在以下问题:
TCP4-LISTEN:PORT-B,reuseaddr,fork,可以连接但不接收数据。PORT-B(可克服的)有没有办法调整命令,使其成为“永久”并抵抗失败?
我已经在多宿主服务器上的 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) 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) 假设给定的 TCP 片段被分成两个 IP 数据报,第一个数据报到达 TCP 服务器,但第二个数据报从未到达。
一定时间后,TCP 服务器发送一个keepalive,并确定客户端是存活的。那么 TCP 服务器如何处理这个第一个数据报?是等待第二个数据报到达,还是丢弃第一个数据报?
我试图让 Memcached 服务器像使用二进制协议一样响应。如果可能,请仅通过命令行回答,任何编程语言中都没有代码片段。
我有一个看似简单的问题,但事实证明很难找到答案。
该站点具有高度安全的 Windows Server 2019 安装和连接到它的设备,该设备在某个 TCP 端口上运行。
我需要一个来自该端口的原始数据样本,需要几分钟,然后转储到一个二进制文件中。它需要尽可能原始(即,当我们从本地 .NET 应用程序连接到同一端口时,它需要类似于我们将从 TCP 流中读取的内容)。
这是非常优选仅使用内置的Windows工具,这个(即netsh),但最坏情况windump或telnet也很好。