为什么 Berkeley 套接字需要字节交换?
Why do Berkeley sockets require byte swapping?
我知道在线路上,大多数整数都是大端格式。
但是为什么应用程序的负担是在像 sockaddr_in
这样的结构中进行字节交换而不是内核,所有低级工作实际上都发生在内核中?如果用户空间 API 与平台无关并且不应该处理这个问题会更有意义。
为什么 Berkeley 插座 API 设计成这样?
原因可能是历史原因。
插座 API 是(在 1980 年代)发明的,当时 Sun-3 (MC68030) and Sun-4 (Sparc) workstations were kings. The endianness 这些(按照今天的标准速度较慢)处理器很重要。
我忘记了细节,可能 BSD 套接字约定是为某些 PDP-11 or VAX-780 发明的。
But why is it the burden of the application to do the byte swapping in structures like sockaddr_in and not the kernels
可能是因为在 1980 年代,您不希望计算机(比手机慢一千倍 phone)在 kernel-land 上花费太多(不间断的)时间。
这个问题真的应该在 https://retrocomputing.stackexchange.com/ 上问(答案在一些 1980 年代 Unix 内核的源代码中)
我能想到的唯一技术优势是它允许应用程序进行一次转换并缓存它。
然后,对于 UDP 的无数调用 sendto()
,或者你有什么,re-ordered-if-necessary 地址被提供给 OS 可以复制它 as-is直接进入传出网络数据包。
在内核中执行此操作的替代方案将要求每次调用 sendto()
一遍又一遍地获取应用程序所知道的相同地址,并每次都重新转换它。
由于 sendto()
从中受益,他们让其余的 API 以同样的方式工作。
我知道在线路上,大多数整数都是大端格式。
但是为什么应用程序的负担是在像 sockaddr_in
这样的结构中进行字节交换而不是内核,所有低级工作实际上都发生在内核中?如果用户空间 API 与平台无关并且不应该处理这个问题会更有意义。
为什么 Berkeley 插座 API 设计成这样?
原因可能是历史原因。
插座 API 是(在 1980 年代)发明的,当时 Sun-3 (MC68030) and Sun-4 (Sparc) workstations were kings. The endianness 这些(按照今天的标准速度较慢)处理器很重要。
我忘记了细节,可能 BSD 套接字约定是为某些 PDP-11 or VAX-780 发明的。
But why is it the burden of the application to do the byte swapping in structures like sockaddr_in and not the kernels
可能是因为在 1980 年代,您不希望计算机(比手机慢一千倍 phone)在 kernel-land 上花费太多(不间断的)时间。
这个问题真的应该在 https://retrocomputing.stackexchange.com/ 上问(答案在一些 1980 年代 Unix 内核的源代码中)
我能想到的唯一技术优势是它允许应用程序进行一次转换并缓存它。
然后,对于 UDP 的无数调用 sendto()
,或者你有什么,re-ordered-if-necessary 地址被提供给 OS 可以复制它 as-is直接进入传出网络数据包。
在内核中执行此操作的替代方案将要求每次调用 sendto()
一遍又一遍地获取应用程序所知道的相同地址,并每次都重新转换它。
由于 sendto()
从中受益,他们让其余的 API 以同样的方式工作。