raw socket 的简单介绍

本文记录了有关 raw socket 以及TCP/IP的基础知识

本文记录了有关 raw socket 以及TCP/IP的基础知识

raw socket 介绍

raw socket 原始套接字,它工作在数据链路层和网络层,而其他类型的套接字工作在传输层,只能进行传输层数据操作

raw socket 创建

  1. sock_fd = socket(AF_INET, SOCK_RAW, TYPE)
    • AF_INET:抓网络层的IP数据报。
    • TYPE:表示IP数据报上层所使用的协议。例如:(对应于IP数据报首部协议字段)
      • TYPE=IPPROTO_ICMP: 抓取ICMP包(网络层协议,封装在IP数据报上)。
      • TYPE=IPPROTO_TCP: 抓取TCP包。
      • TYPE==IPPROTO_UDP: 抓取UDP包。
  2. sock_fd = socket(PF_PACKET, SOCK_RAW, htons(x) )
    • PF_PACKTE: 抓取数据链路层的MAC帧
    • x:常用的取值有
      • ETH_P_IP 、ETH_P_ARP 、ETH_P_RARP。(对应于MAC帧首部类型字段)
      • ETH_P_IP 0x0800 只接收发往本机mac的ip类型的数据帧
      • ETH_P_ARP 0x0806 只接受发往本机mac的arp类型的数据帧
      • ETH_P_RARP 0x08035 只接受发往本机mac的rarp类型的数据帧
      • ETH_P_ALL 0x3 接收发往本机mac的所有类型ip arp rarp的数据帧, 接收从本机发出的所有类型的数据帧.(混杂模式打开的情况下,会接收到非发往本地mac的数据帧)

TCP/IP Cheat Sheet

概述

TCP/IP不是一个协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的http、ftp、pop3协议等等。电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。

实质上,TCP/IP协议族的结构与ISO-OSI的七层协议经典架构稍有不同,通常来讲,我们将之分为四层或者五层。分别是:

  • 链路层:处理与电缆(或)其他任何传输媒介的物理接口细节 设备驱动程序及接口卡
  • 网络层:处理分组在网络中的活动,例如分组选路 IP/ICMP/IGMP
  • 运输层:为两台主机上的应用程序提供端到端的通讯 TCP和UDP
  • 应用层:处理特定的应用程序细节 Telnet FTP 和e-mail等

补充一些基础知识

互联网地址(ip地址)

网络上每一个节点都必须有一个独立的Internet地址(也叫做IP地址)。现在,通常使用的IP地址是一个32bit的数字,也就是我们常说的IPv4标准,这32bit的数字分成四组,也就是常见的255.255.255.255的样式。IPv4标准上,地址被分为五类,我们常用的是B类地址。具体的分类请参考其他文档。需要注意的是IP地址是网络号+主机号的组合,这非常重要。

域名系统

域名系统是一个分布的数据库,它提供将主机名(就是网址啦)转换成IP地址的服务。

RFC

RFC是什么?RFC就是tcp/ip协议的标准文档,在这里我们可以看到RFC那长长的定义列表,现在它一共有4000多个协议的定义,当然,我们所要学习的,也就是那么十几个协议而已。

端口号(port)

注意,这个号码是用在TCP,UDP上的一个逻辑号码,并不是一个硬件端口,我们平时说把某某端口封掉了,也只是在IP层次把带有这个号码的IP包给过滤掉了而已。

应用编程接口

现在常用的编程接口有socket和TLI。而前面的有时候也叫做“Berkeley socket”,可见Berkeley对于网络的发展有多大的贡献。

MAC地址

MAC地址,即 Media Access Control Address。中文直译为,媒体存取控制地址,通常也称为局域网地址(LAN Address),以太网地址(Ethernet Address) 或物理地址(Physical Address),它是一个用來确认網路設備位置的位址。

Link layer - 链路层

通常将链路层称为数据链路层,在TCP/IP协议族中,数据链路层有三个目的:

  1. 为IP模块发送和接收IP数据报。
  2. 为ARP模块发送ARP请求和接收ARP应答。
  3. 为RARP发送RARP请求和接收RARP应答。

先来说下这几个英文简称:

  • IP 即 Internet Protocol ,中文为网络协议,IP地址即为网络协议地址的简称。
  • ARP 即 Address Resolution Protocol ,中文为地址解析协议,用来通过IP地址定位MAC地址。
  • RARP 即 Reverse Address Resolution Protocol,逆地址解析协议。RARP用于将MAC地址转换为IP地址。其因为较限于IP地址的运用以及其他的一些缺点,因此渐为更新的BOOTP或DHCP所取代。

TCP/IP 协议族支持的链路层协议很多,列出常用的几个:

以太网链路层协议

在win下使用ipconfig 和在 Linux下使用 ifconfig 均可在返回的信息中找到诸如’以太网适配器’和’eth0’等字段,这就是以太网接口。

以太网(Ether-net)的定是指数字设备公司( Digital Equipment Corp.)、英特尔公司(Intel Corp.)和Xerox公司在1982年联合公布的一个标准,这个标准里面使用了一种称作CSMA/CD的接入方法。而IEEE802提供的标准集802.3(还有一部分定义到了802.2中)也提供了一个CSMA/CD的标准。

这两个标准稍有不同,TCP/IP协议对这种情况的处理方式如下:

  • 以太网的IP数据报封装在RFC894中定义,而IEEE802网络的IP数据报封装在RFC1042中定义。
  • 一台主机一定要能发送和接收RFC894定义的数据报。
  • 一台主机可以接收RFC894和RFC1042的封装格式的混合数据报。
  • 一台主机也许能够发送RFC1042数据报。如果主机能同时发送两种类型的分组数据,那么发送的分组必须是可以设置的,而且默认条件下必须是RFC 894分组。

以太网协议封装可以参考-以太网协议封装格式

SLIP(串行线路IP)

SLIP(Serial Line Internet Protocol,串行线路网际协议),主要在Unix远程访问服务器中使用,现今仍然用于连接某些ISP。因为SLIP协议是面向低速串行线路的,可以用于专用线路,也可以用于拨号线路,Modem的传输速率在1200bps到19200bps。RFC1055中有详细描述。

帧格式的规则:

  1. IP数据报以一个被称作END(0xc0)的特殊字符结束。同时为防止数据到来前的噪声,通常在开始处也会传一个END,用来标识数据的起始部分。
  2. 若IP报文中某个字符为END,那么要连续传输两个字节0xdb,0xdc来代替。(好比,编程语言中要打印特殊含义的字符的时候要加转义字符)
  3. 若IP报文中某个字符为ESC,那么要连续传输两个字节0xdb,0xdd来代替。

SLIP的缺陷:

  1. 每一端必须知道对方的IP地址,不能把本端的IP地址通知给另一端
  2. 数据帧中没有类型字段。如果一条串行线路用于SLIP,那么它不能同时使用其他协议。
  3. SLIP中没有类似于以太网的CRC校验字段,这样纠错能力差。

CSLIP

传统的串行线路速率较低,为了传输1个字节的数据需要20个字节的IP首部和20个字节的TCP首部。因此,人们提出CSLP(压缩SLIP),他将前面提到的40个字节压缩到3到5个字节,且能够在两端维持多大16个TCP连接,并且知道其中每个连接的首部中的某个字段一般不会。当然同样可以用localhost代替。

A类网络号就是为了回环接口预留的,大多数系统喜欢分配127.0.0.1,所以在你不装网卡的时候用ping命令也是可以通的。当你把ip数据报传给这个接口的时候,就不能再任何网络上出现了。

对于环回接口,有如下三点值得注意:

传给环回地址(一般是127.0.0.1)的任何数据均作为IP输入。

传给广播地址或多播地址的数据报复制一份发生变化。对于那些发生变化的字段,大多数只是一些小的数字和的改变。被压缩的首部大大缩短了交互响应时间。

PPP(点对点协议)

PPP协议修改了SLIP协议中的所有缺陷:

包括三个部分:

  1. 在串行链路上封装了IP数据报的方法。PPP既支持数据位8为和无奇偶检验的异步模式,还支持面向比特的同步链接。
  2. 建立、配置及测试LCP(数据链路的链路控制协议)。它允许通信双方进行协商,以及确定不同的选项。
  3. 针对不同网络层协议的NCP(网路控制协议)体系。当前RFC定义的网络层有IP、OSI网络层、DECnet以及AppleTalk。例如,IP NCP允许双方商定是否对报文首部进行压缩,类似于CSLIP

具体参看 - PPP协议详解

回环接口(127.0.0.1)

回环接口,又叫环回接口都是Loopback Interface的翻译。

关于这个127.0.0.1基本上学过网络编程的人都不会陌生。比如你用C#写一个c/s的程序,要用自己的PC又当Server又当Client。就需要这个回环地址。当然同样可以用localhost代替。

A类网络号就是为了回环接口预留的,大多数系统喜欢分配127.0.0.1,所以在你不装网卡的时候用ping命令也是可以通的。当你把ip数据报传给这个接口的时候,就不能再任何网络上出现了。

对于环回接口,有如下三点值得注意:

  • 传给环回地址(一般是127.0.0.1)的任何数据均作为IP输入。
  • 传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这是因为- 广播传送和多播传送的定义包含主机本身。
  • 任何传给该主机IP地址的数据均送到环回接口。