TCP/IP学习(37)——L2如何设置包的协议类型

简介:

原文地址:TCP/IP学习(37)——L2如何设置包的协议类型 作者:GFree_Wind

本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net
   

以太网的硬件地址长度为48 bits(6 字节),而L2数据帧有三种类型:单播,多播和广播,其中广播可看作多播的一种特殊情况。Bit 0用于表示多播还是单播,当bit 0为1时,为多播,为0时,表示单播。

Linux kernel使用eth_type_trans来判断数据帧的类型,及协议类型。
  1. __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
  2. {
  3.     struct ethhdr *eth;

  4.     skb->dev = dev;
  5.     skb_reset_mac_header(skb);
  6.     skb_pull_inline(skb, ETH_HLEN);
  7.     eth = eth_hdr(skb);

  8.     if (unlikely(is_multicast_ether_addr(eth->h_dest))) {
  9.         /* 如果是多播地址,即bit0为1*/

  1.         if (!compare_ether_addr_64bits(eth->h_dest, dev->broadcast))
  2.             skb->pkt_type = PACKET_BROADCAST; //与设备的广播地址相同,则帧为广播帧
  3.         else
  4.             skb->pkt_type = PACKET_MULTICAST; //与设备的广播地址不同,则帧为多播帧
  5.     }

  6.     /*
  7.      * This ALLMULTI check should be redundant by 1.4
  8.      * so don't forget to remove it.
  9.      *
  10.      * Seems, you forgot to remove it. All silly devices
  11.      * seems to set IFF_PROMISC.
  12.      */
     /* 
     这里为什么不检测 IFF_PROMISC标志呢? 
     我怀疑是因为有的网卡不设置这个标志,依然可以收到不属于自己地址的数据包
     */
  1.     else if (1 /*dev->flags&IFF_PROMISC */ ) {
         
          /* 如果数据帧的目的地址不是网卡的地址,那么数据帧的类型为PACKET_OTHERHOST */
  1.         if (unlikely(compare_ether_addr_64bits(eth->h_dest, dev->dev_addr)))
  2.             skb->pkt_type = PACKET_OTHERHOST;

 /* 默认情况,skb->pkt_type为0,即PACKET_HOST,即数据帧是发给本主机的 */
  1.     }

     /* 下面开始判断L2协议 */

  1.     /*
  2.      * Some variants of DSA tagging don't have an ethertype field
  3.      * at all, so we check here whether one of those tagging
  4.      * variants has been configured on the receiving interface,
  5.      * and if so, set skb->protocol without looking at the packet.
  6.      */
     /*
     如上面的注释所说,当设备指定了DSA或者TRAILER,那么就不需要检查包,直接返回DSA或者TRAILER
     */
  1.     if (netdev_uses_dsa_tags(dev))
  2.         return htons(ETH_P_DSA);
  3.     if (netdev_uses_trailer_tags(dev))
  4.         return htons(ETH_P_TRAILER);

     /*
     当协议值大于136时,那么这个数据帧一定为ethernet frame 
     因为802.2和802.3的对应域为帧长,均要小于或等于1500,而ethernet frame的协议类型都大于等于1536.
     */
  1.     if (ntohs(eth->h_proto) >= 1536)
  2.         return eth->h_proto;

  3.     /*
  4.      * This is a magic hack to spot IPX packets. Older Novell breaks
  5.      * the protocol design and runs IPX over 802.3 without an 802.2 LLC
  6.      * layer. We look for FFFF which isn't a used 802.2 SSAP/DSAP. This
  7.      * won't work for fault tolerant netware but does for the rest.
  8.      */
     /*
     当IPX使用原始的802.3作为载体时,其头两个字节作为checksum,但是一般都设为0xffff。 
     */
  1.     if (skb->len >= 2 && *(unsigned short *)(skb->data) == 0xFFFF)
  2.         return htons(ETH_P_802_3);

  3.     /*
  4.      * Real 802.2 LLC
  5.      */
  6.     /* ok, 那么类型为802.2*/
  7.     return htons(ETH_P_802_2);
  8. }
这个函数逻辑上很简单,基本上都是由L2层协议所决定的。
目录
相关文章
|
6月前
|
机器学习/深度学习 人工智能 网络协议
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
113 4
|
7天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
37 3
|
18天前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
46 13
|
19天前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
1月前
|
网络协议 算法 数据格式
【TCP/IP】UDP协议数据格式和报文格式
【TCP/IP】UDP协议数据格式和报文格式
123 3
|
1月前
|
XML JSON 网络协议
【TCP/IP】自定义应用层协议,常见端口号
【TCP/IP】自定义应用层协议,常见端口号
26 3
|
2月前
|
网络协议 网络架构 数据格式
TCP/IP基础:工作原理、协议栈与网络层
TCP/IP(传输控制协议/互联网协议)是互联网通信的基础协议,支持数据传输和网络连接。本文详细阐述了其工作原理、协议栈构成及网络层功能。TCP/IP采用客户端/服务器模型,通过四个层次——应用层、传输层、网络层和数据链路层,确保数据可靠传输。网络层负责IP寻址、路由选择、分片重组及数据包传输,是TCP/IP的核心部分。理解TCP/IP有助于深入掌握互联网底层机制。
436 2
|
4月前
|
网络协议 程序员 定位技术
学习网络的第一步:全面解析OSI与TCP/IP模型
**网络基础知识概览:** 探索网络通信的关键模型——OSI七层模型和TCP/IP五层模型。OSI模型(物理、数据链路、网络、传输、会话、表示、应用层)提供理论框架,而TCP/IP模型(物理、数据链路、网络、传输、应用层)更为实际,合并了会话、表示和应用层。两者帮助理解数据在网络中的传输过程,为网络设计和管理提供理论支持。了解这些模型,如同在复杂的网络世界中持有了地图。
100 2
|
5月前
|
网络协议 Java 程序员
TCP/IP协议栈是网络通信基础,Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用
【6月更文挑战第23天】 **TCP/IP协议栈是网络通信基础,它包含应用层(HTTP, FTP等)、传输层(TCP, UDP)、网络层(IP)、数据链路层(帧, MAC地址)和物理层(硬件信号)。Java的`java.net`包提供工具,使开发者能利用TCP/IP创建网络应用,如Socket和ServerSocket用于客户端和服务器通信。**
55 3
|
6月前
|
网络协议 安全 网络安全
网络 (TCP/IP 四层协议中常见网络协议)
网络 (TCP/IP 四层协议中常见网络协议)
89 7
下一篇
无影云桌面