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

Sockets 原始套接字问题:TCP数据包是否传递到原始套接字?,sockets,networking,Sockets,Networking,根据Unix网络编程Vol1,“接收到的UDP数据包和接收到的TCP数据包永远不会传递到原始套接字。如果进程希望读取包含UDP或TCP数据包的IP数据报,则必须在数据链路层读取数据包” 但与此相反,在创建原始套接字时有一个IPPROTO_TCP协议选项,在我看来,它正是为了达到这个目的。有人能指出我在理解这一点时可能犯的任何错误吗?当您创建原始套接字时,您可以使用IPPROTO_TCP等协议选项指定要绑定到的协议,UDP、TCP或ICMP。但是,此选项仅确定您正在打开的套接字类型,以及在该端口上

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


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

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

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

有关详细信息,请查看本教程:


非常感谢,这就解释了