抽象 UDP 和 TCP send/receive 过程
Abstracting UDP and TCP send/receive procedures
美好的一天。
简介
最近我开始研究一些'low-level'网络编程以及Linux中的网络协议。为此,我决定创建一个小型网络图书馆。
现在我想知道一些问题。我现在就问其中一位。
如您所知,至少有两种协议建立在 IP 之上。我说的是 TCP 和 UDP。由于其中的连接方向 属性,它们的实现可能 OS 不同。
根据man 7 udp
UDP 套接字上的所有接收操作return 只有一个数据包。这是合理的,因为不同的数据报可能来自不同的来源。
另一方面,TCP连接包序列可以被认为是连续的字节流。
现在,关于问题本身。
说,我有一个 API 用于 TCP 连接套接字和 UDP 套接字,例如:
void tcp_connection_recv(endpoint_t *ep, buffer_t *b);
void udp_recv(endpoint_t *ep, buffer_t *b);
endpoint_t
类型将描述端点(远程用于 TCP 连接,本地用于 UDP)。 buffer_t
类型将描述某种基于向量或基于数组的缓冲区。
很可能用户已经分配了缓冲区,我不确定这是否适合 UDP 不更改缓冲区的大小。因此,为了抽象 TCP 和 UDP 操作的代码,我认为它需要分配尽可能多的缓冲区来包含整个接收到的数据。
此外,为了防止调整用户缓冲区的大小,每个套接字都可以映射到它自己的缓冲区(虽然它将是用户空间缓冲区,但它将对用户隐藏)。然后根据用户的请求,数据将从 'inner' 缓冲区复制到用户缓冲区,或者如果数量不足,则从套接字中读取数据。
有什么建议或意见吗?
如果您想创建这样的API,这将取决于您要提供的服务。在 TCP 中,它将不同于 UDP,因为 TCP 是面向流的。
对于TCP,tcp_connection_recv不是重新分配一个缓冲区,如果用户传递的缓冲区不够大,你可以填充整个缓冲区然后return,可能带有一个输出参数, 并指示有更多数据等待读取。基本上你可以使用TCP连接在内核中已经提供的接收缓冲区,不需要创建其他缓冲区。
对于udp,你可以向用户请求一个数字,表明它正在等待的最大数据报大小。当您使用 recvfrom 从 UDP 套接字读取时,如果您读取的数据少于到达数据报中的数据,则数据报的其余数据将丢失。您可以先使用 MSG_PEEK 标志阅读,以了解有多少数据可用。
一般来说,我不会为应用程序处理缓冲区,因为应用程序,实际上是应用程序层协议,是知道它希望如何接收数据的协议。
美好的一天。
简介
最近我开始研究一些'low-level'网络编程以及Linux中的网络协议。为此,我决定创建一个小型网络图书馆。
现在我想知道一些问题。我现在就问其中一位。
如您所知,至少有两种协议建立在 IP 之上。我说的是 TCP 和 UDP。由于其中的连接方向 属性,它们的实现可能 OS 不同。
根据man 7 udp
UDP 套接字上的所有接收操作return 只有一个数据包。这是合理的,因为不同的数据报可能来自不同的来源。
另一方面,TCP连接包序列可以被认为是连续的字节流。
现在,关于问题本身。
说,我有一个 API 用于 TCP 连接套接字和 UDP 套接字,例如:
void tcp_connection_recv(endpoint_t *ep, buffer_t *b);
void udp_recv(endpoint_t *ep, buffer_t *b);
endpoint_t
类型将描述端点(远程用于 TCP 连接,本地用于 UDP)。 buffer_t
类型将描述某种基于向量或基于数组的缓冲区。
很可能用户已经分配了缓冲区,我不确定这是否适合 UDP 不更改缓冲区的大小。因此,为了抽象 TCP 和 UDP 操作的代码,我认为它需要分配尽可能多的缓冲区来包含整个接收到的数据。 此外,为了防止调整用户缓冲区的大小,每个套接字都可以映射到它自己的缓冲区(虽然它将是用户空间缓冲区,但它将对用户隐藏)。然后根据用户的请求,数据将从 'inner' 缓冲区复制到用户缓冲区,或者如果数量不足,则从套接字中读取数据。
有什么建议或意见吗?
如果您想创建这样的API,这将取决于您要提供的服务。在 TCP 中,它将不同于 UDP,因为 TCP 是面向流的。
对于TCP,tcp_connection_recv不是重新分配一个缓冲区,如果用户传递的缓冲区不够大,你可以填充整个缓冲区然后return,可能带有一个输出参数, 并指示有更多数据等待读取。基本上你可以使用TCP连接在内核中已经提供的接收缓冲区,不需要创建其他缓冲区。
对于udp,你可以向用户请求一个数字,表明它正在等待的最大数据报大小。当您使用 recvfrom 从 UDP 套接字读取时,如果您读取的数据少于到达数据报中的数据,则数据报的其余数据将丢失。您可以先使用 MSG_PEEK 标志阅读,以了解有多少数据可用。
一般来说,我不会为应用程序处理缓冲区,因为应用程序,实际上是应用程序层协议,是知道它希望如何接收数据的协议。