TCP/IP网络协议套件最初是在BSD上开发的,而BSD又包含了TCP/IP的第一个主要实现。
虽然本章对TCP/IP进行了很好的概述,但它不会涵盖许多细节、陷阱和注意事项。如果你需要了解更多关于TCP/IP的知识,可以读一本关于这个主题的书。有关概述,请参阅我的书《Networking for systems Administrators》(倾斜风车出版社,2015)。最终,你需要深入了解网络;直接阅读Charles M.Kozierok的《TCP/IP Guide》(No Starch Press,2005)。
TCP是一种传输协议,IP是一种网络协议。
网络的每一层都处理网络进程中的特定任务,并且只与网络进程上下层进行交互。每一层只与它正上方的层和它正下方的层通信。
经典的开发系统互联(Open System Interconnection——OSI)网络协议栈有七层,几乎涵盖了任何网络协议和任何应用程序的任何情况。本书仅限于讨论TCP/IP网络,因此只需要考虑网络堆栈的四层。
物理层指工作在最底层的设备,如:网卡、网线、光纤或无线电波、交换机、集线器、基站。
我们将物理层称为线(wire),尽管这一层可以是任何类型的介质。
互联网路由器的功能之一是将一种物理层连接到另一种。
物理层没有决策能力,也没有智力。在其上运行的所有内容都由数据链路层(datalink layer)决定。
数据链路层也叫物理协议。该层将信息转换为实际的0和1,这些信息以该物理协议的适当编码通过物理层发送。
一些物理协议已经在许多不同的物理层上实现。例如,以太网已经通过双轴、同轴电缆、CAT3、CAT5、CAT6、CAT7、光纤、HDMI和无线电波进行传输。通过设备驱动程序的微小更改,数据链路层可以寻址任何类型的物理层。这是层简化网络的方法之一。我们将在本章末尾第140页的“了解以太网”中详细讨论以太网,因为它是FreeBSD系统使用的最常见的网络类型。通过了解FreeBSD上的以太网,您将能够管理FreeBSD上的其他协议——当然,一旦您了解了这些协议!
除了与物理层交换信息外,数据链路层还与网络层通信。
网络层映射(map)网络节点之间的连接。无论使用什么类型的物理层,这个逻辑协议都为在网络上运行的程序提供了一个一致的接口。
网络层是真正抽象出(abstract away)底层物理介质的地方。
网络层与下面的数据链路层和上面的传输层进行通信。
传输层处理真实应用程序甚至真实人类的真实数据。三种常见的传输层协议是ICMP、TCP和UDP。
ICMP——Internet Control Message Protocol——互联网控制消息协议,管理具有IP地址的主机之间的基本连接消息。大多数时候,ICMP只在后台运行,永远不必考虑它。
TCP——Transmission Control Protocol——传输控制协议,提供比UDP更复杂的功能,如拥塞控制和完整性检查。
UDP——User Datagram Protocol——用户数据报协议,基本的传输协议,提供通过网络传输所需要的最低服务。
除了以上三个最常见的协议外,还有许多其他协议在IP之上运行。/etc/protocols文件包含了一个相当全面的传输协议列表,这些协议使用IP作为底层机制。例如,以下是互联网上常用的网络层协议IP和ICMP的条目:
xxxxxxxxxx
➊ip ➋0 ➌IP ➍# Internet protocol, pseudo protocol number
icmp 1 ICMP # Internet control message protocol
/etc/protocols中的每个条目都有三个关键字段:非官方名称➊、协议编号➋和任何别名➌。协议编号在网络请求中用于识别流量。如果你出于任何原因启动了数据包嗅探器或开始深入挖掘你的网络,你都会看到它。正如你所看到的,IP是协议0,ICMP是协议1——如果这不是其他一切的基础,那么很难看出会有什么!TCP是协议6,UDP是协议17。您还将看到评论➍提供了有关每个协议的更多细节。
传输层与下面的网络层和上面的应用程序通信。
应用程序绝对是网络的一部分。应用程序打开网络连接请求,通过网络发送数据,从网络接收数据,并处理这些数据。Web浏览器、电子邮件客户端、JSP服务器等都是网络感知应用程序。应用程序只需与网络协议和用户通信。用户层的问题超出了本书的范围。
假设通过您的网络连接到互联网的用户想查看雅虎!用户访问他的网络浏览器并输入URL。
浏览器应用程序知道如何与网络中的下一层通信,即传输层。在将用户的请求揉成适当的形式后,浏览器向传输层请求到端口80上的特定IP地址的TCP连接。(纯粹主义者会注意到,我们跳过了过程中的DNS请求部分,但它与所描述的非常相似,只会混淆我们的示例。)
传输层检查浏览器的请求。由于应用程序已请求TCP连接,因此传输层为此类连接分配适当的系统资源。请求被分解为易于理解的块,并传递给网络层。
网络层并不关心实际的请求。它被交给了一块要通过互联网传输的数据。就像你的邮递员在不关心内容的情况下投递信件一样,网络层只是将TCP数据与适当的地址信息捆绑在一起。由此产生的大量数据称为数据包。网络层将这些数据包传递给数据链路层。
数据链路层不关心数据包的内容。它当然不关心IP地址或路由。它被赋予了一组0和1,它的工作是在网络上传输这些0和1。它所知道的就是如何进行传输。数据链路层可以将适当的报头和/或页脚信息添加到所使用的物理介质的数据包中,从而创建帧。最后,它将帧交给物理层,以便在本地线路、波或其他介质上传输。
物理层根本没有智能。数据链路层给它一堆0和1,物理层将它们传输到另一个物理设备。它不知道正在使用什么协议,也不知道这些数字是如何通过交换机、集线器或中继器回声的,但这个网络上的主机之一可能是网络的路由器。
当路由器接收到0和1时,它会将它们交给数据链路层。数据链路层剥离其帧信息,并将得到的数据包交给路由器内的网络层。路由器的网络层检查数据包,并根据其路由表决定如何处理它。然后,它将数据包传递给相应的数据链路层。这可能是另一个以太网接口,也可能是T1之外的PPP接口。
随着数据的传输,您的导线可能会经历许多物理变化。您的有线互联网线路可以聚合到光纤DS3中,然后将其转换为OC192跨国链路。由于分层和抽象的奇迹,你的计算机和用户都不需要知道这些。
当请求到达目的地时,事务另一端的计算机接受该帧,并将其一路发送回协议栈。物理线路接受零和一,并将它们发送到数据链路层。数据链路层将以太网报头从帧上剥离,并将得到的数据包交给网络。网络层剥离数据包报头,并将剩余的数据段混洗到传输层。传输层将这些段重新组装成数据流,然后将其传递给应用程序——在本例中为web服务器。应用程序处理请求并返回一个答案,该答案会下降协议栈并在网络中传播,根据需要在途中通过各种数据链路层上下跳动。这是一项艰巨的工作,让机器运行,这样你就可以得到“404页面未找到”的错误。
这个例子说明了为什么分层如此重要。每一层只知道它上面和下面的层的绝对必要信息,如果需要,可以交换层的内部。当创建新的数据链路协议时,其他层不必更改;网络协议只是将一个格式正确的请求交给数据链路层,让该层做自己的事情。当你有一个新的网卡时,你只需要一个与数据链路层和物理层接口的驱动程序;您不必更改网络堆栈中的任何更高级别的内容,包括您的应用程序。想象一下,一个设备驱动程序必须安装在您的网络浏览器、电子邮件客户端和计算机上的所有其他应用程序中,包括定制的应用程序。你很快就会放弃计算,转而从事一些理智和明智的事情,比如用铁砧跳伞。
计算机将所有数据视为零和一。单个零或一就是一个比特(bit)。当协议指定了比特数时,它谈论的就是计算机看到的数字。一个32位的数字有32位数字(A 32-bit number has 32 digits.),每个数字要么是零,要么是一。
IP地址是个32位数字,MAC是个48位数字。
为了好玩,Unix在某些情况下会使用十六进制数字,比如MAC地址和网络掩码。
十六进制数字通常在前面标记0x。
处理十六进制、十进制和二进制数字时,最简单的方法是使用科学计算器。
计算机系统倾向于以字节(byte)为单位,其中8位数字有单个字符标识。唯一的例外是网络堆栈,其中所有内容都以位(bit)为单位。
网络堆栈(network stack)是允许主机通过网络与其他主机通信的软件。
主机可以使用仅IPv4网络堆栈、仅IPv6网络堆栈,或双堆栈设置运行。FreeBSD默认启用这两个功能。
当前只使用IPv6会让你与一些流行的网站隔绝。
如今最常见的服务器配置是双堆栈设置。客户端主机尝试同时使用IPv4和IPv6。MS Windows的最后几个版本更喜欢IPv6。
我们将首先介绍熟悉的IPv4,然后使用IPv4作为参考来讨论IPv6。
IP地址是分配给网络上特定节点的唯一32位数字。有些IP地址是永久性的,例如分配给重要服务器的地址。其他则根据网络需要进行更改,例如拨号客户端获取到的。共享网络上的各个机器获得相邻的IP地址。
IP地址不是将32位数字标识为单个数字,而是分解成四个8位数字,通常显示为十进制数字,以便于人类的大脑处理。
IP地址由互联网服务提供商(Internet Service Providers——ISP)分块发布。这些块通常很小,比如16或32个IP地址。如果你的系统位于服务器场上,则可能只能从块中获得几个IP地址。
netmask——网络掩码,也称为前缀长度或斜线,是一个标签,指示分配给本地网络的IP地址块的大小。
IP块的大小决定了网络掩码,或者说,网络掩码决定了你有多少个IP地址。错误的网络掩码会阻止系统工作。
由255和0组成的网络掩码很容易查看,但会浪费IP地址。IPv4地址是一种及其稀缺的资源。
举个例子,IP地址块看起来像203.0.113.128/25。把IP地址想象成一串二进制数字。在你的网络中,你可以更改最右侧的位,但不能更改最左侧的位。唯一的问题是,哪边是左,哪边是右。前缀长度(prefix length)就是网络上的固定位数。/25意味着你有25个固定位。转换成二进制,如下所示:
xxxxxxxxxx
11111111.11111111.11111111.10000000
二进制11111111是十进制的255,10000000是128。所以你的网络掩码是255.255.255.128。如果你用二进制思维,这很简单。但如果你不理解底层的二进制概念,十进制转换看起来会很混乱。建议学会将某些小数字字符串识别位合法的二进制转换。
IP地址块以2的倍数发布。如果你有4个位可以用,你就有16个IP地址(2x2x2x2=16)。如果你有8位可以用,那么就有256个地址。
经常可以看到主机的IP地址附带了网络掩码,例如198.51.100.4/26。这为你提供了在本地网络上获取主机所需的一切(默认网关是另一个话题,但按照惯例,它通常是块中的顶部或底部IP地址)。
找出你的网络上有多少个IP地址,这将是2的倍数,且肯定小于256。从256中减去你拥有的IP地址数,就得到了你的网络掩码的最后一个数字。你仍然需要识别合法的网络大小。
如果你的IP地址是203.0.113.100/26,你需要知道/26表示26个固定位,即64个IP地址。看看你IP地址的最后一个数字,100,它显然不在0到63之间,但在64到127之间。IP块上的其他主机的IP地址范围为203.0.113.64到203.0.113.127之间,你的网络掩码为255.255.255.192(256-64=192)。
网络掩码经常以十六进制数字的形式出现。下表显示了/24和较小网络的网络掩码、IP信息和相关好处:
前缀 | 二进制掩码 | 十进制掩码 | 十六进制掩码 | 可用IP数 |
---|---|---|---|---|
/24 | 00000000 | 255.255.255.0 | 0xffffff00 | 256 |
/25 | 10000000 | 255.255.255.128 | 0xffffff80 | 128 |
/26 | 11000000 | 255.255.255.192 | 0xffffffc0 | 64 |
/27 | 11100000 | 255.255.255.224 | 0xffffffe0 | 32 |
/28 | 11110000 | 255.255.255.240 | 0xfffffff0 | 16 |
/29 | 11111000 | 255.255.255.248 | 0xfffffff8 | 8 |
/30 | 11111100 | 255.255.255.252 | 0xfffffffc | 4 |
/31 | 11111110 | 255.255.255.254 | 0xfffffffe | 2 |
/32 | 11111111 | 255.255.255.255 | 0xffffffff | 1 |
IP地址块中的第一个IP地址是网络号,用于内部记账,不能被分配给某个主机。
传统上,任何IP地址块的最后一个数字被称为广播地址。根据最初的IP地址规范,网络上的每台及其都应该对这个地址的请求做出响应。这允许你ping广播地址,以快速确定正在使用的IP地址。例如在典型的/24网络上,广播地址是x.y.z.255。然而在1990s末期,这一功能被转化为一种攻击技术,并在几乎所有操作系统和大多数网络设备上默认禁用。如果你需要此功能,请将sysctl net.inet.icmp.bmcastecho设置为1。在大多数环境中,广播地址是对IP地址的浪费。在任何情况下,你都无法在不造成网络问题的情况下将网络中的第一个或最后一个IP地址分配给设备。这使得/31网络毫无用处。
通常,每张网卡有一个单独的IP地址,可以通过别名在一张网卡上绑定多个IP地址。
另一方面,通过特殊配置,可以将多张网卡绑定到一个网络接口中,从而为计算机提供一个虚拟接口,给这个虚拟接口分配一个IP地址。
IP地址127.0.0.1始终是连接到每个主机的环回(lookback)接口。只能从本地机器访问它。
IPv4的最初工程师认为42.9亿个IP地址足以满足全世界的需求。毕竟,计算机很昂贵,只有军事和教育系统连接到互联网。他们并没有预见到有一天世界上每个人都拥有多个网络设备。
未使用的IPv4地址不再可用。使用的IPv4地址的价格正在上涨。最终,IPv4地址的价格超出大多数人的承受范围,世界不得不接受IPv4的替代品——IPv6。
与IPv4一样,IPv6是一种网络层协议。TCP、UDP、ICMP和其他协议在其上运行。
IPv6使用128位地址,表示为八组由冒号分隔的四个十六进制字符,例如2001:db8:5c00:90ff:dab:c0de:cafe。
128位地址空间难以想象的巨大。一般来说,一旦你了解了IPv6的新规则,你的所有网络知识都是适用的。
如前所述,IPv6地址为128位,表示为八个冒号分隔的组,每组四个十六进制字符。与十进制IP地址一样,您不需要在每个组中显示前导零。地址2001:db8:5c00:90ff:dabd:c0de:cafe可以写成2001:0db8:5c0:00000:90ff:0bad:code:cafe,但就像我们不会写203.000.113.013一样,我们去掉了IPv6地址中的前导零。
由于IPv6子网的方式,IPv6地址通常包含长串的零。在我写这篇文章的时候,Sprint网站的IPv6地址是2600:0:0:0:00:0:0。当连续的组只包含零时,它们会被替换为两个冒号。您可以将此IP地址显示为2600::。但是,每个地址只能进行一次双冒号替换。像2001::aa::1这样的地址将是模糊的。2001::aa::1代表2001:0:0:0:0:aa:0:0:0:1、2001:0:00:0:0:aa:0:00:1、2001:00:0:aa:0:0:0:0:1还是2001:0:aa:0:00:0:0:0:1:1?没办法说。
您可能已经看到添加到IPv4地址的端口号,例如203.0.113.13:80。将此术语用于IPv6地址会使它们变得更加丑陋,并使每个人都感到困惑。像2001:db8:5c00:0:90ff:bad:c0de:cafe:80这样的IP地址和端口组合并不含糊,但除非你仔细阅读,否则你可能会认为它是一个以80结尾的IP地址。如果要表示IP和端口组合,请将地址括在方括号中,如[2001:db8:5c00:90ff:dabd:c0de:cafe]:80。
IPv6地址每16位有一个冒号,因此划分网络的明显且自然的方法是/16、/32、/48、/64、/80、/96、/112。最初的IPv6标准只建议在这些边界上进行子网划分(重复了IPv4最大的错误之一),但这越来越被拒绝,取而代之的是任何地方的IPv4风格的子网划分。IPv6子网始终以斜线表示,也称为前缀长度,因此你不会看到类似IPv4的ffff:ffff:ffff::的网络掩码。
ISP通常会发布/32或/48的子网前缀,并预计会发布最终用户网络,如典型的客户端,即/64网络。64有264个子网,或18,446,744,073,709,551,616个地址。
当您在16位边界处建立子网时,每个网络都有65536个下一个较小的子网。一个/32的子网包含65536个/48的网络,一个/48的子网包含65536个/64的网络。
建议去网上搜索“IPv6子网计算器”来计算IPv6子网和网络大小。
以fe8x:开头的地址(x为任意十六进制字符)是其接口的本地地址。链路本地网络始终是/64子网。例如:
xxxxxxxxxx
fe80::bad:c0de:cafe%vtnet0
此接口的链接本地地址为fe80::bad:c0de:cafe。尾随的%vtnet0表示此地址是接口vtnet0的本地地址,不能在计算机上的任何其他接口上使用。如果您的计算机具有接口vtnet1,并且该网络上的主机试图访问地址fe80::bad:c0de:cafe,则此计算机将不会响应。此特定地址仅对直接连接到接口vtnet0的网段上的主机有效。
您可能会注意到,链接本地地址与此接口上的公共IPv6地址有一个共同的部分。这是因为自动配置的IPv6地址通常是根据接口的物理地址计算的;自动配置的地址是链接的公共地址还是本地地址并不重要。
/64或更大网络上的IPv6客户端通常可以通过路由器发现(router discovery)自动配置其网络。
路由器发现类似于精简的DHCP服务。路由器广播网关和子网信息,主机配置自己使用它。
现代版本的路由器发现包括非常基本的DHCP样式选项,如DNS服务器。然而,并非所有IPv6提供商在路由发现配置中都包含这些选项。如果你想为手机或无盘主机提供复杂的自动配置,或者你的提供商在配置中不提供DNS信息,你需要设置一个IPv6 DHCP服务器。
服务器不应使用IPv6自动配置。服务器通常需要一个静态IP,即使在IPv6中也是如此。
必须手动配置小于/64的网络上的主机。
地址::1始终表示本地主机,并分配给环回地址。
我们将从最简单的ICMP开始,然后讨论UDP和TCP。所有这些协议都在IPv4和IPv6上运行。虽然每种协议的版本因底层IP协议而异,但它们的行为基本相同。
互联网控制消息协议(Internet Control Message Protocol ——ICMP)是在网络上传输路由和可用性消息的标准。ping(8)和traceroute(8)等工具使用ICMP来收集结果。IPv4和IPv6的ICMP版本略有不同,有时称为ICMPv4和ICMPv6。
虽然有些人声称出于安全原因必须阻止ICMP,但ICMP与更容易理解的TCP和UDP协议一样多种多样。适当的IPv4网络性能需要大块的ICMPv4。如果您觉得必须阻止ICMP,请有选择地这样做。例如,阻断源淬灭(quench)消息会破坏路径最大传输单元(pMTU——path maximum transmission unit)的发现,这就像在一箱碎玻璃和生锈的钉子上进行面部植入。如果你不理解最后一句话,不要阻止ICMP。
IPv6在没有ICMPv6的情况下就会死亡,因为IPv6不支持数据包分片。如果你使用IPv6,永远不要阻止ICMPv6作为一个整体。在不破坏网络的情况下阻止部分ICMPv6需要仔细的研究和测试。
UDP——User Datagram Protocol——用户数据报协议。
它没有错误处理、最低限度的完整性验证,也没有任何防止数据丢失的防御措施。
对于特定类型的数据传输来说是一个不错的选择,许多重要的互联网服务都依赖于它。
当主机通过UDP传输数据时,发送方无法知道数据是否到达了目的地。接收UDP数据的程序只需监听网络并接受到达的内容。当程序通过UDP接收数据时,它无法验证该数据的来源——虽然UDP数据包包含源地址,但这个地址很容易被伪造。这就是为什么UDP被称为无连接或无状态。
既然有这些缺点,为什么还要使用UDP?使用UDP的应用程序通常有自己的纠错处理方法,这些方法与TCP等协议提供的默认值不太匹配。例如,简单的客户端DNS查询必须在几秒钟内超时,否则用户将致电帮助台并抱怨。TCP连接仅在两分钟后超时。由于计算机希望更快地处理其失败的DNS请求,因此简单的DNS查询使用UDP。在DNS必须传输大量数据的情况下(例如,用于区域传输),它会智能地切换到TCP。实时流数据,如视频会议,也使用UDP。如果你在实时视频会议中错过了图片的几个像素,重新传输这些数据只会增加拥堵。毕竟,你不能回到过去来填补图片中缺失的部分!您会发现几乎所有其他使用UDP的网络应用程序背后都有类似的推理。
因为当您连接到端口时,UDP协议本身不会返回任何内容,所以没有可靠的方法来远程测试UDP端口是否可访问(尽管nmap等工具尝试这样做)。
UDP也是一种数据报协议,这意味着每个网络传输都是完整的、自包含的,并作为一个整体单元接收。虽然应用程序可能不会将单个UDP数据包视为完整的请求,但网络会。TCP完全不同。
传输控制协议(TCP)包括错误纠正和恢复等功能。接收器必须确认它收到的每个数据包;否则,发送方将重新传输任何未确认的数据包。使用TCP的应用程序可以期待可靠的数据传输。这使得TCP成为一种连接或有状态的协议,与UDP不同。
TCP也是一种流协议,这意味着单个请求可以在多个网络数据包中拆分。虽然发送方可能会一个接一个地传输几个数据块,但接收方可能会收到无序或零碎的数据块。接收方必须跟踪这些块并正确组装它们以完成网络事务。
为了让两台主机交换TCP数据,它们必须设置一个通道让数据通过。一个主机请求连接,另一个主机响应请求,然后第一个主机开始传输。这个设置过程被称为三次握手(three-way handshake)。具体细节现在并不重要,但你应该知道这个过程是会发生的。同样,一旦传输完成,系统必须做一定量的工作来断开连接。
TCP通常被应用程序(如电子邮件程序、FTP客户端和web浏览器)使用,因为它具有相当通用的超时和传输功能。
你可以把网络堆栈比作和家人坐在一起吃节日晚餐。数据链路层(ARP,在以太网上的IPv4的情况下)让你看到桌子上的其他人。IP为桌上的每个人提供了一把独特的椅子,除了使用钢琴凳NAT的三个年轻侄子。ICMP提供了基本的路由信息,例如,“最快的方法是让克里斯叔叔把豌豆递给你。”TCP是你递给某人一道菜,另一个人必须说“谢谢”,然后才能放手。最后,UDP就像在向贝蒂阿姨扔掷骰子;她可能会抓住它,它可能会从她的额头上弹开,或者它可能会被从用餐开始就一直在寻找机会的狗从半空中抢走。
你有没有注意到电脑有太多的端口?我们将添加TCP和UDP端口。传输协议端口允许一个服务器通过单个传输协议提供许多不同的服务,多路复用(multiplexing)机器之间的连接。
当网络服务器程序启动时,它会连接或绑定到一个或多个逻辑端口。逻辑端口只是1到65535之间的任意数字。例如,互联网邮件服务器绑定到TCP端口25。到达系统的每个TCP或UDP数据包都有一个字段,指示其所需的目标端口。每个传入请求都标有所需的目的端口号。如果传入请求要求端口25,则它将连接到在该端口上侦听的邮件服务器。这意味着其他程序可以在不同的端口上运行,客户端可以与这些不同的端口通信,除了系统管理员之外,没有人会感到困惑。
/etc/services文件包含端口号及其通常关联的服务的列表。可以在任何端口上运行几乎所有服务,但这样做会混淆试图连接到你系统的其他互联网主机。如果有人试图向你发送电子邮件,他们的邮件程序会自动连接到你的系统上的端口25。如果你在端口77上运行电子邮件,而在端口25上有一个web服务器,你将永远无法收到电子邮件,你的web服务器将开始接收垃圾邮件。/etc/services文件有一个非常简单的五列格式:
xxxxxxxxxx
➊qotd ➋17/➌tcp ➍quote ➎#Quote of the Day
这是qotd服务➊的条目,该服务在TCP协议➌的端口17➋上运行。它也被称为quote服务➍。最后,我们有一个注释➎,提供了更多细节;显然,qotd代表quote of the day。在TCP和UDP中,服务被分配了相同的端口号,即使它们通常只在一个而不是另一个上运行——例如,qotd有端口17/TCP和17/UDP。
许多服务器程序在启动时读取/etc/services以了解要绑定到哪个端口,而客户端程序读取/etc/services以了解应该尝试连接到哪个端口。如果您在不寻常的端口上运行服务器,您可能需要编辑此文件以告诉服务器要连接到哪里。
与所有标准一样,违反规则往往有充分的理由。SSH守护进程sshd通常在端口22/tcp上侦听,但由于各种原因,我在端口23(telnet)、80(HTTP)和443(HTTPS)上运行了它。配置这取决于您使用的服务器程序。
TCP和UDP中低于1024的端口称为保留端口。这些端口仅分配给核心互联网基础设施和重要服务,如DNS、SSH、HTTP、LDAP等,这些服务应该只由系统或网络管理员合法提供。只有具有根级别权限的程序才能绑定到低编号的端口。如果系统策略允许,用户可以在高编号端口上提供游戏服务器,但这与设置一个对所有人可见的官方网页略有不同,该网页声明该机器的主要目的是成为游戏服务器!这些核心协议的端口分配通常是板上钉钉的。
您可以使用sysctls net.inet.ip.prophistoringe.reserved high和net.inet.ipphistoringe.reserved low查看和更改保留端口。
偶尔,有人认为他们可以禁用这种“仅由root绑定”功能并提高系统的安全性——毕竟,如果你的应用程序可以作为普通用户而不是root运行,这不会提高系统安全性吗?在保留端口上运行的大多数程序实际上都是以root身份启动的,绑定到该端口,然后将特权授予特权比普通用户更少的特殊受限用户。这些程序被设计为以root身份启动,并且在作为普通用户运行时经常表现不同。一些程序,如Apache web服务器,是为了让非root用户安全启动而编写的,但其他程序则不是。
以太网在企业和家庭网络中非常流行,是FreeBSD系统最常见的连接介质。以太网是一个共享网络;许多不同的机器可以连接到同一个以太网,并可以直接相互通信。这使以太网比其他网络协议具有很大的优势,但以太网具有物理距离限制,使其仅适用于办公室、共置设施和其他相对较小的网络。
多年来,许多不同的物理介质都支持以太网。从前,大多数以太网电缆都是厚厚的同轴电缆。如今,大多数都是相对较细的CAT6电缆,里面有八股非常细的电线。您还可能遇到光纤或无线电以太网。为了我们的讨论,我们假设您使用的是CAT6或更好的电缆,这是当今最受欢迎的选择。无论你使用什么物理介质,以太网的理论都不会改变——记住,物理层是抽象的。
以太网是一种广播协议,这意味着您在网络上发送的每个数据包都可以发送到网络上的每个工作站。(请注意,我说【可以】;一些以太网硬件限制了这些广播的接收者。)您的网卡或其设备驱动程序将用于您计算机的数据与用于其他计算机的数据分开。以太网广播特性的一个副作用是,你可以窃听其他计算机的网络流量。虽然这在诊断问题时非常有用,但这也是一个安全问题。在老式的以太网上捕获明文密码是轻而易举的。以太网中所有主机都可以直接与所有其他主机通信而不涉及路由器的部分称为广播域或段。
以太网段通过集线器(hub)或交换机(switch)连接。以太网集线器是物理连接许多其他以太网设备的核心硬件。集线器只需将所有接收到的以太网帧转发到连接到网络的每个其他设备。集线器将它们接收到的所有以太网流量广播到每个连接的主机和其他连接的集线器。每个主机负责过滤掉它不想要的流量。集线器是老式的以太网,今天很少见。
交换机在很大程度上取代了集线器。交换机就像一个集线器,但它会过滤发送到每个主机的流量。它识别连接设备的物理地址,并且在大多数情况下,只将帧转发给它们所针对的设备。由于每个以太网主机的带宽都是有限的,因此交换通过减少每个主机必须处理的流量来减少单个系统的负载。
交换机都有可能出现故障。
有些交换机在出现故障时会以集线器的模式工作,如果你依赖交换机来防止安全信息泄露,这时可能会很危险。
安装syslog服务器,并让你的交换机记录到该服务器,可以降低此风险。虽然日志记录并不能防止交换机故障,但它将简化在尝试投诉时监听垂死交换机的过程。
以太网最初仅支持每秒几兆比特,但现已扩展到处理数十千兆比特的速度。大多数以太网卡都是千兆速度,这意味着它们可以处理每秒千兆位,但在高速应用中,你会发现一些10Gbs或100Gbs的卡。如果一张卡被标记为千兆,这并不意味着它实际上可以推送那么多流量——我见过千兆卡在十分之一的带宽上阻塞。当你想推送带宽时,卡的质量很重要,当推送大量带宽时,整个计算机的质量也很重要。
让交换机和卡通过自动协商自行协商设置。虽然一些老手可能还记得禁用旧以太网卡上的自动协商,但千兆和更快的以太网需要自动协商才能正常工作。
每个以太网卡都有一个唯一的标识符,即媒体访问控制(Media Address control——MAC)地址。这个48位的数字有时被称为以太网地址或物理地址。当系统在以太网上向另一台主机传输数据时,它首先广播一个以太网请求,询问“哪个MAC地址负责此IP地址?”如果主机以其MAC地址进行响应,则该IP的进一步数据将传输到该MAC地址。
IPv4使用地址解析协议(Address Resolution Protocol——ARP)将IP地址映射到主机。使用arp(8)查看FreeBSD系统对arp表的了解。最常见的用法是arp -a命令,它显示计算机知道的所有MAC地址和主机名。
xxxxxxxxxx
# arp -a
gw.blackhelicopters.org (198.51.100.1) at 00:00:93:34:4e:78 on igb0 [ethernet]
sipura.blackhelicopters.org (198.51.100.5) at 00:00:93:c2:0f:8c on igb0 [ethernet]
ARP信息的完整列表称为ARP table或MAC table。(MAC和ARP这两个术语经常可以互换使用,所以不用太担心。)在这里,我们看到主机gw.blackhelicopters.org的IP地址为198.51.100.1,MAC地址为00:00:93:34:4e:78,您可以在本地系统的接口igb0上访问这些主机。 如果MAC地址显示为incomplete,则无法在本地以太网上联系主机。在这种情况下,请检查您的物理层(the wire)、远程系统以及这两个系统的配置。 IPv6使用邻居发现协议(Neighbor Discovery Protocol——NDP)将IPv6地址映射到MAC地址。它是一个独立于ARP的协议,用于包含路由器发现。使用ndp(8)查看主机的MAC表和相应的IPv6地址。输出故意类似于arp(1)的输出:
xxxxxxxxxx
# ndp -a
Neighbor Linklayer Address Netif Expire S Flags
fe80::fc25:90ff:fee8:1270%vtnet0 fe:25:90:e8:12:70 vtnet0 4s R R
www.michaelwlucas.com 00:25:90:e8:12:70 vtnet0 permanent R
fe80::225:90ff:fee8:1270%vtnet0 00:25:90:e8:12:70 vtnet0 permanent R
输出故意类似于arp(8),但稍微更像表格。
有关更多状态和标记,请参阅ndp(8)。
为什么有两个单独的命令?arp(8)和ndp(8)都存在,用于将IP地址映射到MAC地址。某些主机可能仅通过一种协议或另一种协议可用。仅支持IPv6的主机不会出现在ARP表中,仅支持IPv4的主机也不会出现在NDP表中。
对于arp(8)和ndp(8),-n标志关闭主机名查找。当您调试网络问题并且无法获得DNS解析时,这非常有用。
现在你知道网络是如何工作的,配置互联网连接非常简单。