出于好奇,建立与端口的连接时实际发送了多少数据(使用Java套接字)。它是Socket对象的大小吗? SocketConnection对象?
答案 0 :(得分:3)
您对TCP网络连接的理解似乎将它们与电路混淆在一起。 (可以理解,给定background。)
从物理角度来看,没有连接,只有数据包。通过TCP协议,两个设备同意建立逻辑(即软件)连接。客户端首先将数据发送到远程主机(SYN),服务器将数据发送回客户端(SYN-ACK),并且客户端发送最终确认(ACK)来建立连接。 所有这些谈判都必须消耗带宽,当您终止连接时,您必须协商一个全新的连接以开始再次发送数据。
例如,我将从我的机器连接到本地Web服务器,192.168.1.2:80。
首先,我的机器发送TCP SYN。这通过线路发送66个字节:(与|
删除的标题)
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。源(my)MAC跟随有效载荷类型(IP,0x0800)。接下来的20个字节是IPv4标头,后跟32个字节的TCP标头。
服务器以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个字节的以太网报头,20个字节的IP报头和28个字节的TCP报头。我发了一封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个字节,并且需要额外的162-216个字节来终止TCP连接(取决于是否有4路FIN ACK FIN ACK)或者使用更常见的3路FIN FIN-ACK ACK终止握手),通过断开连接和重新连接,最多可添加近400个字节来“脉冲”连接。
与用于在已建立的连接上发送一个字节数据的55个字节相比,这显然是浪费。
您要做的是建立一个连接,然后根据需要发送数据。如果你真的带宽受限,你可以使用UDP(根本不需要握手,每个数据包只有14个以太网+20个IP + 8个UDP字节的开销)但是你面对的是使用不可靠的传输问题,并且必须自己处理丢失的数据包。
答案 1 :(得分:1)
TCP数据包的最小大小为40个字节。它需要三个交换的数据包来创建连接,两个来自客户端,一个来自服务器,还有四个要关闭它,每个方向两个。连接交换中的最后一个数据包也可以包含数据,每个方向的密切交换中的第一个数据包也可以包含数据,这可以将它分摊一点,就像根据下面的@josh3736评论组合传出的FIN和ACK一样。