我对互联网的认识

中国科大软件学院 阎镇 原创文章转载请注明出处

互联网是网络与网络之间所串联成的巨大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。在互联网的支持下,我们真正实现了全球意义上的实时信息传播。现在,我们无论是上网看新闻,查资料,看电影,上论坛,登陆教务系统,下载软件,实时聊天,都可以轻易实现,这都是因为我们现在所处环境网络发达的原因。所以,我们无法想象没有互联网的生活。

我是从小学时候开始接触互联网的,但那时候的中国互联网远远不如现在发达。因为我父亲也是搞计算机这行的,最开始的时候,只有他所在的单位有互联网,而家里是没有互联网的。后来家里有了互联网,但不是宽带,上网需要使用电话线进行拨号上网,网速很慢。所以那个时候上网只能浏览资料,不能随便下载东西。后来有了宽带网,而且因为宽带网的出现,产生了很多多线程原理的包含断点续传的下载工具,这个时候家里才实现了真正意义上的快速下载。再往后来,就是无线网和无线路由器的飞速发展。一直到现在,网络技术还在不断革新中。

在学习网络程序设计这门课之前,我也零零星星学过一些与网络有关的课,也知道OSI七层模型,但并没有太上心。事实上,在这学期重修这门课之前,我对互联网体系结构也只是似懂非懂。看到身边很多同学对互联网理解的很深入,甚至连编写网络程序,比如说单线程文件传递,简单网络服务器并发处理,甚至使用开源框架比如Servlet编写网站,都是如鱼得水。看到这些我非常羡慕,就认真重修了一遍这门课。下面我就讲讲自己对互联网的理解。当然,即使是现在,我对互联网的理解仍然只是皮毛。所以我会结合自己对互联网的理解,以及一些实际应用程序,来谈谈自己对互联网的心得体会。

因为互联网的工作原理相当复杂,所以在实际工作中,互联网运行是通过若干层的架构来实现的。其中上层需要使用下层提供的服务,而下层又要提供可用的服务接口供上层使用。于是,每个模块都是相对独立的,而每个高层的功能都是通过对下一层功能的调用实现的。其中模块的层次越往上,即越贴近高层,需要调用的东西就越多。层次越往下,即越贴近底层,需要调用的东西就越少。

互联网的设计依赖于具体模型中每一层的协议和相应实现,但真正实现却未必完全按照模型来。由于整个网络架构非常复杂,需要的设备和软件非常多,而我们在使用网络,编写网络程序的时候,可能只需要使用一个或者几个层的内容。比如说我们用Tomcat中包含的Servlet编写网站,根据客户端http请求的类型,我们主要使用doget和dopost函数来处理相应请求。这个时候我们需要使用的是http协议,也就是应用层的协议。再比如说我们使用tcp或者udp协议来进行通话,文件传输,甚至是实现服务器并发处理,等等。这个时候我们需要使用的是传输层的协议。

网络服务器的具体实现很麻烦,但我们可以通过具体的框架来大大简化网络服务器的开发。我们在上课的时候学习并实现过简单服务器模型的并发处理。具体实现方法有很多:多进程,多线程,IO复用等。多进程很安全,但是创建和运行占资源太高,不推荐。多线程比较安全,但由于不同线程都公用进程的大部分资源,如果设计不当,可能会出现死锁之类问题。同时效率也并不是很高。

至于IO复用,这是现在很多服务器的原型。最开始的IO复用是轮询,linux下的select函数和poll函数都是采用的这个原理。它的具体操作步骤就是对每个连接挨个询问,如果对方有信息传来,就进行相应处理;如果没有,就返回一个消息通知用户。这种做法当每个用户都比较活跃时效率很高,但如果不活跃用户比较多,就非常不划算。因为它对不活跃用户的轮询完全属于非操作。因此,在linux 2.6内核中又诞生了epoll,它的主要原理是在每次轮询的过程中,对每个处理的事件填写合适的状态,然后在下一次轮询中,只处理那些需要处理的事件,对于不需要处理的事件,比如说客户端没有发来信息到缓冲区,那么就不处理。这种想法很新颖很好,经过我的观察,我自己经常去的5sing网(中国原创音乐基地)采用的是Nginx服务器,就是采用的epoll原理。不过,由于epoll服务器需要对所有事件进行管理,所以在活跃用户很多的时候,效率还要略低于轮询服务器。

再举例说明互联网和局域网的差别。我们很多同学都喜欢或者曾经喜欢过玩联网游戏。比如说我在大学的时候,经常跟同学一起玩dota。如果我们一起去网吧去开黑,也就是在互联网上联机。所以我们有时候通过局域网来联机。只要我们把网段(ip地址前3个和子网掩码)设置相等,就可以通过路由器来实现局域网联机。在局域网中传递信息要明显快于互联网。因为在局域网传递信息的时候,只要知道对方主机的ip地址,就可以通过arp协议,获得对方主机的物理地址(MAC),然后把信息传递给对方。但如果在互联网内发送信息,由于两台主机不在同一个局域网内,那么主机A需要把信息发送给它所在的路由器上,然后根据路由表信息,通过路由选择算法发送给主机B所在的路由器上,再有路由器通过arp协议找到主机B的物理地址,把信息发送给主机B。主机A和主机B中,间隔了若干个路由器的传递,所以速度慢了很多。因此,如果网络状况不是很好,玩游戏就会觉得卡。

一般来讲,我们常用的互联网模型有2种:OSI七层模型和TCP/IP模型。在OSI七层模型里,从底层到高层分别是:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。在TCP/IP模型里,从底层到高层分别是:网络接口层,网际层,传输层,应用层。

不管是互联网还是局域网,都属于网络层。实际上,根据OSI七层模型的理论,互联网信息传递需要使用路由器,属于网络层。而局域网信息传递只需要使用交换机,属于数据链路层。关于这一点,我查询了一些资料。我现在的理解是,互联网中的信息传递,也就是不同网段的信息传递,需要路由器来进行网络层的传递,这一点毫无疑义。而局域网中的信息传递,实际上只需要知道两台主机的MAC地址就可以了,这一点确实只需要交换机来实现。但是在实际情况中,我们往往都是用路由器来实现局域网的。这是为什么呢?因为路由器比交换机高一层,所以它本身就已经包含了交换机的功能。它给局域网中的每个主机分配了一个ip地址,并可以通过arp协议获得每个主机的MAC地址。这样,路由器就可以实现交换机的信息转发功能。

也就是说,真正意义上的路由器,主要是实现路由器和路由器之间的信息包传递。而真正意义上的交换机,主要是实现局域网内部不同主机之间信息的转发。而实际生活中的交换机,这两点都包含。

在具体传输过程中,TCP和UDP是两个重要的传输协议。TCP的连接和断开需要进行3次握手和4次挥手来实现,特别是断开的时候,主动断开的一方会保持大约2分钟的time_wait状态。而且在发送数据的时候,TCP也有比较完善的确认和对数据包的排序机制,如果出错会请求重发。TCP还有主动调速功能,如果网络状况不好或者网络缓冲区不足的话,TCP会适当降低发送速度。所以TCP连接和传输都比较安全,但是速度相对慢。而UDP协议就没有这些功能。UDP包发送很快,但是不确认信息的正确性,也不对收到的信息进行排序,所以收到的信息可能不对,顺序也可能不对。在实际UDP工作中,我们可以进行流量发送控制,也可以对UDP包收到的东西进行重排序,在这样的机制下比UDP的可靠性提高了很多,而且比TCP快,算是一种折衷吧。

如果我们的通信对准确性要求极高,比如说文件传输,文件下载,那么哪怕是速度慢了点,也必须要使用TCP。如果对速度和效率要求极高,比如说qq打字通信,qq语音通信,qq视频通信,或者dota之类延迟0.1秒都会明显影响游戏结果的网络游戏,那么TCP根本无法满足游戏的要求,这个时候只能使用UDP。当然,真正的UDP不是很可靠,我们可以对UDP进行优化,来提高可靠性。实际上,TCP和UDP各有各的优点,而缺点也都比较明显。对于它们的使用,应该具体情况具体分析,不应该一棍子打死任何一个。
阅读更多

没有更多推荐了,返回首页