关闭

【Linux网络编程】原始套接字能干什么?

标签: 原始套接字Linux网络编程套接字原始套接字编程Linux套接字
460人阅读 评论(0) 收藏 举报
分类:
通常情况下程序员接所接触到的套接字(Socket)为两类:
(1)流式套接字(SOCK_STREAM):一种面向连接的 Socket,针对于面向连接的TCP 服务应用;
(2)数据报式套接字(SOCK_DGRAM):一种无连接的 Socket,对应于无连接的 UDP 服务应用。

从用户的角度来看,SOCK_STREAM、SOCK_DGRAM 这两类套接字似乎的确涵盖了 TCP/IP 应用的全部,因为基于 TCP/IP 的应用,从协议栈的层次上讲,在传输层的确只可能建立于 TCP 或 UDP 协议之上,而 SOCK_STREAM、SOCK_DGRAM 又分别对应于 TCP 和 UDP,所以几乎所有的应用都可以用这两类套接字实现


但是,当我们面对如下问题时,SOCK_STREAM、SOCK_DGRAM 将显得这样无助:

(1)怎样发送一个自定义的 IP 包?
(2)怎样发送一个 ICMP 协议包?
(3)怎样分析所有经过网络的包,而不管这样包是否是发给自己的?
(4)怎样伪装本地的 IP 地址?


这使得我们必须面对另外一个深刻的主题——原始套接字(SOCK_RAW)。原始套接字广泛应用于高级网络编程,也是一种广泛的黑客手段。著名的网络sniffer(一种基于被动侦听原理的网络分析方式)、拒绝服务攻击(DOS)、IP 欺骗等都可以通过原始套接字实现。


原始套接字(SOCK_RAW)可以用来自行组装数据包,可以接收本机网卡上所有的数据帧(数据包),对于监听网络流量和分析网络数据很有作用。


原始套接字是基于 IP 数据包的编程(SOCK_PACKET 是基于数据链路层的编程)。另外,必须在管理员权限下才能使用原始套接字。


原始套接字(SOCK_RAW)与标准套接字(SOCK_STREAM、SOCK_DGRAM)的区别在于原始套接字直接置“根”于操作系统网络核心(Network Core),而  SOCK_STREAM、SOCK_DGRAM 则“悬浮”于 TCP 和 UDP 协议的外围。



流式套接字只能收发 TCP 协议的数据,数据报套接字只能收发 UDP 协议的数据,原始套接字可以收发内核没有处理的数据包。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Linux网络编程:原始套接字编程及实例分析

Linux网络编程:原始套接字编程及实例分析 一、原始套接字能干什么? 二、原始套接字编程 三、原始套接字实例:MAC头部报文分析
  • q623702748
  • q623702748
  • 2016-07-29 11:25
  • 981

基于原始套接字编程

基于原始套接字编程        在开发面向连接的TCP和面向无连接的UDP程序时,我们所关心的核心问题在于数据收发层面,数据的传输特性由TCP或UDP来保证:        也就是说,对于TCP或UDP的程序开...
  • u013286409
  • u013286409
  • 2015-09-06 16:23
  • 1248

linux下简单的原始套接字通信

SOCK_RAW
  • my_zou
  • my_zou
  • 2016-12-20 15:21
  • 339

《网络编程》原始套接字 ---ping程序实现

基于字节流套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)不可以访问传输层协议,只是对应用层的报文进行操作,传输层的数据报格式都是由系统提供的协议栈实现,用户只需要填充相应的应用层报文,由系统完成底层报文首部的填充并发送。原始套接字(SOCK_RAW)可以访问位于基层的传输层协...
  • chenhanzhun
  • chenhanzhun
  • 2014-12-23 18:08
  • 2837

Linux网络编程:原始套接字的魔力【续】

如何从链路层直接发送数据帧        本来以为这部分都弄完了,结果有朋友反映说看了半天还是没看到如何从链路层直接发送数据。因为上一篇里面提到的是从链路层“收发”数据,结果只“收”完,忘了“发”,实在抱歉,所以就有这篇续出来了。    ...
  • ljq550000
  • ljq550000
  • 2016-02-28 19:55
  • 395

Linux 网络编程——原始套接字实例:发送 UDP 数据包

IP报头
  • tennysonsky
  • tennysonsky
  • 2015-04-08 16:57
  • 3568

C#网络编程 (四) 套接字编程原理

简述面向连接服务(TCP)的主要特点有: - 数据传输必须经过建立、维护和释放三个阶段 - 在传输过程中,个分组不需要携带目的主机的地址 - 可靠性好,但协议复杂,通信效率不高 面向无连接服务(UDP)的主要特点: - 不需要连接的各个阶段 - 各个分组要携带完整的目的主机地址...
  • im_zhq
  • im_zhq
  • 2016-05-16 23:27
  • 626

Linux网络编程——原始套接字实例:MAC 头部报文分析

一、前导 通过《Linux网络编程——原始套接字编程》得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 二、链路层封包格式 三、MAC 头部(有线局域网) 注意:...
  • lianghe_work
  • lianghe_work
  • 2015-04-21 16:09
  • 1633

Linux网络编程——原始套接字编程

原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据。区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有的数据帧(数据包)。另外,必须在管理员权限下才能使用原始套接字。 原始套接字的创建: int s...
  • tennysonsky
  • tennysonsky
  • 2015-03-27 17:47
  • 8126

linux下原始套接字编程

1. 面向IP层的原始套接字编程 -----------------------------------------------------------------------------------------------------------------------------  &...
  • banruoju
  • banruoju
  • 2017-03-13 19:35
  • 656
    个人资料
    • 访问:200842次
    • 积分:4309
    • 等级:
    • 排名:第8165名
    • 原创:220篇
    • 转载:69篇
    • 译文:3篇
    • 评论:22条
    博客专栏
    最新评论