gpt4 book ai didi

sockets - 套接字连接的大小(网络占用空间)是多少?

转载 作者:可可西里 更新时间:2023-11-01 02:57:12 24 4
gpt4 key购买 nike

出于好奇,在建立到端口的连接(使用 Java 套接字)时实际发送了多少数据。它是 Socket 对象的大小吗? SocketConnection 对象?

最佳答案

您对 TCP 网络连接的理解似乎将它们与电路混为一谈。 (可以理解,考虑到您的 background 。)

从物理的角度来看,没有所谓的连接,只有数据包。通过 TCP 协议(protocol),两个设备同意建立一个逻辑(即软件)连接。客户端首先向远程主机发送数据 (SYN),服务器将数据发回客户端 (SYN-ACK),然后客户端发送最终确认 (ACK),从而建立连接。 所有这些协商必然会消耗带宽,当您终止连接时,您必须协商一个全新的连接才能再次开始发送数据。

例如,我将从我的机器连接到本地 Web 服务器 192.168.1.2:80。

首先,我的机器发送一个 TCP SYN。这会通过网络发送 66 个字节:(用 | 定义的 header )

0000  00 24 8c a9 4c b4 00 1e  68 66 20 79 08 00|45 00   .$..L... hf y..E.
0010 00 34 53 98 40 00 80 06 00 00 c0 a8 01 0b c0 a8 .4S.@... ........
0020 01 02|36 0a 00 50 09 ef 3a a7 00 00 00 00 80 02 ..6..P.. :.......
0030 20 00 50 c8 00 00 02 04 05 b4 01 03 03 02 01 01 .P..... ........
0040 04 02 ..

前 14 个字节是 Ethernet frame , 指定此数据包的目标 MAC 地址。这通常是一个上游路由器,但在这种情况下,服务器恰好在同一个交换机上,所以它是机器的 MAC地址,00:24:8c:a9:4c:b4。随后是源(我的)MAC,以及有效负载类型(IP,0x0800)。接下来的 20 个字节是 IPv4 header ,然后是 32 个字节的 TCP header 。

服务器以 62 字节的 SYN-ACK 响应:

0000  00 1e 68 66 20 79 00 24  8c a9 4c b4 08 00|45 00   ..hf y.$ ..L...E.
0010 00 30 69 b9 40 00 80 06 0d b1 c0 a8 01 02 c0 a8 .0i.@... ........
0020 01 0b|00 50 36 0a d3 ae 9a 73 09 ef 3a a8 70 12 ...P6... .s..:.p.
0030 20 00 f6 9d 00 00 02 04 05 b4 01 01 04 02 ....... ......

同样,14 字节的以太网 header 、20 字节的 IP header 和 28 字节的 TCP header 。我发送一个 ACK​​:

0000  00 24 8c a9 4c b4 00 1e  68 66 20 79 08 00|45 00   .$..L... hf y..E.
0010 00 28 53 9a 40 00 80 06 00 00 c0 a8 01 0b c0 a8 .(S.@... ........
0020 01 02|36 0a 00 50 09 ef 3a a8 d3 ae 9a 74 50 10 ..6..P.. :....tP.
0030 fa f0 83 78 00 00 ...x..

14 + 20 + 20 = 54 字节在线路上(顺便说一下,这是可能的最小 TCP 数据包大小——SYN 和 SYN-ACK 数据包更大,因为它们包含选项)。

这通过线路增加了 182 字节以建立连接;现在我可以开始向服务器发送实际数据了:

0000  00 24 8c a9 4c b4 00 1e  68 66 20 79 08 00 45|00   .$..L... hf y..E.
0010 01 9d 53 9d 40 00 80 06 00 00 c0 a8 01 0b c0 a8 ..S.@... ........
0020 01 02|36 0a 00 50 09 ef 3a a8 d3 ae 9a 74 50 18 ..6..P.. :....tP.
0030 fa f0 84 ed 00 00|47 45 54 20 2f 20 48 54 54 50 ......GE T / HTTP
0040 2f 31 2e 31 0d 0a 48 6f 73 74 3a 20 66 73 0d 0a /1.1..Ho st: fs..
...

14 个以太网 + 20 个 IP + 20 个 TCP + 数据,在本例中为 HTTP。


因此我们可以看到建立 TCP 连接需要大约 182 字节,终止 TCP 连接需要额外的 162-216 字节(取决于 4 路 FIN ACK FIN ACK 是否或使用更常见的 3 向 FIN FIN-ACK ACK 终止握手),添加近 400 个字节以通过断开和重新连接来“脉冲”连接。

与通过已建立的连接发送一个字节数据所用的 55 个字节相比,这显然是一种浪费。

您要做的是建立一个连接,然后根据需要发送数据。如果您真的带宽受限,您可以使用 UDP(它根本不需要握手并且每个数据包的开销仅为 14 个以太网 + 20 个 IP + 8 个 UDP 字节),但是你会面临使用不可靠传输的问题,并且必须自己处理丢失的数据包。

关于sockets - 套接字连接的大小(网络占用空间)是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10871313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com