Linux SOCK_RAW和SOCK_STREAM之间的区别是什么?

时间:2018-06-16 14:49:17

标签: c linux networking ip

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

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

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

我了解使用SOCK_STREAM的基本客户端和服务器通信。我在C和Linux上工作

1 个答案:

答案 0 :(得分:3)

阅读man page

原型

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),它返回下一个数据报          发件人的地址。