原始套接字是数据报套接字吗?

5

对于非阻塞数据报套接字(如UDP),当我在套接字上调用write() / send()时,每个write() / send()或read() / recv()调用都处理一个数据包。

我想知道下面这个原始套接字是否为数据报套接字?

int on = 1;
rawfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
setsockopt(IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));
2个回答

2
当您发送数据时,TCP/IP栈会添加TCP/UDP头、IP头,然后是以太网头,网络网卡将整个包传输出去。对于原始套接字,您需要准备所有的头部(TCP/UDP、IP和MAC),并将整个包传输到网络网卡上。因此,它是否为数据报取决于您添加的头部是TCP还是UDP。

2
这取决于你将在数据包中包含哪种IP头(TCP或UDP)。实际上,包含UDP头更容易,因为内核将管理一些TCP机制。因此,您需要在数据包中添加UDP头,这样它就会成为一个数据报套接字。

这是原始套接字,因此不涉及TCP协议栈。我认为对于原始套接字而言,TCP数据包只是一个普通的数据包,TCP机制并没有参与其中,是吗? - user1944267
机制很复杂。在TCP套接字的情况下,内核会为您执行一些操作。请查看此问题 - nouney
啊,好的,这是针对 recv()/read() 的,因为 TCP 栈将响应传入的 TCP 数据包。但对于 send()/write(),原始套接字与本地 TCP 栈无关。 - user1944267
我认为你需要接收和发送 :) 没关系:你可以将原始套接字用作数据报套接字。 - nouney
所以你的意思是,如果我使用原始套接字发送TCP数据包,它就像使用数据报套接字一样操作,对吗? - user1944267
不,我的意思是你应该只在原始套接字中使用UDP头。TCP原始套接字的“send()”可能没问题,但你不能确定“recv()”(除非你自己管理TCP堆栈)。 - nouney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接