协议分层
计算机网络中有着许多的协议,不同的协议规定着不同的规范、执行着不同的功能,网络的设计者将这些协议进行了分层,分层之后的一个好处是:如果互联网只由一个协议统筹,某个地方需要改变设计时,就必须把所有部分整体替换掉。而分层之后只需把变动的层替换掉即可。把各层之间的接口部分规划好之 后,每个层次内部的设计就能够自由改动了。法律上规定的协议层次分为7层,它概念清楚,理论完整,但是既复杂又不实用。现在得到广泛应用的是中间的TCP/IP体系结构,它主要是上面的三层,网络接口层基本上没有什么内容,所以在学习的时候,基本上是结合了左中两个体系结构的优点,把计算机网络分为了如右图的五层。
应用层
应用层是网络应用程序及它们的应用层协议存留的地方。因特网的应用层包括许多协议,例如HTTP(它提供了 Web文档的请求和传送)、SMTP(它提供了电子邮件报文的传输)和FTP(它提供两个端系统之间的文件传送)以及DNS(Domain Name System,它提供域名解析功能)。应用层协议分布在多个端系统上,而一个端系统中的应用程序使用协议与另一个端系统中的应用程序交换信息分组,这种位于应用层的信息分组被称为报文(message)。
运输层
运输层对上层应用层提供处于网络连接中的两台计算机之间的数据传输。在传输层有两个性质不同的协议:TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Data Protocol,用户数据报协议),运输层的分组被称为报文段 (segment) 。
网络层
网络层用来处理在网络上流动的数据包,数据包是网络传输的最小数据单位(网络层的分组)。该层规定了通过怎样的路径(所谓的传输路线)到达对方计算机,并把数据包传送给对方。与对方计算机之间通过多台计算机或网络设备进行传输时,网络层所起的作用就是在众多的选项内选择一条传输路线。网络层包括著名的网际协议IP,该协议定义了在数据报中的各个字段以及端系统和路由器如何作用于这些字段。IP仅有一个,所有具有网络层的因特网组件必须运行IP。
链路层
用来处理连接网络的硬件部分。包括控制操作系统、硬件的设备驱动、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分(还包括连接器等一切传输媒介)。硬件上的范畴均在链路层的作用范围之内,我们把链路层分组称为帧。
物理层
虽然链路层的任务是将整个帧从一个网络元素移动到邻近的网络元素,而物理层的任务是将该帧中的一个个比特从一个节点移动到下一个节点。在这层中的协议仍然是链路相关的,并且进一步与该链路(例如,双绞铜线、单模光纤)的实际传输媒体相关。例如,以太网具有许多物理层协议:一个是关于双绞铜线的,另一个是关于同轴电缆的,还有一个是关于光纤的,等等。在每种场合中,跨越这些链路移动一个比特是以不同的方式进行的。
数据在网络上的流动过程
数据封装
- 应用层准备数据,把数据交给传输层
- 运输层把数据分段,将文件分成数据包,并标上顺序号,然后传给网络层,传输层的数据叫做数据段
- 网络层给每一段加上地址(源IP地址和目标IP地址),把数据给数据链路层,网络层的数据叫做数据包
- 链路层使用自己的子网掩码,判断自己在哪个网段,然后使用自己的子网掩码,判断目标地址在哪个网段。如果是同一个网段,使用ARP协议广播解析目标IP地址的MAC地址;否则通过网关把数据包交给路由器。然后把当前的MAC地址和下一跳的MAC地址添加在数据包后面,在数据包前面加上FCS(帧校验序列),把数据给物理层,数据链路层的数据叫数据帧。
- 物理层把数据链路层的数据帧变成数字信号(比特流),物理层的数据叫做比特流,就是0和1组成的序列。
数据传输
- 如果有集线器,物理层会把数据发给集线器,集线器传递比特流,加强信号,不做任何判断,集线器和网线是同一级别的
- 比特流被发送到交换机,交换机接收并存储比特流,查看目标MAC地址,选择出口(由哪个口转发出去),交换机能够看懂数据链路层添加的MAC地址,所以交换机是数据链路层的设备
- 交换机把比特流发送到路由器,路由器接收比特流,接收后去掉数据链路层的帧校验序列以及MAC地址,根据目标IP地址选择路径出口。网卡重新包装数据包,路由器和下一个路由器之间如果使用的是PPP协议(点对点),因为使用了这个协议,所以不写源MAC地址,只写目标MAC地址为FF,变成比特流再往下传输
- 下一个路由器接收到比特流,去掉MAC地址。如果IP地址是对的,根据数据包选择转发的路径,封装上目标MAC地址和当前MAC地址,变成比特流继续传输;错误的则丢掉数据包
- 计算机接收到之后处理数据
数据解封
- 物理层接收到比特流,把比特流转换成数据帧给链路层
- 链路层把打包数据时加入的两个MAC地址和FCS去掉,把数据包交给网络层
- 网络层把数据包中的IP地址去掉,把剩余的数据段给运输层
- 运输层把数据段的头去掉,把数据交给应用层
- 应用层把收到的一段一段的数据再拼到一起,成为一块完整的数据
图解

