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

9
根据《Unix网络编程》第一卷的说法,“接收到的UDP数据包和接收到的TCP数据包永远不会传递给原始套接字。如果进程想要读取包含UDP或TCP数据包的IP数据报,那么这些数据包必须在数据链路层读取”...
但与此相反,在创建原始套接字时有一个IPPROTO_TCP协议选项,看起来就像是为了实现这个目的而存在的。请问是否有任何错误可以指出我对此的理解?
1个回答

10

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

即使保证收到的数据包是TCP,套接字也不会执行任何正常的TCP处理(SYN,ACK,重新排序等),您只会得到具有代表TCP头部的二进制数据块的原始IP数据包。对于普通的TCP套接字,您接收到的数据是嵌入在TCP头部内的数据。对于原始TCP套接字,数据仍然是嵌入在链接层头部中的全部内容,因此您将看到每个接收到的数据包的IP标头,后跟TCP标头,再后跟有效负载数据。

更多信息请参见以下教程:

C语言原始套接字简明编程教程


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