1、如何发现所在网络拓扑的相关信息?
可使用大多数Unix系统提供的 `netstat` 和 `ifconfig` 这两个基本命令来发现网络的一些细节。具体操作如下:
1. 使用 `netstat -i` 命令获取接口信息,建议同时指定 `-n` 标志以打印数字地址。例如在Linux系统中执行 `netstat -ni` 可查看接口及其名称;在支持IPv6的FreeBSD系统中执行该命令能获取更多接口相关信息。
2. 使用 `netstat -r` 命令查看路由表,同样建议指定 `-n` 标志打印数字地址,此命令还能显示默认路由器的IP地址。
可通过查看系统中这些命令的手册(man)页面了解输出信息的详细情况,同时要注意有些厂商会将这些命令放在 `/sbin` 或 `/usr/sbin` 等管理目录中,而这些目录可能不在正常的shell搜索路径(PATH)中。
2、获取TCP日间客户端程序的源代码。编译并测试该程序。多次运行该程序,每次在命令行参数中指定不同的IP地址。
首先获取TCP日间客户端程序的源代码。使用合适的编译器(如假设使用ANSI C编译器)对代码进行编译。编译完成后,运行生成的可执行文件,每次运行时在命令行中指定不同的IP地址作为参数,以此来测试程序。
3、在以太网主机(其TCP通告的MSS为1460)和令牌环网主机(其TCP通告的MSS为4096)之间建立了连接,两台主机都未实现路径MTU发现。观察数据包,发现任一方向的数据都不超过1460字节。这是为什么?
MSS的作用是告知对端TCP每个分段可发送的最大TCP数据量,目的是告知对端重组缓冲区的实际大小并避免分片。在这种连接中,两端会采用较小的MSS值来发送数据,以确保数据能在双方都可接受的范围内传输。由于以太网主机通告的MSS为1460,小于令牌环网主机通告的4096,所以双方都以1460字节为上限发送数据,因此看不到超过1460字节的数据。
4、为什么像套接字地址结构长度这样的值 - 结果参数必须通过引用传递?
因为该长度在函数调用时是一个值,它告知内核结构的大小,使内核在填充结构时不会越界;在函数返回时是一个结果,它告知进程内核实际存储在结构中的信息有多少。通过引用传递才能让函数更新其值。
5、编写一个名为inet_pton_loose的新函数,处理以下情况:如果地址族是AF_INET且inet_pton返回0,则调用inet_aton并查看是否成功。同样,如果地址族是AF_INET6且inet_pton返回0,则调用inet_aton,如果成功,则返回IPv4映射的IPv6地址。
以下是实现 inet_pton_loose 函数的示例代码:
#include <arpa/inet.h>
#include <string.h>
#include <errno.h>
int inet_pton_loose(int family, const char *strptr, void *addrptr) {
int result = inet_pton(family, strptr, addrptr);
if (result == 0) {
if (family == AF_INET) {
struct in_addr in_val;
if (inet_aton(strptr, &in_val)) {
memcpy(addrptr, &in_val, sizeof(struct in_addr));
return 1;
}
} else if (family == AF_INET6) {
struct in_addr in_val;
if (inet_aton(strptr, &in_val)) {
struct in6_addr *in6_val = (struct in6_addr *)addrptr;
memset(in6_val, 0, sizeof(struct in6_addr));
in6_val->s6_addr[10] = 0xff;
in6_val->s6_addr[11] = 0xff;
memcpy(&in6_val->s6_addr[12], &in_val.s_addr, sizeof(in_val.s_addr));
return 1;
}
}
}
return result;
}
代码解释:
- 调用
inet_pton:首先调用inet_pton函数尝试将字符串形式的地址转换为二进制地址。 - 检查返回值 :如果
inet_pton返回0,表示输入不是有效的表示格式。 - 处理
AF_INET情况
网络编程与协议分析核心问题解析

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



