我想知道TCP套接字发送和接收字节的顺序。
我已经实现了套接字,它已经启动并正常工作,所以这很好。 我还有一些名为"一条消息" - 它是一个包含字符串(序列化为字节)和两个整数(转换为字节)的字节数组。它必须是这样的 - 项目规范:/
无论如何,我想知道它是如何处理字节的: 在字节数组中,我们有字节顺序 - 0,1,2,... Length-1。他们坐在记忆中。
他们是如何寄出的?是最后一个发送?还是第一个?我认为接收非常简单 - 第一个字节出现在缓冲区的第一个空闲位置。
我认为我精心制作的一个小图片显示了我的意思。
答案 0 :(得分:4)
它们按照它们在内存中的相同顺序发送。否则会更复杂......如果你有连续的字节流,你会怎么做?等待最后一个发送然后全部反转?或者这种反转应该按照数据包"?因此,每个2k字节的块(或TCP数据包的大小)都在内部反转,但数据包的顺序是"正确"?
我认为接收非常简单 - 第一个字节出现在缓冲区的第一个空闲位置。
为什么在地球上发送方应该反转字节但接收方不应该?如果你构建了一个对称系统,那么它们都会做一个动作,或者都没有动作!
请注意,真实问题通常是 endianness 的问题。计算机上int
的内存布局可能与另一台计算机的int
的布局不同。因此,两台计算机中的一台可能必须反转int
的4个字节。但是字节序是一种已经解决的问题"原始类型" by"原始类型"。出于历史原因,许多互联网协议都是Big Endian,而Intel CPU则是Little Endians。甚至TCP的内部字段都是Big Endian(参见Big endian or Little endian on net?),但这里我们说的是TCP字段,而不是TCP协议移动的数据。