网络异常检测

网络异常检查

2

作者 CppLive | 发表于 2012-02-17

文章分类 : C语言LinuxWindows应用与编程网络

标签: AndroidiPhoneLinuxWindows套接字路由

一、本文目的

在涉及网络编程的实际项目应用中,由于网络不可能一直处于理想状态,TCP长连接也可能随时正常或异常地断开,如果不予处理,那么就可能因此而给程序带来很多潜在的问题。 编写该文档的目的就在于针对网络程序中可能遇到的各种问题,拿出来与大家探讨一下具体问题的解决方案,同时本人将前期调研的一些解决方案列出来,抛砖引玉,希望可以集思广益,寻求到更加合理的解决方案。

二、网络断开时机

1、正常网络断开

(1) CS 一方调用 Close

(2) CS 一方程序正常退出,如Ctrl + C 事件可以被系统检测到,对应的套接字也将被系统标记为已断开。

2、异常网络断开

(1) CS 一方网线被拨出

(2) CS 之间路由故障,物理连接断开

(3) CS 一方断电或当机

(4) CS 一方无线信号不佳或无线接口被关闭

(5) CS 一方更改 IP 事件无法被系统检测到,这个时候读数据不会出错,只会一直阻塞着;写数据在缓冲区未满之前也不会返回错误。若无法及时检测到断开事件,对某些应用场景而言可能存在致命的错误。如服务端维护的客户端在线信息错误等。

三、网络断开常用检测方法

1、处理正常网络断开

(1) select 捕捉可读事件,read返回0

(2) epoll 捕捉可读事件,read返回0

(3) 主动 read 返回错误

(4) 主动 write 返回错误

2、处理异常网络断开

(1) 应用层KeepAlive检测

在应用层协议加入心跳握手机制,维护服务端跟客户端之间的连通状态,是最普遍最保险的办法。 客户端定时向服务端发送探测包,若服务端回应则说明服务端在线,否则作离线处理;服务端也可对长期未发送探测包的客户端作离线处理。 该方案所有系统都支持,跨平台性好;对端跟自身出现网络故障都能检测到。不足之处在于它需要应用层协议支持,程序内部需要长期维护心跳握手包,相对比较繁琐。

(2) 传输层KeepAlive检测

除了应用层 KeepAlive 检测机制外,TCP 内部也集成了 KeepAlive 机制,默认关闭,开启它很方便。对端跟自身出现网络故障都能检测到。但不是所有的系统都支持,而且有些系统虽然支持但会影响到所有套接字,消耗额外的宽带和流量,不建议使用。

view plaincopy to clipboardprint?

  1. //启用心跳机制,如果您想关闭,将keepAlive置零即可
  2. setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive));
  3. //启用心跳机制开始到首次心跳侦测包发送之间的空闲时间
  4. setsockopt(fd,SOL_TCP,TCP_KEEPIDLE,(void *)&start,sizeof(start));
  5. //两次心跳侦测包之间的间隔时间
  6. setsockopt(fd,SOL_TCP,TCP_KEEPINTVL,(void *)&interval,sizeof(interval));
  7. //探测次数,即将几次探测失败判定为TCP断开
  8. setsockopt(fd,SOL_TCP,TCP_KEEPCNT,(void *)&count,sizeof(count));

(3) 网络层KeepAlive检测

Ping 命令几乎是所有平台的网络连通性检测命令,走网络层 ICMP 协议,这里考虑使用 popen 函数调用系统自带的 Ping 命令来封装网络连通性检测函数。它实际上也是一种网络层的 KeepAlive 机制。

view plaincopy to clipboardprint?

  1. int checkConnect(char *dst, int cnt)
  2. {
  3. FILE *stream;
  4. sprintf(cmdBuf, "ping %s -c %d -i 0.2 | grep time= | wc -l", dst, cnt);
  5. stream = popen(cmdBuf, "r");
  6. fread(recvBuf, sizeof(char), sizeof(recvBuf)-1, stream);
  7. pclose(stream);
  8. if (atoi(recvBuf) > 0) return 0;
  9. return -1;
  10. }

dst 指定要检测的目的地址,cnt 指定 Ping 尝试的次数,-i 参数指定 Ping 尝试的超时时间。

(4) 应用层监控内核消息机制

Netlink 是一种特殊的套接字,为2.6.14及更高版本的Linux所特有,通过它,应用层程序可以方便地向内核订制指定消息,如网卡上下线。也可以设置或查询配置,如IP、路由、网络流量信息等。

a、创建一个 netlink 套接字:

  1. fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);

b、绑定路由多播组,监控网卡信息:

view plaincopy to clipboardprint?

  1. addr.nl_family = AF_NETLINK;
  2. addr.nl_groups = RTNLGRP_LINK; //指定接收路由多播组消息
  3. bind(fd, (struct sockaddr*)&addr, sizeof(addr));

c、监听套接字,一旦可读,解析其内容,实时监控网卡上下线事件。

优点:实时性高,使用方便。

缺点:跨平台性不佳,只能检测自身网络故障。

(5) 应用层网卡信息轮询机制

网卡信息轮询机制就是定期调用 ioctl 函数执行如下操作:

view plaincopy to clipboardprint?

  1. struct ifconf ifc;
  2. struct ifreq ifrcopy;
  3. //获取网卡信息列表
  4. ioctl(fd, SIOCGIFCONF, (char *)&ifc);
  5. //获取网卡上下线状态
  6. ioctl(fd, SIOCGIFFLAGS, &ifrcopy);
  7. //获取 MAC 地址
  8. ioctl(fd, SIOCGIFHWADDR, (char *)(&ifrcopy);
  9. //获取 IP 地址
  10. ioctl(fd, SIOCGIFADDR, (char *)&ifrcopy);
  11. //获取广播地址
  12. ioctl(fd, SIOCGIFBRDADDR, &ifrcopy));

缺点:

a、跨平台性不佳。

可以成功移植到 Linux、AndroidWindows平台,但由于 iPhone 平台上获取MAC跟IP的参数不同,需特殊处理。

b、实时性跟灵活性不高。

c、耗费资源,影响性能。

d、只能检测自身网络故障。

时间: 2024-08-04 17:39:47

网络异常检测的相关文章

KMeans算法检测网络异常入侵

非监督学习技术 在决策树算法预测森林植被中 我们可以体会到属于监督学习的分类和回归技术的强大,可以预测"即将发生"的事情 使用监督学习技术有一个很关键的前提:需要大量的数据对模型进行训练,模型能够从已知的数据中学习规律进而预测未知的数据 然而在某些场景下,并不是都能提供监督学习所需要的样本数据来训练模型,有可能只能给出部分正确的输出,甚至一个输出都没有 这种情况下,监督学习的技术就不能够使用了 此时,对应监督学习,另一种非监督学习技术就可以排上用场了 异常检查 顾名思义,异常检测就是要

记录一次ARP故障导致网络异常

故障现象:单位某台PC出现无法打印故障,提示为下图 该PC重新设置打印机就能够使用但在重启之后无法连接到打印机,并且还会出现连接共享文件的时候会出现类似掉线的情况 分析过程:打印机为网络打印机 内存使用率仅有10% 所以排除1和3 剩下围绕着2的提示来解决 实践过程: 先从网络方面下手,利用IMCP的PING功能对打印服务器,打印机本身进行测试,结果为能PING通. 注!此时发现一个问题,服务器以及其他PC无法PING通本PC! 针对上述所说的故障对本PC进行了网卡驱动更新,系统重装,甚至更换网

SQL Server事务遭遇网络异常时的处理机制浅析

SQL Server数据库中,如果应用程序正在执行一个事务的时候突然遭遇了网络异常,例如网络掉包,网络中断等,那么这个事务会怎么样? SQL Server数据库是通过什么机制来判断处理呢? 估计很多人跟我一样都有不少疑问, 我们下面构造一个测试实验来测试验证一下.如下所示: 步骤1:在客户端连使用SSMS工具连接到测试数据库,执行下面脚本,显性事务既不提交也不回滚.模拟事务正在执行当中. USE AdventureWorks2012; GO SELECT @@SPID; BEGIN TRAN D

异常检测算法的Octave仿真

在基于高斯分布的异常检测算法一文中,详细给出了异常检测算法的原理及其公式,本文为该算法的Octave仿真.实例为,根据训练样例(一组网络服务器)的吞吐量(Throughput)和延迟时间(Latency)数据,标记出异常的服务器. 可视化的数据集如下: 我们根据数据集X,计算其二维高斯分布的数学期望mu与方差sigma2: function [mu sigma2] = estimateGaussian(X) %ESTIMATEGAUSSIAN This function estimates th

基于机器学习的web异常检测

基于机器学习的web异常检测 Web防火墙是信息安全的第一道防线.随着网络技术的快速更新,新的黑客技术也层出不穷,为传统规则防火墙带来了挑战.传统web入侵检测技术通过维护规则集对入侵访问进行拦截.一方面,硬规则在灵活的黑客面前,很容易被绕过,且基于以往知识的规则集难以应对0day攻击:另一方面,攻防对抗水涨船高,防守方规则的构造和维护门槛高.成本大. 基于机器学习技术的新一代web入侵检测技术有望弥补传统规则集方法的不足,为web对抗的防守端带来新的发展和突破.机器学习方法能够基于大量数据进行

异常检测(anomaly detection)

异常检测(anomaly detection) 关于异常检测(anomaly detection)本文主要介绍一下几个方面: 异常检测定义及应用领域 常见的异常检测算法 高斯分布(正态分布) 异常检测算法 评估异常检测算法 异常检测VS监督学习 如何设计选择features 多元高斯分布 多元高斯分布在异常检测上的应用 一.异常检测定义及应用领域 先来看什么是异常检测?所谓异常检测就是发现与大部分对象不同的对象,其实就是发现离群点.异常检测有时也称偏差检测.异常对象是相对罕见的.下面来举一些常见

异常检测概览——孤立森林和局部异常因子算法效果是最好的

转自博客:http://www.infosec-wiki.com/?p=140760 一.关于异常检测 异常检测(outlier detection)在以下场景: 数据预处理 病毒木马检测 工业制造产品检测 网络流量检测 等,有着重要的作用.由于在以上场景中,异常的数据量都是很少的一部分,因此诸如:SVM.逻辑回归等分类算法,都不适用,因为: 监督学习算法适用于有大量的正向样本,也有大量的负向样本,有足够的样本让算法去学习其特征,且未来新出现的样本与训练样本分布一致. 以下是异常检测和监督学习相

ng机器学习视频笔记(十三) ——异常检测与高斯密度估计

ng机器学习视频笔记(十三) --异常检测与高斯密度估计 (转载请附上本文链接--linhxx) 一.概述 异常检测(anomaly detection),主要用于检查对于某些场景下,是否存在异常内容.异常操作.异常状态等.异常检测,用到了一个密度估计算法(density estimation)--高斯分布(Gaussian distribution),又称正态分布(normal distribution). 该算法只用到了样本的特征值,不需要分类标签,故该算法是无监督学习算法 主要内容是,对于

KDD Cup 99网络入侵检测数据的分析

看论文 该数据集是从一个模拟的美国空军局域网上采集来的 9 个星期的网络连接数据, 分成具有标识的训练数据和未加标识的测试数据.测试数据和训练数据有着不同的概率分布, 测试数据包含了一些未出现在训练数据中的攻击类型, 这使得入侵检测更具有现实性. 在训练集中包含了1种正常的标识类型 normal 和 22种训练攻击类型. 1.KDDCup99入侵检测实验数据的标识类型 标识类型 含义 具体分类标识 Normal 正常记录 normal DOS 拒绝服务攻击 back, land, neptune