- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
出于好奇,在建立到端口的连接(使用 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/
我一整天都在努力完成这项工作,但是 但没有成功。我尝试设置按钮顶部约束(垂直间距)相对于tableView。但是当我从我的快速代码中隐藏表格 View 时仍然占用空间。 我想要实现的是,当我隐藏表格
我一整天都在努力完成这项工作,但是 但没有成功。我尝试设置按钮顶部约束(垂直间距)相对于tableView。但是当我从我的快速代码中隐藏表格 View 时仍然占用空间。 我想要实现的是,当我隐藏表格
我不太擅长编程,但我做了一些研究,发现了这一小串 javascript,可以让我们在点击每个 javascript 链接按钮时立即在页面上播放声音: 问题是,当我放入其中几行来定义不同的声音时,它们
我该怎么做,让 .tabs__item2 占据右边的剩余空间? 我希望无论屏幕大小如何,.tabs__item2 都会填充剩余空间,一直到它的大蓝色 div 的边缘。可能类似于 width:100
我试图找到一种现代解决方案,在页面顶部有一个固定的菜单栏( flexbox ),在下面有一个 flexbox 。我希望页面滚动时菜单保持静态,第二个内容 flexbox 的内容滚动 (fixBox)。
我正在用 ajax 进度条和其他东西做一些事情...... 基本上我有一个隐藏的 div,里面写着“正在加载”,在它下面有一个可见的 div,里面有我的内容。 加载时,它淡出内容 div,使隐藏的 d
我有五个 div,每个都共享一个 ad_tile 类。该类在 div 的左侧和右侧提供 3 像素的填充和 1 像素的边框,并为内容提供清晰的修复。如果这些 div 中的一个或多个为空,则这些 div
有这个固定的 header元素( block 元素),带有 absolute定位nav带有菜单的元素,和另一个固定元素作为标志: About Contac
我有一个 ViewHolder,标题位于顶部,该标题在特定情况下变得可见。在大多数其他情况下, header 设置为 GONE。问题是,当 header 设置为 GONE 时,它的高度仍会计算,而其他
请注意,我的问题不是关于如何用 . 填充剩余空间 背景:我正在尝试将 jQuery sortable 与一系列水平布局的 , 结合使用与类 "column" .column { display:i
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 7 年前。 Improv
我有一个带有模板切换器的 ListView ,并且我希望在特定项目上隐藏它,所以我使用了一个隐藏模板。我将 View (或 StackLayout)设置为 isVisible=false 和 Heig
TL;DR:部署面向 ECS 的 CodePipeline 后,如何更改内存和 CPU 要求(或指定 ECS 任务定义的任何细节)? 我已经创建了一个部署 ECS 容器的 CodePipeline。为
哪种工具最适合测量 HDFS 空间消耗? 当我总结“hdfs dfs -du/”的输出时,与“hdfs dfsadmin -report”(“DFS Used”行)相比,我总是消耗更少的空间。是否有
我试图理解使用 MD5 哈希作为 Cassandra key 在“内存/存储消耗”方面的含义: 我的内容(在 Java 中)的 MD5 哈希 = byte[] 长 16 个字节。 (16 字节来自维基
我是一名优秀的程序员,十分优秀!