为什么只有ip地址和端口号需要主机字节序到网络字节序的转换?

传输的数据为什么不需要主机字节序到网络字节序的转换却能正确传输?

阅读 11.7k
6 个回答

IP/PORT转换是因为TCP/IP协议规定用网络字节序, 你用人家的东西, 自然要按别人的规矩办事~

你传输的数据收发处理都是你自己做的, 你想转字节序就转, 不想转也没人强迫你~

但是通常建议是统一都转成网络序, 接口确定大家好办事嘛. 假如是多人开发一个项目, 别人发的数据转成网络序了, 你收到后不再转成主机序, 导致数据解不出来, 你说怪谁?

好问题。

答复是:因为内容是二进制流,不是整数。

整数(int、uint16、uint32)的表达,是需要多字节的,在不同cpu上,字节次序是不同的。因此,从A主机到B主机,如果是异构的,就需要做字节调整。同构是不需要的。然后网络就是如此,你不能约定对方的主机类型,因此,干脆都转。

内容的表达,就是二进制流,在不同类型的主机上并无差别,如何解释,应用自行决定。故而不必转。

有些系统不需要转是因为这些系统默认的字节序就是网络字节序,但Windows、Linux不是,所以你得转。

传输的数据属于应用层,你自己处理的,转不转与tcp/ip无关
设计业务协议时,就该声明采用大端字节序还是小端字节序

@1000copy 说的就是对的,我增加一点说明:

他所谓的二进制流,就是逐个字节定义的数据。当你传输一个 int 值的时候,高位和低位的排列顺序会根据 cpu 的类型有所不同,但如果你定义一个数组 char Array[4],挨个字节填入 char 型值,然后发出去,它的顺序永远不会变,Array[0]永远在Array[1]前面。

端口是 2byte的
端口1080 的表示是 0x04 0x38
但是有些硬件系统是 0x38 0x04

你要发送这个端口值给对方, 你总得有个统一的顺序约定吧,要不对方怎么正确识别呢。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进