TCP/IP协议二十:VLAN

TCP/IP协议二十:VLAN


原因: 广播报文导致的广播报文泛滥;通信的安全性
定义: 把一个物理LAN划分成多个逻辑的LAN
本质: VLAN本质就是指一个网段,不通vlan相当于不同网段,
处于同一VLAN的主机能直接互通,不同则不能互通
作用: 有效地限制了广播域的范围
实现: 以太网报文中添加4个字节的VLAN Tag 标识VLAN的相关信息
类型: 基于端口,基于MAC,基于IP子网,基于协议

一、基于端口的VLAN:
定义: 按照设备物理端口来定义VLAN成员
端口的链路类型:
Access: 连接终端;只能发生一个VLAN报文;发出去的报文不带VLAN Tag;
Trunk : 连接交换机等设备;可发送多个报文;发出去的端口缺省报文不带Tag,其他必须带;
Hybrid: 混合模式
端口缺省VLAN: 端口缺省VLAN 简称PVID (Port VLAN ID)。
当端口收到Untagged的报文时,认为所属的VLAN为PVID

二、基于MAC地址的VLAN:
定义: 根据报文的源mac地址来划分vlan;
优点: 当用户物理位置变化时,vlan不用重新配置;又称基于用户的vlan

三、基于IP子网的VLAN:
定义: 根据报文源IP地址及子网掩码来划分vlan
基于协议的VLAN:
定义: 根据端口报文所属的协议及封装格式来划分vlan
不同VLAN间的三层互通:
原因: 不通vlan相当于不同网段,不同网段通信当然要路由器
VLAN本质 就是指一个网段,之所以叫做虚拟的局域网,
是因为它是在虚拟的路由器的接口下创建的网段。
不同vlan间的主机不能直接通信,通过在设备上创建并配置vlan接口,可以实现vlan间的三层互通;
vlan接口 是一种三层的虚接口,它不作为物理实体存在于设备上。
每个vlan对应一个vlan接口,再为vlan接口配置了ip地址后,该ip地址可作为本vlan内网络设备的
网关地址,此时该VLAN接口能对需要跨网段的报文进行三层转发。

Super Vlan:
原因: 一般的交换设备中,通常是采用一个VLAN对应一个VLAN接口的方式来实现广播域之间的互通,
这在某些情况下导致了对IP地址的较大浪费
定义: Super VLAN可以对VLAN进行聚合,从而大幅缩减实际需要的VLAN接口数量,解决IP地址紧张的问题
Private Vlan:
原因: 每个用户一个VLAN,4094个VLAN远远不能满足需求
定义: Private VLAN采用二层VLAN结构,它在同一台设备上配置Primary VLAN和Secondary VLAN两类VLAN
保证接入用户之间相互隔离,又能将接入的VLAN ID屏蔽掉,从而节省了VLAN资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要经过TCP/IP协议栈发送802.1Q报文,需要在数据包添加802.1Q VLAN标签,并将其发送到网络接口。以下是一个简单的示例程序,演示如何使用TCP/IP协议栈发送带有802.1Q VLAN标签的数据包: ```c++ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <arpa/inet.h> #include <net/ethernet.h> #include <net/if.h> #include <netinet/in.h> #include <netinet/ip.h> #include <netinet/tcp.h> #include <netinet/udp.h> #include <netinet/ip_icmp.h> #include <linux/if_packet.h> #include <linux/if_ether.h> #include <linux/if_vlan.h> int main() { int sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (sock < 0) { perror("socket"); exit(1); } char ifname[IFNAMSIZ] = "eth0"; struct ifreq ifr; strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1); if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) { perror("ioctl"); exit(1); } struct sockaddr_ll addr; memset(&addr, 0, sizeof(addr)); addr.sll_family = AF_PACKET; addr.sll_ifindex = ifr.ifr_ifindex; // 构造802.1Q VLAN标签 struct vlan_tag { uint16_t tci; uint16_t ether_type; } __attribute__((packed)); struct vlan_tag vlan; vlan.tci = htons(0x100); vlan.ether_type = htons(ETH_P_IP); // 构造IP数据包 char ip_packet[ETH_FRAME_LEN]; struct iphdr *iph = (struct iphdr *)ip_packet; iph->version = 4; iph->ihl = 5; iph->tos = 0; iph->tot_len = htons(sizeof(struct iphdr) + sizeof(struct udphdr)); iph->id = htons(0); iph->frag_off = htons(0); iph->ttl = 64; iph->protocol = IPPROTO_UDP; iph->check = htons(0); iph->saddr = inet_addr("192.168.1.100"); iph->daddr = inet_addr("192.168.1.1"); // 构造UDP数据包 char udp_packet[ETH_FRAME_LEN]; struct udphdr *udph = (struct udphdr *)udp_packet; udph->source = htons(1234); udph->dest = htons(5678); udph->len = htons(sizeof(struct udphdr)); udph->check = htons(0); // 将IP头和UDP数据拷贝到数据包 memcpy(ip_packet + sizeof(struct iphdr), udph, sizeof(struct udphdr)); // 将802.1Q VLAN标签和IP/UDP数据拷贝到数据包 char packet[ETH_FRAME_LEN]; memcpy(packet, "\xff\xff\xff\xff\xff\xff", ETH_ALEN); memcpy(packet + ETH_ALEN, "\x00\x11\x22\x33\x44\x55", ETH_ALEN); memcpy(packet + 2 * ETH_ALEN, &vlan, sizeof(struct vlan_tag)); memcpy(packet + 2 * ETH_ALEN + sizeof(struct vlan_tag), ip_packet, sizeof(struct iphdr) + sizeof(struct udphdr)); // 发送数据包 if (sendto(sock, packet, 2 * ETH_ALEN + sizeof(struct vlan_tag) + sizeof(struct iphdr) + sizeof(struct udphdr), 0, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("sendto"); exit(1); } close(sock); return 0; } ``` 该程序使用socket API创建了一个PF_PACKET类型的socket,并将其绑定到网络接口上。然后,程序构造了一个带有802.1Q VLAN标签的IP/UDP数据包,并将其封装成一个以太网帧。在构造802.1Q VLAN标签时,程序使用了vlan_tag结构体来定义标签格式,并将其添加到数据包的头部。最后,程序调用sendto函数将数据包发送到目标MAC地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值