1.计算机网络背景
计算机刚刚发展的时候,是没有网络的,每一台计算机都是相互独立的。后来,人们有了多人协作的需求,人们就想办法把多台计算机用“线”连接起来,实现数据共享。后来,连接到一起的电脑越来越多,就逐渐衍生出局域网,城域网,广域网这样的概念。所谓的局域网,广域网只是一个相对的概念,我们不用区分的过于清楚。你只需要知道连接在一起的计算机比较少就是局域网,连接在一起的电脑比较多就属于广域网。广域网可以看成最大的局域网。通常,一个局域网内,只有交换机,通过交换机数据共享。而广域网,在此基础上还需要很多很多的路由器来实现数据传输。
2.认识网络前的知识储备
为了助于我们更好的学习网络,我们先来回忆一下计算机体系结构。当今的计算机绝大多数都是冯诺依曼体系结构,相比大家对此并不陌生
我们常说,输入设备将数据传给内存,然后内存将数据传给CPU,CPU对数据进行处理将结果传给内存,内存再将处理结果传给输出设备。那么我现在问,怎么传的的数据呢,总不能你说传就能传吧,其实呢,这些硬件之间也是通过线来连接起来的。其中,CPU与内存之间进行数据传输的线叫做“系统总线”,而外设与内存之间进行数据传输的线叫做IO总线。(虽然我这样说的并不是很准确,但是我们只需要知道各个硬件之间用线连接起来之后就可以进行数据交互,至于为什么连上线就能数据交互我们并不关心)同理,当我们把多台计算机用线连接起来之后,就可以实现多台计算机数据交互了。
3.什么是协议?
所谓协议,其实就是一种约定,或者说是一种规则。其实我们在现实生活中有很多这样的规则。比如我们在过马路看到红绿灯的时候,红灯停下,绿灯通行,黄灯等一等。这是国家的交通管理部门制定的规则,我们每个公民都遵守规则,才能保证交通井然有序。同样的网络传输,自然也需要有相应的网络协议,并且每个网民都遵守协议,才能保证数据在网络中正确高效的传输。
4.网络协议分层
70年代以来,国外一些主要计算机生产厂家先后推出了各自的网络体系结构,但它们都属于专用的。为使不同计算机厂家的计算机能够互相通信,以便在更大的范围内建立计算机网络,有必要建立一个国际范围的网络体系结构标准。国际标准化组织ISO 于1981年正式推荐了一个网络系统结构----七层参考模型,叫做开放系统互连模型(Open System Interconnection,OSI)。由于这个标准模型的建立,使得各种计算机网络向它靠拢,大大推动了网络通信的发展。OSI参考模型将网络协议分为以下七层。
但是在实际使用的时候发现,很难将最上面三层区分的特别清楚,于是上面三层就被简化为一层,统称为应用层。我们现在所说的TCP/IP四层(或五层)网络协议就是这么来的。我们学习也是按这四层(或五层)协议来学习。
- 协议分层的原因/好处有哪些呢?
- 降低通信协议的复杂性,每层各自完成一定的任务,功能相对独立(高内聚低耦合),这样实现起来更容易
- 将网络的通信过程划分为小一些、简单一些的部件,因此有助于各个部件的开发、设计和故障排除
- 在通信过程中,每一层都认为和对端的同一层直接通信,不用管下层具体怎样将信息传输的。
5.TCP/IP协议
TCP/IP协议不是一个协议,而是一组协议,包括了很多协议。TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.TCP/IP通讯协议采用了5层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求.
- 应用层: 负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问 协议(Telnet)等. 我们的网络编程主要就是针对应用层.
- 传输层: 负责两台主机之间的数据传输. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.
- 网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.
- 数据链路层: 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.
- 物理层: 负责光/电信号的传递方式. 比如以前以太网通用的网线(双绞线)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.
本文只是对TCP/IP协议总体介绍,后面在对每一层进行深入学习。
下面我们将之前学的计算机体系层状结构和网络协议放到一起看看
通过观察我们可以发现,一台主机想和另一台主机通信肯定要借助硬件,而应用层是不能直接驱动硬件的,而是必须经过操作系统。用户在应用层通过使用操作系统提供给用户的系统调用接口,告诉操作系统想和另一台主机通信,而操作系统在告诉网卡驱动,驱动再告诉网卡,通过网卡将信息发到互联网。由此可见,两台主机通信一定是自上而下的发送信息,自下而上的接收信息。就好比张三住在五楼,李四也住在五楼(不是同一栋楼),王五帮助他们两个传话,王五肯定是从五层收到张三的消息,再下到一层,走到马路上,然后走到李四那栋楼,再从一楼上到五楼,把消息传给李四。
-
那么从计算机的视角是如何看待协议呢?
举个例子,你在网上买了一部手机,你下单之后,你就只需要等快递了。商家会收到订单,然后商家会把手机交给快递员,然后呢商家也什么也不用管了。快递员收到包裹之后呢,会给手机打包起来,并且贴上快递单,这个快递单上一定包含了从哪来,到哪里去,上一站是哪,下一站是哪,并且呢包裹每走一站,上一站下一站的地址一定会改变。当快递小哥把包裹交给你之后,你会把包裹拆开,拿到里面的手机。虽然你只想买一部手机,但是你收到的绝不仅仅是一部手机,而一定包含了其他东西(快递包装箱,快递单)。以上过程可以简化为:打包–转发–解包。
两台主机通信的过程,同样也有类似的过程。请看下图。
讲到这里,想必刚刚学习网络的同学会有这样的疑惑。为什么处于同一个局域网的两台主机能够通信呢?
- 举个例子,老师和同学们在一间教室里上课,老师叫张三:张三你站起来回答问题。老师说的这句话,所有的同学都听到了,但是只有张三站起来了,因为老师是在叫他的名字。其他同学之所以没有站起来,是因为没有叫他们的名字。同样的,一个局域网,就好比一间教室,一台主机发消息,局域网内的所有主机都是可以收到的,但是,每一台主机都有他们自己的“名字”,发消息的人呢,也会带上接收方的“名字”,指明消息是发给谁的。所有的主机收到消息的时候,都会将自己的“名字”和消息中接收方的“名字”做对比,如果不是在叫自己,就会自动忽略消息内容。再回到教室的例子,比如此时是下课期间,教室里比较吵闹,老师叫张三,但是张三坐的比较靠后没有听到,那么老师可能就会过一会重新叫张三一次。而在局域网中,也是有可能多台主机同时在发消息,这些消息可能发生“碰撞”,导致有些消息没有被正确的发送给接收方。此时,就会使用碰撞检测算法,(应该就是过一定时间重发一次,大概是这样)。
上面我们介绍了同一局域网内的主机通信,那么互联网中不同局域网的两台主机又是如何通信的呢?请看下图。
其中路由器,屏蔽了底层硬件的差异,使得不同数据链路层的协议的主机也能正常通信。
6.IP地址和MAC地址
我们要将信息从一台主机发送到另一台主机,一定要用到这几个地址:起始地址,最终地址,上一站地址,下一站地址。
IP地址:在公网上一台主机的唯一标识,对应“起始地址,最终地址”。
MAC地址:用来在局域网中标识一台主机的唯一性。对应“上一站地址,下一站地址”。
如果把IP比作你的身份证号,MAC地址就是你的学号。
7.主机通信的本质
通过以上的学习,我们可以说,两台主机的通信,其实就是两台主机中的某两个进程之间的通信。我们可以通过IP在公网上找到目的主机,可是这还不够,我们需要和目的主机的具体某一个进程进行通信。如何确定和哪一个进程通信呢?或许有的同学想到了进程PID,从技术的角度上来说,我们确实可以通过PID确定和哪个进程通信,但是,这样不好,既然有了身份证号,为什么学习还要给同学们生成学号呢,身份证号也可以在一个学校内唯一标识一名学生呀。在网络通信的时候,标识具体某一进程,使用的是端口号(port),而IP+port就可以标识全网唯一一个进程。我认为这样做有以下两种好处:首先不是所有的进程都需要进行网络通信,把需要网络通信的进程用port标识,更好管理。此外,这样讲网络和操作系统直接的概念区分的更明确,明明就是两个方向的知识,何必用相同的名字进行区分呢?这样不易混淆。
感谢大家的阅读,期待您的关注与支持,下面我会继续更新网络的知识,尽量使用最浅显易懂的道理帮您学好网络的知识!