通常我们看到的socket是拆包后的,只能看到用户数据,原始套接字raw就是给你看最原始的,以方便你进行干预。从用户的角度来看,SOCK_STREAM、SOCK_DGRAM这两类套接字似乎的确涵盖了TCP/IP应用的全部,因为基于TCP/IP的应用,从 协议栈的层次上讲,在传输层的确只可能建立于TCP或UDP协议之上(图),而SOCK_STREAM、SOCK_DGRAM又分别对应于TCP和 UDP,所以几乎所有的应用都可以用这两类套接字实现。
Raw Socket与标准套接字(SOCK_STREAM、SOCK_DGRAM)的区别在于前者直接置"根"于操作系统网络核心(Network Core),而SOCK_STREAM、SOCK_DGRAM则"悬浮"于TCP和UDP协议的外围,如图所示:
当我们使用Raw Socket的时候,可以完全自定义IP包,一切形式的包都可以"制造"出来。如果用原始套接字来传输数据的话,就要自己来写TCP或者UDP包的头部。