Categories
Tech

C#里奇怪的参数传递

te: C#里奇怪的参数传递

正在奋战人工智能大作业,被C#里奇怪的参数传递折腾了一个下午+一个晚上,终于弄明白了。

起因是在一个递归函数里,莫名其妙的一直出现数组越界。经过测试才明白:

把一个元素为类对象的数组作为实参传入函数中,实际上传递的只是它的引用,也就是说,在函数中用Array.Copy方法复制一个新的副本,该副本中的元素仍然是对原对象的引用,对这个副本做的任何修改会直接影响原对象。

所以,现在为了不影响原对象,复制一个List<T>[]的时候,只能遍历一次原对象,将元素一个个添加到新的数组里……

也许是我土,也许是C#…

Categories
Tech

关于CPU和内存的配合

为了给本子升级内存,刚刚研究了一下这个问题。

  1. CPU与北桥通讯的数据传输率=CPU外频×倍速(P4为4倍)×位宽/8。代入数字:32位的133MHz×12=1.6GHz的P4芯片,前端总线数据传输率=133×4×32/8=2132Mb/s;
  2. 内存数据传输率=芯片频率×预读取位数×位宽/8。代入数字:DDR2-400(实际上400=100MHz×4Bit)内存,数据传输率=100×4(DDR2具有4Bit预读取能力)×64/8=3200Mb/s;

因此,对于这颗CPU来说,DDR2-400已经能够把它喂得饱饱的了。现在1G DDR2-400内存也就300大洋左右,嗯,可以考虑……

Categories
Tech

Microsoft Windows 的 TCP/IP 基础知识.第 3 章 – IP 编址(zz)

摘要 本章详细介绍了 IPv4 和 IPv6 的编址。网络管理员必须透彻地理解这两种 IP 编址,才能管理传输控制协议/Internet 协议 (TCP/IP) 网络以及对基于 TCP/IP 的通信进行疑难解答。本章详细讨论了 Internet 协议版本 4 (IPv4) 和 Internet 协议版本 6 (IPv6) 地址的类型、它们的表示形式和分配给网络节点接口的单播地址的类型。

Categories
Tech

谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词(zz)

te: 谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词(zz)

这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。整理这篇文章的动机是两个问题:

问题一:

      使用Windows记事本的另存为,可以在GBKUnicodeUnicode big endianUTF-8这几种编码方式间相互转换。同样是txt文件,Windows是怎样识别编码方式的呢?

      我很早前就发现UnicodeUnicode big endianUTF-8编码的txt文件的开头会多出几个字节,分别是FFFEUnicode,FEFFUnicode big endian,EFBBBFUTF-8)。但这些标记是基于什么标准呢?

    问题二:

        最近在网上看到一个ConvertUTF.c,实现了UTF-32UTF-16UTF-8这三种编码方式的相互转换。对于Unicode(UCS2)GBKUTF-8这些编码方式,我原来就了解。但这个程序让我有些糊涂,想不起来UTF-16UCS2有什么关系。

      查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些Unicode的细节。写成一篇文章,送给有过类似疑问的朋友。本文在写作时尽量做到通俗易懂,但要求读者知道什么是字节,什么是十六进制。

      Categories
      Tech

      热切期待Ubuntu 7.04中

      Te: 热切期待Ubuntu 7.04中

      论坛上说最迟明天早上8:00放出,期待期待。

      各路大神啊,可怜我没光驱,我的6.10能直接升级成功吧……

      Categories
      Tech

      postie配置成功

      

      以后可以直接邮件发布了~
       
      配置时的三个问题:
      1. 用Gmail发布不成功,服务器可能没有安装php-IMAP,于是选择邮件服务器类型时IMAP/SSL unavailable,无能为力……
      2. 用sina,检查时报告: Ooops POP3: premature NOOP OK, NOT an RFC 1939 Compliant server。解决方法:开启 wp-includes/class-pop3.php,将if($this->RFC1939) { 改为 if(!$this->RFC1939) {
      3. 邮件发布后乱码:撰写邮件时把编码改成UTF-8

      Categories
      Semantic Web Tech

      综述:本体的概念、方法和应用

      Categories
      Tech

      Your Freedom-Failed

      seems vipedu doesn’t support https.
      no problem to access ordinary sites but banned ones.

      Categories
      Tech

      Ubuntu终于无线上网了

      以前尝试过两次,都没有配置成功,今天下决心,终于搞定。
      (ubuntu 6.10, intel wireless)
      在ubuntu下笔记本的wifi灯从来都亮不起来,搜索了才知道,开启wifi的组合键其实是有效的,只不过灯不会亮。
      首先在网络配置处启用无线网,基本不需要配置,ESSID填入无线网的名称即可。
      不过默认情况下ubuntu并不会像windows那样自动搜索可用的无线连接,我是从shao的机器上看到的
      比如,今天在A309,最强的信号名就是A309,于是填入ESSID
      然后,点任务栏处的网络图标,把连接名称改为无线网的名称,由于我禁了有线,所以是eth1
      这时候如果信号强度为0,说明机器的wifi没开,用组合键开了之后应该就可以看见信号了
      其实之前也曾看过信号强度很好的情况,但是却显示“已断开”,原来就是ESSID没有正确配置。
      最后,可以下载个小工具wifi-radar,然后就能自动搜索网络了

      Categories
      Tech

      解析ARP欺骗攻击(zz)

      最近一段时间,很多校园局域网内的主机出现频繁断网的现象,引起这种现象的主要原因是局域网内部存在ARP欺骗攻击。以下就针对这种攻击的原理和防范方法进行简单介绍。

      什么是ARP协议

      要想了解ARP欺骗攻击的原理,首先就要了解什么是ARP协议。ARP是地址转换协议的英文缩写,它是一个链路层协议,工作在OSI模型的第二层,在本层和硬件接口间进行联系,同时为上层(网络层)提供服务。
      我们知道,二层的以太网交换设备并不能识别32位的IP地址,它们是以48位以太网地址(就是我们常说的MAC地址)传输以太网数据包的。因此IP地址与MAC地址之间就必须存在一种对应关系,而ARP协议就是用来确定这种对应关系的协议。
      ARP工作时,首先请求主机发送出一个含有所希望到达的IP地址的以太网广播数据包,然后目标IP的所有者会以一个含有IP和MAC地址对的数据包应答请求主机。这样请求主机就能获得要到达的IP地址对应的MAC地址,同时请求主机会将这个地址对放入自己的ARP表缓存起来,以节约不必要的ARP通信。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用(Windows系统这个时间为2分钟,而Cisco路由器的这个时间为5分钟),就会被删除。通过下面的例子我们可以很清楚地看出ARP的工作机制。
      假定有如下五个IP地址的主机或者网络设备,它们分别是:

      假如主机A要与主机B通信,它首先会检查自己的ARP缓存中是否有192.168.1.3这个地址对应的MAC地址,如果没有它就会向局域网的广播地址发送ARP请求包,大致的意思是192.168.1.3的MAC地址是什么请告诉192.168.1.2,而广播地址会把这个请求包广播给局域网内的所有主机,但是只有192.168.1.3这台主机才会响应这个请求包,它会回应192.168.1.2一个ARP包,大致的意思是192.168.1.3的MAC地址是02-02-02-02-02-02。这样的话主机A就得到了主机B的MAC地址,并且它会把这个对应的关系存在自己的ARP缓存表中。之后主机A与主机B之间的通信就依靠两者缓存表里的MAC地址来通信了,直到通信停止后2分钟,这个对应关系才会从表中被删除。
      再来看一个非局域网内部的通信过程。假如主机A需要和主机D进行通信,它首先会发现这个主机D的IP地址并不是自己同一个网段内的,因此需要通过网关来转发,这样的话它会检查自己的ARP缓存表里是否有网关192.168.1.1对应的MAC地址,如果没有就通过ARP请求获得,如果有就直接与网关通信,然后再由网关C通过路由将数据包送到网关E,网关E收到这个数据包后发现是送给主机D(10.1.1.2)的,它就会检查自己的ARP缓存,看看里面是否有10.1.1.2对应的MAC地址,如果没有就使用ARP协议获得,如果有就是用该MAC地址与主机D通信。

      什么是ARP欺骗

      通过上面的例子我们知道,在以太局域网内数据包传输依靠的是MAC地址,IP地址与MAC对应的关系依靠ARP表,每台主机(包括网关)都有一个ARP缓存表。在正常情况下这个缓存表能够有效保证数据传输的一对一性,像主机B之类的是无法截获A与D之间的通信信息的。
      但是主机在实现ARP缓存表的机制中存在一个不完善的地方,当主机收到一个ARP的应答包后,它并不会去验证自己是否发送过这个ARP请求,而是直接将应答包里的MAC地址与IP对应的关系替换掉原有的ARP缓存表里的相应信息。这就导致主机B截取主机A与主机D之间的数据通信成为可能。
      首先主机B向主机A发送一个ARP应答包说192.168.1.1的MAC地址是02-02-02-02-02-02,主机A收到这个包后并没有去验证包的真实性而是直接将自己ARP列表中的192.168.1.1的MAC地址替换成02-02-02-02-02-02,同时主机B向网关C发送一个ARP响应包说192.168.1.2的MAC是02-02-02-02-02-02,同样,网关C也没有去验证这个包的真实性就把自己ARP表中的192.168.1.2的MAC地址替换成02-02-02-02-02-02。当主机A想要与主机D通信时,它直接把应该发送给网关192.168.1.1的数据包发送到02-02-02-02-02-02这个MAC地址,也就是发给了主机B,主机B在收到这个包后经过修改再转发给真正的网关C,当从主机D返回的数据包到达网关C后,网关也使用自己ARP表中的MAC,将发往192.168.1.2这个IP地址的数据发往02-02-02-02-02-02这个MAC地址也就是主机B,主机B在收到这个包后再转发给主机A完成一次完整的数据通信,这样就成功地实现了一次ARP欺骗攻击。
      因此简单点说,ARP欺骗的目的就是为了实现全交换环境下的数据监听。大部分的木马或病毒使用ARP欺骗攻击也是为了达到这个目的。

      如何发现及清除

      局域网内一旦有ARP的攻击存在,会欺骗局域网内所有主机和网关,让所有上网的流量必须经过ARP攻击者控制的主机。其他用户原来直接通过网关上网,现在却转由通过被控主机转发上网。由于被控主机性能和程序性能的影响,这种转发并不会非常流畅,因此就会导致用户上网的速度变慢甚至频繁断线。另外ARP欺骗需要不停地发送ARP应答包,会造成网络拥塞。
      一旦怀疑有ARP攻击我们就可以使用抓包工具来抓包,如果发现网内存在大量ARP应答包,并且将所有的IP地址都指向同一个MAC地址,那么就说明存在ARP欺骗攻击,并且这个MAC地址就是用来进行ARP欺骗攻击的主机MAC地址,我们可以查出它对应的真实IP地址,从而采取相应的控制措施。另外,我们也可以到路由器或者网关交换机上查看IP地址与MAC地址的对应表,如果发现某一个MAC对应了大量的IP地址,那么也说明存在ARP欺骗攻击,同时通过这个MAC地址查出用来ARP欺骗攻击的主机在交换机上所对应的物理端口,从而进行控制。
      如何防范?
      我们可以采取以下措施防范ARP欺骗。
      (1)在客户端使用arp命令绑定网关的真实MAC地址命令如下:
      arp (先清除错误的ARP表)
      arp 192.168.1.1 03-03-03-03-03-03 (静态指定网关的MAC地址)
      (2)在交换机上做端口与MAC地址的静态绑定。
      (3)在路由器上做IP地址与MAC地址的静态绑定。
      (4)使用“ARP SERVER”按一定的时间间隔广播网段内所有主机的正确IP-MAC映射表。
      (5)最主要是要提高用户的安全意识,养成良好的安全习惯,包括:及时安装系统补丁程序;为系统设置强壮的密码;安装防火墙;安装有效的杀毒软件并及时升级病毒库;不主动进行网络攻击,不随便运行不受信任的软件。