玩转socket(四)
OSI网络七层模型、TCP/IP协议族、IP、MAC和端口号
本讲分三个部分:
- OSI网络七层模型
- TCP/IP协议族
- IP、MAC和端口号
OSI网络七层模型
如果你读过计算机专业,或者学习过网络通信(很遗憾,我的专业教学越过了网络通信),那你一定听说过OSI模型,它曾无数次让你头大。OSI是Open System Interconnection的缩写,译为“开放式系统互联”。
OSI模型把网络通信的工作分为七层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
OSI只是存在于概念和理论上的一种模型,它的缺点是分层太多,增加了网络工作的复杂性,所以没有大规模应用。后来人们对OSI进行了简化,合并了一些层,最终只保留了4层,从下到上分别是接口层、网络层、传输层和应用层。这就是鼎鼎大名的TCP/IP模型。
图1:OSI 七层网络模型和 TCP/IP 四层网络模型的对比
图2:OSI 七层网络模型和 TCP/IP 四层网络模型的对比
这个网络模型究竟是干什么的呢?简而言之就是进行数据封装的。
我们平常使用的程序(或者说软件)一般都是通过应用层来访问网络的,程序产生的数据会一层一层地往下传输,直到最后的网络接口层,就通过网线发送到互联网上去了。数据每往下走一层,就会被这一层地协议增加一层包装,等到发送到互联网上时,已经比原始数据多了四层包装。整个数据封装的过程就像俄罗斯套娃。
当另一台计算机接收到数据包时,会从网络接口再一层一层往上传输,每传输一层就拆开一层包装,直到最后的应用层,就得到了最原始的数据,这才是程序要使用的数据。
给数据加包装的过程,实际上就是在数据头增加一个标志(一个数据块),表示数据经过了这一层,我已经处理了。给数据拆包的过程正好相反,就是去掉数据头部的标志,让它逐渐现出原形。
所以,在互联网上传输一份数据是多么的复杂!而我们却感受不到,这就是网络模型的厉害之处。我们只需要在代码中调用一个函数,就能让下面的所有网络层为我们工作。
我们所说的socket编程,是站在传输层的基础上,所以可以使用TCP/UDP协议,但是不能干访问网页这样的事情,因为访问网页所需要的http协议位于应用层。
两台计算机进行通信时,必须遵循以下原则:
- 必须是同一层次进行通信,比如,A计算机的应用层和B计算机的传输层就不能通信,因为它们不在一个层次,数据的拆包会遇到问题。
- 每一层的功能都必须相同,也就是拥有完全相同的网络模型。如果网络模型都不同,那不就乱套了,谁都不认识谁。
- 数据只能逐层传输,不能跃层。
- 每一层可以使用下层提供的服务,并向上层提供服务。
TCP/IP协议族
上面讲到,目前实际使用的网络模型时TCP/IP模型,它对OSI模型进行了简化,只包含了四层,从上到下分别是应用层、传输层、网络层和网络接口层,每一层都包含了若干协议。
协议(Protocol)就是网络通信过程中的约定或者合同,通信双方必须都遵循才能正常收发数据。协议有很多种,例如TCP、UDP、IP等,通信双方必须使用同一协议才能通信。协议是一种规范,由计算机组织制定,规定了很多细节,例如,如何建立连接,如何相互识别等。
协议仅仅是一种规范,必须由计算机软件来实现。例如IP协议规定了如何找到目标计算机,那么各个开发商在开发自己的软件时就必须遵循该协议,不能另起炉灶。
TCP/IP模型包含了TCP、IP、UDP、Telnet、FTP、SMTP等上百种互为关联的协议,其中TCP和IP是最常见的两种底层协议,所以把他们统称为“TCP/IP协议族”
也就是说,“TCP/IP”模型”中所涉及到的协议称为“TCP/IP协议族”,你可以区分这两个概念,也可以认为他们是等价的,随便你怎么想。
本文所讲的socket编程是基于TCP和UDP协议的,他们的层级关系如下:
图3:TCP和UDP协议的层级关系
开放式系统(Open System)
把协议分成多个层次有哪些优点?协议设计更容易?当然这也足以成为优点之一。但是还有更重要的原因,就是为了通过标准化操作设计成开放式系统。
标准本身就是对外公开的,会引导更多的人遵守规范。以多个标准为依据设计的系统称为开放式系统,我们学习的TCP/IP协议族也属于其中之一。
接下来了解一下开放式系统具有哪些优点。
路由器用来完成IP层的交互任务。某个网络原来使用A公司的路由器,现要将其替换成B公司的,是否可行?这并非难事,并不一定要换成同一公司的同一型号路由器,因为所有生产商都会按照IP层标准制造。
再举个例子。大家的计算机是否装有网络接口卡,也就是所谓的网卡?尚未安装也无妨,其实很容易买到,因为所有网卡制造商都会遵循链路层的协议标准。这就是开放式系统的优点。
标注的存在意味着高速的技术发展,这也是开放式系统设计最大的原因所在。实际上,软件工程中的“面向对象”的诞生背景中也有标准化的影子也就是说,标准对于技术发展起着举足轻重的作用。
IP、MAC和端口号
在茫茫的互联网汪洋中,要找到一台计算机非常不容易,有三个要素必须具备,它们分别是IP地址、MAC地址和端口号。
IP地址
IP地址是Internet Protocol Address的缩写,译为“网际协议地址”。
目前大部分软件使用IPv4地址,但IPv6也正在被人们接受(实际上很多人已经在用IPv6了),尤其是在教育网中,已经大量使用。
一台计算机可以拥有一个独立的IP地址,一个局域网也可以拥有一个独立的IP地址(对外就好像只有一台计算机)。目前广泛使用的ipv4地址,它的资源是非常有限的,一台计算机一个IP地址是不现实的,往往是一个局域网才拥有一个IP地址。
在互联网上进行通信时,必须要知道对方的IP地址。实际上数据包中已经附带了IP地址,把数据包发送给路由器后,路由器会根据IP地址找到对方的地理位置,完成一次数据的传递。路由器有非常高效和智能的算法,很快会找到目标计算机。
MAC地址
现实情况是,一个局域网往往才能拥有一个独立的IP;换句话说,IP地址只能定位到一个局域网,无法定位到具体的一台计算机。这可怎么办呀?这样也没法通信呀!
其实,真正能唯一标识一台计算机是MAC地址,每个网卡的MAC地址在全世界都是独一无二的。计算机出厂时,MAC地址已经被写死到网卡里了(当然,通过某些“奇淫巧技”也是可以修改的)。局域网中的路由器/交换机会记录每台计算机的MAC地址。
MAC地址是Media Access Control Address的缩写,直译为“媒体访问控制地址”,也称为局域网地址(LAN Address),以太网地址或物理地址。
数据包中除了会附带IP地址,还会附带对方的MAC地址,当数据包达到局域网以后,路由器/交换机会根据数据包中的MAC地址找到对应的计算机,然后把数据包转交给它;这样就完成了数据的传递。
端口号
有了IP地址和MAC地址,虽然可以找到目标计算机,但仍不能进行通信。一台计算机可以同时提供多种网络服务,例如Web服务,FTP服务(文件传输服务)、SMTP服务(邮箱服务)等,仅有IP地址和MAC地址,计算机虽然可以正确地接收到数据包,但是却不知道要将数据包交给哪个网络程序来处理,所以通信失败。
为了区分不同的网络程序,计算机会为每个网络程序分配一个独一无二的端口号(Port Number),例如,Web服务的端口是80,FTP服务的端口是21,SMTP服务的端口是25.
端口(Port)是一个虚拟的、逻辑上的概念。可以将端口理解为一道门,数据通过这道门流入流出,每道门有不同的编号,就是端口号。
图4:端口号对应的网络服务
本节完