【问题标题】:What's the difference between Linux SOCK_RAW and SOCK_STREAM?Linux SOCK_RAW 和 SOCK_STREAM 有什么区别?
【发布时间】:2018-11-26 02:06:11
【问题描述】:

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

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

我什么时候可以使用SOCK_STREAM 而不是SOCK_RAW,反之亦然?

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

【问题讨论】:

标签: c linux networking ip


【解决方案1】:

阅读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) 调用的一些变体。当一个会话有 完成后可以执行 close(2)。带外数据可能 也可以按照 send(2) 中的描述发送并按照描述接收 在 recv(2) 中。

SOCK_RAW 套接字允许将数据报发送到 sendto(2) 调用中指定的通讯员。数据报一般是 使用 recvfrom(2) 接收,它返回下一个数据报以及 发件人的地址。

【讨论】:

  • 这是您上次引用的内容:“SOCK_DGRAM and”;-)
  • @alk 这就是为什么我将源代码放在第一行本身。 :)
  • 所以后续问题可能是:“SOCK_DGRAMSOCK_RAW 有什么区别?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 2011-08-14
  • 2012-11-27
  • 2020-01-02
  • 2015-01-02
  • 2018-08-29
相关资源
最近更新 更多