发送端在层与层之间传输数据时,每经过一层时必定会被打上一个该层所属的首部信息,这种把数据信息包装起来的做法称为封装(encapsulate)。数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。 我会从最底层开始讲起。
网络接口层 常见协议: Ethernet 802.3、Token Ring 802.5、X.25、Frame relay、HDLC、PPP ATM等。
又叫网络访问层(数据连接 + 物理层),负责从上层接收 IP 数据包并通过网络发送,或者从网络上接收物理帧,抽出 IP 数据包,交给 IP 层。这层包括主机连接到物理网络所需要的硬件以及传送数据的协议。比如路由、NIC(Network Interface Card,网络适配器,即网卡),及光纤等物理可见部分;这层的协议取决于所使用的物理网络。如果物理网络是 LAN,那么通常使用的是以太网(802.3)协议以及它的变体,如果使用的是 WAN,常用的则是点对点协议(PPP)以及帧中继等协议。
其中比较出名的是以太网协议。“两台电脑(主机)之间是通过网卡来进行发送和接收数据的。每个网卡都有一个独特的地址,也就是 MAC 地址。以太网数据以帧为单位,包括标头和数据部分。以太网在子网内以广播的形式发送数据。光有 MAC 地址并不能让两台主机之间相互通信,如果两台主机不在同一个子网,以太网协议就没辙了。这就要通过网络层来区分每台主机所在的网络是哪个子网。如果在同一个子网,就用广播发送数据,否则就用路由发送。这就导致了网络层的诞生。”(来自极光推送)
网络访问层
常见协议:IP(Internet Protocol)、ICMP、ARP(Address Resolution Protocol)、RARP(Reverse ARP)。 IP 是网络层的核心,通过路由选择将下一条 IP 封装后交给接口层。 ICMP 是网络层的补充,可以回送报文。用来检测网络是否通畅。
网络层的主要任务简而言之就是“给每个数据包确定路线”。这个主机可能在同一个网络或者外部网络,因此需要先区分主机是不是在同一个子网。
这层就是 IP 协议所在的地方。就像我们写信的时候需要有一个地址,在网络世界中也需要一个地址,这个网络地址就是 IP 地址。
IP 地址是门牌号,而 IP 协议负责计算并找到指定门牌,快递小哥每天出门前要做的事就是 IP 协议的天职:分拣包裹、规划路径。其实,三五个节点的小型网络内部通信完全不必使用 IP 协议,因为这些节点之间本来就能两两互通,但会有个问题:节点数变多后,网速就会瘫痪,因为带宽耗尽。(带宽指固定时间内能传递的数据包,有点像马路宽度。)
因此,后来一片网络拆分成很多子网络(sub networks),每片子网络交给一台路由器统管。子网络中的节点间可以单独通信,不需要 IP 协议,但由于带宽限制,如果你想和本网络外的节点沟通时,就得使用一个设备:路由器。世界上大多数的路由器被几家大运营商掌管。
如上图,节点 1 和 2 同属一个子网,可基于内部通信协议沟通,而 1 和 5 间的联络必须基于 IP 协议,通过路由器 1 和 2 之间的路径交流。
把 IP 协议的逻辑推广到整个互联网,最终,连接我们手机客户端和腾讯服务器的是无数个路由器。
把大网络切小的好处显而易见:节约带宽、抬高网速,同时一只路由器挂了不影响其他节点间的通信,这就是 IP 协议的作用。
这层还有一些 “协助”IP 协议工作的协议,比如 ARP 和 RARP。要保证数据确实传送到对方主机,除了 IP 地址之外还需要 MAC 地址(Media Access Control Address)。Mac 地址又称物理地址,跟网卡一一对应,对于一台主机来说是唯一且不可变的。IP 地址则是会根据你所在网络的不同改变的。
上述两个协议的作用简单而言就是:用 IP 地址找 Mac 地址;以及用 Mac 地址找 IP 地址。具体的作用请看下面两段:
“ARP(地址解析协议)基本功能就是通过目标设备的 IP 地址,查询目标设备的 MAC 地址,以保证通信的顺利进行。以太网中的数据帧从一个主机到达网内的另一台主机是根据48位的以太网地址(硬件地址)来确定接口的,而不是根据 32 位的 IP 地址。内核必须知道目的端的硬件地址才能发送数据。P2P 的连接是不需要 ARP 的。
RARP(反向地址转换协议)允许局域网的物理机器从网关服务器的 ARP 表或者缓存上请求其 IP 地址。局域网网关路由器中存有一个表以映射 MAC 和与其对应的 IP 地址。当设置一台新的机器时,其 RARP 客户机程序需要向路由器上的 RARP 服务器请求相应的 IP 地址。假设在路由表中已经设置了一个记录,RARP 服务器将会返回 IP 地址给机器。”
看完之后你可能跟我有一样的疑惑,既然都是靠物理地址找主机,为啥还需要 IP 地址?51CTO 和 CSDN 这两篇文章可以解答这个问题:
MAC 地址结构是酱紫的:一共有 48bit,分为两部分,前 24bit 是厂商代码,后 24bit 是厂家自己分配的。假如我们认为 MAC 地址可以区分不同的网络的话,那只能是使用厂商代码来区分不同的网络,显然同品牌网卡不代表在同一个网络。
最早这个世界上的电脑没这么多的时候,是没有路由这个东西存在的,主机都在一张网里,所以确实是直接通过 mac 地址通信的。最初的链路层协议是和 ip 地址无关的,没有网络层方面的设定,只有物理层和链路层,最初也只有集线器,没有交换机路由器,服务器之间传输数据全靠 mac 地址。在没有 ip 地址之前,mac 地址已经在使用了。现在到处都在用的二层交换机,就是根据 mac 地址转发数据。mac 地址的设计不携带设备在网络中的位置信息,想要通过 mac 地址通信,我们得在所有的设备上维护一张很大的表,记录所有 mac 地址路由在当前位置的的下一跳,这显然是不合理的。
再次用《图解 HTTP》里面萌萌哒图解释一下这个过程:
MAC 地址就像电脑的个人身份证,IP 地址就像电脑所在的屋子,屋子里可以住着很多人,局域网关路由就像登记人口的街道办公室。
传输层
有了 IP 协议,就可以在两个主机之间发送数据了,接下来的问题在于每台主机都有不同的应用,如何区分哪个数据包属于哪个程序?这就是传输层的作用。传输层的主要任务是确保分割的单元在另一端正确地到达,它建立端口到端口的连接。网络层建立主机到主机的连接,只要有主机和端口,就能确定数据包属于哪个程序的。同时它也负责接收应用层的数据,然后把它们分成更小的单元(标头和数据部分在网络层的数据部分),传输到网络层。
这里提到的端口不是硬件端口,而是软件端口,端口有点向外界信息进入电脑的门,不同的信息通过这些门传给不同应用程序。
“ip 能锁定一台物理机器,对应着一张网卡,外界发来的数据包网卡都会接收。但是问题来了,网卡给程序提供了接口,你监听一下我,要是有消息来了,我就转发给你。这样应用程序就能收到数据了。但是问题来了,程序 A 和程序 B 都需要监听网卡接发数据,网卡说那我把接到的数据都发给你两,你们自己看着办吧。好,小 A 小 B 都接受了。但是又来了 CDEF......,不行了,每个包都被发到了所有应用程序,每个应用程序都累得不行,最终垮了。
好,那网卡说我给你们加个表示吧,我们之间可以用一个号码来作为标识,我和小 A 之间就用 1 来标识,如果外界发给 1 号标识的数据我就转发给你,你监听我的时候得告诉我你监听的时 1,我就转发 1 的数据包给你。好了其他的 BCD... 都自己弄一个标识号,只要不重复就行。这样大家都省事了。
最后设计到安全,一个标识号只能被一个应用程序监听,因为如果小 A 程序和小 B 同时监听一个标识号号,那就坏了,我传的数据都被 AB 接到,这样数据安全性就没办法保证了。”