ip r命令在Linux环境下用于显示路由表信息。以下是对该命令输出的详细解析:
示例输出
假设执行ip r命令后得到以下输出:
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 metric 100
10.0.0.0/8 via 192.168.1.1 dev eth0
解析每一行
1.默认路由
default via 192.168.1.1 dev eth0 proto dhcp metric 100
- default:表示默认路由。当没有其他更具体的路由匹配时,数据包将通过这个路由发送。
- via 192.168.1.1:数据包将通过网关192.168.1.1发送。
- dev eth0:使用网络接口eth0。
- proto dhcp:路由是通过DHCP协议获取的。
- metric 100:路由的优先级,数值越小优先级越高。
2.直连路由
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 metric 100
- 192.168.1.0/24:表示网络192.168.1.0,子网掩码为255.255.255.0。
- dev eth0:使用网络接口eth0。
- proto kernel:路由是由内核自动添加的。
- scope link:路由的作用范围是链路本地。
- src 192.168.1.100:源IP地址为192.168.1.100。
- metric 100:路由的优先级。
3.静态路由
10.0.0.0/8 via 192.168.1.1 dev eth0
- 10.0.0.0/8:表示网络10.0.0.0,子网掩码为255.0.0.0。
- via 192.168.1.1:数据包将通过网关192.168.1.1发送。
- dev eth0:使用网络接口eth0。
关键字段解释
- default:默认路由,所有未匹配其他路由的数据包将通过此路由发送。
- via:指定下一跳网关的IP地址。
- dev:指定使用的网络接口。
- proto:路由的来源,常见的有kernel(内核自动添加)、static(静态路由)、dhcp(通过DHCP获取)。
- metric:路由的优先级,数值越小优先级越高。
- scope:路由的作用范围,常见的有link(链路本地)、global(全局)。
- src:源IP地址,表示从该接口发送数据包没有指定源IP时使用该IP作为源IP地址。
关于源IP示例
假设您在创建socket时没有指定源IP地址:
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in dest;
dest.sin_family = AF_INET;
dest.sin_port = htons(80);
inet_pton(AF_INET, "192.168.1.50", &dest.sin_addr);
connect(sockfd, (struct sockaddr *)&dest, sizeof(dest));
在这种情况下,系统会使用路由表中指定的默认源IP地址192.168.1.100。如果您在创建socket时指定了源IP地址:
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in src, dest;
src.sin_family = AF_INET;
src.sin_port = htons(0); // 让系统自动选择端口
inet_pton(AF_INET, "192.168.1.101", &src.sin_addr);
bind(sockfd, (struct sockaddr *)&src, sizeof(src));
dest.sin_family = AF_INET;
dest.sin_port = htons(80);
inet_pton(AF_INET, "192.168.1.50", &dest.sin_addr);
connect(sockfd, (struct sockaddr *)&dest, sizeof(dest));
在这种情况下,系统会使用您在bind函数中指定的源IP地址192.168.1.101,而不是路由表中默认的源IP地址192.168.1.100。
- 默认源IP地址:路由表中的src字段指定了默认源IP地址,当没有在创建socket时指定源IP地址时使用。
- 指定源IP地址:如果在创建socket时通过bind函数指定了源IP地址,系统会使用指定的源IP地址,而不是路由表中的默认源IP地址。
总结
通过ip r命令,可以查看Linux系统的路由表,了解数据包的转发路径。每一行输出代表一条路由规则,包含目标网络、下一跳网关、使用的网络接口、路由来源、优先级等信息。