[英]What's the difference between Linux SOCK_RAW and SOCK_STREAM?
我最近一直在用c代码和密码学研究网络,在思考随机问题后,我偶然发现了一段用于数据包嗅探的代码,我对函数recvfrom()
使用的实际套接字有疑问。 套接字通过以下sock函数rawSock = socket(AF_INET, SOCK_RAW, 0)
初始化。
我知道SOCK_STREAM
和SOCK_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.