程序员社区

RAW-socket

一、简介

Internet套接字是大多数操作系统中实现网络通信的方式。它们通常由套接字API提供,并且基于与读取和写入文件相同的原则。程序可以通过操作系统提供的功能获得套接字。然后,该函数返回套接字描述符,通常是一个简单的整数,类似于大多数操作系统提供的用于文件读写操作的描述符。然后,这个套接字描述符可以用于从套接字写入或读取数据。写入套接字的数据通过添加首部和尾部被操作系统封装,然后通过网络接口通过网络将完整的数据包发送到目标主机。从套接字接收到的数据显示给程序,而不带首部和尾部,仅向用户显示用户数据。这样工作的套接字是通过Berkeley套接字API提供的数据报或流套接字。用户不知道底层之间的通信。所有网络通信步骤,例如连接建立,都在用户不知情的情况下进行处理。用户只负责创建套接字,然后提供他希望发送到正确函数的数据:
在这里插入图片描述
用户需要设置的参数是:

  • 源套接字地址(IP地址和端口号的组合)通常可以通过bind()函数设置,也可以直接通过send()函数之一定义。
  • 通过选择DATAGRAM-socket或STREAM-socket,我们可以选择是否要有单独的数据报或字节流。这也会选择正在使用的传输层协议(UDP或TCP)。

如果我们想访问较低层的数据,我们有几种可能:RAW-socket、PACKET-socket、网络驱动程序和数据链路层api。网络驱动程序的编程将在这项工作中不再进一步讨论,因为我们想看看适用于不同操作系统的可移植解决方案。我们将展示的API可以访问的内容如下图2所示:
在这里插入图片描述
通过这些api,应用程序可以更改和访问用于发送数据的网络层的字段。这可能被看作是对传统分层模型的突破,因为我们可以影响较低层提供的服务。

1.1 RAW-sockets

RAW-socket是标准Berkeley套接字和基于它的套接字API的一部分[1]。它们是除了前面提到的DATAGRRAM-socket或STREAM-socket之外的另一个选项,用于使用套接字API创建数据包[1]。除了简单地发送数据和定义地址信息外,RAW-socket还允许用户访问和操作较低层的头和尾信息,更具体地说,是网络层和传输层(OSI模型的第3层和第4层)。由于RAW-socket是Internet套接字API的一部分,因此它们只能用于生成和接收IP数据包。

1.2 //待补充

二、不同系统的实现

首先,我们要简要概述一些可用于RAW-socket和数据链路层网络编程的api和库。一般来说,我们希望将可用的库分为两部分:操作系统提供的api和可用于多个操作系统的独立库。

2.1 Windows

//待补充

2.2 Linux

赞(0) 打赏
未经允许不得转载:IDEA激活码 » RAW-socket

一个分享Java & Python知识的社区