TCP/IP总共有4层,分别是链路层,网络层,传输层和应用层。
每层之间都有很好的隔离性,就是说每一层对上层和下层来说都是透明的。这使得各层可以专心处理自己的数据,不用担心其他层的数据处理,只关注同层的通信方式。这种分层思想是具有划时代意义的,这使得现在的INTERNET无所不在,使得如今的TCP/IP协议包容性如此之强。让我们再也不用管什么令牌网,以太网,点对点接口还是各种奇葩网,我们的网络程序一样运行,不受任何底层传输限制。这有点像我们写程序时候的模块化,函数化编程方式,可扩展性和可替代性大大增强。
今天我们来看看链路层:
我们常说的以太网接口(网卡)就是属于这一层的,当然链路层不止包括以太网接口,还包括SLIP接口,PPP接口等。现在大多数网络运营商都用pppoe进行用户认证接入网络,这个pppoe其实是ppp on ethenet,是在以太网接口上实现ppp协议。我们的电脑可能有多个网络接口,下面用我的来分析一下:
看到我的电脑目前有三个接口,一个是eth0,这是以太网接口,一个是lo这是环回接口,一个是wlan0接口,一般来说每个接口对应一个ip地址,我现在用wlan0上网,可以看到目前的ip地址是192.168.1.105,这个不是公网ip,这个是私网ip,对应的链路层地址为48bit的00:26:82:a5:82:b8。环回接口比较特殊,这是专门用来和本机自己通信的接口,不对外传输数据报。
一般TCP/IP协议是由内核实现的,我们可以看到内核处理IP数据报的流程,环回地址做为一个特殊的存在,ip数据报可以不经过以太网驱动。
从这个图中我们可以很好的理解下面两个ip报的流动过程不一样:
ping 127.0.0.1
ping 192.168.1.105
为什么不一样呢?
第一个命令是将ip数据报直接放入环回接口中,由环回驱动将报文放入ip数据报队列中。
而第二个命令是将ip数据报传入以太网驱动程序中,由以太网驱动程序判断该地址是本机地址,再将报文转发给环回接口,放入ip队列中。
结果都是一样的,不管哪个命令,数据报都不会发送到外部以太网中。
在链路层中,每个数据报有大小的限制,一般关注最大值,小的化可以自动填0,最大值就导致了MTU的出现。这也限制了上层ip数据报的大小,以太网的MTU为1500。
也就是说最大的ip数据报长度不能超过1500个字节。
同时我们也可以在链路层中,还可以传送别的数据报,如arp数据报,和rarp数据报。
在这里让我想起上几天我网上看的一个贴子,有人问为什么还需要mac地址啊,系统接受到数据报以后判断一下是不是自己的ip不就行了。。。。现在我想这个图很明白的告诉了我们答案,且不考虑其他原因,链路层可不止传送单一的ip数据报,还有很多无ip的报文,如果没有了mac地址,那么其他链路层协议就没办法实现了。
可以看看自己的接口MTU大小限制:
eth0与wlan0都是1500,只有lo为65536。