热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

分层的网络模型

前面的一篇文章简要说了一下linux网卡的ip地址结构,可是写完之后觉得说的不够彻底,我一般写文章喜欢从大的方面着手而不喜欢钻到细节中,因为细节往往容易把握,而大体的设计往往对于我们这些学习的人是不可

前面的一篇文章简要说了一下linux网卡的ip地址结构,可是写完之后觉得说的不够彻底,我一般写文章喜欢从大的方面着手而不喜欢钻到细节中,因为细节往往容易把握,而大体的设计往往对于我们这些学习的人是不可见的,比如linux内核代码够细节了吧,我们每个人都可以拥有都可以阅读,但是linux内核设计背后的思想我们却不得而知,因此我往往独好几遍代码然后做好几个实验,意在发掘作者为什么这么设计代码,发现代码结构成为这样的原因,当我看了linux的网络代码的时候,我思考了很长时间,妈的linux就好像是专门为网络设计的,它和tcp/ip简直是亲兄弟,如果说linux的很多别的特性比不过Microsoft或者Apple的话,我敢说,在网络方面,linux是最强大的,既然说到了网络,我就想把自己对网络的理解写成一篇短文。

众所周知,我们的网络遵循OSI七层模型,但是那只是理论上的,真正只遵循的是TCP/IP模型,这里我们可以看到是从IP开始的,并没有OSI下面的链路层和网络层,而且我们对比OSI和TCP/IP后会发现,它们的功能有些重合,具体哪里呢?看了RFC之后会发现,OSI的链路层和TCP/IP的传输层的功能几乎一样。这不得不引起我的思考。实际山它们一样是应该的,我觉得我们的互联网就是从网络层也就是IP层开始的,IP层以下的层次仅仅就是一个支撑环境,互联网旨在为所有的上层应用提供一个同构的平台,它的任务之一就是屏蔽掉下层的网络异构性,那么在TCP/IP模型上我们可以看到这一点,TCP/IP从IP层开始正如OSI从物理层开始一样,TCP/IP模型并不规定链路层和物理层的信息,它只是定义了一个IP,这个IP就像一个终结者一样,任何想纳入这个系统的系统都必须遵循这个IP的规定,这是一个统一的接口,也必须在这个地方强行限制一个统一的接口才会使以后的工作更简单,于是当这个模型风行以后,各个底层的网络都遵循了这个IP的规定,都使用了IP地址进行通信,因此TCP/IP模型就可以放心的在上层构建复杂的应用了,因此可以看出,TCP/IP模型就是互联网的模型,IP层相当于传统网络的物理层,它只是简单地提供了寻址,传输的功能,提供传输的机制,而任何策略交由给上层的协议来完成,这就是设计边界问题,想要设计一个高级的协议族就不能从最底层比如物理层开始定义规范,就好像皇帝总是将任务交给高级官员,然后高级官员将任务交给低级官员一样,皇帝不必管人民的死活,这种糟糕的体制已经成了传统,那么我们设计任何系统时都要遵循它。

因此我们把网络分为两个部分,一个是网络层以下,也就是ip层以下,这些层次是为了物理传输而设定的,另外一部分就是ip层以上,这些层次是为了逻辑传输而设定的,ip层也就是网络层在中间提供屏蔽下层异构网络的作用,在上层基于ip看来,网络传输就是从ip层开始的。理解到了这里,我们就不难理解为何链路层提供流量控制而传输层也提供流量控制了,链路层的流量控制是基于物理的流量控制,也就是在两个物理相邻的节点之间的流量控制,而传输层的流量控制是两个通信节点之间的逻辑上的流量控制,不涉及物理作用。

如果我们彻底地理解了互联网,那么我们可以完全不用顾及底层用什么媒介进行传输,用双绞铜线和光纤都无所谓,因为我们知道TCP/IP已经在IP层为我们提供了一个统一的接口,我们只需要操作这个统一的接口就可以了。对于互联网来说,我们对再底层的东西不关心,我们只管我们的数据能否正确到达对端而不管怎么到达对端。因此在逻辑上讲,TCP/IP模型的IP层就是最底层,它提供了OSI的物理层的概念和功能,实际上,互联网根本不关心IP层以下的东西,这就是事实。本质上互联网是一个逻辑网络,想想就知道,有几个搞网站设计的人懂得电缆方面的知识呢?从需求上讲,互联网也不允许深入到细节,它的最大边界就是负责到网络层,再往下负责的话就可能分互联网的心,使得它在网路层以上用力偏小,因此互联网的界限就是IP层,IP层以下的工作其实很丰富,不如可以用很多技术实现IP,比如以太网,比如X.25等等,不过这些互联网也就是TCP/IP都不管。至于传输层,它的作用就和链路层一样,也是提供流量控制等功能,只不过是逻辑方面的,是通信双方的而不是相邻两个物理节点的。

整个互联网分为物理的和逻辑的两个部分,物理的部分由IP层以下的负责,和逻辑层由IP层以上的负责。我喜欢linux的目的就在于linux完全重现了这种完美的设计,我认为TCP/IP并不是OSI的替代,相反的,它只是OSI的一部分,也就是网络层以及以上的部分,毕竟TCP/IP并没有定义网络层以下的层次,在linux中,这一切表现的比我用文字描述的还清晰,linux内核设计的每个数据结构都耐人寻味,这就是我在喜欢linux的原因,特别的是它的网络方面。

通过本文和前面的一篇文章的描述,我们应该明白一个不相关的概念:网卡的mac地址和ip地址是不相关的,因为mac地址代表的是物理的链路,而ip地址代表的是逻辑链路,这样的话就不难理解那个哲学上的意义了,也就是为何一个mac地址可以对应很多ip地址。


推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Python字典推导式及循环列表生成字典方法
    本文介绍了Python中使用字典推导式和循环列表生成字典的方法,包括通过循环列表生成相应的字典,并给出了执行结果。详细讲解了代码实现过程。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
author-avatar
小丘
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有