谈谈网络拓扑结构遇到的坑

引言

现在大部分场所(家庭、小型公司等,下同)宽带或光纤接入后,都是通过「Modem」再转接路由器组成一个小型局域网,此时手机、PC等便可以上网。如果此时网络规模需要扩大,比如办公区域扩增,那么已有的网络已经无法满足了,此时正常的做法就是添加交换机了。

但很多人遇到这个问题可能就直接使用路由器了,完全没考虑使用交换机。这样就很容易出现一个使用误区,本文就这种情况下使用路由器可能遇到的问题进行说明。

常见的网络拓扑

引言中的第一句话提到的网络拓扑结构见下图,这是最常见的一种拓扑结构之一。

small-network-topology

而当规模需要扩大时,可能很多人都是采取下面的网络拓扑结构:

enlarge-network-topology

接路由器可能出现的问题

当用以上方法接路由器时,将使得整个局域网内部网络变复杂,也就是说内部已经分为两个「子网」了。路由器1的接法相当于主路由器对路由器1及主机2来说就是外网,这也将导致主机2无法直接与连接主路由器的主机0、主机1等设备所处的内部网络直接通信。

可能有人会想我就是有这个需求,就是要再建一个内网,那么这个拓扑结构就没有问题。但假如你就是简单的想让主机2接入网络,那么这种接法就不推荐了,因为它很容易就让你遇到上文提到的问题

推荐的解决方案

  1. 买一个交换机替换路由器1,问题即可解决;
  2. 将路由器1配置为交换机,即将路由器当交换机用,适合已经购买路由器的人。

附录:

简单说说路由器配置为交换机步骤:

  1. 将主路由器「LAN口」的网线接到路由器1的「LAN口」,不接「WAN口」;
  2. 禁用路由器1的DHCP服务;
  3. 路由器1「WAN口」配置忽略,修改「LAN口」地址为主路由器内网任一未被占用的IP地址;
  4. 重启路由器1。

从数据结构的角度看ArrayList与LinkedList

数组应该是大部分开发者最常用的数据结构,而链表使用频率则相对小一些。对于Java开发者而言,数组和链表这两种数据结构分别对应Java集合类中ArrayList和LinkedList。对我而言,至少在Java开发中,我99%以上都是使用ArrayList。
为了避免上述的情况,就从数据结构的角度来分析一下这两者的优缺点以及使用场景。

数组

数组很简单,就是一段相同类型的元素的集合。用ArrayList简单的创建一个集合:

ArrayList<Integer> arrays = new ArrayList<Integer>();
arrays.add(2);
arrays.add(4);
arrays.add(6);
arrays.add(8);

它在内部的数据结构即为数组,类似下面:

int[] arrays = {2,4,6,8};

此时,如果我们想要在索引为2的位置插入一个元素5,使数组变成{2,4,5,6,8}。如下图:

arraylist

Java中对应操作为:

arrays.add(2, 5);

这时ArrayList内部其实做了下面这些事情:

  1. 动态扩大数组;
  2. 将原来数组索引为2及其后面所有的元素向后移动;
  3. 插入新元素5到索引为2的位置。

对于删除某个元素也是类似的操作,所以现在应该可以看出数组的随机访问速度应该是不错的,而随机存储效率比较低。

链表

链表有单向链表、双向链表和循环链表,LinkedList使用的是非循环双向链表。双向链表的每一个元素为一个节点,每个节点都有一个直接前驱,数据域,直接后继。同样用LinkedList简单创建一个集合:

LinkedList<Integer> linkedList = new LinkedList<Integer>();
linkedList.add(2);
linkedList.add(4);
linkedList.add(6);
linkedList.add(8);

它在内部的数据结构即为链表,同样如果想要在索引为2的位置添加一个5,对应的图如下:

linkedlist

 

Java中对应操作为:

linkedList.add(2, 5);

这时LinkedList内部其实做了下面这些事情:

  1. 同样先检查是否超出边界;
  2. 对半查找出原来索引为2的节点将其前驱改为新增节点5;
  3. 将新增节点5的前驱改为4,后继改为6;
  4. 节点4的后继改为5。

同样对于链表中节点的删除也是如此,只要修改指针指向即可,而不必像数组那样大费周章的移动。由此可见链表的优点是随机存储效率高,而缺点就是随机访问效率较低。

总结

比较完数组与链表的优缺点,现在对于它们各自的使用场景应该更清楚了。
数组适合在大量随机访问集合的情况下使用,而链表更适合在大量随机存储,即大量的添加删除时使用。

使用Android Studio开发的四点理由

有朋友跟我聊天中抱怨Android Studio很难用,还是Eclipse好用,我也相信还存在很大一部分Android开发者还在继续使用Eclipse开发Android。从Android Studio内测版开始我就开始使用了,越用越顺畅,导致我在开发中越来越依赖它,现在如果让我换回Eclipse开发,一定苦不堪言。为什么开发Android我会坚定不移的使用Android Studio?下面是我使用Android Studio作为主IDE的几个理由:

1.Android官方建议

Android官方去年六月底在博客上就建议开发者从Eclipse迁移到Android Studio。Android的产品经理说:

Over the past few years, our team has focused on improving the development experience for building Android apps withAndroid Studio. Since the launch of Android Studio, we have been impressed with the excitement and positive feedback. As the official Android IDE, Android Studio gives you access to a powerful and comprehensive suite of tools to evolve your app across Android platforms, whether it’s on the phone, wrist, car or TV.

这哥们大致上是说:“我们过去一直致力于用Android Studio提高Android App的开发体验。自从推出Android Studio后,一直备受好评。这是官方推出的Android IDE,提供了众多牛逼哄哄的功能,你敢不用我削你。”

2.代码智能提示

android-studio-hero-code

对于Eclipse来说,当需要提示的时候,每次都得手动敲一下【Alt+/】才能弹出提示。而Android Studio是「智能」的,你输入第一个字母后,它就会主动将一系列相关的类或方法或变量都弹出来供你选择。可以说这点至少提高了我20%开发效率。

3.同时预览不同屏幕尺寸的效果

android-studio-hero-screens

在Android Studio上,你可以很轻松的预览不同尺寸屏幕上所显示的效果,这可以大大减轻Android开发的适配工作。

4.使用Gradle自动化构建工具

自动化构建工具是每个开发者都需要了解的。Java开发者可能对Maven很熟悉,Gradle之于Android,正如Maven之于Java。Gradle不但吸收了Maven的优点,还大大简化了构建配置,支持多种方式依赖管理,因此Gradle比Maven略胜一筹,青出于蓝。比如:下面简单的两行就用了两种不同的方式添加依赖。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])    //将本地项目libs目录下的所有jar包自动添加依赖
    compile 'com.android.support:appcompat-v7:21.0.0'    //自动从maven远程仓库下载并添加依赖
}

也许选择Nginx才是正确的

在此之前,使用Apache作为Web服务器一直是我的优先选择,所以我的服务器通常安装LAMP,直到最近自己亲手在阿里云的低配置服务器上实践后才知道:原来Apache并不适合在低配置小内存的服务器,Nginx才是正确的选择。

Apache相当耗内存

Apache毫无疑问是非常强大的Web服务器,尤其是基于php的动态系统,但是它同时也是个「内存大户」。几周的时间测试下来,Apache几乎每12-36小时之内就会将内存耗光,直至自动停止。这换谁估计都无法忍受。
这时能想到应该就是优化配置看看了。将各项相关配置参数调到很低的值,依然不能为它洗白,依然改变不了它是内存大户的身份。

Nginx表现良好

将Web服务器换成Nginx,同时使用PHP-FPM之后,运行了近一周时间,再无出现耗尽内存导致Web Server停止运行的情况。
这样一对比,证明了在低配置服务器选择Nginx的必要性,而且Nginx在应对高并发方面也是首选。

重新定位网站

一个网站的定位决定了这个网站未来的模样,所以我觉得做网站,一定要先找准定位,否则最终有很大机率会演变成一个「垃圾站」。

举个例子,我在2010年时就注册了这个域名,之后便以站长的身份开始了维护这个网站。但那时我并没有意识到自己创建这个网站的目的究竟是什么,所以那时网站的内容有一小部分是伪原创,另外一大部分虽说是原创的,但其实并没有什么价值。期间也折腾了N个不同的模板,一个模板用一段时间就开始觉得不满意,于是乎又要准备换一个。

之所以会出现这样的情况我觉得倒不是这些年来价值观发生了变化,而是没有定位好网站,所以网站的内容就会感觉很杂,甚至「四不像」。

这篇文章的发布距离上一篇近九个月,这期间我常常会思考这个网站的未来,要将它定位成什么样子。这篇文章发布,意味着我已经想好了。因此我重新定位了我的网站,我心目中它应该是这样子的:

1.具有自己思想的原创内容

目前互联网上充斥着大量一样的内容,这肯定不是大家想看到的。所以首先不能为了发文章而发文章,即使没有什么可写的也不能去搞伪原创,这样就保证了内容的原创性。

2.尽量保持简洁

一个网站的UI确实重要,但不是全部,内容才是灵魂因此我认为应该尽量保持简洁,不能有太多影响阅读的因素。

以上就是我对网站定位的理解。

 

注:本文提到的网站特指博客类型的网站。