OSI参考模型
在OSI参考模型中,网络被分为七层,从下到上依次是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
物理层:负责0、1比特流(0、1序列)与电压的高低、光的闪灭(电信号)之间的互换。
数据链路层:负责物理层上互连的、节点之间的通信传输。例如一个与以太网相连的2个节点之间的通信
网络层:将数据传输到目标地址。目标地址可以是多个网络通过路由器连接而成的某一个地址。因此这一层主要是负责寻址和路由选择。
传输层:可靠地传输数据。只在通信双方节点上进行处理,而无需在路由器上处理。
会话层:负责建立和断开通信连接,以及数据的分割等数据传输相关的管理。
表示层:将应用处理的信息转换为适合网络传输的格式,或将来自下一层的数据转换为上层能够处理的格式。因此它主要负责数据格式的转换。
应用层:为应用程序提供服务并规定应用程序中通信相关的细节。包括文件传输、电子邮件、远程登录等协议。
数据链路层
数据链路层中有两个重要的概念:MAC 地址和分组交换
MAC地址
MAC 地址是被烧录到网卡 ROM 中的一串数字,长度为 48 比特,它在世界范围内唯一(不考虑虚拟机自定义 MAC 地址)。由于 MAC 地址的唯一性,它可以被用来区分不同的节点,一旦指定了 MAC 地址,就不可能出现不知道往哪个设备传输数据的情况。
分组交换
分组交换是指将大数据分割为一个个叫做包的较小单位进行传输的方法。使用分组交换的原因是不同的数据链路有各自的最大传输单元(MTU)。以以太网为例,它的MTU是1500字节,也就是通过以太网的数据,必须分割为若干帧,每个帧的数据长度不超过1500字节。如果上层传来的数据超过这个长度,数据链路层需要分割后再发送。
传输方式的分类
- 面向连接型和面向无连接型(网络数据传输方式)
- 电路交换和分组交换(网络通信方式)
- 单播、广播、多播、任播(根据接收端数量分类)
- 单播:一对一通信
- 广播:将消息从1台主机发送给与之相连的所有其他主机,典型例子就是电视播放
- 多播(组播):有一台主机发送消息给特定的多台主机
- 任播:从目标主机群中选择一台最符合网络条件的主机作为目标主机发送消息,发送端将只会跟这台主机进行通信。
TCP/IP
TCP/IP的具体含义
全称:Transmission Control Protocol/Internet Protocol
TCP/IP是指利用IP进行通信时所必须用到的协议群的统称。具体来说,IP或ICMP、TCP或UDP、TELNET或FTP、以及HTTP等都属于TCP/IP协议。它们与TCP或IP的关系密切,是互联网必不可少的组成部分。TCP/IP泛指这些协议,有时也称为TCP/IP为网际协议族。
TCP/IP规范-RFC
那些需要标准化的协议被列入RFC(Request for Comment)文档并在互联网上公布。RFC不仅记录了协议规范内容,还包含了协议的实现和运用的相关信息以及实验方面的信息。
协议 | RFC |
---|---|
IPv4 | RFC791 |
IPv6 | RFC2460 |
TCP | RFC793 |
UDP | RFC768 |
HTTP(1.1) | RFC2616 |
FTP | RFC959 |
TELNET | RFC 854 |
TCP/IP参考模型
TCP/IP参考模型中,网络分为五层,从下到上依次为:物理层、网络接口层、网络层、传输层、应用层。TCP/IP更强调“在计算机上实现协议应该开发哪种程序”。
物理层
TCP/IP物理层是负责数据传输的硬件。
网络接口层
网络接口层利用以太网的数据链路层进行通信
网络层
网络层使用IP协议,相当于OSI参考模型的第三层网络层。IP协议基于IP地址转发分包数据,作用是将分组数据报发送到目的主机。
TCP/IP分层中的网络层与传输层的功能通常由操作系统提供。尤其是路由器,它必须实现通过网络层转发分组数据包的功能。此外,连接互联网的所有主机跟路由器都必须实现IP的功能。
- IP
IP是跨越网络传送数据包,使整个互联网都能收到数据的协议。IP协议使数据能够发送到地球的另一端,这期间它使用IP地址作为主机的标识。
IP还隐含着数据链路层的功能。通过IP相互通信的主机之间不论经过怎样的底层数据链路都能够实现通信
IP也是分组交换的一种协议,但是它不具有重发机制。即使分组数据包未能到达对端主机也不会重发,因此属于非可靠性传输协议。
- ICMP
IP数据包在发送过程中一旦发生异常导致无法到达对端目标地址时,需要给发送方发送一个发送异常的通知。ICMP就是为这一功能而制定的,它有时也被用来诊断网络的健康状况。
- ARP
从分组数据包中的IP地址中解析出物理地址(MAC地址)的一种协议。
传输层
传输层的主要功能就是让应用程序之间实现通信。
- TCP传输控制协议
TCP是一种面向有连接的传输层协议,它可以保证两端通信主机之间的数据完整性。TCP能够正确处理在传输过程中丢包、传输顺序乱掉等异常情况。此外TCP还能够有效利用宽带,缓解网络拥堵。然而,为了建立与断开连接,有时它需要至少7次的发包收包,导致网络流量的浪费。
- UDP用户数据包协议
UDP是一种面向无连接的传输层协议。它不能保证两端通信主机之间的数据完整性,它是不可靠的。
应用层
TCP/IP应用的架构大多数属于客户端/服务器模型。常见的应用有www、E-mail、FTP、TELNET、SNMP(网络管理)。
TCP/IP通信示例
数据包首部
每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。通常,为协议提供的信息为包首部,所要发送的内容为数据。如下图所示,在下一层的角度看,从上一层收到的包全部都被认为是本层的数据。
发送数据包
假设甲给乙发送电子邮件,内容为:“早上好”。而从TCP/IP通信上看,是从一台计算机A向另一台计算机B发送电子邮件。下面,我们通过这个例子来讲解一下TCP/IP通信的过程。
- [1]应用程序处理
启动应用程序新建邮件,将收件人邮箱填好,再由键盘输入邮件内容“早上好”,鼠标点击“发送”按钮就可以开始TCP/IP通信了。
首先应用程序会进行编码处理。例如,电子邮件使用UTF-8进行编码,这些编码相当于OSI的表示层功能。
应用在发送邮件的那一刻建立TCP连接,从而利用这个TCP连接发送数据。它的过程首先是将应用的数据发送给下一层的TCP,再做实际的转发处理。
- [2]TCP模块的处理
TCP根据应用的指示,负责建立连接、发送数据以及断开连接。TCP提供将应用层发来的数据顺利发送至对端的可靠传输。
为了实现TCP的这一功能,需要在应用层数据的前端附加一个TCP首部。TCP首部中包括源端口号和目标端口号(用以识别发送主机跟接收主机上的应用)、序号(用以识别发送的包中哪部分是数据)以及校验码。随后将附加类TCP首部的包再发送给IP。
- [3]IP模块的处理
IP将TCP传过来的TCP首部和TCP数据组合起来作为IP包的数据,并在TCP首部的前端加上IP包的首部。因此,IP数据包中IP首部后面紧跟着TCP首部,然后才是应用的数据首部和数据本身。IP首部中包含数据接收端IP地址以及发送端IP地址。紧随IP首部的还有用来判断数据时TCP还是UDP的信息。
IP包生成后,参考路由控制表决定接受此IP包的路由或主机。随后,IP包将被发送给连接这些路由器或主机网络接口的驱动程序,以实现真正发送数据。
如果不知道接收端的MAC地址,可以利用ARP查找。只要知道了对端的MAC地址,就可以将MAC地址和IP地址交给以太网驱动程序,实现数据传输。
- [4]网络接口层的处理
从IP传过来的包,对于以太网驱动来说不过就是数据。给这数据附加上以太网首部并进行发送处理。以太网首部中包含接收端MAC地址、发送端MAC地址以及标志以太网类型的以太网数据的协议。根据上述信息产生的以太网数据包将通过物理层传输给接收端。发送处理中的FCS由硬件计算,添加到包的最后。设置FCS的目的是为了判断数据包是否由于噪声而被破坏。
下图为展示TCP/IP各层对邮件的收发处理
经过数据链路的包
分组数据包经过以太网的数据链路时的大致流程如下图所示。
包流动时,从前往后依次被附加了以太网包首部、IP包首部、TCP包首部以及应用自己的包首部和数据。而包的最后则追加以太网包尾。
每个包首部中至少都会包含两个信息:一是发送端和接收端的地址,另一个是上一层的协议类型。
经过每个协议层时,都必须有识别包发送端和接收端的信息。以太网会用MAC地址,IP会用IP地址,而TCP/UDP则会用端口号作为识别两端主机的地址。即使在应用程序中,像电子邮件地址这样的信息也是一种地址标识。这些地址信息都在每个包经由各个分层时,附加到协议对应的包首部里面。
此外,每个分层的包首部中还包含一个识别位,它是用来标识上一层协议的种类信息。例如以太网的包首部中的以太网类型,IP中的协议类型以及TCP/UDP中两个端口的端口号等都起着识别协议类型的作用。就是在应用的首部信息中,有时也会包含一个用来识别其数据类型的标签。
数据包接收处理
包的接收流程是发送流程的逆序过程。
- [5]网络接口层的处理
主机收到以太网包以后,首先以太网的包首部找到MAC地址判断是否为发给自己的包。如果不是发给自己的包则丢弃数据。
而如果接收到了恰好是发给自己的包,就查找以太网包首部中的类型域从而确定以太网协议所传送过来的数据类型。在这个例子中数据类型显然是IP包,因此再将数据传给处理IP的子程序,如果这时不是IP而是其他诸如ARP的协议,就把数据传给ARP处理。总之,如果以太网包首部的类型域包含了一个无法识别的协议类型,则丢弃数据。
- [6]IP模块的处理
IP模块接收到IP包首部及后面的数据部分以后,也做类似的处理。如果判断得出包首部中的IP地址与自己的IP地址匹配,则可接收数据并从中查找上一层的协议。如果上一层是TCP就将IP包首部之后的部分传给TCP处理;如果是UDP则将IP包首部后面的部分传给UDP处理。对于有路由器的情况下,接收端地址往往不是自己的地址,此时,需要借助路由控制表,在调查应该送达的主机或路由器以后再转发数据。
- [7]TCP模块的处理
在TCP模块中,首先会计算一下校验和,判断数据是否被破坏。然后检查是否在按照序号接收数据。最后检查端口号,确定具体的应用程序。
数据接收完毕后,接收端则发送一个“确定回执”给发送端。如果这个回执信息未能达到发送端,那么发送端会认为接收端没有接收到数据而一直反复发送。
数据被完整地接收以后,会传给由端口号识别的应用程序。
- [8]应用程序的处理
接收端应用程序会直接接收发送端发送的数据。通过解析数据可以获知邮件的收件人地址是乙的地址。如果主机B上没有乙的邮件信箱,那么主机B返回给发送端一个“无此收件地址”的报错信箱。
但在这个例子中,主机B上有乙的收件箱,所有主机B和收件人乙能够收到电子邮箱的正文。邮件会被保存到本机的硬盘上。如果保存也能正常进行,那么接收端会返回一个“处理正常”的回执给发送端。反之,一旦出现磁盘满、邮件未能成功保存等问题,就会发送一个“处理异常”的回执给发送端。
由此,用户以就可以利用主机B的邮件客户端,接收并阅读由主机A上的用户甲所发送过来的电子邮件。