Networking 从内核缓冲区读取的recv()和recvfrom()数据包(段)或字节数?

Networking 从内核缓冲区读取的recv()和recvfrom()数据包(段)或字节数?,networking,network-programming,Networking,Network Programming,我构建的UDP服务器或TCP服务器使用recv()或recvfrom从客户端接收数据包 但在我看来,机制是:内核从网络接收数据包 和条带化IP/TCP/UDP标头,然后将数据有效负载部分放入 内核缓冲区,然后从内核缓冲区读入数据 因此,这意味着缓冲区中只有字节,而字节不被划分为多个部分,每个部分对应于UDP数据报/TCP段的有效负载 如果我希望recv()或recvfrom()的每次调用只接收一个TCP段或UDP数据报(注意,由于IP碎片,一个TCP或UDP数据包可能包含多个IP数据包) 有没有

我构建的UDP服务器或TCP服务器使用
recv()
recvfrom
从客户端接收数据包

但在我看来,机制是:内核从网络接收数据包 和条带化IP/TCP/UDP标头,然后将数据有效负载部分放入 内核缓冲区,然后从内核缓冲区读入数据

因此,这意味着缓冲区中只有字节,而字节不被划分为多个部分,每个部分对应于UDP数据报/TCP段的有效负载

如果我希望
recv()
recvfrom()
的每次调用只接收一个TCP段或UDP数据报(注意,由于IP碎片,一个TCP或UDP数据包可能包含多个IP数据包)

有没有可能

如果是,怎么做? 谢谢

我希望对recv()或recvfrom()的每次调用只接收一个TCP段

不可以。它可能返回从一个字节到您提供的长度(或在非阻塞mdoe中为零字节)的任何内容,并且数据可能会跨越TCP段边界,而不是因为您无法知道TCP段边界首先位于何处。您必须将TCP连接视为字节流,仅此而已

或UDP数据报


是的。

您的意思是对于UDP,默认情况下,
recv()
recvfrom()
的每次调用只获取1个UDP数据报?那么,每次调用是否有可能获得另外两个UDP数据报的有效负载字节?此外,如果我想测量TCP段丢失率、TCP段到达顺序,是否有套接字编程的方法?@misteryes(1)是的,每个
recv()/recvfrom()
,您只会得到一个数据报,因此(2)不,你不能同时得到两个。我不知道你为什么要问两次同样的问题。(3) 如果不使用数据包驱动程序,例如libpcap,则不能。对不起,我忘了询问,因此,如果一个UDP数据报存在ip碎片,则
recv
recvfrom
将等待相同UDP数据报的所有ip碎片到达?如果某个特定的IP数据报丢失了怎么办?“recv”是否有等待完整udp数据报的超时机制?@misteryes如果存在IP碎片,则数据报将不会发送到应用程序,除非并直到收到所有碎片。它将完好无损地交付,或者根本不交付。