检查网络“质量”是一项常见任务 - 延迟、丢弃的数据包数量等。但是“ping”有许多缺点: - 它使用 ICMP。许多 ISP 对 ICMP 和 TCP 流量有不同的整形器,因此“ping”将显示 10 毫秒的延迟,但 TCP 连接将经历 1000 毫秒以上。- 它发送非常少量的数据包。默认情况下,每秒一个数据包。由于 TCP 协议容忍丢包(它可以很好地运行,丢失一半的数据包 - 这是正常的),因此完全不清楚 ping 的“30%丢包”是否会杀死连接或是否绝对正常。
那么,使用 TCP 连接而不是 ICMP 并检查 Internet 连接质量的 ping 是否有任何替代方法?
我正在监视服务器上的 TCP 堆栈,希望能够推断出盒子上的应用程序存在的问题。
我的第一个倾向是测量所有报告状态(LISTEN、ESTABLISHED、FIN_WAIT2、TIME_WAIT 等)中的套接字数量并检测一些异常情况。
一位队友建议“lsof”将是一个更好的工具来查看 TCP 堆栈处于什么状态。
服务器故障人群的任何偏好或经验提示?
如何发现网络中机器的 MAC 地址?
我需要发现只安装了 BIOS(没有操作系统)的机器。
我需要找到正在运行的机器的 MAC 地址。
我了解到 TCP 连接由元组(源 IP、源端口、目标 ip、目标端口)标识。从理论上讲,因此应该可以让一个来自 host1:port1 的客户端连接到 server1:port1,同时另一个客户端(在 host1 上运行)从 host1:port1 连接到 server2:port1。
我已经在 Java 中进行了一些测试,到目前为止似乎是可能的。
但是,我多次阅读到主机地址的源端口必须是唯一的,这基本上意味着最多有 65536 个并发传出 TCP 连接的硬限制。真的吗?
更新:这是我的 Java 代码。这似乎有效,并且 netstat -t 清楚地显示了来自端口 9990(一个到 9997,一个到 9998)的两个活动的传出连接。至少在现代 Linux 上,这似乎是可能的?
Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);
Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);
Run Code Online (Sandbox Code Playgroud)
和 netstat -t 输出(截断):
tcp6 0 0 localhost:9990 …Run Code Online (Sandbox Code Playgroud) 我正在为虚拟专用服务器开发防火墙,我正在研究的一件事是端口扫描仪。TCP 标志用于保护。我有2个问题。
规则:
-p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP
Run Code Online (Sandbox Code Playgroud)
第一个参数表示检查带有 SYN 标志的数据包 第二个参数表示确保设置了标志 ACK、FIN、RST SYN
并且在这种情况下(有匹配项),丢弃 tcp 数据包
第一个问题:
我理解 RST 和 RST/ACK 的含义,但在第二个参数中使用了 RST SYN。
RST SYN 和 RST 和 SYN RST 有什么区别?
3 次握手中是否有“SYN RST”标志?
第二个问题是关于两者之间的区别
-p tcp --tcp-flags SYN,ACK,FIN,RST SYN -j DROP
Run Code Online (Sandbox Code Playgroud)
和
-p tcp --tcp-flags ALL SYN,ACK,FIN,RST SYN -j DROP
Run Code Online (Sandbox Code Playgroud)
什么时候应该使用 ALL ?
当我使用ALL时,这是否意味着如果带有syn标志的tcp数据包没有设置ACK“和”FIN“和”RST SYN标志,就不会有匹配?
我有一台与交换机有 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(可克服的)有没有办法调整命令,使其成为“永久”并抵抗失败?