一、TCP/IP协议简介
IP协议用于将多个包交换网络连接起来,IP不提供可靠的传输服务,它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。如果出错可以通过ICMP报告,ICMP在IP模块中实现。I
TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于点对点的通讯。
TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。
如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向‘上’传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。
二、锐捷认证原理
锐捷认证协议以802.1X协议为基础。其认证过程如下:
1、主机现在不知道服务器的地址,发出第一帧数据,协议为生成树协议(Spanning-tree)。
2、服务器向主机发送EAP REQUEST Identity要求认证身份请求。
3、主机向服务器发送EAP RESPONSE Identity回应。
4、服务器向主机发送EAP REQUEST MD5 challenge要求认证密码MD5校验值。
5、主机向服务器发送EAP RESPONSE MD5 challenge回应。
6、服务器向主机发送EAP SUCCESS。
7、从DHCP服务器获取IP地址。
8、客户端版本校验。
9、发送数据包保持在线。
三、软硬件平台
硬件平台:s3c6410处理器 DM9000网卡
内核版本:linux-3.0.1
文件系统:可读的yaffs2文件系统
1、需要开启的内核支持:
# USB Network Adapters
CONFIG_USB_NET_DM9601=m或者y
usb网卡的支持,否则会找不到网卡。出现:!! 查找网卡失败: Can't open USB bus file /sys/kernel/debug/usbmon/1t: No such file or directory
# Networking options
CONFIG_PACKET=y
!! 打开网卡eth0失败: socket: Address family not supported by protocl
CONFIG_IP_PNP_DHCP=y
华师大学城是动态分配IP,所以还要在内核开启这条支持。
2、相关库与工具
(1)交叉编译器:4.2.2-eabi
编译内核和编译锐捷兼容包的如果不是同一个交叉编译器可能会出问题。如编译内核用支持eabi特性的编译器而编译锐捷的编译器不支持eabi则将导致不兼容,下载到板上后会找不到命令锐捷命令。
(2)编译libpcap:
libpcap是unix和linux平台下的网络数据包捕获函数包。编译生成的库libpcap.a在编译锐捷兼容客户端时要用到
1、下载libpcap,网址http://www.tcpdump.org
2、解压tar -zxvf libpcap-1.0.0.tar.gz,修改confiugre文件,注释掉下面两段:
#if test -z "$with_pcap" && test "$cross_compiling" = yes; then
# { { echo "$as_me:$LINENO: error: pcap type not determined when cross-compiling; use --with-pcap=..." >&5
#echo "$as_me: error: pcap type not determined when cross-compiling; use --with-pcap=..." >&2;}
# { (exit 1); exit 1; }; }
#fi
.......
# if test $ac_cv_linux_vers = unknown ; then
# { { echo "$as_me:$LINENO: error: cannot determine linux version when cross-compiling" >&5
#echo "$as_me: error: cannot determine linux version when cross-compiling" >&2;}
# { (exit 1); exit 1; }; }
# fi
3、执行./configure --host=arm-linux,使用arm-linux-gcc进行configure,生成Makefile
4、修改Makefile的prefix项为prefix=/usr/local/arm/4.2.2-eabi/usr(安装到交叉编译工具的目录)
5、make,make install,完成了libpcap的编译和安装,查看/usr/local/arm/4.2.2-eabi/usr/lib,该目录下增加了两个pcap的文件库,分别为libpcap.a和libpcap.so.1.0.0。
(3)编译dhclient:
1、下载dhcp源码,网址http://gd.tuwien.ac.at/infosys/servers/isc/dhcp/
2、解压 tar -zxvf dhcp-3.1.3.tar.gz,进入目录./dhcp-3.1.3/
3、运行配置./configure,之后生成work.linux-2.2文件夹,进入目录./work.linux-2.2/client/
4、输入make "CC=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-gcc -static",编译生成dhclient
5、复制dhclient到开发板上的/usr/bin目录下,复制/dhcp-3.1.3/client/dhclient.conf 到开发板的/sbin/目录下,复制/dhcp-3.1.3/client/scripts/linux 到开发板的/sbin/目录下,并改名为dhclient-script,同时修改该文件的第一行#! /bin/bash 为#! /bin/sh,保存后,修改权限 chmod +x /sbin/dhclient-script
四、编译配置锐捷兼容包mentohust-0.3.1
1、下载mentohust源码,网址http://code.google.com/p/mentohust/
2、解压 tar -zxvf mentohust-0.3.1.tar.gz,进入目录./menohust-0.3.1/
3、运行配置./configure --host=arm-linux --disable-encodepass --disable-notify --with-pcap=stlib
这里把libpcap.a库设为静态链接,前提是把刚才编译生成的libpcap.a放到mentohust-0.3.1/src/里(也可以将配置改为—with-pcap=/usr/local/arm/4.2.2-eabi/usr/lib/libpcap.a)
4、输入make,编译menohust-0.3.1,在/mentohust-0.3.1/src/里生成了arm平台上的可执行文件menothust
5、将mentohust和mentohust.conf复制到开发板上的/usr/bin/目录下,修改mentohust.conf中的
;网卡
Nic=
为:
;网卡
Nic=eth0
6、本人所在的华师大学城的锐捷认证过程要求V3校验算法验证,而mentohust-0.3.1版本是只支持V2校验的,所以只是这样编译配置是认证不了的。利用mentohust提供的一个锐捷抓包工具MentoHUSTTool.exe在windows下抓取锐捷客户端认证过程的数据包,保存为扩展名为.mpf的文件,如mentohust.mpf,并复制的开发板上,在开发板上运行mentohust命令认证时通过-f选项指定数据文件menothust.mpf
7、通过串口工具ckermit连接开发板的终端(也可直接在开发板上的终端操作),输入命令mentohust -f/etc/mentohust.mpf -b2 -w,根据提示输入用户名、密码,组播地址选项选0,DHCP方式选二次认证。加-w选项之后配置信息会保存/etc/menohust.conf。Mentohust程序首先要找到认证服务器MAC,这里MAC为00:d0:f8:bf:94:71;然后mentohust向这个地址发送用户名与密码认证信息;通过用户认证之后再利用抓包工具所抓取的数据文件mentohust.mpf进行锐捷客户端的校验;通过客户端校验之后mentohust调用dhclient动态获取IP;获得服务器分配的IP后,就可以连接互联网了。Ping一下Google,可以接收到应答数据包。
终端信息如下:
mentohust 认证:
[root@FORLINX6410]# mentohust -f/etc/mentohust.mpf -b2 -w
欢迎使用MentoHUST 版本: 0.3.1
Copyright (C) 2009-2010 HustMoon Studio
人到华中大,有甜亦有辣。明德厚学地,求是创新家。
Bug report to http://code.google.com/p/mentohust/issues/list
** 网卡[1]: eth0
** 您选择了第[1]块网卡。
?? 请输入用户名: 2009*******
?? 请输入密码: ******
?? 请选择组播地址(0标准 1锐捷私有 2赛尔): 0
?? 请选择DHCP方式(0不使用 1二次认证 2认证后 3认证前): 1
>> 进入后台运行模式,使用参数-k可退出认证。
** 用户名: 2009*******
** 网卡: eth0
** 认证超时: 8秒
** 响应device eth0 entered promiscuous mode
间隔: 30秒
** 失败等待: 15秒
** 允许失败: 0次
** 组播地址: 标准
** DHCP方式: 二次认证
** 数据文件: /etc/mentohust.mpf
** DHCP脚本: dhclient
** 本机MAC: 00:e0:62:1f:e3:8c
** 使用IP: 125.216.223.30
** 子网掩码: 255.255.254.0
** 认证参数已成功保存到/etc/mentohust.conf.
>> 寻找服务器...
** 认证MAC: 00:d0:f8:bf:94:71
>> 发送用户名...
>> 发送密码...
** 客户端版本: 4.31
** MD5种子: 55:3c:ba:b3:21:2e:9b:ca:b9:e3:71:20:32:1b:2c:84
** V2校验值: 86f1775d7e6a7a2224e90bb23d3fd928
>> 认证成功!
>> 正在获取IP...
Internet Systems Consortium DHCP Client V3.1.3
Copyright 2004-2009 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
can't create /var/state/dhcp/dhclient.leases: No such file or directory
Listening on LPF/eth0/00:e0:62:1f:e3:8c
Sending on LPF/eth0/00:e0:62:1f:e3:8c
Sending on Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5
DHCPOFFER from 222.200.152.1
DHCPREQUEST on eth0 to 255.255.255.255 port 67
DHCPACK from 222.200.152.1
can't create /var/state/dhcp/dhclient.leases: No such file or directory
bound to 125.216.223.30 -- renewal in 6424 seconds.
>> 操作结束。
** 本机MAC: 00:e0:62:1f:e3:8c
** 使用IP: 125.216.223.30
** 子网掩码: 255.255.254.0
>> 寻找服务器...
>> 发送用户名...
>> 发送密码...
** 客户端版本: 4.31
** MD5种子: f6:81:c4:de:4f:88:42:43:7a:28:ee:89:0b:72:b4:23
** V2校验值: 332a78abde8732af2fd45bb3d257a501
>> 认证成功!
>> 发送心跳包以保持在线...
ping 命令测试网络:
[root@FORLINX6410]# ping www.google.com
PING www.google.com (74.125.71.147): 56 data bytes
64 bytes from 74.125.71.147: seq=0 ttl=44 time=252.864 ms
64 bytes from 74.125.71.147: seq=1 ttl=44 time=254.789 ms
64 bytes from 74.125.71.147: seq=2 ttl=44 time=265.585 ms
64 bytes from 74.125.71.147: seq=3 ttl=44 time=253.418 ms
64 bytes from 74.125.71.147: seq=4 ttl=44 time=258.604 ms
64 bytes from 74.125.71.147: seq=5 ttl=44 time=280.166 ms
^C
--- www.google.com ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 252.864/272.019/320.106 ms