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

标签 sockets networking

根据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/

相关文章:

linux - 非阻塞连接调用不返回连接被拒绝

php调用c++套接字函数导致权限被拒绝错误

amazon-web-services - AWS Lambda 通过仅导出互联网网关访问互联网

java - FileOutputStream 部分不起作用

c# - PubNub Windows Phone 8(仅在 Debug模式下连接)

c++ - 识别进程正在某些端口 C/C++ Windows 中运行

amazon-web-services - 如何从我的 AWS 实例的公共(public) IP 地址运行 ThingsBoard

networking - 如何在公司防火墙后面使用 cygwin

ruby - Socket.recv 有效但无法获取或读取?

C++ Boost ASIO 套接字错误