链路层解决的问题
- IP拥有将数据跨网络从一台主机送到另一台主机的能力,但IP并不能保证每次都能够将数据可靠的送到对端主机,因此IP需要上层TCP为其提供可靠性保证,比如数据丢包后TCP可以让IP重新发送数据,最终在TCP提供的可靠性机制下IP就能够保证将数据可靠的发送到对端主机。
- TCP除了对下层IP提供可靠性机制之外,TCP对上还提供进程到进程的服务,我们在进行socket编程时,本质就是在使用TCP或UDP为我们提供的进程到进程的服务。
- 但数据在网络传输时需要一跳一跳的从一台主机跳到另一台主机,最终才能将数据转发到目标主机,因此要将数据发送到目标主机的前提是,需要先将数据转发给与当前主机直接相连的下一跳主机,而两台主机直接相连也就意味着这两台主机属于同一网段,因此将数据转发到下一跳主机实际是属于局域网通信范畴的,而这实际就是链路层需要解决的问题。
也就是说,网络层IP提供的是跨网络发送数据的能力,传输层TCP是为数据发送提供可靠性保证的,而链路层解决的则是两台相连主机之间的通信问题。
以太网协议
认识以太网
- “以太网” 不是一种具体的网络, 而是一种技术标准; 既包含了数据链路层的内容, 也包含了一些物理层的内容. 例如: 规定了网络拓扑结构, 访问控制方式, 传输速率等;
- 例如以太网中的网线必须使用双绞线; 传输速率有10M, 100M, 1000M等;
- 以太网是当前应用最广泛的局域网技术; 和以太网并列的还有令牌环网, 无线LAN等;
碰撞避免算法
由于以太网中的所有的主机共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰。站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用。
- 对于这个问题,以太网的做法就是先不限制各个主机发送数据的能力,局域网中的每个主机想发数据的时候直接发就行了,但是只要发送出去的数据与其他主机发送的数据产生了碰撞,那就得执行碰撞避免算法。
- 所谓的碰撞避免算法就是,当主机发送出去的数据产生碰撞时,该主机需要等待一段时间后再进行数据重发,在主机等待的时候就能够就能够尽可能让局域网当中的数据消散。
- 以太网通信的原理就像现实生活中开会一样,在开会过程中同一时刻只允许一个人发言,如果两个人突然同时说话,那么双方都会有礼貌的等待别人先说。
也就是说,以太网中主机发送的数据产生碰撞后该主机会执行碰撞避免算法,所以我们说以太网是基于碰撞区和碰撞检测的局域网通信标准。
碰撞避免算法就是主机等待一段时间后重新发送数据,因此以太网底层也有重传机制,只不过以太网的重传机制只是为了保证将数据从局域网中的一台主机发送到另一台主机.
以太网帧格式
MAC帧如何将报头与有效载荷进行分离?
以太网MAC帧的帧头和帧尾都是固定长度的,因此当底层收到一个MAC帧后,直接提取出MAC帧当中固定长度的帧头和帧尾,此时剩下的就是有效载荷了。
MAC帧如何决定将有效载荷交付给上层的哪一个协议?
以太网MAC帧对应的上层协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需要确定应该将分离出来的有效载荷交付给上层的哪一个协议。
在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可。
认识MAC地址
- MAC地址用来识别数据链路层中相连的节点。
- 长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示,例如:08:00:27:03:fb:19。
- 在网卡出厂时就确定了,不能修改,MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址)
对比理解MAC地址和IP地址
实际数据在路由过程中会存在两套地址,一套是源IP地址和目的IP地址,还有一套是源MAC地址和目的MAC地址。
- IP地址描述的是路途总体的起点和终点。
- MAC地址描述的是路途上的每一个区间的起点和终点。
比如做公交车时,源IP地址就是我们上车的站点,目的IP地址就是我们最终要下车的站点,而源MAC地址就是公交车上一个已经到达的站点,目的MAC地址就是公交车下一个将要到达的站点。
因此数据在路由过程中,源IP地址和目的IP地址可以理解成是不会变化的,而数据每进行一跳后其源MAC地址和目的MAC地址都会变化。
注意: 实际数据在路由过程中,源IP地址和目的IP地址也可能会发生变化。(NAT技术)
认识MTU
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制。
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位;
- 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU;
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
- 不同的数据链路层标准的MTU是不同的;
MUT对IP协议的影响
因为数据链路层规定了最大传输单元MTU,所以如果IP层一次要发送的数据量超过了MTU,此时IP层就需要先对该数据进行分片,然后才能将分片后的数据向下交付。
- IP层会将较大的数据进行分片,并给每个分片数据包进行标记,具体就是通过设置IP报头当中的16位标识、3位标志和13位片偏移来完成的。
- 由同一个数据分片得到的各个分片报文,所对应的IP报头当中的16位标识(id)都是相同的。
- 每一个分片报文的IP报头当中的3位标志字段中,第2位设置为0,表示允许分片,第3位用作结束标记(最后一个分片报文设置为0,其余分片报文设置为1)。
- 当对端IP层收到这些分片报文后,需要先将这些分片报文按顺序进行组装,拼装到一起后再向上交付给传输层。
- 如果分片后的某个报文在网络传输过程中丢包了,那么对端在进行数据组装时就会失败,此时就需要上层传输层进行数据重传。
数据的分片和组装发生在IP层,不仅源端主机可能会对数据进行分片,数据在路由过程中的路由器也可能对数据进行分片。因为不同网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU小,那么路由器就可能对IP数据报再次进行分片。
MTU对UDP协议的影响
IP报头当中如果不携带选项字段,那么IP报头的长度就是20字节,而UDP采用的是定长的8字节报头,因此如果UDP一次携带的数据超过了 1500−20−8=1472 字节,此时数据就需要在IP层进行分片。
- 分片后得到的多个IP数据报中有任意一个在传输过程中丢失,都会引起接收端IP层重组失败。
- 假设在网络传输时丢包的概率是万分之一,如果将数据拆分为一百份进行发送,那么此时丢包的概率就上升到了百分之一。
- 因为只要有一个分片报文丢包了也就等同于这个报文整体丢失了,因此分片会增加UDP报文丢包的概率。
MTU对TCP协议的影响
对于TCP来说,分片也会增加TCP报文丢包的概率,但与UDP不同的是TCP丢包后还需要进行重传,因此TCP应该尽量减少因为分片导致的数据重传。
- TCP发送的数据报不能无限大,还是应该受制于MTU,我们将TCP的单个数据报的最大报文长度,称为MSS(Max Segment Size)。
- TCP通信双方在建立连接的过程中,就会进行MSS协商,最终选取双方支持的MSS值当中的较小值作为最终MSS。
- MSS的值实际就是在TCP首部的40字节的选项字段当中的(kind=2)。
- 最理想的情况下,MSS的值正好就是在数据不会在IP层进行分片的最大长度。
MSS和MTU的关系如下:
ARP协议
地址解析协议(Address Resolution Protocol,ARP)协议,是根据IP地址获取MAC地址的一个TCP/IP协议。
ARP协议的作用
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
- 在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
- 数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢
弃; - 因此在通讯前必须获得目的主机的硬件地址;
ARP协议的定位
在TCP/IP四层模型中,网络协议栈自顶向下分为应用层、传输层、网络层和数据链路层。
其中应用层最典型的协议有HTTP、HTTPS和DNS等,传输层最典型的协议有TCP和UDP,网络层最典型的协议就是IP,数据链路层最典型的协议就是MAC帧协议,但实际数据链路层还有两种协议叫做ARP和RARP。
ARP、RARP和MAC帧协议虽然都属于数据链路层的协议,但ARP协议和RARP协议属于MAC帧的上层协议
- 也就是说,MAC帧的上层协议不一定就直接是网络层的协议,MAC帧的上层协议有可能也属于数据链路层的协议,但就是位于MAC帧的上层。
- 与之类似的,网络层当中的ICMP协议和IGMP协议,这两个协议虽然与IP协议都属于网络层,但这两个协议属于IP的上层协议。
ARP数据的格式
- 硬件类型指链路层的网络类型,1为以太网。
- 协议类型指要转换的地址类型,0x0800为IP地址。
- 硬件地址长度对于以太网地址为6字节,因为MAC地址是48位的。
- 协议地址长度对于IP地址为4字节,因为IP地址是32位的。
- op字段为1表示ARP请求,op字段为2表示ARP应答。
从ARP的数据格式也可以看出,ARP是MAC帧协议的上层协议,ARP数据格式中的前3个字段和最后一个字段对应的就是以太网首部,但由于ARP数据包的长度不足46字节,因此ARP数据包在封装成为MAC帧时还需要补上18字节的填充字段。