一 原始套接字概述
原始套接字,指在传输层下面使用的套接字。流式套接字和数据报套接字这两种套接字工作在传输层,主要为应用层的应用程序提供服务,并且在接收和发送时只能操作数据部分,而不能对IP首部或TCP和UDP首部进行操作,通常把这两种套接字称为标准套接字。
但是,如果我们开发的是更底层的应用,比如发送一个自定义的IP包、UDP包、TCP包或ICMP包,捕获所有经过本机网卡的数据包,伪装本机的IP,想要操作IP首部或传输层协议首部,等等,这些功能对于这两种套接字就无能为力了。这些功能需要使用另一种套接字来实现,这种套接字叫作原始套接字,功能更强大,更底层。
原始套接字可以在链路层收发数据帧。
二 原始套接字和标准套接字的区别
原始套接字可以自动组装数据包(伪装本地IP和本地MAC),可以接收本机网卡上所有的数据帧(数据包)。另外,必须在管理员权限下才能使用原始套接字。
原始套接字直接置“根”于操作系统网络核心(Network Core),而SOCK_STREAM、SOCK_DGRAM则“悬浮”于TCP和UDP协议的外围,如下图所示:
流式套接字只能收发TCP协议的数据,数据报套接字只能收发UDP协议的数据,原始套接字可以收发没经过内核协议栈的数据包。
三 原始套接字的编程方法
原始套接字的编程和UDP的编程方法差不多,也是创建一个套接字后,通过这个套接字收发数据。重要区别是原始套接字更底层,可以自行封装数据包,制作网络嗅探工具,实现拒绝服务攻击,实现IP欺骗,等等。面向链路层的原始套接字用于在MAC层(二层)上收发原始数据帧,这样就允许用户在用户空间完成MAC上各个层次的实现。
原文链接:https://blog.csdn.net/chengqiuming/article/details/89577351