与AF_INET混淆,SOCK_RAW作为套接字类型,V / S AF_PACKET,SOCK_DGRAM和SOCK_RAW作为套接字类型

时间:2018-03-15 20:55:40

标签: sockets unix networking tcp

我对网络编程很陌生,并且一直在努力解决这个问题。在通过互联网浏览了大量资源之后,我得出了以下结论,并对此产生了混淆。

结论1: 当我们谈论创建套接字时:

s = socket(AF_INET, SOCK_RAW, 0);

我们基本上是在尝试创建一个原始套接字。使用以这种方式创建的原始套接字,可以绕过OSI堆栈中的TCP / UDP层。这意味着,当应用程序通过此套接字接收到数据包时,应用程序将具有包含网络层(第3层)标头的数据包,其中包含包含实际数据的第2层标头。因此,无论如何,应用程序都可以自由地处理此数据包,超出第3层。

类似地,当通过此套接字发送数据包时,应用程序可以自由地处理数据包创建,直到第4层,然后将其传递到第3层,从内核处理内容。

结论2:当我们谈论创建套接字时:

s = socket(AF_PACKET, SOCK_RAW, 0);

我们再次尝试创建一个原始套接字。使用以这种方式创建的原始套接字,可以完全绕过OSI的所有层。 用户土地应用程序可以使用纯原始数据包,并且可以随意使用该数据包执行任何操作。通过这样的套接字接收的数据包将使所有标头保持完整,并且应用程序也可以访问所有这些标头。

类似地,当通过这样的套接字发送数据时,用户应用程序是必须处理关于数据包的创建以及实际数据的包装以及每个层的标头之前的应用程序。实际上是放在要传输的物理介质上。

结论3:当我们谈论创建套接字时:

s = socket(AF_PACKET, SOCK_DGRAM, 0);

我们再次尝试创建一个原始套接字。使用以这种方式创建的原始套接字,可以绕过OSI堆栈中的数据链路层(第2层)。这意味着,当用户陆地应用程序接收到这种套接字上的分组时,从分组中移除数据链路层报头。

类似地,在通过此套接字发送数据包时,根据sockaddr_ll目标地址中的信息,将一个合适的数据链路层头添加到数据包中。

以下是我的疑问/疑惑点:

  1. 我上面提到的关于原始套接字的结论是否正确?
  2. 我不太清楚上面的结论3 。有人可以解释一下吗?比如,是否意味着当用户登陆应用程序通过此套接字接收数据包时,只有内核处理的数据链路层标头?因此,数据包就像直接包裹在第3层标题中的消息一样,然后由上面的图层包裹起来?
  3. 如果上面得出的结论是正确的,结论1 结论2 仍然有意义。但是,如果上面的结论3 (以及上面2中的推测)是正确的,那么任何应用程序何时都需要这样做呢?
  4. 我提到的一些资源试图理解上述内容:

    https://docs.freebsd.org/44doc/psd/21.ipc/paper.pdf

    https://sock-raw.org/papers/sock_raw

    https://www.quora.com/in/Whats-the-difference-between-the-AF_PACKET-and-AF_INET-in-python-socket

    http://www.linuxcertif.com/man/7/PF_PACKET/

    http://opensourceforu.com/2015/03/a-guide-to-using-raw-sockets/

    'SOCK_RAW' option in 'socket' system call

    http://stevendanna.github.io/blog/2013/06/23/a-short-sock-raw-adventure/

    https://www.intervalzero.com/library/RTX/WebHelp/Content/PROJECTS/Application%20Development/Understanding_Network/Using_RAW_Sockets.htm

0 个答案:

没有答案