socket接口的网络协议无关性

###1. socket接口 BSD Socket 是UNIX系统中通用的网络接口, linux同样使用该接口, socket系统调用接口为 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int socket(int domain, int type, int protocol); domain : 指定地址族 type : socket类型 protocl : 通常为0,因为同一domain, 同一type下, 通常只有一种protocol(但是不是绝对的, 比如netlink就支持30多种protocol) 从socket系统调用可以看出, socket是一个与网络协议无关的接口 ###2. linux上socket接口支持的网络协议 linux上socket接口支持的domain(地址族)较多, 在linux源码的...

linux虚拟网络接口 —— 802.1q vlan

###1. linux 虚拟网络接口 在linux的网络设备驱动框架里面, 使用一个net_device来代表一个网络设备接口, 因此, 一个物理网卡对应着一个net_device结构 虚拟网络接口是指一个网络接口的net_device没有直接对应的物理设备 ###2. 802.1q vlan VLAN(Virtual Local Area Network)的中文名为”虚拟局域网” 在计算机网络中,一个二层网络可以被划分为多个不同的广播域,一个广播域对应了一个特定的用户组,默认情况下这些不同的广播域是相互隔离的。不同的广播域之间想要通信,需要通过一个或多个路由器。这样的一个广播域就称为VLAN 在一台物理的交换机上, 划分不同的VLAN相当于将物理交换机分割成多个逻辑上独立的交换机, 只有处于同一个VLAN内的端口才能互相通信 VLAN可分离广播域, 缩小arp中间人攻击,减少广播风暴 VLAN只是分离广播域, 并不能隔离广播域, 不同的vlan可通过3层通信 ###3. vlan的划分 vlan的划分可以分为两种情况: 静态vlan划分 动态vlan划分 ####3.1 静态vlan划分 静态VLAN又被称为基于端口的VLAN, 需要明确指定各端口属于哪个VLAN, 由于需要一个个端口地指定,因此当网络中的计算机数目超过一定数字(比如数百台)后,设定操作就会变得烦杂无比。并且,客户机每次变更所连端口,都必须同时更改该端口所属VLAN的设定——这显然不适合那些需要频繁改变拓补结构的网络 ####3.2 动态vlan划分 动态VLAN则是根据每个端口所连的计算机,随时改变端口所属的VLAN。这就可以避免上述的更改设定之类的操作。动态VLAN可以大致分为3类 基于MAC地址的VLAN 基于子网的VLAN 基于用户的VLAN...

linux虚拟网络接口 —— tun/tap

###1. linux 虚拟网络接口 在linux的网络设备驱动框架里面, 使用一个net_device来代表一个网络设备接口, 因此, 一个物理网卡对应着一个net_device结构 虚拟网络接口是指一个网络接口的net_device没有直接对应的物理设备 ###2. TUN/TAP TUN/TAP 会生成虚拟网络接口, 配合“/dev/net/tun”设备文件, 所有通过 tun/tap 网络接口发送的数据包, 都会进入“/dev/net/tun”设备文件的缓冲区, 用户空间可以从“/dev/net/tun”设备文件中读出读出这些数据包, 而写入“/dev/net/tun”设备文件的数据包, 则会进入到linux的网络协议栈进行处理 tun/tap的区别如下: tun表示虚拟的是点对点设备,工作在三层网络上,具有处理IP包的能力 tap表示虚拟的是以太网设备,工作在二层网络上,具有直接处理以太帧的能力 tun/tap的内核代码位于 “driver/net/tun.c” ###3. /dev/net/tun “/dev/net/tun”是一个misc 设备, minor id固定为200 crw-rw-rwT 1 root root 10, 200 7月 31 09:11...

linux虚拟网络接口 —— 多ip地址

###1. linux 虚拟网络接口 在linux的网络设备驱动框架里面, 使用一个net_device来代表一个网络设备接口, 因此, 一个物理网卡对应着一个net_device结构 虚拟网络接口是指一个网络接口的net_device没有直接对应的物理设备 ###2. 网卡绑定多个ip 每一个物理网卡, 都有一个唯一的MAC地址, 这一点很好理解, 每一个网卡都有一个ip地址,这一点看起来也很自然,但是, 如果说一个网卡可以绑定多个ip地址, 很多人都无法理解,但是, 如果说“ip地址是主机的, 而不是网卡的,相信就比较好理解了”, 按照网络协议的分层, 下层为上层提供服务, 网络层基于ip寻址, 但是在为传输层提供服务时,tcp/udp可以使用不同的端口号, 同样的, 数据链路层基于MAC地址寻址, 为网络层服务时, 网络层可以使用不同的ip, 只要arp协议能够正确地对应MAC和ip 一张网卡上绑定多个ip有两种实现: 早期的 ip alias和现在的secondary ip 网卡绑定多地址不会注册新的net_device, 因此, 严格意义来说, 并不算是虚拟网卡,但是早期的ip alias方式添加的多个ip, 列出的 ethx:y 看起来像是生成了新的网络接口一样...

linux虚拟网络接口 —— 环回接口 lo

###1. 虚拟网络接口 在linux的网络设备驱动框架里面, 使用一个net_device来代表一个网络设备接口, 因此, 一个物理网卡对应着一个net_device结构 虚拟网络接口是指一个网络接口的net_device没有直接对应的物理设备 ###2. 环回接口 lo linux上的回环网络接口也是一个虚拟网络接口, 所有通过该设备发送的数据都会被该接口接收返回 ###3, 环回接口的实现 “lo” 回环网络接口的实现位于linux源码中的 “driver/net/loopback.c”, 其实现比较简单, 只有220行左右 static netdev_tx_t loopback_xmit(struct sk_buff *skb, struct net_device *dev) { ...... skb->protocol = eth_type_trans(skb, dev); ...... if (likely(netif_rx(skb) == NET_RX_SUCCESS)) { .........