《UNIX网络编程 卷1:套接字联网API(第3版)》——1.9 测试用网络及主机

1.9 测试用网络及主机

图1-16展示了本书示例所用的各个网络和主机。对于每个主机,我们都标出了它的操作系统和硬件类型(因为有些操作系统可运行在不止一种硬件上)。各个框内的名字就是出现在本书中的各个主机名。

图1-16所示的拓扑适合本书的例子,不过机器大范围地散布在因特网上,物理拓扑实际上变得不太重要。事实上虚拟专用网络(virtual private network,VPN)或安全shell(secure shell,SSH)连接提供这些机器之间的连通性,而无需顾及这些主机的物理位置。

图中“/24”(和/64)指出从地址的最左位开始用于标识网络和子网的连续位数。A.4节将说明现今用于指定子网边界的/n记法。

Sun操作系统的真实名字是SunOS 5.x,而不是Solaris 2.x,但是大家习惯称它为Solaris,实际上这是操作系统和与之捆绑的其他软件的合称。

网络拓扑的发现
图1-16展示了本书的全部示例所用主机的网络拓扑,但是为了在你自己的网络上运行这些例子和完成习题,你可能需要了解自己的网络拓扑。尽管目前还没有关于网络配置和管理的现行Unix标准,但大多数Unix系统都提供了可用于发现某些网络细节的两个基本命令:netstat和ifconfig。通过阅读所用系统上这些命令的手册页面⑨,你可以获悉有关它们的输出信息的详情。要留意的是,有些厂商把这些命令存放在诸如/sbin或/usr/sbin这样的管理目录中,而不是通常的/usr/bin目录,而这些管理目录可能不在通常的shell搜索路径中(由PATH环境变量指定)。

(1)netstat -i提供网络接口的信息。我们还指定-n标志以输出数值地址,而不是试图把它们反向解析成名字。下面的例子给出了接口及其名字和统计信息:

linux % netstat -ni
Kernel Interface table
Iface  MTU Met  RX-OK RX-ERR RX-DRP RX-OVR  -OK TX-ERR -OVR Flg
eth0  1500  049211085   0   0   040540958   0   0   0 BMRU
lo  16436  098613572   0   0   098613572   0   0   0 LRU

其中环回(loopback)接口称为lo,以太网接口称为eth0。下面的例子给出了支持IPv6的一个主机的类似信息:

freebsd % netstat -ni
Name  Mtu Network    Address        Ipkts Ierrs  Opkts Oerrs Coll
hme0  1500 <Link#1>   08:00:20:a7:68:6b 29100435  35 46561488   0   0
hme0  1500 12.106.32/24 12.106.32.254   28746630   - 46617260   -   -
hme0  1500 fe80:1::a00:20ff:fea7:686b/64
              fe80:1::a00:20ff:fea7:686b
                            0   -    0   -   -
hme0  1500 3ffe:b80:8d:1::1/64
              3ffe:b80:8d:1::1      0   -    0   -   -
hme1  1500 <Link#2>   08:00:20:a7:68:6b    51092   0  31537   0   0
hme1  1500 fe80:2::a00:20ff:fea7:686b/64
              fe80:2::a00:20ff:fea7:686b
                            0   -    90   -   -
hme1  1500 192.168.42  192.168.42.1      43584   -  24173   -   -
hme1  1500 3ffe:b80:8d:2::1/64
              3ffe:b80:8d:2::1     78   -    8   -   -
lo0  16384 <Link#6>                10198   0  10198   0   0
lo0  16384 ::1/128     ::1           10   -    10   -   -
lo0  16384 fe80:6::1/64  fe80:6::1        0   -    0   -   -
lo0  16384 127       127.0.0.1       10167   -  10167   -   -
gif0  1280 <Link#8>                 6   0    5   0   0
gif0  1280 3ffe:b80:3:9ad1::2/128
              3ffe:b80:3:9ad1::2     0   -    0   -   -
gif0  1280 fe80:8::a00:20ff:fea7:686b/64
              fe80:8::a00:20ff:fea7:686b
                             0   -    0   -   -

注意:为了对齐输出字段,我们对较长的代码行做了回行处理。

(2)netstat –r展示路由表,也是另一种确定接口的方法。我们通常指定-n标志以输出数值地址。它还给出默认路由器的IP地址。

freebsd % netstat -nr
Routing tables

Internet:
Destination   Gateway        Flags  Refs  Use Netif  Expire
default     12.106.32.1      USGc   10  6877 hme0
12.106.32/24  link#1         UC     3   0 hme0
12.106.32.1   00:b0:8e:92::00    UHLW    9   7 hme0   1187
12.106.32.253  08:00:20:b8:f7:e0  UHLW    0   1 hme0   140
12.106.32.254  08:00:20:a7:68:6b  UHLW    0   2  lo0
127.0.0.1    127.0.0.1       UH     1 10167  lo0
192.168.42   link#2         UC     2   0 hme1
192.168.42.1  08:00:20:a7:68:6b  UHLW    0   11  lo0
192.168.42.2  00:04:ac:17:bf:38  UHLW    2 24108 hme1   210

Internet6:
Destination             Gateway        Flags  Netif Expire
::/96                ::1          UGRSc   lo0 =>
default               3ffe:b80:3:9ad1::1 UGSc   gif0
::1                 ::1          UH    lo0
::ffff:.0/96               ::1          UGRSc   lo0
3ffe:b80:3:9ad1::1         3ffe:b80:3:9ad1::2  UH    gif0
3ffe:b80:3:9ad1::2         link#8         UHL    lo0
3ffe:b80:8d::/48           lo0          USc    lo0
3ffe:b80:8d:1::/64          link#1         UC    hme0
3ffe:b80:8d:1::1           08:00:20:a7:68:6b  UHL    lo0
3ffe:b80:8d:2::/64          link#2        UC    hme1
3ffe:b80:8d:2::1           08:00:20:a7:68:6b  UHL    lo0
3ffe:b80:8d:2:204:acff:fe17:bf38  00:04:ac:17:bf:38  UHLW   hme1
fe80::/10              ::1          UGRSc   lo0
fe80::%hme0/64            link#1        UC    hme0
fe80::a00:20ff:fea7:686b%hme0    08:00:20:a7:68:6b  UHL    lo0
fe80::%hme1/64            link#2        UC    hme1
fe80::a00:20ff:fea7:686b%hme1    08:00:20:a7:68:6b  UHL    lo0
fe80::%lo0/64             fe80::1%lo0     Uc    lo0
fe80::1%lo0              link#6        UHL    lo0
fe80::%gif0/64            link#8        UC    gif0
fe80::a00:20ff:fea7:686b%gif0    link#8        UHL    lo0
ff01::/32               ::1         U     lo0
ff02::/16               ::1         UGRS   lo0
ff02::%hme0/32            link#1        UC    hme0
ff02::%hme1/32            link#2        UC    hme1
ff02::%lo0/32             ::1         UC    lo0
ff02::%gif0/32            link#8        UC    gif0
24

(3) 有了各个网络接口的名字,执行ifconfig就可获得每个接口的详细信息。

linux % ifconfig eth0
eth0   Link encap:Ethernet HWaddr 00:C0::06:B0:E1
     inet addr:206.168.112.96 Bcast:206.168.112.127 Mask:255.255.255.128
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:49214397 errors:0 dropped:0 overruns:0 frame:0
     TX packets:40543799 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:100
     RX bytes:1098069974 (1047.2 Mb) TX bytes:3360546472 (3204.8 Mb)
     Interrupt:11 Base address:0x6000

该命令给出了指定接口的IP地址、子网掩码和广播地址。其中的MULTICAST标志通常指明该接口所在主机支持多播。有些ifconfig的实现还提供-a标志,用于输出所有已配置接口的信息。

(4) 找出本地网络中众多主机的IP地址的方法之一是,针对从上一步找到的本地接口的广播地址执行ping命令。

linux % ping -b 206.168.112.127
WARNING: pinging broadcast address
PING 206.168.112.127 (206.168.112.127) from 206.168.112.96 : 56(84) bytes of data.
64 bytes from 206.168.112.96: icmp_seq=0 ttl=255 time=241 usec
64 bytes from 206.168.112.40: icmp_seq=0 ttl=255 time=2.566 msec (DUP!)
64 bytes from 206.168.112.118: icmp_seq=0 ttl=255 time=2.973 msec (DUP!)
64 bytes from 206.168.112.14: icmp_seq=0 ttl=255 time=3.089 msec (DUP!)
64 bytes from 206.168.112.126: icmp_seq=0 ttl=255 time=3.200 msec (DUP!)
64 bytes from 206.168.112.71: icmp_seq=0 ttl=255 time=3.311 msec (DUP!)
64 bytes from 206.168.112.31: icmp_seq=0 ttl=64 time=3.541 msec (DUP!)
64 bytes from 206.168.112.7: icmp_seq=0 ttl=255 time=3.636 msec (DUP!)
...
时间: 2024-09-20 23:18:39

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.9 测试用网络及主机的相关文章

socket-unix网络编程环境怎么配置?我买了套接字联网api和tcp/ip详解,但是书上的代码都不能运行.

问题描述 unix网络编程环境怎么配置?我买了套接字联网api和tcp/ip详解,但是书上的代码都不能运行. 就下面这个代码,运行提示没有unp.h,找了个unp.h,但是还是提示什么各种数据类型重复定义.我到现在觉得是不是这本书写错了. #include "unp.h" int main(int argc, char **argv) { int sockfd, n; char recvline[MAXLINE + 1]; struct sockaddr_in servaddr; if

《UNIX网络编程 卷1:套接字联网API(第3版)》——导读

**前言**本书面向的读者是那些希望自己编写的程序能使用称为套接字(socket)的API进行彼此通信的人.有些读者可能已经非常熟悉套接字了,因为这个模型几乎已经成了网络编程的同义词,但有些读者可能仍需要从头开始学习.本书想达到的目标是向大家提供网络编程指导.这些内容不仅适用于专业人士,也适用于初学者:不仅适用于维护已有代码,也适用于开发新的网络应用程序:此外,还适用于那些只是想了解一下自己系统中网络组件的工作原理的人. 书中的所有示例都是在Unix系统上测试通过的真实的.可运行的代码.但是,考

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.8 BSD网络支持历史

1.8 BSD网络支持历史 套接字API起源于1983年发行的4.2BSD操作系统.图1-15展示了各种BSD发行版本的发展史,并注明了TCP/IP的主要发展历程.1990年面世的4.3BSD Reno发行版本随着OSI协议进入BSD内核而对套接字API做了少量的改动. 图1-15中从4.2BSD往下到4.4BSD的通路展示了源自Berkeley计算机系统研究组(Computer Systems Research Group,CSRG)的各个版本,它们要求获取者已拥有Unix的源代码许可权.然而

《UNIX网络编程 卷1:套接字联网API(第3版)》——8.10 UDP程序例子小结

8.10 UDP程序例子小结 图8-11以圆点的形式给出了在客户发送UDP数据报时必须指定或选择的四个值. 客户必须给sendto调用指定服务器的IP地址和端口号.一般来说,客户的IP地址和端口号都由内核自动选择,尽管我们提到过,客户也可以调用bind指定它们.在客户的这两个值由内核选择的情形下我们也提到过,客户的临时端口是在第一次调用sendto时一次性选定,不能改变:然而客户的IP地址却可以随客户发送的每个UDP数据报而变动(假设客户没有捆绑一个具体的IP地址到其套接字上).其原因如图8-1

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.10 Unix标准

1.10 Unix标准 在编写本书时,最引人注目的Unix标准化活动是由Austin公共标准修订组(The Austin Common Standards Revision Group,CSRG)主持的.他们的努力结果是涵盖1 700多个编程接口的约4 000页内容的规范[Josey 2002].这些规范既具有IEEE POSIX名字,也具有开放团体的技术标准(The Open Group's Technical Standard)名字.其结果是同一个Unix标准有多个名字来指称:ISO/IEC

《UNIX网络编程 卷1:套接字联网API(第3版)》——2.6 TCP连接的建立和终止

2.6 TCP连接的建立和终止 为帮助大家理解connect.accept和close这3个函数并使用netstat程序调试TCP应用,我们必须了解TCP连接如何建立和终止,并掌握TCP的状态转换图. 2.6.1 三路握手建立一个TCP连接时会发生下述情形. (1)服务器必须准备好接受外来的连接.这通常通过调用socket.bind和listen这3个函数来完成,我们称之为被动打开(passive open). (2)客户通过调用connect发起主动打开(active open).这导致客户T

《UNIX网络编程 卷1:套接字联网API(第3版)》——2.3 用户数据报协议(UDP)

2.3 用户数据报协议(UDP) UDP是一个简单的传输层协议,在RFC 768[Postel 1980]中有详细说明.应用进程往一个UDP套接字写入一个消息,该消息随后被封装(encapsulating)到一个UDP数据报,该UDP数据报进而又被封装到一个IP数据报,然后发送到目的地.UDP不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次. 我们使用UDP进行网络编程所遇到的问题是它缺乏可靠性.如果一个数据报到达了其最终目的地,但是

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.5 一个简单的时间获取服务器程序

1.5 一个简单的时间获取服务器程序 我们可以编写一个简单的TCP时间获取服务器程序,它和1.2节中的客户程序一道工作.图1-9给出了这个服务器程序,它使用了上一节中讲过的包裹函数. 创建TCP套接字10 TCP套接字的创建与客户程序相同. 把服务器的众所周知端口捆绑到套接字11~15 通过填写一个网际套接字地址结构并调用bind函数,服务器的众所周知端口(对于时间获取服务是13)被捆绑到所创建的套接字.我们指定IP地址为INADDR_ANY,这样要是服务器主机有多个网络接口,服务器进程就可以在

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.11 64位体系结构

1.11 64位体系结构 20世纪90年代中期到未期开始出现向64位体系结构和64位软件发展的趋势.其原因之一是在每个进程内部可以由此使用更长的编址长度(即64位指针),从而可以寻址很大的内存空间(超过232字节).现有32位Unix系统上共同的编程模型称为ILP32模型,表示整数(I).长整数(L)和指针(P)都占用32位.64位Unix系统上变得最为流行的模型称为LP64模型,表示只有长整数(L)和指针(P)占用64位.图1-17对这两种模型进行了比较. 从编程角度看,LP64模型意味着我们

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.3 协议无关性

1.3 协议无关性 图1-5中的程序是与IPv4协议相关的:我们分配并初始化一个sockaddr_in类型的结构,把该结构的协议族成员设置为AF_INET,并指定socket函数的第一个参数为AF_INET. 为了让图1-5中的程序能够在IPv6上运行,我们必须修改这段代码.图1-6所示的是一个能够在IPv6上运行的版本,其中改动之处用加粗的等宽字体突出显示. 我们只修改了程序的5行代码,得到的却是另一个与协议相关的程序:这回是与IPv6协议相关的.更好的做法是编写协议无关的程序.图11-11将