点到点信道的数据链路层协议的数据单元为帧:
- 将网络层交下来的IP数据报添加首部尾部封装成帧;
- 将封装好的帧发送给接受方的数据链路层;
- 收到的帧无差错则从中提取到IP数据报交给网络层,否则丢弃
由上图可知,在 IP 数据包交付的过程中,在数据链路层会对数据包进行添加报头信息。此时就要引出一个新的概念——以太网。那么以太网是什么呢?
- 以太网不是一种具体的网络,而是一种技术标准。它既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等
- 以太网是当前应用最广泛的局域网技术(和以太网并列的还有令牌环网,无线LAN等)
以太网帧格式
以太网帧就是将网络层交付的数据添加报头信息后,此时的数据以帧的形式传递。
以太网格式如下:
在这里,目的地址与源地址这里都指的是 MAC 地址。每一个主机对应唯一的一个 MAC 地址,是由网卡决定的,长度是 48 位,所以这里的目的地址与源地址都是 6 个字节,也就是 48 个比特位。
在以太网帧的最后,还有一个 CRC 校验码,来校验数据是否异常。
在中间,有一个两个字节的类型标识。这个类型字段有三种值,分别对应IP、ARP、RARP。
类型字段
IP
如果类型码为 0800 那么在数据链路层解包完毕后,将该数据交付给网络层的 IP 协议来处理该报文。
ARP
如果类型码是 0806 , 那么在向上层交付的时候就交付给 ARP 协议,这里要说的是 ARP 协议是处于数据链路层与网络层之间的一种协议,也叫作地址解析协议。它将 IP 地址转换为 MAC 地址。
RARP
RARP 协议,就是 Reverse ARP,与 ARP 协议相同,是将 MAC 地址转换为 IP 地址的协议
注意:一般来说,数据第一次发送给目的主机时,在这之前应该发送 ARP 协议,根据目的主机的 IP 地址来确定目的主机的 MAC 地址,从而为后面的数据发送与接收提供便利
MAC地址与IP地址
- MAC地址用来识别数据链路层中相连的节点
- MAC地址长度为48位,即6个字节。一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
- MAC地址在网卡出场时就确定了,不能被修改。MAC地址通常时唯一的
- 在数据发送传输的过程中,目的 IP 地址与源 IP 地址是永远不会变的,这是这个数据的起始与终点,而 MAC 地址是一直在变化的,由于数据在传输的过程中会经历很多的主机等,所以在这个过程中 MAC 地址一直在变。类似于我们坐车,要坐车从 A 出发,目的地是 D。这个过程中我们会经过 B C,在到达 B 的时候,此时的 MAC 地址相当于我们上一站是 A , 下一站是 C。而目的 IP 地址与 源 IP 地址 分别是 D 与 A,这样说的话就很好理解了(MAC 地址与 IP 地址,一个代表的目的与终点,一个代表着途中的经过。所以在到达目的局域网后,数据包并不知道要传输给哪台主机,因为 MAC 地址的变化,但是目的 IP 地址一直没有变化,所以此时就需要 ARP 协议来确定目的主机的 MAC 地址)
MTU
在谈 IP 协议的时候说到, IP数据报的长度受数据链路层的 MTU 影响。数据链路层要求在网络层传输过来的数据包必须在 MTU 范围内 。MTU相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层产生的限制。
- 以太网帧中的数据长度规定最小46个字节,最大1500字节。ARP数据包的长度不够46字节,那么要在后面补充填充位(PAD)
- 最大值1500称之为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片
MTU对IP协议的影响
由于MTU的限制,对于较大的IP数据包要进行分包
- 在IP层在添加报头信息之前,要判断此时由传输层传输过来的数据段是否超过了1480个字节(以太网帧中的数据包括IP协议的报头信息,IP协议的报头信息为20字节),如果超过了那么则要对该数据段进行分片)
- 将较大的IP包分成多个小包,并给每个小包打上标签
- 每个小包IP协议头的16位标识是相同的
- 每个小包的IP协议头的3位标志字段中,第二位置0表示允许分片,第3位表示结束标记(当前是否是最后一个小包,如果是则置为1,否则置为0)
- 到达对端后再将这些小包按顺序重组,拼装到一起返回给传输层
- 一旦这些小包中任意一个小包丢失,接收端的重组就会失败,但是IP层不会负责重新传输数据
MTU对UDP协议的影响
- 因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节. 而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的. 又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节. 这个1472字节就是我们可以使用的字节数。
- 一旦UDP携带的数据超过1472,那么就会在网络层分成多个IP数据报
- 这些多个数据报有任意一个丢失都会引起接收端网络层重组失败。这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了
MTU对TCP协议的影响
我们先来回忆一下TCP协议:
- TCP的一个数据报也不能无限大,还是受制于MTU。TCP的单个数据报的最大消息长度,称为MSS(Max Segment Size)
- TCP在建立连接的过程中,通信双方会进行MSS协商
- 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然受制于数据链路层的MTU)
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值
- 然后双方得知对方的MSS值之后,选择较小的作为最终MSS
- MSS的值就是在TCP首部的40字节变长选项中
MSS和MTU的关系
由上可知,MSS 的大小其实就是应用层给传输层的交付的数据的大小。不包括传输层的报头信息。所以在计算 MSS 的时候,用 MTU 减去网络层报头长度以及传输层报头长度即可。