一、TCP、UDP回顾
1.1 TCP、UDP开发回顾
UDP:
数据报式套接字(SOCK_DGRAM)
1、无连接的socket,针对无连接的UDP服务
2、可以通过邮件模型来进行对比
(不保证可靠,但是传输效率高,速度快)
TCP:
流式套接字(SOCK_STREAM)
1、面向连接的socket,针对面向连接的TCP服务
2、可通过电话模型来进行对比
连接时:三次握手;退出时:四次挥手
这两类套接字似乎涵盖了TCP/IP应用的全部
TCP与UDP各自有独立的port互不影响
一个进程可同时拥有多个port
不必关心TCP/IP协议实现的过程
UDP:
TCP:
二、原始套接字概述、创建
2.1 原始套接字概述
2.2 创建原始套接字
注意:原始套接字运行时需要加权限 sudo
三、数据包详解
3.1 组装/拆解UDP数据包流程
3.2 UDP封包格式
UDP报头:(八个字节)
1、源头口号:发送端口号
2、目的端口号:接收方端口
3、长度:UDP用户数据报的长度,最小值是8(仅有首部)
4、校验和:监测UDP用户数据报在传输中是否有错,有错就丢弃
3.3 IP封包格式
3.4 Ethernet 封包格式:
MAC头部:
注意:ip数据报(0x0800)、ARP数据报(0x0806)、RARP(0x8035)
数据根据类型来决定
3.5 TCP封包格式
TCP报头:
3.6 ICMP封包格式
ICMP协议用来实现监测两台主机是否能够通信
四、编程实例——分析MAC数据包
4.1 链路层数据格式
五、练习——网络数据分析器
对网络上的数据进行抓取,然后进行分析,此“网络数据分析器”就是模仿显示开发中的抓包工具而进行的。
5.1 网络数据分析图
5.2 ARP数据分析图
说明:
1、ARP的TYPE为0x0806
2、buf为unsigned char
3、所有数据均为大端
5.3 IP数据报
说明:
1、ARP的TYPE为0x0800
2、buf为unsigned char
3、所有数据均为大端
5.4 代码讲解以及混杂模式
5.4.1 要求
1、分析出ARP/IP/RARP
2、分析出MAC
扩展:
在完成基本要求的前提下,分析port
提示:
以root权限运行
5.4.2 代码讲解
接收一个数据报,并分析:
结果:
5.4.3 混杂模式
六、sendto发送数据
6.1 用sendto发送原始套接字数据
6.2 本机网络接口
6.3 发送数据demo
sll.sll_ifindex = 当前要出去的网络接口地址
6.4 通过ioctl来过去网络接口地
七、练习——MAC地址扫描器(ARP)
7.1 概述
7.2 在Linux和Windows查看系统ARP表方式
Linux下:
Windows:
注意:当主机A与B通信时 会先查看表中有没有对方的mac地址,有则直接通信即可,没有的话再调用arp协议获取对方的mac地址并将其保存在arp表中
7.3 ARP协议格式
7.4 想指定IP发送ARP请求(demo)
通过对方的ip地址获取对方的mac地址: