gpt4 book ai didi

sockets - 原始套接字问题: Are TCP packets passed to a raw socket?

转载 作者:行者123 更新时间:2023-12-02 12:44:28 26 4
gpt4 key购买 nike

根据Unix网络编程第一卷,“接收到的UDP数据包和接收到的TCP数据包永远不会传递到原始套接字。如果进程想要读取包含UDP或TCP数据包的IP数据报,则必须在数据链路层读取数据包” ...

但与此相反,在创建原始套接字时有一个 IPPROTO_TCP 协议(protocol)选项,在我看来,它正是服务于这个目的。有人可以指出我在理解这一点时可能犯的任何错误吗?

最佳答案

当您创建原始套接字时,您可以使用 IPPROTO_TCP 等协议(protocol)选项指定要绑定(bind)到的协议(protocol):UDP、TCP 或 ICMP。但是,此选项仅确定您要打开的套接字类型,因此该端口上收到的数据将转发到您的应用程序。因此,如果您设置 IPPROTO_TCP 并在端口 5000 上打开原始套接字,您的应用程序将收到发送到端口 5000 的原始 TCP 数据包,但不会收到发送到端口 5000 的原始 UDP 数据包。

即使数据包保证是 TCP,套接字也不会执行任何正常的 TCP 处理(syn、ack、重新排序等),您只是获得原始 IP 数据包,其中包含代表 TCP 的二进制数据 block header 。对于普通的 TCP 套接字,您接收到的数据是嵌入在 TCP header 中的数据。使用原始 TCP 套接字,数据仍然是嵌入在链路层 header 中的所有内容,因此您将看到 IP header ,然后是 TCP header ,然后是收到的每个数据包的有效负载数据。

有关更多信息,请查看本教程:

A brief programming tutorial in C for raw sockets

关于sockets - 原始套接字问题: Are TCP packets passed to a raw socket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5476112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com