最近更新日期:2011/07/15
2.1 网络是个什么玩意儿
2.1.1 什么是网络 2.1.2 计算机网络组成组件 2.1.3 计算机网络区域范围 2.1.4 计算机网络协议: OSI 七层协定 2.1.5 计算机网络协议: TCP/IP 2.2 TCP/IP 的链结层相关协议 2.2.1 广域网使用的设备 2.2.2 局域网络使用的设备-以太网络, 速度与标准, RJ45接头 (跳线/并行线) 2.2.3 以太网络的传输协议:CSMA/CD 2.2.4 MAC 的封装格式 2.2.5 MTU 最大传输单位 2.2.6 集线器、交换器与相关机制 2.3 TCP/IP 的网络层相关封包与数据 2.3.1 IP 封包的封装 2.3.2 IP 地址的组成与分级:网域, IP 与门牌关连, 分级 (Class A, B, C) 2.3.3 IP 的种类与取得方式: loopback, IP 的取得方式 2.3.4 Netmask, 子网与 CIDR (Classless Interdomain Routing) 2.3.5 路由概念 2.3.6 观察主机路由: route 2.3.7 IP 与 MAC:链结层的 ARP 与 RARP 协定:arp 2.3.8 ICMP 协定 2.4 TCP/IP 的传输层相关封包与数据 2.4.1 可靠联机的 TCP 协议:通讯端口, 特权埠口 (Privileged Ports), Socket Pair 2.4.2 TCP 的三向交握 2.4.3 非连接导向的 UDP 协议 2.4.4 网络防火墙与 OSI 七层协议 2.5 连上 Internet 前的准备事项 2.5.1 用 IP 上网?主机名上网?DNS 系统? 2.5.2 一组可以连上 Internet 的必要网络参数 2.6 重点回顾 2.7 本章习题 2.8 参考数据与延伸阅读 2.9 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=25884 2.1 网络是个什么玩意儿 全世界的人种有很多,人类使用的语言种类也多的很。那如果你想要跟外国人沟通时,除了比手划脚之外,你要如何跟对方讲话? 大概只有两种方式啰,一种是强迫他学中文,一种则是我们学他的语言,这样才能沟通啊。在目前世界上的强势语言还是属于英语系国家, 所以啰,不管是啥人种,只要学好英文,那么大家都讲英文,彼此就能够沟通了。希望不久的未来,咱们的中文能够成为强势语言啊! 这个观念延伸到网络上面也是行的通的,全世界的操作系统多的很,不是只有 Windows/Linux 而已,还有苹果计算机自己的操作系统, Unix like 的操作系统也非常多!那么多的操作系统 (人种) 要如何进行网络沟通 (语言) 呢?那就得要制订共同遵守的标准才行了。这个标准是由国际组织规范的,你的系统里面只要提供可以加入该标准的程序代码, 那你就能够透过这个标准与其他系统进行沟通!所以啰,网络是跨平台的,并不是只有 Linux 才这么做!因此,这部份的资料你学完后,是可以应用在所以操作系统上面的!观念都相同啊! 另外,这一个章节旨在引导网络新鲜人快速进入网络的世界,所以鸟哥写的比较浅显一些些,基本上,
还有一堆网络硬件与通讯协议并没有被包含在这篇短文里头。如果你的求知欲已经高过本章节,
那么请自行到书局寻找适合你自己的书籍来阅读!当然,你也可以在因特网上面找到你所需要的数据。
在本章最后的参考数据可以瞧一瞧吶! 2.1.1 什么是网络 我们都知道,网络就是几部计算机主机或者是网络打印机之类的接口设备, 透过网络线或者是无线网络的技术,将这些主机与设备连接起来, 使得数据可以透过网络媒体(网络线以及其他网络卡等硬件)来传输的一种方式。 请你想象一下,如果你家里面只有计算机、打印机、传真机等机器,却没有网络连接这些硬件, 那么使用上会不会很麻烦?如果将这个场景移到需要工作的办公室时, 计算机的数据无法使用网络连接到打印机来打印,那是否很伤脑筋呢? 对吧!光用想的就觉得很麻烦吧!不幸的是,这些麻烦事在 1970 年代以前,确实是存在的啊!
2.1.2 计算机网络组成组件 接下来,让我们来谈谈那么组成计算机网络的组件有哪些呢?这些组件的定义为何啊?我们得要先知道有哪些硬件嘛! 接下来才好理解啊。在这里,我们以底下这张联机示意图来解释好了: 图 2.1-1、计算机网络联机示意图 在上图中,我们主要需要注意到的硬件有哪些呢?大致有底下这些啦:
网络设备其实非常多也非常复杂,不过如果以小型企业角度来看,我们能够了解上述图示内各设备的角色,那应该也足够啰! 接下来,让我们继续来讨论一下网络范围的大小吧! 2.1.3 计算机网络区域范围 由于各个节点的距离不同,联机的线材与方式也有所差异,由于线材的差异也导致网络速度的不同,让网络的应用方向也不一样。 根据这些差异,早期我们习惯将网络的大小范围定义如下:(注6)
除了这两个之外,还有所谓的都会网络 (Metropolitan Area Network, MAN),不过近来比较少提及,因此你只要知道有 LAN 及 WAN 即可。这两个名词在很多地方你都可以看的到喔!改天你回家看看你家的 ADSL 调制解调器或 IP 分享器后面的插孔看看,你就能够看到有 WAN 与 LAN 的插孔,现在你就知道为啥有这两个灯号与插孔了吧。 一般来说,LAN 指的是区域范围较小的环境,例如一栋大楼或一间学校,所以在我们生活周遭有着许许多多的 LAN 存在。 那这些 LAN 彼此串接在一起,全部的 LAN 串在一块就是一个大型的 WAN 啰!简单的说,就是这样分。 不过,现在的环境跟以前不一样了,举例来说,前几天刚刚宣布 (2011/07),光纤的速度已经可以到达 100Mbps/10Mbps 的下载/上传带宽了!再举例来说,台湾的学术网络通通是串在一块的,鸟哥在台南昆山联机到高雄义守大学下载 CentOS 映像档时,你猜下载的速度有多快?每秒钟可高达 100Mbps 左右!这已经是一个内部区网的速度了!所以,用以前的观点来看, 其实对目前的网络环境有点不符现象了。因此,目前你可以使用『速度』作为一个网络区域范围的评量。 或许现在我们可以说,整个台湾的学术网络 (TANET, 注7) 可以视为是一个局域网络呢! 2.1.4 计算机网络协议: OSI 七层协定 谈完了网络需要制订的标准、网络联机的组件以及网络的范围之后,接下来就是要讲到,那么各个节点之间是如何沟通讯息的呢? 其实就是透过标准的通讯协议啦!但是,整个网络连接的过程相当复杂,包括硬件、软件数据封包与应用程序的互相链接等等, 如果想要写一支将联网全部功能都串连在一块的程序,那么当某个小环节出现问题时,整只程序都需要改写啊!真麻烦! 那怎办?没关系,我们可以将整个网络连接过程分成数个阶层 (layer),每个阶层都有特别的独立的功能, 而且每个阶层的程序代码可以独立撰写,因为每个阶层之间的功能并不会互相干扰的。 如此一来,当某个小环节出现问题时,只要将该层级的程序代码重新撰写即可。所以程序撰写也容易,整个网络概念也就更清晰! 那就是目前你常听到的 OSI 七层协定 (Open System Interconnection) 的概念啰! 如果以图示来说,那么这七个阶层的相关性有点像底下这样: 图 2.1-2、OSI 七层协议各阶层的相关性 依据定义来说,越接近硬件的阶层为底层 (layer 1),越接近应用程序的则是高层 (layer 7)。 不论是接收端还是发送端,每个一阶层只认识对方的同一阶层数据。 而整个传送的过程就好像人们在玩整人游戏一般,我们透过应用程序将数据放入第七层的包裹,再将第七层的包裹放到第六层的包裹内, 依序一直放到第一层的最大的包裹内,然后传送出去给接收端。接收端的主机就得由第一个包裹开始,依序将每个包裹拆开, 然后一个一个交给对应负责的阶层来视察!这就是整人游戏...喔!是 OSI 七层协议在阶层定义方面需要注意的特色。 既然说是包裹,那我们都知道,包裹表面都会有个重要的信息,这些信息包括有来自哪里、要去哪里、接收者是谁等等, 而包裹里面才是真正的数据。同样的,在七层协议中,每层都会有自己独特的表头数据 (header),告知对方这里面的信息是什么, 而真正的数据就附在后头啰!我们可以使用如下的图示来表示这七层每一层的名字,以及数据是如何放置到每一层的包裹内: 图 2.1-3、OSI 七层协议数据的传递方式 上图中仔细看每个数据报的部分,上层的包裹是放入下层的数据中,而数据前面则是这个数据的表头。其中比较特殊的是第二层, 因为第二层 (数据链结层) 主要是位于软件封包 (packet) 以及硬件讯框 (frame) 中间的一个阶层, 他必须要将软件包装的包裹放入到硬件能够处理的包裹中,因此这个阶层又分为两个子层在处理相对应的数据。 因为比较特殊,所以您瞧瞧,第二层的数据格式比较不一样喔,尾端还出现一个检查码哩~ 每一个阶层所负责的任务是什么呢?简单的说,每一层负责的任务如下:(注6, 注8, 注9)
事实上, OSI 七层协议只是一个参考的模型 (model),目前的网络社会并没有什么很知名的操作系统在使用 OSI 七层协定的联网程序代码。那...讲这么多干嘛?这是因为 OSI 所定义出来的七层协议在解释网络传输的情况来说, 可以解释的非常棒,因此大家都拿 OSI 七层协议来做为网络的教学与概念的理解。至于实际的联网程序代码,那就交给 TCP/IP 这个玩意儿吧! 2.1.5 计算机网络协议: TCP/IP 虽然 OSI 七层协议的架构非常严谨,是学习网络的好材料。但是也就是因为太过严谨了,因此程序撰写相当不容易, 所以造成它在发展上面些许的困扰。而由 ARPANET 发展而来的 TCP/IP 又如何呢?其实 TCP/IP 也是使用 OSI 七层协议的观念, 所以同样具有分层的架构,只是将它简化为四层,在结构上面比较没有这么严谨,程序撰写会比较容易些。后来在 1990 年代由于 email, WWW 的流行,造成 TCP/IP 这个标准为大家所接受,这也造就目前我们的网络社会啰! 既然 TCP/IP 是由 OSI 七层协议简化而来,那么这两者之间有没有什么相关性呢?它们的相关性可以图示如下, 同时这里也列出目前在这架构底下常见的通讯协议、封包格式与相关标准: 图 2.1-4、OSI 与 TCP/IP 协议之相关性 从上图中,我们可以发现 TCP/IP 将应用、表现、会谈三层整合成一个应用层,在应用层上面可以实作的程序协议有 HTTP, SMTP, DNS 等等。 传送层则没有变,不过依据传送的可靠性又将封包格式分为连接导向的 TCP 及非连接导向的 UDP 封包格式。网络层也没有变,主要内容是提供了 IP 封包,并可选择最佳路由来到达目标 IP 地址。数据链结层与物理层则整合成为一个链结层,包括定义硬件讯号、 讯框转位串的编码等等,因此主要与硬件 (不论是区网还是广域网) 有关。 那 TCP/IP 是如何运作的呢?我们就拿妳常常连上的 Yahoo 入口网站来做个说明好了,整个联机的状态可以这样看:
等到 Yahoo 收到你的包裹后,在依据相反方向拆解开来,然后交给对应的层级进行分析,最后就让 Yahoo 的 WWW 服务器软件得到你所想要的数据,该服务器软件再根据你的要求,取得正确的资料后,又依循上述的流程,一层一层的包装起来, 最后传送到你的手上!就是这样啰! 根据这样的流程,我们就得要知道每个分层所需要了解的基础知识,这样才算学习网络基础嘛!所以底下我们会依据 TCP/IP 的链结层、网络层、传送层来进行说明,应用层的协议则在后续章节中有对应的协定再来谈啰!同时我们也知道, 网络媒体一次传输的数据量是有限的,因此如果要被传输的数据太大时,我们在分层的包装中,就得要将数据先拆开放到不同的包裹中, 再给包裹一个序号,好让目的端的主机能够藉由这些序号再重新将数据整合回来!很有趣吧!接下来就让我们一层一层来介绍啰!
2.2 TCP/IP 的链结层相关协议 TCP/IP 最底层的链结层主要与硬件比较有关系,因此底下我们主要介绍一些 WAN 与 LAN 的硬件。
同时会开始介绍那重要的 CSMA/CD 的以太网络协议,以及相关的硬件与 MAC 讯框格式等。那就开始来聊聊啰! 2.2.1 广域网使用的设备 在 2.1.3 节我们有提到过,广域网使用的设备价格较为低廉。 不过广域网使用到的设备非常的多,一般用户通常会接触到的主要是 ADSL 调制解调器或者是光纤到大厦,以及第四台的 Cable 宽带等。在这里我们先介绍一些比较常见的设备,如果以后你有机会接触到其他设备,再请你依据需求自行查阅相关书籍吧!
2.2.2 局域网络使用的设备-以太网络 在局域网络的环境中,我们最常使用的就是以太网络。当然啦,在某些超高速网络应用的环境中,
还可能会用到价格相当昂贵的光纤信道哩。只是如同前面提到的,以太网络因为已经标准化了,设备设置费用相对低廉,
所以一般你会听到什么网络线或者是网络媒体,几乎都是使用以太网络来架设的环境啦!
只是这里还是要提醒您,整个网络世界并非仅有以太网络这个硬件接口喔!
事实上,想了解整个以太网络的发展,建议你可以直接参考风信子与张民人先生翻译的
『Switched & Fast 以太网络』一书,该书内容相当的有趣,挺适合阅读的吶。
底下我们仅做个简单的介绍而已。
以太网络的流行主要是它成为国际公认的标准所致。早先 IEEE 所制订的以太网络标准为 802.3 的 IEEE 10BASE5 ,这个标准主要的定义是:『10 代表传输速度为 10Mbps,BASE 表示采用基频信号来进行传输,至于 5 则是指每个网络节点之间最长可达 500 公尺。』 由于网络的传输信息就是 0 与 1 啊,因此,数据传输的单位为每秒多少 bit , 亦即是 M bits/second, Mbps 的意思。那么为何制订成为 10Mbps 呢? 这是因为早期的网络线压制的方法以及相关的制作方法,还有以太网络卡制作的技术并不是很好, 加上当时的数据传输需求并没有像现在这么高,所以 10Mbps 已经可以符合大多数人的需求了。
早期的网络线使用的是旧式的同轴电缆线,这种线路在现在几乎已经看不到了。取而代之的是类似传统电话线的双绞线 (Twisted Pair Ethernet) ,IEEE 并将这种线路的以太网络传输方法制订成为 10BASE-T 的标准。 10BASE-T 使用的是 10 Mbps 全速运作且采用无遮蔽式双绞线 (UTP) 的网络线。此外, 10BASE-T 的 UTP 网络线可以使用星形联机(star), 也就是以一个集线器为中心来串连各网络设备的一个方法,图 2.1-1 就是星形联机的一个示意图。 不同于早期以一条同轴电缆线链接所有的计算机的 bus 联机,透过星形联机的帮助, 我们可以很简单的加装其他的设备或者是移除其他设备,而不会受到其他装置的影响,这对网络设备的扩充性与除错来说, 都是一项相当棒的设计!也因此 10BASE-T 让以太网络设备的销售额大幅提升啊! 后来 IEEE 更制订了 802.3u 这个支持到 100Mbps 传输速度的 100BASE-T 标准,这个标准与 10BASE-T 差异不大, 只是双绞线线材制作需要更精良,同时也已经支持使用了四对绞线的网络线了, 也就是目前很常见的八蕊网络线吶!这种网络线我们常称为等级五 (Category 5, CAT5) 的网络线。 这种传输速度的以太网络就被称为 Fast ethernet 。至于目前我们常常听到的 Gigabit 网络速度 1000 Mbps 又是什么吶?那就是 Gigabit ethernet 哩!只是 Gigabit ethernet 的网络线就需要更加的精良。
为什么每当传输速度增加时,网络线的要求就更严格呢?这是因为当传输速度增加时,线材的电磁效应相互干扰会增强,
因此在网络线的制作时就得需要特别注意线材的质料以及内部线蕊心之间的缠绕情况配置等,
以使电子流之间的电磁干扰降到最小,才能使传输速度提升到应有的 Gigabit 。
所以说,在以太网络世界当中,如果你想要提升原有的 fast ethernet 到 gigabit ethernet 的话,
除了网络卡需要升级之外,主机与主机之间的网络线,
以及连接主机线路的集线器/交换器等,都必须要提升到可以支持 gigabit 速度等级的设备才行喔!
前面提到,网络的速度与线材是有一定程度的相关性的,那么线材的接头又是怎样呢? 目前在以太网络上最常见到的接头就是 RJ-45 的网络接头,共有八蕊的接头,有点像是胖了的电话线接头, 如下所示: 图 2.2-1、RJ-45 接头示意图 而 RJ-45 接头又因为每条蕊线的对应不同而分为 568A 与 568B 接头,这两款接头内的蕊线对应如下表:
事实上,虽然目前的以太网络线有八蕊且两两成对,但实际使用的只有 1,2,3,6 蕊而已, 其他的则是某些特殊用途的场合才会使用到。但由于主机与主机的联机以及主机与集线器的联机时, 所使用的网络线脚位定义并不相同,因此由于接头的不同网络线又可分为两种:
2.2.3 以太网络的传输协议:CSMA/CD 整个以太网络的重心就是以太网络卡啦!所以说,以太网络的传输主要就是网络卡对网络卡之间的数据传递而已。 每张以太网络卡出厂时,就会赋予一个独一无二的卡号,那就是所谓的 MAC (Media Access Control) 啦! 理论上,网卡卡号是不能修改的,不过某些笔记本电脑的网卡卡号是能够修改的呦! 那么以太网络的网卡之间数据是如何传输的呢?那就得要谈一下 IEEE 802.3 的标准 CSMA/CD (Carrier Sense Multiple Access with Collision Detection) 了!我们以下图来作为简介,下图内的中心点为集线器, 各个主机都是联机到集线器,然后透过集线器的功能向所有主机发起联机的。 图 2.2-2、CSMA/CD联机示意图,由 A 发送资料给 D 时,注意箭头方向 集线器是一种网络共享媒体,什么是网络共享媒体啊?想象一下上述的环境就像一个十字路口,而集线器就是那个路口! 这个路口一次只允许一辆车通过,如果两辆车同时使用这个路口,那么就会发生碰撞的车祸事件啊!那就是所谓的共享媒体。 也就是说,网络共享媒体在单一时间点内, 仅能被一部主机所使用。 理解了共享媒体的意义后,再来,我们就得要讨论,那么以太网络的网卡之间是如何传输的呢?我们以上图中的 A 要发给 D 网卡为例好了,简单的说, CSMA/CD 搭配上述的环境,它的传输情况需要有以下的流程:
了解这个程序很重要吗?我们就来谈谈:
2.2.4 MAC 的封装格式 上面提到的 CSMA/CD 传送出去的讯框数据,其实就是 MAC 啦!MAC 其实就是我们上面一直讲到的讯框 (frame) 啰! 只是这个讯框上面有两个很重要的数据,就是目标与来源的网卡卡号,因此我们又简称网卡卡号为 MAC 而已。 简单的说,你可以把 MAC 想成是一个在网络线上面传递的包裹,而这个包裹是整个网络硬件上面传送数据的最小单位了。 也就是说,网络线可想成是一条『一次仅可通过一个人』的独木桥, 而 MAC 就是在这个独木桥上面动的人啦!接下来,来看一看 MAC 这个讯框的内容吧! 图 2.2-3、以太网络的 MAC 讯框 上图中的目的地址与来源地址指的就是网卡卡号 (hardware address, 硬件地址),我们前面提到,每一张网卡都有一个独一无二的卡号, 那个卡号的目的就在这个讯框的表头数据使用到啦!硬件地址最小由 00:00:00:00:00:00 到 FF:FF:FF:FF:FF:FF (16 进位法), 这 6 bytes 当中,前 3bytes 为厂商的代码,后 3bytes 则是该厂商自行设定的装置码了。 在 Linux 当中,你可以使用 ifconfig 这个指令来查阅你的网络卡卡号喔!特别注意,在这个 MAC 的传送中,他仅在局域网络内生效,如果跨过不同的网域 (这个后面 IP 的部分时会介绍),那么来源与目的的硬件地址就会跟着改变了。 这是因为变成不同网络卡之间的交流了嘛!所以卡号当然不同了!如下所示: 图 2.2-4、同一讯框在不同网域的主机间传送时,讯框的表头变化 例如上面的图标,我的数据要由计算机 A 通过 B 后才送达 C ,而 B 计算机有两块网络卡,其中 MAC-2 与 A 计算机的 MAC-1 互通,至于 MAC-3 则与 C 计算机的 MAC-4 互通。但是 MAC-1 不能与 MAC-3 与 MAC-4 互通,为啥?因为 MAC-1 这块网络卡并没有与 MAC-3 及 MAC-4 使用同样的 switch/hub 相接嘛!所以,数据的流通会变成:
也就是说,只要透过 B (就是路由器) 才将封包送到另一个网域 (IP 部分会讲) 去的时候, 那么讯框内的硬件地址就会被改变,然后才能够在同一个网域里面直接进行讯框的流通啊!
2.2.5 MTU 最大传输单位 通过上面 MAC 封装的定义,现在我们知道标准以太网络讯框所能传送的数据量最大可以到达 1500 bytes , 这个数值就被我们称为 MTU (Maximum Transmission Unit, 最大传输单位)。 你得要注意的是,每种网络接口的 MTU 都不相同,因此有的时候在某些网络文章上面你会看到 1492 bytes 的 MTU 等等。不过,在以太网络上,标准的定义就是 1500 bytes。 在待会儿会介绍到的 IP 封包中,这个 IP 封包最大可以到 65535 bytes,比 MTU 还要大呢!既然礼物 (IP) 都比盒子 (MAC) 大,那怎么可能放的进去啊?所以啰, IP 封包是可以进行拆解的,然后才能放到 MAC 当中啊!等到数据都传到目的地, 再由目的地的主机将他组装回来就是了。所以啰,如果 MTU 能够大一些的话,那么 IP 封包的拆解情况就会降低, 封包与封包传送之间的等待时间 (前一小节提到的 96 bit time) 也会减少,就能够增加网络带宽的使用啰! 为了这个目的,所以 Gigabit 的以太网络媒体才有支持 Jumbo frame 的嘛!这个 Jumbo frame 一般都定义到 9000bytes。 那你会说,既然如此,我们的 MTU 能不能改成 9000bytes 呢?这样一来不就能够减少数据封包的拆解,以增加网络使用率吗? 是这样没错,而且,你也确实可以在 Linux 系统上更改 MTU 的!但是,如果考虑到整个网络,那么我们不建议你修改这个数值。 为什么呢? 我们的封包总是需要在 Internet 上面跑吧?你无法确认所有的网络媒体都是支持那么大的 MTU 对吧! 如果你的 9000 bytes 封包通过一个不支持 Jumbo frame 的网络媒体时,好一点的是该网络媒体 (例如 switch/router 等) 会主动的帮你重组而进行传送,差一点的可能就直接回报这个封包无效而丢弃了~这个时候可就糗大啰~ 所以, MTU 设定为 9000 这种事情,大概仅能在内部网络的环境中作~举例来说,很多的内部丛集系统 (cluster) 就将他们的内部网络环境 MTU 设定为 9000,但是对外的适配卡可还是原本的标准 1500 喔! ^_^ 也就是说,不论你的网络媒体支持 MTU 到多大,你必须要考虑到你的封包需要传到目的地时, 所需要经过的所有网络媒体,然后再来决定你的 MTU 设定才行。就因为这样,我们才不建议你修改标准以太网络的 MTU 嘛!
2.2.6 集线器、交换器与相关机制
2.3 TCP/IP 的网络层相关封包与数据 我们现在知道要有网络的话,必须要有网络相关的硬件,而目前最常见的网络硬件接口为以太网络,包括网络线、网络卡、Hub/Switch
等等。而以太网络上面的传输使用网络卡卡号为基准的 MAC 讯框,配合 CSMA/CD 的标准来传送讯框,这就是硬件部分。在软件部分,我们知道
Internet 其实就是 TCP/IP 这个通讯协议的通称,Internet 是由 InterNIC(注12) 所统一管理的,
但其实他仅是负责分配 Internet 上面的 IP 以及提供相关的 TCP/IP 技术文件而已。不过 Internet 最重要的就是 IP 啊!所以,
这个小节就让我们来讲讲网络层的 IP 与路由吧! 2.3.1 IP 封包的封装 目前因特网社会的 IP 有两种版本,一种是目前使用最广泛的 IPv4 (Internet Protocol version 4, 因特网协定第四版), 一种则是预期未来会热门的 IPv6 。IPv4 记录的地址由于仅有 32 位,预计在 2020 年前后就会分发完毕,如此一来, 新兴国家或者是新的网络公司,将没有网络可以使用。为了避免这个问题发生,因此就有 IPv6 的产生。 IPv6 的地址可以达到 128 位,可以多出 2 的 96 次方倍的网址数量,这样的 IP 数量几乎用不完啦!虽然 IPv6 具有前瞻性,但目前主流媒体大多还是使用 IPv4 ,因此本文主要谈到的 IP 都指 IPv4 而言喔!(注13) 我们在前一小节谈到 MAC 的封装,那么 IP 封包的封装也得要来了解一下,才能知道 IP 到底是如何产生的啊! IP 封包可以达到 65535 bytes 这么大,在比 MAC 大的情况下,我们的操作系统会对 IP 进行拆解的动作。至于 IP 封装的表头数据绘制如下:(下图第一行为每个字段的 bit 数)
在上面的图示中有个地方要注意,那就是『每一行所占用的位数为 32 bits』, 各个表头的内容分别介绍如下:
你只要知道 IP 表头里面含有: TTL, Protocol, 来源地址与目标地址也就够了!而这个 IP 表头的来源与目标 IP ,以及那个判断通过多少路由器的 TTL ,就能了解到这个 IP 将被如何传送到目的端吶。后续各小节我们将介绍 IP 的组成与范围,还有 IP 封包如何传送的机制 (路由) 等等。 2.3.2 IP 地址的组成与分级 现在我们知道 IP (Internet Protocol) 其实是一种网络封包,而这个封包的表头最重要的就是那个 32 位的来源与目标地址! 为了方便记忆,所以我们也称这个 32 bits 的数值为 IP 网络地址就是了。因为网络是人类发明的,所以很多概念与邮务系统类似! 那这个 IP 其实就类似所谓的『门牌号码』啦!那么这个 IP 有哪些重要的地方需要了解的呢?底下我们就来谈一谈吧! 既然 IP 的组成是 32 bits 的数值,也就是由 32 个 0 与 1 组成的一连串数字!那么当我们思考所有跟 IP 有关的参数时,你就应该要将该参数想成是 32 位的数据喔! 不过,因为人类对于二进制实在是不怎么熟悉,所以为了顺应人们对于十进制的依赖性,因此,就将 32 bits 的 IP 分成四小段,每段含有 8 个 bits ,将 8 个 bits 计算成为十进制,并且每一段中间以小数点隔开,那就成了目前大家所熟悉的 IP 的书写模样了。如下所示:
所以 IP 最小可以由 0.0.0.0 一直到 255.255.255.255 哩!但在这一串数字中,其实还可以分为两个部分喔! 主要分为 Net_ID (网域号码)与 Host_ID (主机号码) 两部份。我们先以 192.168.0.0 ~ 192.168.0.255 这个 Class C 的网域当作例子来说明好了:
在上面的范例当中,前面三组数字 (192.168.0) 就是网域号码,最后面一组数字则称为主机号码。 至于同一个网域的定义是『在同一个物理网段内,主机的 IP 具有相同的 Net_ID ,并且具有独特的 Host_ID』,那么这些 IP 群就是同一个网域内的 IP 网段啦!
上面例子当中的 192.168.0.0, 192.168.0.1, 192.168.0.2, ...., 192.168.0.255 (共 256 个) 这些 IP 就是同一个网域内的
IP 群(同一个网域也称为同一个网段!),请注意,同一个 Net_ID 内,不能具有相同的 Host_ID ,否则就会发生 IP
冲突,可能会造成两部主机都没有办法使用网络的问题!
那么同一个网域该怎么设定,与将 IP 设定在同一个网域之内有什么好处呢?
所以说,贵单位公司内的计算机群,或者是你宿舍或家里面的所有计算机,当然都设定在同一个网域内是最方便的,
因为如此一来每一部计算机都可以直接透过 MAC 来进行数据的交流,而不必经由
Router (路由器) 来进行封包的转递呢!(Router
这部份在第八章才会提及)。
刚接触到 IP 组成的朋友都很困扰,又分啥网域号码与主机号码,烦死了!其实,你不用烦恼啊!使用门牌号码的概念来想即可。 既然 IP 是门牌,那拿我们昆山科技大学的门牌来说好了,我们的门牌是:『台南市永康区大湾路 949 号』, 假设整个大湾路是同一个巷弄,那么我们这个门牌的网域号码『台南市永康区大湾路』而我的主机号码就是『 949 号』, 那么整条大湾路上面只要是开头为『台南市永康区大湾路』的,就是跟我们同一个网域啰!当然啦,门牌号码不可能有第二个 949 号啊!这样理解否? 另外,Host_ID 全为 0 与全为 1 (二进制的概念) 时,代表整条巷子的第一个与最后一个门牌,而第一个门牌我们让他代表整条巷子, 所以又称为 Network IP,就是巷子口那个 XXX 巷的立牌啦!至于最后一个 IP ,则代表巷子尾,亦即本条巷子的最后一个门牌, 那就是我们在巷子内广播时的最后一个 IP ,又称为 Broadcast IP 的啰。 在我们这个巷子内,我们可以透过大声公用广播的方式跟大家沟通讯息,例如前几年很热门的张君雅小妹妹的泡面广告, 在巷子内透过广播告诉张君雅小妹妹,你阿嬷将泡面煮好了,赶快回家吃面去!那如果不是张君雅小妹妹呢?就将该讯息略过啊! 这样有没有联想到 CSMA/CD 的概念呢? 那如果你的数据不是要给本巷子内的门牌呢?此时你就得要将资料拿给巷子内的邮局 (路由器),由邮局帮你传送,
你只要知道巷子内的那间邮局在哪里即可,其他的就让邮局自己帮你把信件传出去即可啊!这就是整个区网与门牌对应的想法!
这样有没有比较清晰啊?
你应该要想到一个问题,那就是我的总门牌『台南市永康区大湾路 949 号』中,到哪里是巷子而到哪里是门牌? 如果到『台南市』是巷子,那么我的门牌将有好多乡镇的组成,如果巷子号码到『台南市永康区』时, 那么我们的门牌就又少了点。所以说,这个『巷子』的大小,将会影响到我们主机号码的数量! 为了解决这个问题,以及为了 IP 管理与发放注册的方便性,InterNIC 将整个 IP 网段分为五种等级, 每种等级的范围主要与 IP 那 32 bits 数值的前面几个位有关,基本定义如下:
根据上表的说明,我们可以知道,你只要知道 IP 的第一个十进制数,就能够约略了解到该 IP 属于哪一个等级, 以及同网域 IP 数量有多少。这也是为啥我们上头选了 192.168.0.0 这一 IP 网段来说明时,会将巷子定义到第三个数字之故。 不过,上表中你只要记忆三种等级,亦即是 Class A, B, C 即可,因为 Class D 是用来作为群播 (multicast) 的特殊功能之用 (最常用在大批计算机的网络还原),至于 Class E 则是保留没有使用的网段。因此,能够用来设定在一般系统上面的,就只有 Class A, B, C 三种等级的 IP 啰! 2.3.3 IP 的种类与取得方式 接下来要跟大家谈一谈也是很容易造成大家困扰的一个部分,那就是 IP 的种类!很多朋友常常听到什么『真实IP, 实体 IP, 虚拟 IP, 假的 IP....』烦都烦死了~其实不要太紧张啦!实际上,在 IPv4 里面就只有两种 IP 的类别,分别是:
早在 IPv4 规划的时候就担心 IP 会有不足的情况,而且为了应付某些企业内部的网络设定,于是就有了私有 IP (Private IP) 的产生了。私有 IP 也分别在 A, B, C 三个 Class 当中各保留一段作为私有 IP 网段,那就是:
由于这三段 Class 的 IP 是预留使用的,所以并不能直接作为 Internet 上面的连接之用,不然的话,到处就都有相同的 IP 啰!那怎么行!网络岂不混乱?所以啰,这三个 IP 网段就只做为内部私有网域的 IP 沟通之用。简单的说,他有底下的几个限制:
这个私有 IP 有什么好处呢?由于他的私有路由不能对外直接提供信息,所以,你的内部网络将不会直接被 Internet 上面的 Cracker 所攻击!但是,你也就无法以私有 IP 来『直接上网』啰!因此相当适合一些尚未具有 Public IP 的企业内部用来规划其网络之设定!否则当你随便指定一些可能是 Public IP 的网段来规划你企业内部的网络设定时,万一哪一天真的连上 Internet 了,那么岂不是可能会造成跟 Internet 上面的 Public IP 相同了吗? 此外,在没有可用的公开网络情况下,如果你想要跟同学玩联机游戏怎办?也就是说,在区网内自己玩自己的联机游戏, 此时你只要规范好所有同学在同一段私有 IP 网段中,就能够顺利的玩你的网络啦!就这么简单呢! 那么万一你又要将这些私有 IP 送上 Internet 呢?这个简单,设定一个简单的防火墙加上 NAT (Network
Address Transfer) 服务,你就可以透过 IP 伪装 (不要急,这个在后面也会提到) 来使你的私有
IP 的计算机也可以连上 Internet 啰!
好了,那么除了这个预留的 IP 网段的问题之外,还有没有什么其他的怪东西呢?当然是有啦!不然鸟哥干嘛花时间来唬 XX 呢?没错,还有一个奇怪的 Class A 的网域,那就是 lo 这个奇怪的网域啦 (注意:是小写的 o 而不是零喔)!这个 lo 的网络是当初被用来作为测试操作系统内部循环所用的一个网域,同时也能够提供给系统内部原本就需要使用网络接口的服务 (daemon) 所使用。 简单的说,如果你没有安装网络卡在的机器上面, 但是你又希望可以测试一下在你的机器上面设定的服务器环境到底可不可以顺利运作,这个时候怎么办, 嘿嘿!就是利用这个所谓的内部循环网络啦!这个网段在 127.0.0.0/8 这个 Class A,而且默认的主机 (localhost) 的 IP 是 127.0.0.1 呦!所以啰,当你启动了你的 WWW 服务器,然后在你的主机的 X-Window 上面执行 http://localhost 就可以直接看到你的主页啰!而且不需要安装网络卡呢!测试很方便吧! 此外,你的内部使用的 mail 怎么运送邮件呢?例如你的主机系统如何
mail 给 root 这个人呢?嘿嘿!也就是使用这一个内部循环啦!当要测试你的
TCP/IP 封包与状态是否正常时,可以使用这个呦!(所以哪一天有人问你嘿!你的主机上面没有网络卡,
那么你可以测试你的 WWW 服务器设定是否正确吗?这个时候可得回答:当然可以啰!使用 127.0.0.1
这个 Address 呀! ^_^ )
谈完了 IP 的种类与等级还有相关的子域概念后,接下来我们得来了解一下,那么主机的 IP 是如何设定的呢? 基本上,主机的 IP 与相关网域的设定方式主要有:
不管是使用上面哪种方式取得的 IP ,你的 IP 都只有所谓的『 Public 与 Private IP 』而已!而其他什么浮动式、固定制、 动态式等等有的没有的,就只是告诉你这个 IP 取得的方式而已。举例来说,台湾地区 ADSL 拨接后取得的 IP 通常是 public IP, 但是鸟哥曾接到香港网友的来信,他们 ADSL 拨接后,取得的 IP 是 Private ,所以导致无法架设网站喔! 2.3.4 Netmask, 子网与 CIDR (Classless Interdomain Routing) 我们前面谈到 IP 是有等级的,而设定在一般计算机系统上面的则是 Class A, B, C。现在我们来想一想,如果我们设定一个区网, 使用的是 Class A ,那么我们很容易就会想到,哪有这么多计算机可以设定在同一个 Class A 的区段内 (256x256x256-2=16777214) ? 而且,假设真有这么多计算机好了,回想一下 CSMA/CD 吧,你的网络恐怕会一直非常停顿,因为妳得要接到一千多万台计算机对你的广播... 光是想到一千多万台的广播,你的网络还能使用吗?真没效率! 此外,分为 Class 的 IP 等级,是为了管理方面的考虑,事实上,我们不可能将一个 Class A 仅划定为一个区网。举例来说, 我们昆山取得的 Public IP 是 120.xxx 开头的,但是其实我们只有 120.114.xxx.xxx 而已,并没有取得整个 Class A 喔! 因为我们学校也用不了这么多嘛!这个时候,我们就得要理解一下啰,就是,怎么将 Class A 的网段变小?换句话说, 我们如何将网域切的更细呢?这样不就可以分出更多段的区网给大家设定了? 前面我们提到 IP 这个 32 位的数值中分为网域号码与主机号码,其中 Class C 的网域号码占了
24 位,而其实我们还可以将这样的网域切的更细,就是让第一个
Host_ID 被拿来作为 Net_ID ,所以,整个 Net_ID 就有 25 bits ,至于 Host_ID
则减少为 7 bits 。在这样的情况下,原来的一个 Class C
的网域就可以被切分为两个子域,而每个子域就有『
256/2 - 2 = 126 』个可用的 IP
了!这样一来,就能够将原本的一个网域切为两个较细小的网域,方便分门别类的设计喔。
那到底是什么参数来达成子网的切分呢?那就是 Netmask (子网掩码) 的用途啦!这个 Netmask 是用来定义出网域的最重要的一个参数了!不过他也最难理解了~@_@。为了帮助大家比较容易记忆住 Netmask 的设定依据,底下我们介绍一个比较容易记忆的方法。同样以 192.168.0.0 ~ 192.168.0.255 这个网域为范例好了,如下所示,这个 IP 网段可以分为 Net_ID 与 Host_ID,既然 Net_ID 是不可变的,那就假设他所占据的 bits 已经被用光了 (全部为 1),而 Host_ID 是可变的,就将他想成是保留着 (全部为 0),所以, Netmask 的表示就成为:
将他转成十进制的话,就成为『255.255.255.0』啦! 这样记忆简单多了吧!照这样的记忆方法,那么 A, B, C Class 的 Netmask 表示就成为这样:
所以说, 192.168.0.0 ~ 192.168.0.255 这个 Class C 的网域中,他的 Netmask 就是 255.255.255.0 !再来,我们刚刚提到了当 Host_ID 全部为 0 以及全部为 1 的时后该 IP 是不可以使用的,因为 Host_ID 全部为 0 的时后,表示 IP 是该网段的 Network ,至于全部为 1 的时后就表示该网段最后一个 IP ,也称为 Broadcast ,所以说,在 192.168.0.0 ~ 192.168.0.255 这个 IP 网段里面的相关网络参数就有:
好了,刚刚提到 Class C 还可以继续进行子域 (Subnet) 的切分啊,以 192.168.0.0 ~192.168.0.255 这个情况为例,他要如何再细分为两个子域呢?我们已经知道 Host_ID 可以拿来当作 Net_ID,那么 Net_ID 使用了 25 bits 时,就会如下所示:
所以说,当再细分下去时,就会得到两个子域,而两个子域还可以再细分下去喔 (Net_ID 用掉 26 bits ....)。呵呵!如果你真的能够理解 IP, Network, Broadcast, Netmask 的话,恭喜你,未来的服务器学习之路已经顺畅了一半啦! ^_^
其实子网的计算是有偷吃步的,我们知道 IP 是二进制,每个位就是 2 的次方。又由于 IP 数量都是平均分配到每个子网去, 所以,如果我们以 192.168.0.0 ~ 192.168.0.255 这个网段来说,要是给予 Net_ID 是 26 位时,总共分为几段呢? 因为 26-24=2 ,所以总共用掉两个位,因此有 2 的 2 次方,得到 4 个网段。再将 256 个 IP 平均分配到 4 个网段去, 那我们就可以知道这四个网段分别是:
有没有变简单的感觉啊?那你再想想,如果同样一个网段,那 Net_ID 变成 27 个位时,又该如何计算呢?自己算算看吧!
一般来说,如果我们知道了 Network 以及 Netmask 之后,就可以定义出该网域的所有 IP 了!因为由 Netmask 就可以推算出来 Broadcast 的 IP 啊!因此,我们常常会以 Network 以及 Netmask 来表示一个网域,例如这样的写法:
另外,既然 Netmask 里面的 Net_ID 都是 1 ,那么 Class C 共有 24 bits 的 Net_ID ,所以啦,就有类似上面 192.168.0.0/24 这样的写法啰!这就是一般网域的表示方法。 同理可证,在上述的偷吃步计算网域方法中,四个网段的写法就可以写成:
事实上,由于网络细分的情况太严重,为了担心路由信息过于庞大导致网络效能不佳,因此,某些特殊情况下, 我们反而是将 Net_ID 借用来作为 Host_ID 的情况!这样就能够将多个网域写成一个啦!举例来说,我们将 256 个 Class C 的私有 IP (192.168.0.0~192.168.255.255) 写成一个路由信息的话,那么这个网段的写法就会变成: 192.168.0.0/16,反而将 192 开头的 Class C 变成 class B 的样子了! 这种打破原本 IP 代表等级的方式 (透过 Netmask 的规范) 就被称为无等级网域间路由 (CIDR) 啰! (注14) 老实说,你无须理会啥是无等级网域间路由啦!只要知道,那个 Network/Netmask 的写法,通常就是 CIDR 的写法! 然后,你也要知道如何透过 Netmask 去计算出 Network, Broadcast 及可用的 IP 等,那你的 IP 概念就相当完整了!^_^ 2.3.5 路由概念 我们知道在同一个区网里面,可以透过 IP 广播的方式来达到资料传递的目的。但如果是非区网内的数据呢? 这时就得要透过那个所谓的邮局 (路由器) 的帮忙了!这也是网络层非常重要的概念喔!先来看看什么是区网吧!
如上题所述,那么这两个网段的数据无法透过广播来达到数据的传递啊,那怎办? 此时就得要经过 IP 的路径选择 (routing) 功能啦!我们以下面图示的例子来做说明。 下列图示当中共有两个不同的网段,分别是 Network A 与 Network B,这两个网段是经由一部路由器 (Server A) 来进行数据转递的,好了,那么当 PC01 这部主机想要传送数据到 PC11 时, 他的 IP 封包该如何传输呢? 图 2.3-2、简易的路由示意图 我们知道 Network A(192.168.0.0/24) 与 Network B(192.168.1.0/24) 是不同网段,所以 PC01 与 PC11 是不能直接互通数据的。不过, PC01 与 PC11 是如何知道他们两个不在同一个网段内?这当然是透过 Net_ID 来发现的!那么当主机想要传送数据时,他主要的参考是啥? 很简单!是『路由表 (route table)』,每部主机都有自己的路由表』, 让我们来看一看预设的情况下, PC01 要如何将数据传送到 PC02 呢?
大致的情况就是这样,所以每一部主机里面都会存在着一个路由表 (Route table),数据的传递将依据这个路由表进行传送!而一旦封包已经经由路由表的规则传送出去后, 那么主机本身就已经不再管封包的流向了,因为该封包的流向将是下一个主机 (也就是那部 Router) 来进行传送,而 Router 在传送时,也是依据 Router 自己的路由表来判断该封包应该经由哪里传送出去的!整体来说,数据传送有点像这样: 图 2.3-3、路由的概念 PC 01 要将资料送到 Server Bingo 去,则依据自己的路由表,将该封包送到 Server A 去,Server A 再继续送到 Server B ,然后在一个一个的接力给他送下去,最后总是可以到达 Server Bingo 的。 上面的案例是一个很简单的路由概念,事实上, Internet 上面的路由协议与变化是相当复杂的,因为 Internet 上面的路由并不是静态的,他可以随时因为环境的变化而修订每个封包的传送方向。 举例来说,数年前在新竹因为土木施工导致台湾西部整个网络缆线的中断。 不过南北的网络竟然还是能通,为什么呢?因为路由已经判断出西部缆线的终止, 因此他自动的导向台湾东部的花莲路线,虽然如此一来绕了一大圈,而且造成网络的大塞车, 不过封包还是能通就是了!这个例子仅是想告诉大家,我们上面提的路由仅是一个很简单的静态路由情况, 如果想要更深入的了解 route ,请自行参考相关书籍喔! ^_^ 。 此外,在属于 Public 的 Internet 环境中,由于最早时的 IP 分配都已经配置妥当, 所以各单位的路由一经设定妥当后,上层的路由则无须担心啊!IP 的分配可以参考底下的网页: 2.3.6 观察主机路由: route 既然路由是这么的重要,而且『路由一旦设定错误, 将会造成某些封包完全无法正确的送出去!』 所以我们当然需要好好的来观察一下我们主机的路由表啦!还是请再注意一下, 每一部主机都有自己的路由表喔!观察路由表的指令很简单,就是 route ,这个指令挺难的,我们在后面章节再继续的介绍,这里仅说明一些比较简单的用法:
在上面的例子当中,鸟哥是以 PC 01 这部主机的路由状态来进行说明。由于 PC 01 为 192.168.0.0/24 这个网域,所以主机已经建立了这个网域的路由了,那就是『 192.168.0.0 * 255.255.255.0 ... 』那一行所显示的讯息!当你下达 route 时, 屏幕上说明了这部机器上面共有三个路由规则,第一栏为『目的地的网域』,例如 192.168.0.0 就是一个网域咯,最后一栏显示的是 『要去到这个目的地要使用哪一个网络接口!』例如 eth0 就是网络卡的装置代号啦。如果我们要传送的封包在路由规则里面的 192.168.0.0/255.255.255.0 或者 127.0.0.0/255.0.0.0 里面时,因为第二栏 Gateway 为 * ,所以就会直接以后面的网络接口来传送出去,而不透过 Gateway 咯! 万一我们要传送的封包目的地 IP 不在路由规则里面,那么就会将封包传送到『default』所在的那个路由规则去,也就是 192.168.0.254 那个 Gateway 喔!所以,几乎每一部主机都会有一个 default gateway 来帮他们负责所有非网域内的封包转递!这是很重要的概念喔!^_^! 关于更多的路由功能与设定方法,我们在第八章当中会再次的提及呢! 2.3.7 IP 与 MAC:链结层的 ARP 与 RARP 协定 现在我们知道 Internet 上面最重要的就是那个 IP 了,也会计算所谓的局域网络与路由。 但是,事实上用在传递数据的明明就是以太网络啊!以太网络主要是用网卡卡号 (MAC) 的嘛!这就有问题啦!那这两者 (IP 与 MAC) 势必有一个关连性存在吧?没错!那就是我们要谈到的 ARP (Address Resolution Protocol, 网络地址解析) 协议,以及 RARP (Revers ARP, 反向网络地址解析) 当我们想要了解某个 IP 其实是设定于某张以太网络卡上头时,我们的主机会对整个区网发送出 ARP 封包, 对方收到 ARP 封包后就会回传他的 MAC 给我们,我们的主机就会知道对方所在的网卡,那接下来就能够开始传递数据啰。 如果每次要传送都得要重新来一遍这个 ARP 协定那不是很烦?因此,当使用 ARP 协议取得目标 IP 与他网卡卡号后, 就会将该笔记录写入我们主机的 ARP table 中 (内存内的数据) 记录 20 分钟 (注14)。
那如何取得本机的 ARP 表格内的 IP/MAC 对应数据呢?就透过 arp 这个指令吧!
如同上面提到的,当你发送 ARP 封包取得的 IP/MAC 对应,这个记录的 ARP table 是动态的信息 (一般保留 20 分钟),他会随时随着你的网域里面计算机的 IP 更动而变化,所以,即使你常常更动你的计算机 IP,不要担心,因为 ARP table 会自动的重新对应 IP 与 MAC 的表格内容!但如果你有特殊需求的话, 也可以利用『 arp -s 』这个选项来定义静态的 ARP 对应喔! 2.3.8 ICMP 协定 ICMP 的全名是『 Internet Control Message Protocol, 因特网讯息控制协议 』。 基本上,ICMP 是一个错误侦测与回报的机制,最大的功能就是可以确保我们网络的联机状态与联机的正确性! ICMP 也是网络层的重要封包之一,不过,这个封包并非独立存在,而是纳入到 IP 的封包中!也就是说, ICMP 同样是透过 IP 封包来进行数据传送的啦!因为在 Internet 上面有传输能力的就是 IP 封包啊! ICMP 有相当多的类别可以侦测与回报,底下是比较常见的几个 ICMP 的类别 (Type):
那么我们是如何利用 ICMP 来检验网络的状态呢?最简单的指令就是 ping 与 traceroute 了, 这两个指令可以透过 ICMP 封包的辅助来确认与回报网络主机的状态。在设定防火墙的时候, 我们最容易忽略的就是这个 ICMP 的封包了,因为只会记住 TCP/UDP 而已~事实上, ICMP 封包可以帮助联机的状态回报,除了上述的 8 可以考虑关闭之外,基本上,ICMP 封包也不应该全部都挡掉喔! 2.4 TCP/IP 的传输层相关封包与数据 网络层的 IP 封包只负责将数据送到正确的目标主机去,但这个封包到底会不会被接受,或者是有没有被正确的接收,
那就不是 IP 的任务啦!那是传送层的任务之一。从 图 2.1-4 我们可以看到传送层有两个重点,
一个是连接导向的 TCP 封包,一个是非连接导向的 UDP 封包,这两个封包很重要啊!数据能不能正确的被送达目的,
与这两个封包有关喔! 2.4.1 可靠联机的 TCP 协议 在前面的 OSI 七层协议当中,在网络层的 IP 之上则是传送层,而传送层的数据打包成什么? 最常见的就是 TCP 封包了。这个 TCP 封包数据必须要能够放到 IP 的数据袋当中才行喔! 所以,我们将图 2.1-4 简化一下,将 MAC, IP 与 TCP 的封包数据这样看: 图 2.4-1、各封包之间的相关性 想当然尔,TCP 也有表头数据来记录该封包的相关信息啰?没错啦~ TCP 封包的表头是长这个样子的:
上图就是一个 TCP 封包的表头数据,各个项目以 Source Port, Destination Port 及 Code 算是比较重要的项目,底下我们就分别来谈一谈各个表头数据的内容吧!
谈完了 TCP 表头数据后,再来让我们了解一下这个表头里面最重要的端口信息吧!
在上图的 TCP 表头数据中,最重要的就属那 16 位的两个咚咚,亦即来源与目标的端口。由于是 16 位,因此目标与来源端口最大可达 65535 号 (2 的 16 次方)! 那这个埠口有什么用途呢?上面稍微提到过,网络是双向的,服务器与客户端要达成联机的话, 两边应该要有一个对应的埠口来达成联机信道,好让数据可以透过这个信道来进行沟通。 那么这个埠口怎么打开呢?就是透过程序的执行!举例来说,鸟哥的网站上,必须要启动一个 WWW 服务器软件, 这个服务器软件会主动的唤起 port 80 来等待客户端的联机。你想要看我网站上的数据,就得要利用浏览器, 填入网址,然后浏览器也会启动一个埠口,并将 TCP 的表头填写目标端口为 80 ,而来源端口是你主机随机启动的一个埠口, 然后将 TCP 封包封装到 IP 后,送出到网络上。等鸟站主机接收到你这个封包后,再依据你的埠口给予回应。 这么说你或许不好理解,我们换个说法好了。假如 IP 是网络世界的门牌,那么这个埠口就是那个门牌号码上建筑物的楼层! 每个建筑物都有 1~65535 层楼,你需要什么网络服务,就得要去该对应的楼层取得正确的资料。但那个楼层里面有没有人在服务你呢? 这就得要看有没有程序真的在执行啦。所以,IP 是门牌,TCP 是楼层,真正提供服务的, 是在该楼层的那个人 (程序)!
你现在了解了埠口的意义后,再来想想,网络既然是双向的,一定有一个发起端。问题是,到底要联机到服务器取得啥玩意儿? 也就是说,哪支程序应该在哪个端口执行,以让大家都知道该埠口就是提供哪个服务,如此一来,才不会造成广大用户的困扰嘛! 所以啰,Internet 上面已经有很多规范好的固定 port (well-known port), 这些 port number 通常小于 1024 ,且是提供给许多知名的网络服务软件用的。 在我们的 Linux 环境下,各网络服务与 port number 的对应默认给他写在 /etc/services 档案内喔! 底下鸟哥列出几个常见的 port number 与网络服务的对应:
另外一点比较值得注意的是,小于 1024 以下的埠口要启动时,
启动者的身份必须要是 root 才行,所以才叫做特权埠口嘛!这个限制挺重要的,大家不要忘记了喔!
不过如果是 client 端的话,由于 client 端都是主动向 server 端要数据,
所以 client 端的 port number 就使用随机取一个大于 1024 以上且没有在用的 port number。
由于网络是双向的,要达成联机的话得要服务器与客户端均提供了 IP 与埠口才行。 因此,我们常常将这个成对的数据称之为 Socket Pair 了!
由于 IP 与埠口常常连在一起说明,因此网络寻址常常使用『 IP:port 』来说明,例如想要连上鸟哥的网站时, 正确的鸟哥网站写法应该是:『 linux.vbird.org:80 』才对! 2.4.2 TCP 的三向交握 TCP 被称为可靠的联机封包,主要是透过许多机制来达成的,其中最重要的就是三向交握的功能。 当然, TCP 传送数据的机制非常复杂,有兴趣的朋友请自行参考相关网络书籍。 OK,那么如何藉由 TCP 的表头来确认这个封包有实际被对方接收,并进一步与对方主机达成联机? 我们以底下的图示来作为说明。 图 2.4-3、三向交握之封包连接模式 在上面的封包连接模式当中,在建立联机之前都必须要通过三个确认的动作, 所以这种联机方式也就被称为三向交握(Three-way handshake)。 那么我们将整个流程依据上面的 A, B, C, D 四个阶段来说明一下:
也就是说,你必须要了解『网络是双向的』这个事实! 所以不论是服务器端还是客户端,都必须要透过一次 SYN 与 ACK 来建立联机,所以总共会进行三次的交谈! 在设定防火墙或者是追踪网络联机的问题时,这个『双向』的概念最容易被忽略, 而常常导致无法联机成功的问题啊!切记切记!
2.4.3 非连接导向的 UDP 协议 UDP 的全名是:『User Datagram Protocol, 用户数据流协议』,UDP 与 TCP 不一样, UDP 不提供可靠的传输模式,因为他不是面向连接的一个机制,这是因为在 UDP 的传送过程中,接受端在接受到封包之后,不会回复响应封包 (ACK) 给发送端,所以封包并没有像 TCP 封包有较为严密的检查机制。至于 UDP 的表头资料如下表所示:
TCP 封包确实是比较可靠的,因为通过三向交握嘛!不过,也由于三向交握的缘故, TCP 封包的传输速度会较慢。 至于 UDP 封包由于不需要确认对方是否有正确的收到数据,故表头数据较少,所以 UDP 就可以在 Data 处填入更多的资料了。同时 UDP 比较适合需要实时反应的一些数据流,例如影像实时传送软件等, 就可以使用这类的封包传送。也就是说, UDP 传输协议并不考虑联机要求、联机终止与流量控制等特性, 所以使用的时机是当数据的正确性不很重要的情况,例如网络摄影机! 另外,很多的软件其实是同时提供 TCP 与 UDP 的传输协议的,举例来说,查询主机名的 DNS 服务就同时提供了 UDP/TCP 协议。由于 UDP 较为快速,所以我们 client 端可以先使用 UDP 来与服务器联机。 但是当使用 UDP 联机却还是无法取得正确的数据时,便转换为较为可靠的 TCP 传输协议来进行数据的传输啰。 这样可以同时兼顾快速与可靠的传输说!
2.4.4 网络防火墙与 OSI 七层协定 由上面的说明当中,我们知道数据的传送其实就是封包的发出与接受的动作啦!并且不同的封包上面都有不一样的表头 (header),此外,封包上面通常都会具有四个基本的信息,那就是 socket pair 里面提到的『来源与目的 IP 以及来源与目的端的 port number』 。当然啦,如果是可靠性联机的 TCP 封包,还包含 Control Flag 里面的 SYN/ACK 等等重要的信息呢!好了,开始动一动脑筋,有没有想到『网络防火墙』的字眼啊? 封包过滤式的网络防火墙可以抵挡掉一些可能有问题的封包, Linux 系统上面是怎么挡掉封包的呢?其实说来也是很简单,既然封包的表头上面已经有这么多的重要信息, 那么我就利用一些防火墙机制与软件来进行封包表头的分析,并且设定分析的规则,当发现某些特定的 IP 、特定的埠口或者是特定的封包信息(SYN/ACK等等),那么就将该封包给他丢弃, 那就是最基本的防火墙原理了! 举例来说,大家都知道 Telnet 这个服务器是挺危险的,而 Telnet 使用的 port number 为 23 ,所以,当我们使用软件去分析要送进我们主机的封包时, 只要发现该封包的目的地是我们主机的 port 23 ,就将该封包丢掉去!那就是最基本的防火墙案例啦! 如果以 OSI 七层协议来说,每一层可以抵挡的数据有:
2.5 连上 Internet 前的准备事项 讲了这么多,其实我们最需要的仅是『连接上 Internet 』啦!那么在 Internet 上面其实使用的是 TCP/IP
这个通讯协议,所以我们就需要 Public IP 来连接上 Internet 啊!你说对吧~
不过,你有没有发现一件事,那就是『为啥我不知道 Yahoo 的主机 IP ,但是俺的主机却可以连到 Yahoo 主机上?』
如果你有发现这个问题的话,哈哈!你可以准备开始设定网络啰~ ^_^ 2.5.1 用 IP 上网?主机名上网?DNS 系统? 讲完了上头的基本数据,现在你知道要连上 Internet 就得要有 TCP/IP 才行!尤其是那重要的 IP 啊! 问题是,计算机网络是依据人类的需要来建立的,不过人类对于 IP 这一类的数字并不具有敏感性,即使 IP 已经被简化为十进制了,但是人类就是对数字没有办法啊!怎么办?没关系,反正计算机都有主机名嘛! 那么我就将主机名与他的 IP 对应起来,未来要连接上该计算机时,只要知道该计算机的主机名就好了,因为 IP 已经对应到主机名了嘛!所以人类也容易记忆文字类的主机名,计算机也可以藉由对应来找到他必须要知道的 IP ,啊!真是皆大欢喜啊! 这个主机名 (Hostname) 对应 IP 的系统,就是鼎鼎有名的 Domain Name System (DNS) 咯!也就是说, DNS 这个服务的最大功能就是在进行『主机名与该主机的 IP 的对应』的一项协议。 DNS 在网络环境当中是相当常被使用到的一项协议喔!举个例子来说,像鸟哥我常常会连到奇摩雅虎的 WWW 网站去看最新的新闻,那么我一定需要将奇摩雅虎的 WWW 网站的 IP 背下来吗?天吶, 鸟哥的忘性这么好,怎么可能将 IP 背下来?!不过,如果是要将奇摩站的主机名背下来的话, 那就容易的多了!不就是 http://tw.yahoo.com 吗?而既然计算机主机只认识 IP 而已, 因此当我在浏览器上面输入了『http://tw.yahoo.com』的时后,我的计算机首先就会藉由向 DNS 主机查询 tw.yahoo.com 的 IP 后,再将查询到的 IP 结果回应给我的浏览器, 那么我的浏览器就可以藉由该 IP 来连接上主机啦! 发现了吗?我的计算机必须要向 DNS 服务器查询 Hostname 对应 IP 的信息 喔!那么那部 DNS 主机的 IP 就必须要在我的计算机里面设定好才行,并且必须要是输入 IP 喔,不然我的计算机怎么连到 DNS 服务器去要求数据呢?呵呵!在 Linux 里面,DNS 主机 IP 的设定就是在 /etc/resolv.conf 这个档案里面啦! 目前各大 ISP 都有提供他们的 DNS 服务器的 IP 给他们的用户,好设定客户自己计算机的 DNS 查询主机, 不过,如果你忘记了或者是你使用的环境中并没有提供 DNS 主机呢?呵呵!没有关系, 那就设定 Hinet 那个最大的 DNS 服务器吧! IP 是 168.95.1.1 咯!要设定好 DNS 之后,未来上网浏览时,才能使用主机名喔!不然就得一定需要使用 IP 才能上网呢!DNS 是很重要的,他的原理也顶复杂的,更详细的原理我们在第十九章 DNS 服务器里面进行更多更详细的说明喔!这里仅提个大纲! 2.5.2 一组可以连上 Internet 的必要网络参数 从上面的所有说明当中,我们知道一部主机要能够使用网络,必须要有 IP ,而 IP 的设定当中,就必须要有 IP, Network, Broadcast, Netmask 等参数,此外,还需要考虑到路由里面的 Default Gateway 才能够正确的将非同网域的封包给他传送出去。 另外,考虑到主机名与 IP 的对应,所以你还必须要给予系统一个 DNS 服务器的 IP 才行~ 所以说,一组合理的网络设定需要哪些数据呢?呵呵!就是:
其中,由于 Network 与 Broadcast 可以经由 IP/Netmask 的计算而得到,因此需要设定于你 PC 端的网络参数, 主要就是 IP, Netmask, Default Gateway, DNS 这四个就是了! 没错!就是这些数据!如果你是使用 ADSL 拨接来上网的话,上面这些数据都是由 ISP 直接给你的,那你只要使用拨接程序进行拨接到 ISP 的工作之后, 这些数据就自动的在你的主机上面设定完成了!但是如果是固定制 (如学术网络) 的话,那么就得自行使用上面的参数来设定你的主机啰!缺一不可呢!以 192.168.1.0/24 这个 Class C 为例的话,那么你就必须要在你的主机上面设定好底下的参数:
2.6 重点回顾:
2.7 本章习题
2.8 参考数据与延伸阅读
特别感谢:
本文在 2002/07 发出之后,收到相当多朋友的关心,也从而发现了自己误会的一些基础的网络理论,真的是感谢好朋友 Netman 兄与 ZMAN 兄的指导!这篇短文在第二版时 (2003/08/03) 做了相当大幅度的修订,与原来的文章 (上次更新日期 2002/09) 已经有一定程度的差异了,第三版又针对整个内容与阅读顺序进行调整 (2010/08),希望网友们如果有时间的话,能够再次的阅读,以厘清一些基本概念喔!
2002/07/18:第一次完成日期! 2002/09/26:修改了部分可能引起误解的文章部分! 2003/08/03:重新编排版面,并且重新检视文章内容,修订文章! 2003/08/20:增加重点回顾与课后练习 2003/09/06:加入参考用解答 2004/03/16:修订 N-Way 的错误,订正为 Auto MDI/MDIX 的功能! 2006/02/09:将旧的文章移动到 此处 2006/07/12:参考了粘教授与风信子兄的书籍,修改了很多基础数据喔!还有重点整理,不过,练习尚未更新 2006/07/16:加入习题练习啰! 2007/10/21:图14那个 UDP 的表头资料中,16 bits 误植为 16 bytes,感谢讨论区 ricky.liu 的告知! 2008/04/21:经由网友 chyanlong 兄的指点,IHL 的大小单位误植为 byte,应该是字组 (word) 才对。 2010/07/22:将基于 CentOS4.x 所写的数据放置于此处 2010/08/15:将章节依据 TCP/IP 相关的层级分别介绍,更改的幅度不小喔! 2011/07/15:将基于 CentOS 5.x 所撰写的文章移动到此处 2013/07/23:修訂重點回顧CSMA單字的錯誤,Sense誤植為Sence,感謝mubiale告知。 by white |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
本网页主要以Firefox配合解析度 1024x768 作为设计依据 鸟哥自由软件整合应用研究室