上图流程中,为何要两次查询来了解正在请求者是否已有一个项目具有相同的目的地地址呢?因此类似项目可能在读取锁放开以及写入锁被取得之间的时间建立而加入该树中。
inet_peer结构:内核会为最近联系过的每台远程主机都维护一个此结构的实例。
IP封包ID选择:
1.不能分段的封包(DF=1):加入这种情况是为了处理window系统IP协议栈中的bug。ID会间接从sock数据结构中取出,每次包裹函数访问该结构时,其值都会递增。这可以确保每次传输时IP ID 都会改变。
2.可以分段的封包(DF=0):ip_select_ident会处理ID。
/个人结论↓/
Netlink发送消息最终调用函数(其实就是把消息放入sock结构的sk_receive_queue队列,然后调用sock结构的函数指针sk_data_ready通知拥有sock的进程,有消息到达了):
858 static int __netlink_sendskb(struct sock *sk, struct sk_buff *skb)
859 {
860 int len = skb->len;
861
862 skb_queue_tail(&sk->sk_receive_queue, skb);
863 sk->sk_data_ready(sk, len);
864 return len;
865 }
/个人结论↑/
如上图所示,若命令为ip address add 则是由函数ipaddr_modify处理。
IP-over-IP,也称为IP隧道或IPIP,就是传输在其他IP封包内的IP封包。该协议在VPN等中有其用处。
IPv4设计时并没有考虑安全问题。因此,开发出了几种细致度有所不同的方法:应用程序点多点方法,如SSL,主机点对点方法,若IPsec等。SSL需要应用程序使用它的安全层(位于TCP之上),而IPsec(多数人所谓的VPN)就不是这样,IPsec位于L3层之上,因此,对于应用程序而言是看不见的。虽然IPv4和IPv6都可以使用IPsec,但是,IPsec更适合IPv6.
unsigned char __pad1,__pad2: 因为当位置对齐32位边界时,内存的存取速度会比较快。Linux内核数据结构通常会采用无用字段(__padn)做填充,以便使其尺寸为32位的倍数。这就是__pad1,__pad2的用途,除此别无它用。
ipv4_devconf结构是存储每个设备的配置,而ipv4_config存储的配置则是用于主机身上。