前几天应聘一个实习生岗位,考官问了很多网络相关的知识,由于我太久没有复习,回答的很差。这让我很恼火,明明已经理解的东西为啥记不住呢?借此机会,我把之前《信息在网络中的漫游》系列重新梳理一遍。
- 信息的封装和解封
信息从一台主机发到另一台主机是需要经过层层封装并解封的。事实上,通信的两个主体是主机上的某个软件或程序。程序产生一段信息或数据,发送给运输层模块,在这里被封装成TCP/UDP报文,本质就是在信息的前面加入一些元数据,比如最重要的源端口和目的端口、报文长度等;这些报文被送往IP模块,再次被封装成IP数据报,在前面加入源主机IP和目的主机IP以及数据报长度等元信息;数据报还要被封装成MAC帧,原理同前面一样。MAC帧应该就不会再封装了,因为再往后就是物理层了,帧在物理层以比特的形式发送出去。上面的发送过程中,信息分别流经了应用层(原始数据,由程序产生)、运输层、网络层、链路层、物理层。信息接收的过程基本上就是这个过程的逆序。
运输层的任务是提供程序(更准确的说是进程)之间的通信,一台机器上可能同时有好多个程序在通信,所以必须提供端口号来识别不同的程序。
网络层提供源和目的主机之间的通信,但是这里的源和目的主机只是公网上的一个逻辑节点,网络层用IP来标识不同的节点。我们知道,IP的本质只是路由器转发表中的一串数字而已,一个IP与路由器中一个网卡接口绑定在一起。从这个接口出发的链路最终指向哪台具体的机器并不是路由器或公网关心的,比如家里的一台电脑独享一个IP,当它坏掉之后换一台新机器,新机器的IP还是原来的那个,没有随之改变。
虽然IP没变,但肯定有些东西是变了的,毕竟这是一台跟原来不一样新机器。变的就是MAC地址,如果说IP标识的是网络上的一个逻辑节点,那么MAC地址是紧紧和一台电脑绑定在一起的,它标识的是一台机器的身份,具体的说是这台机器上那个网卡的身份(机器的网卡是可以更换的)。
MAC地址是链路层的概念,链路层提供具体的机器到机器之间的直接通信。有了MAC地址,两台机器之间就能识别彼此,然后直接发送信息。当然,如果一个网络(比如局域网)中只有两台互联的机器,那么就不存在识别的问题,一台机器发送的信息目的地只可能有一个,这时候其实不需要MAC地址;但问题是一个网络中不可能只存在两台机器,机器多了之后就只能通过一台转发设备(比如交换机)连接各个机器,这时候转发设备有很多个端口,它必须知道某个端口到底对应的是哪台机器,所以它会维护一张转发表,内容就是哪个端口对应的是哪个MAC地址,MAC地址就代表了一台机器。同样道理,路由内部也有很多个端口,它其实维护了两张表,一张是IP和MAC的对应,一张是MAC和端口的对应。
源主机和目的主机虽然知道彼此的IP,但是并不知道MAC,所以他俩不能直接通信。IP提供了一种假象,就好像源主机和目的主机是直接通信似的,实际上IP封装了底层的通信细节,真正的实现是这样的:源主机把MAC帧发送给离它最近的一台机器(通常是网关路由器),这台机器解封MAC帧,读取内部的IP头部数据,对比其目的IP和自己的IP,二者一致的话,说明这台路由器就是目的主机,于是逐层剥离头数据,读取最核心的应用层数据发送相应的程序去处理;否则,重新封装成MAC帧,继续这样转发另一台路由器,直到最终传给目的主机。