繁体   English   中英

Linux SOCK_RAW和SOCK_STREAM有什么区别?

[英]What's the difference between Linux SOCK_RAW and SOCK_STREAM?

我最近一直在用c代码和密码学研究网络,在思考随机问题后,我偶然发现了一段用于数据包嗅探的代码,我对函数recvfrom()使用的实际套接字有疑问。 套接字通过以下sock函数rawSock = socket(AF_INET, SOCK_RAW, 0)初始化。

我知道SOCK_STREAMSOCK_RAW是表示整数的宏; 但问题不在于价值,而在于结果。

我何时使用SOCK_STREAM不是SOCK_RAW ,反之亦然?

我理解使用SOCK_STREAM基本客户端和服务器通信。 我正在使用C和Linux

阅读手册页

对于原型

int socket(int domain, int type, int protocol);

类型可以

   SOCK_STREAM     Provides sequenced, reliable, two-way, connection-
                   based byte streams.  An out-of-band data transmission
                   mechanism may be supported.

要么

   SOCK_RAW        Provides raw network protocol access.

在一行中, SOCK_STREAM用于面向连接的套接字,其中底层操作系统创建和管理L4(TCP),L3和L2的标头。 OTOH SOCK_RAW提供了对标头和数据包构造的更细粒度的控制,用户必须构建和提供标头,并且还可以管理内容。

详细说明:

SOCK_STREAM类型的套接字是全双工字节流。 它们不保留记录边界。 在可以在其上发送或接收任何数据之前,流套接字必须处于连接状态。 使用connect(2)调用创建与另一个套接字的连接。 连接后,可以使用read(2)和write(2)调用或send(2)和recv(2)调用的某些变体来传输数据。 当会话已经完成时,可以执行关闭(2)。 也可以如发送(2)中所述发送带外数据,并如recv(2)中所述接收带外数据。

SOCK_RAW套接字允许向sendto(2)调用中指定的通信方发送数据报。 数据报通常与recvfrom(2)一起接收,它返回下一个数据报以及其发送者的地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM