计算机网络之 IP 协议与以太网
🍒1.IP 协议
🍇1.1IP 协议格式
IP 是网络层传输的一种主流的传输协议,目前包括两个版本,一个是 IPv4,另一个是 IPv6,从全球范围来看 IPv4 仍然占据主流地位,不过在国内 IPv6 基本上部署的差不多了。下面关于 IP 协议格式的介绍以 IPv4 为主。
🍉1.1.1IPv4 格式
IPv4 协议格式如下:
版本(4 位):用来描述 IP 协议的版本,0100
表示版本为4
,即 IPv4,如果版本为0111
表示版本为6
,即 IPv6。
首部长度(4 位):表示 IP 协议首部的长度,单位是 4 字节,因此 IP 协议首部最大长度为15*4=60
字节。服务类型 TOS(8 位):实际只有 4 位是有效的,TOS 用来切换 IP 传输的状态,TOS 有效的 4 位分别表示最小延时,最大吞吐量,最高可靠性,最小成本,这四种状态,在同一时间传输时,只能选择一种。
数据总长度(16 位):与 UDP 中表示的最大报文长度类似,表示数据载荷的最大长度,最大长度不超过 16 位,即 64k,如果数据大小超过 64k 了,则需要对数据进行分包发送,虽然分包是下策,但是 IP 协议自身已经实现了有关分包组包的操作,保证组包后数据的顺序不被打乱,实现有关分包组包字段为 16 位标识,3 位标志,13 位片偏移。标识(16 位):其实相当于“快递编号”,如果一个快递太大了需要分开发送,那么分开发送的这几个包裹的“快递单号”是一样的,标识就是起到一个类似的作用,就是当将数据分包发送时,同一个数据报的数据,标识是相同的。标志(3 位):其实有效的就 1 位,即第三位,3 位中,第一位保留备用,第二位为1
表示禁止分片,为0
表示允许分片,第三位表示数据分包时,如果是源数据的最后一个包,则会将标志位置为0
,否则为1
。
片偏移(13 位):由 13 位构成,用来标识被分片的每一个分段相对于原始数据的位置,这样就算出现先发的包后到的情况,也能确定该包在原始数据中的位置。生存时间 TTL(8 位):它最初的意思是以秒为单位记录当前包在网络上应该生存的期限,然而,在实际中它是指可以中转多少个路由器的意思。每经过一个路由器,TTL 会减少 1,直到变成 0 则丢弃该包(TTL 占 8 位,因此可以表示 0~255 的数字。因此一个包的中转路由的次数不会超过个。由此可以避免 IP 包在网络内无限传递的问题。)协议(8 位):表示传输层使用的是哪一种协议,比如 TCP 的编号是6
,UDP 编号为17
。首部校验和(16 位):用来校验数据是否正确。源地址,目标地址(32 位):源地址表示发送方的 IP 地址,目标地址表示接收方的 IP 地址,大小为 32 位,也就是说最多能够给大约 42 亿 9000 万的设备分配地址,由于互联网的快速发展,IP 地址快不够用了,所以就有了 IPv6,据说它能够给地球上的每一粒沙子分配地址。对于 IPv4 中的 IP 地址,通常使用点分十进制的方式来表示 IP 地址,就是将 32 位等分成 4 份每份 8 位,比如192.168.31.70
这样的一串数字。可选项:长度可变,通常只在进行实验或诊断时使用。该字段包含如下几点信息:安全级别,源路径,路径记录,时间戳。填充:选项可能不是 32 位的整数倍,为此,通过向字段填充 0,调整为 32 比特的整数倍。
🍉1.1.2IPv6 协议格式
关于 IPv6 相比于 IPv4 的变化,《图解 TCP/IP》有如下解释:
IPv6 中为了减轻路由器的负担,省略了首部校验和字段(因为 TCP 和 UDP 在做校验和计算的时候使用伪首部,所以可以验证 IP 地址或协议是否正确。因此,即使在 IP 层无法提供可靠传输,在 TCP 或 UDP 层也可以提供可靠传输的服务。关于这一点可以参考 TCP 或 UDP 的详解。)。因此路由器不再需要计算校验和,从而也提高了包的转发效率。此外,分片处理所用的识别码成为可选项。为了让 64 位 CPU 的计算机处理起来更方便,IPv6 的首部及可选项都由 8 字节构成。
IPv6 协议结构如下:
对比与 IPv4 做出一些总结:
版本的作用与 IPv4 相同。
通信量类与 IPv4 的 TOS 作用类似。
流标号听说用于服务质量控制,emm,不太了解。
有效载荷长度和 IPv4 数据总长度意思一样,不够 IPv6 称自己能够最大能够一次发送 4G 的数据,听说是可选项的功劳。
下一个首部字段,相当于 IPv4 协议字段。
源地址与目标地址相当于 IPv4 的源地址与目标地址,IPv6 拥有 128 位,我算算,位数相当于 IPv4 的四倍,那么能够表示地址的大小就是 IPv4 能够表示地址大小的 4 次幂,太恐怖了,听说能够给地球上的每一粒沙子编号。
跳数限制相当于 IPv4 的生存时间 TTL。
🍇1.2IP 地址
上面说了那么多有关 IP 协议格式,但 IP 地址究竟是什么呢?对于 IPv4,IP 地址本质上就是一串 32 位的序号而已,以点分十进制的方式呈现出来,即平均将这 32 位平分为 4 份,每份 8 位,使用.
分割,每份数据的范围为 0-255,比如192.168.31.70
就是一个 IP 地址。
IP 地址分为两个部分,即网络号+主机号,网络号能够描述当前的网段信息(局域网标识),主机号区分了局域网中的主机。
要求在同一个局域网内,网络号必须相同,主机号不能相同,两个相邻的局域网(同一台路由器连接),网络号是不同的。
比如上面的192.168.31.70
,192.168.31
表示网络号,70
表示主机号。但是网络号的位数与主机号的位数是固定的吗?当然不是,在计算机网络,有一个专有名词叫做子网掩码 ,它也是一个 32 位的数,对应 IP 地址的每一位,如果为1
就表示这一位是网络号,为0
就表示主机号,子网掩码不会混着排列,左边为1
表示网络号,右边为0
表示主机号。
打开电脑的命令行,输入ipconfig
,就能获取到本机的 IP 地址:
就能获取到本机的 IP 地址和子网掩码,上图表示的子网掩码表示前 24 位是网络号,后 8 位表示主机号,毕竟自己的路由器也连接不了不少设备,8 位完全够用,如果是公司或者学校,主机号很可能会长一点。
一些特殊的 IP 地址,如果 IP 地址的主机号为 0,那么这个 IP 就是网络号,一般局域网内正常的设备主机号不会为 0,如果 IP 地址的主机号全为 1,那么这个 IP 就表示广播 IP 地址,即在这个广播地址上发送消息,整个局域网都会收到。
还有,127 开头的 IP 地址,表示环回 IP,就是表示主机自己,比较常用的就是127.0.0.1
。IP 地址是 10 开头,192.168 开头,172.16~172.31 开头的 IP 地址是同一个局域网内部的 IP(内网 IP),除去上面这一些类型的 IP 地址,剩下的 IP 称为外网 IP,也就是直接在广域网使用的 IP。
有关局域网与广域网 IP 我有以下几点说明:
内网 IP 在局域网内部是唯一的,但是在不同的局域网内,可以存在相同的 IP 地址。
外网 IP 是唯一的,每个外网 IP 对应一个唯一的设备。
我们知道,IPv4 地址最多能够支持 42 亿 9000 万的设备编号,但是随着互联网的迅速发展,很快就不够用了,因此提出了三种解决方案:
动态分配 IP 地址,就是当设备上网的时候才分配 IP,否则不分配 IP,这种方案指标不治本,问题并没有完全解决。
NAT 机制,当前网络环境使用的就是这种方案,就是让多个设备使用同一个外网 IP,我们用的最多就是运营商的 IP,这就把网络分为了两个部分,一个是局域网,另一个是广域网,当我们多个设备连接上运营商提供的网络时,这些设备就组成了一个局域网,IP 通常是
198.168
开头,而我们知道不同局域网的 IP 是允许相同的,外网 IP 是唯一,这就缓解了外网 IP 分配的压力,对于外网 IP,我们在互联网任意的位置都能访问,而对于内网 IP,只能在所在的局域网内才能访问。同样,这个方法,只是解燃眉之急,治标不治本。IPv6,我们前面说过,IPv6 的 IP 地址大小是 128 位,位数是 IPv4 的 4 倍,那么能够支持编号数是 IPv4 的 4 次幂,听说能够为地球上的每一粒沙子进行编号,我们知道,制造电脑需要硅,硅由沙子提取,如果能够为沙子编号,那电脑等设备也不在话下,至少在人类到达星际文明之前都是够用的,这是根本方法。
关于 NAT 机制,我再补充一点,就是多个设备使用一个 IP 地址,在这多个设备组成的局域网中,有多台设备访问外网的同一服务器,服务器收到的 IP 地址是一样的,那该如何区分请求是来自那一台设备呢?很简单,通过端口进行识别,如果在这个局域网在存在相同的端口号,则系统会重新分配端口号,当然如果这个局域网连接的设备太多了,端口号不够用了那就好出现问题了,这也是 NAT 机制的问题,最根本的方法是使用 IPv6。
既然 IPv6 这么香,为什么现在还流行 IPv4+NAT 呢?主要的原因就是 IPv6 与 IPv4 不兼容,那就造成需要升级 IPv6 就得换设备,那换设备要钱吧,那这钱谁出呢?但是我们国内 IPv6 升级的差不多了,主要是工信部给力啊。
🍇1.3 路由选择
路由选择其实就是规划路径,数据想要从一个设备到另一个设备,需要先规划一条路出来,然后数据沿着这条路进行传输,传输到目标 IP 地址。
但是仅仅拥有目标 IP 是不够的,在数据发送的过程中还需要类似于“指明路由器”的类似信息,才能发送到目标地址。也就是说,数据传输过程中如果不知道目标地址在哪,它就会找就近的人问路,就算给不出一条具体的路径,但是也会获得一个大致的方向,然后数据会沿这个方向走一段距离,找到另外一个路由器,这个过程也被称为下一跳,找到路由器后,又会进行问路,如果路由器知道目标地址在哪里,就会把路径的细节告诉这个数据,然后数据就会按照这个路径找到目标地址,如果这个路由器也不知道在哪,就会给出一个方向,以此类推,直到找到这个目标地址为止。
那路由器为什么能够找到目标地址,或者大致的一个方向呢,这是路由器中维护了一个路由信息表,表里面记录一些网段信息以及每个网络号对应的网络接口。至于路由器时如何形成路由表的,一是当路由器接入网络后,就会和相邻的设备“认识认识”,在认识的时候就构造了这个信息表,二是通过网络管理员手动导入。
🍒2.以太网
数据经过网络层的封装后,会进入数据链路层进一步封装,数据链路层最常用的协议就是“以太网”,协议格式如下:
目的地址,源地址(6 字节):数据链路层的地址是 MAC 地址,表示物理层地址,每一个设备只有一个物理层地址,这在硬件出厂时就已经写死的(大部分),它的地址长度比 IPv4 长了 6w 多倍,如80-30-49-26-8E-D9
就是一个物理地址,在命令行输入ipconfig /all
就能够查看自己设备的物理地址。帧尾(4 字节):帧尾的功能一般是校验,它是一个叫做 FCS(Frame Check Sequence,帧检验序列)或 CRC 算法实现的校验和。
以太网数据帧的最大数据载荷称为 MTU,这个范围一般取决于硬件设备,不同硬件设备的 MTU 也不同。数据链路层考虑的是相邻设备,或者说是直接连接设备的数据传输,考虑到这个细节的时候,就需要关注传输的硬件设备,不同的硬件,搭载的数据量也不同。
除了 MTU 还有一个类似的概念,那就是 MSS,表示在不分包的情况下,除去 IP 与 TCP 首部能够搭载的最大容量。
ARP 报文,并不是用来传输数据的,而是一个辅助信息,就是将 IP 地址与 MAC 地址一一对应起来,建立成一个类似哈希表的映射关系,MAC 地址每传输一次都会发生改变。当设备启动的时候,就会在所处的局域网发起一个广播,获取局域网内设备的 IP 与 MAC 地址,根据各个设备响应的信息就能建立一个 IP 与 MAC 对应的映射表。
🍒3.DNS 域名解析
对于我们人类来书说,IP 地址并不好记,为了方便人类的记忆,就将 IP 地址用一个域名(比如www.baidu.com
)来指代,而 DNS 能够将 IP 与域名对应起来,形成映射关系。
DNS 最开始的时候就是一个 hosts 文件,不过随着发展,现在就有一个机构专门在服务器上维护 hosts 文件,如果你需要域名解析,就可以访问它们的网站获取。
当然,就一个根服务器是满足不了全球用户的访问的,于是运营商就就近架设了镜像的服务器,镜像服务器会定时同步根服务器上的数据。
当我们主机查询一次 DNS 后,会把查询结果缓存保留一段时间,这样下一次访问网站的时候就不用频繁地查询 DNS 了,一般情况下,电脑会自动获取 DNS 域名解析地址(默认项)。打开电脑的网络设置,点击“更多网络适配器选项”。
右键 WLAN 或以太网,选择属性。
选择 IPv4 的属性就能设置了。
这样就可以自己去设置 DNS 域名解析的地址了,常用的有 114.114.114.114,当然还有很多很多,网上一查全都是。
下期预告:一文带你认识 HTML
版权声明: 本文为 InfoQ 作者【未见花闻】的原创文章。
原文链接:【http://xie.infoq.cn/article/e44bc4f4595009b45a863ade6】。文章转载请联系作者。
评论