原始套接字问题:TCP数据包是否传递给原始套接字?

时间:2011-03-29 16:55:32

标签: sockets networking

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

但与此相反,在创建原始套接字时有一个IPPROTO_TCP协议选项,在我看来这是用于这个目的。任何人都可以指出我在理解这个问题时可能犯的任何错误吗?

1 个答案:

答案 0 :(得分:9)

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

即使数据包保证是TCP,套接字也不会进行任何正常的TCP处理(syn,ack,重新排序等),你只需要获得带有代表TCP的二进制数据块的原始IP数据包头。使用普通的TCP套接字,您收到的数据是嵌入在TCP标头内的数据。使用Raw TCP套接字时,数据仍然是链接层标头中嵌入的所有内容,因此您将看到IP标头,后跟TCP标头,然后是接收到的每个数据包的有效负载数据。

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

A brief programming tutorial in C for raw sockets