计网之IP协议和以太网

一. IP协议

IP协议是位于OSI模型中第三层(网络层)的协议, 在这层上工作的不止这一个协议, 但IP协议是网络层传输所使用的最主流的一种协议, 有IPv4和IPv6两个版本, 目前IPv4在全球仍然是主流使用的协议, 但IPv6在中国已经基本普及了, 而且中国也是全球IPv6覆盖率最高的国家, 下面内容的介绍以IPv4为主.

1. IPv4报头介绍

IPv4协议格式如下:

img

版本(4位): 用来描述IP协议的版本, 这个属性只有两个取值, 即4, 6, 分别表示IPv4和IPv6.

首部长度(4位): 描述了IP协议首部的长度(报头), 单位是4字节, 报头中有选项部分的存在(可选字段+填充), 因此IP报头是变长的, 最大长度为15*4=60字节.

服务类型TOS(8位): 实际只有4位是有效的, TOS用来切换IP传输的四种形态/工作模式, TOS有效的4位分别表示最小延时(延迟尽量小), 最大吞吐量(传输速度尽量大), 最高可靠性(可靠性尽量大), 最小成本(资源消耗尽量小), 这四种状态, 在同一时间传输时, 只能选择一种模式; 而在实际开发中是很少专门去切换这几个模式的, 因为这几个模式都是站在技术角度来处理的, 而实际上, 性能瓶颈往往是业务带来的.

总长度(16位): 描述了一个IP数据报的总长度(报头+数据载荷), 最大长度不超过16位, 即64k, 这个长度减去IP报头长度, 剩下的就是载荷长度(一个完整的TCP /UDP数据报), 但只有16的总长度的限制并不意味着IP协议最大只能传输这16位长度的数据, 如果要传输的数据长度超过64k了, 在这个限制下IP协议自身还支持对包的拆分和组装, 也就是说如果网络层从传输层拿到的数据太长了, 超过64KB, 就会在网络层针对数据进行拆包, 也就是把一个数据分成多个IP数据报分别进行发送, 而接收方网络层会将载荷重新拼装再交给传输层; 实现有关拆包组包字段为16位标识, 3位标志, 13位片偏移.

标识(16位): 一份数据拆包发送时, 同一个数据报的数据, 标识是相同的.

标志(3位): 用来标志拆包的结束标志, 即将源数据的最后一个包标志为0, 否则为1.

片偏移(13位): 由13位构成, 用来标识被分包的每一个分包相对于原始数据的位置, 这样就算出现先发的包后到的情况, 也能确定该包在原始数据中的位置, 保证组包后数据的顺序不被打乱.

生存时间TTL(8位): 表示一个数据报在网络上能够传输的最大时间, 但这个时间的单位并不是 “时间单位”, 而是次数, 指的是可以中转多少个路由器的意思, 每经过一个路由器, TTL就会减少1, 如果TTL变成了0还没有到达目标, 此时就认为这个包永远都到不了, 就会丢弃该包.

协议(8位): 描述了当前载荷部分的内容时属于哪一个协议(TCP/UDP).

首部校验和(16位): 只针对IP协议首部进行校验, 载荷部分(TCP/UDP数据)自身已经有校验和了.

源地址, 目标地址(32位): 这是IP协议中最重要的组成部分, 源地址表示发送方的IP地址, 目标地址表示接收方的IP地址, 通常使用点分十进制的方式来表示IP地址, 就是将32位等分成4份每份8位, 比如117.86.92.37 这样数字串.

可选项和填充: 这个字段使IP首部是变长的, 填充部分是为了防止选项可能不是32位的整数倍, 为此, 通过向字段填充0, 调整为32比特的整数倍.

2. 解决IPv4地址不够用的问题

最主流的IPv4是用4字节来表示IP地址的, 最多能够给大约42亿9000万的设备分配地址, 而理想情况下是期望给每个设备都单独分配一个不同地址, 但由于现时代中互联网/物联网的高速发展, 想要给每个设备都分配一个地址, 4字节就不够用了.

现在为了解决IP地址不够用的问题, 主要有下面三种办法:

🎯1. DHCP动态分配IP地址.

就是当有设备联网使用的时候就使用分配一个IP地址给当前设备, 如果当前设备不联网了, 那么就不分配了, 但这种方案治标不治本, 只是提高了地址的利用率, 根本上IP地址的个数并没有增加.

🎯2. NAT网络地址转换

在NAT机制下, 把IP地址分成了两个大类:

  1. 内网IP(私有IP)

一个路由器下的电脑都处在一个内网中, 也称之为局域网, 内网IP不同的局域网是可以重复的, 出了局域网, 内网IP就无法访问了, 内网IP网段只有几个, 只要ip地址不属于 10.X.X.X, 192.168.X.X, 172.16.X.X-172.31.X.X 这几个网段范畴的, 都是公网IP.

  1. 外网IP(公网IP)

外网IP是互联网中唯一的地址, 不会出现重复的情况, 分配外网IP的设备可以被互联网中其他的电脑直接访问到.

NAT本质上是使用一个外网IP代表N个内网IP的设备, 就好比网上购物, 收货地址填写的是小区的地址, 而小区里有很多人, 每个人用姓名和手机号区分, 而进入内网 IP后则是使用端口号区分.

如果某个内网里的设备想访问公网的设备, 就需要对应的NAT设备(路由器)把内网IP映射成公网IP, 从而完成网络访问; 反之, 公网的设备也是无法直接访问私网的设备的, 不同局域网的私网的设备没法直接相互访问.

img

注意观察主机A的源IP的变化, 在发送给路由器之前, 主机A的源IP是路由器的内网IP, 当主机A去访问外部服务器时IP地址会被路由器替换成路由器自己的外网IP(会把IP数据报中的源IP给改了), 站在眼务器的视角看, 主机A的IP地址就是路由器的公网IP, 也就是说只要设备是经过运营商路由器将数据转发给服务器的, 服务器看到的源IP就都─样的; 如果是多个设备同时访问同一个服务器, 服务器的响应就会先发给路由器, 路由器根据这些设备不同的端口号来区分将响应发给哪个设备.

这种场景下, 服务器能拿到的只是路由器的IP, 不能拿到具体内网设备的IP, 如果内网中的设备不主动和服务器联系, 服务器该设备的端口号, 也就无法主动的去找到内网设备进行联络.

NAT机制能够有效解决IP地址不够用的问题, 但带来的副作用就是让网络环境更加复杂了…

🎯3. 使用IPv6

IPv6使用16字节表示IP地址, 这可表示的IP地址个数就是一个天文数字了, 据说把地球上的每一粒沙子都分配一个IPv6地址都是够用的, IPv6虽然看起来可以完美的解决问题, 但当今世界上仍然是以NAT+ IPV4+动态分配来进行网络组建的, 除了国内, 世界上其他地方IPv6的覆盖率还是比较低的, 这是因为, lPv6和IPv4是不兼容的, 要想支持IPv6就需要大范围更换路由器等网络设备, 这个成本是极大的, 而国内环境主要是工信部给力啊.

3. IP地址管理

在IPv4中, IP地址分为两个部分, 即网络号和主机号, 网络号能够描述当前的网段信息(标识局域网), 主机号区分了局域网中的主机; 要求在同一个局域网内, 网络号必须相同, 主机号不能相同, 两个相邻的局域网(同一台路由器连接), 网络号不能是相同的.

比如192.168.31.35这个IP地址, 192.168.31表示网络号, 35就表示主机号, 下图中就是一个典型的局域网环境:

img

一个路由器都是有两个IP分别属于不同的网段, 通过这两个IP就可以把两个局域网连接到一起, 可以看到, 图中两个相邻的局域网的网络号是不能相同的, 属于一个局域网中的设备网络号都是相同的但主机号是不同的, 通过这样网络号和主机号这样的划分就可以进行组网了.

但网络号的位数与主机号的位数并不是固定的, 在计算机网络, 有一个单独的概念叫做子网掩码, 它也是使用32比特位对应IP地址的每一位, 如果为1就表示这一位是网络号, 为0就表示主机号, 它是独立于IP地址的另一串数字来辅组记录的, 子网掩码不会混着排列, 左边为1表示网络号, 右边为0表示主机号.

对于家用设备来说, 子网掩码最常见的就是255.255.255.0了, 即11111111111111111111111100000000, 表示IP地址中左边24位构成网络号, 右边8位构成主机号.

在win系统中打开cmd命令窗口, 输入ipconfig, 就能获取到本机的IP地址及子网掩码.

img

还有一些特殊的IP地址有着特殊的作用:

  • 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网.
  • 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包.
  • 127.*的IP地址用于本机环回(loop back), 通常是127.0.0.1, 本机环回主要用于测试程序是否能正常工作, 是本机到本机的网络通信(系统内部为了性能, 不会走网络的方式传输), 对于开发网络通信的程序(即网络编程)而言, 常见的开发方式都是本机到本机的网络通信.
  • 主机号为1, 即IP地址段的第一个, 比如192.168.0.1, 通常是"网关IP(不绝对, 是可以配置的).

4. 路由选择

路由选择其实就是规划路径, 数据想要从一个设备到另一个设备, 需要先规划一条路出来, 然后数据沿着这条路进行传输, 传输到目标IP地址; 但由于网络环境非常复杂, 任何一个节点(路由器)都是无法感知到网络环境的全貌的, 一个路由器最多只认识它的一些邻居节点(或者是邻居的邻居……), 也就是说一个设备是不可能有数据传输的完整路径的, 它知道了目标IP只是知道了大致方向, 具体下一步该怎么走还需要向附近的节点询问(就类似于我们生活向别人问路).

路由选择的核心思路就是 “问路”, 每个路由器都会保存一定的周围设备的信息(路由信息表, 记录一些网段信息以及每个网络号对应的网络接口), 每次有一个IP数据报经过路由器, 就需要匹配路由表, 看看接下来该怎么走, 如果路由表上有匹配的项(该路由器认识路), 直接按照要求走就行了, 如果没有匹配的项(路由器不认识路), 会提供一个默认路径, 这个默认路径提供的大体方向是不会错的, 沿着这个方向继续走, 继续问, 直到到达目标IP; 当然也有可能是到不了的, 因为每经过一个路由器问一次, 生存时间TTL就会减1, 如果减到0了还没到达目标IP, 就表示这个包永远也到不了的, 这个包就会被丢弃.

二. 以太网

数据链路层中使用的典型协议也有很多, 其中最知名常用的就是 "以太网"了, 考虑的是相邻两个节点(通过网线/光纤/无线直接相连的两个设备)之间的传输, 以太网除了规定了数据链路层的协议外还规定了一些物理层的内容, 组网所使用的的网线也叫做 “以太网线”, 是遵循以太网协议的网线.

以太网帧体格式如下:

img

一个完整的以太网数据帧是由帧头(目的地址+源地址+类型), 帧尾再加上数据载荷构成的, 普通的以太网数据帧(类型0800), 载荷部分就是一个完整的IP数据包, 而类型0806载荷部分是一个ARP报文, ARP是数据链路层中另外的一个协议, 通过这个协议让让某个路由器/交换机, 能够认识局域网里的其他设备(义会在交换机/路由器里建立出一个表, 相当于是一个Hash表, 能够建立出IP和MAC地址之间的映射关系); 同样, 类型0835载荷部分就是一个RARP报文.

目的地址, 源地址(6字节): 数据链路层的地址是MAC地址, 表示物理层地址, 这个地址和IP地址是完全独立的另一套地址体系, 每一个设备只有一个物理层地址, 在网卡等硬件设备出厂时这个地址就已经写死了(大部分), 使用6个字节来表示, 地址长度比IPv4长了6w多倍, 如80-30-49-26-8E-D9就是一个物理地址, 在命令行输入ipconfig /all就能够查看自己设备的物理地址.

img

本来只有一个地址体系也是可以的, 比如IP和以太网都使用IP地址/MAC地址, 但是在最初大佬们研发初代的协议栈的时候, 研发网络层协议的大佬和研发数据链路层协议的大佬是两伙人, 是互不干涉的, 于是不可避免的各自独立的研发出了一套地址体系, 然后就形成了IP和MAC相互配合的的地址体系; IP地址用来描述整个传输过程的起点和终点, 而MAC则是用来描述两个相邻节点的起点的终点.

帧尾(4字节): 帧尾的功能一般是校验, 它是一个叫做FCSCRC算法实现的校验和.

以太网数据帧的最大数据载荷称为MTU, 载荷具体多长和使用的物理介质和数据链路层使用的协议有很大关系, 不同硬件设备的MTU也不同; 正是这个MTU引起了IP这个协议要进行分包组包, IP的分包组包通常不是根据IP数据包最大长度64k来分的, 大概率情况下数据链路层的MTU都比64kb要小.

img

除了MTU还有一个类似的概念, 那就是MSS, 表示在不分包的情况下, 除去IP与TCP首部能够搭载的最大容量.

三. 浅谈DNS域名解析系统

对于人类来说, IP地址并不好记, 为了方便人类的记忆, 就将IP地址用使用简单的单词字符串来指代, 也就是我们平时所常见的网址, 也叫做域名(比如www.baidu.com), 而DNS能够将IP与域名对应起来, 形成映射关系, 每个域名都了对应一个/N个IP地址(负载均衡), DNS是应用层的的一个协议.

在早期的时候, 互联网上的服务器很少, 这域名和IP这样的映射关系只是使用一个hosts文件来维护, 每个用户只需要手动自己的hosts文件就可以了, 现在的电脑还是有这个文件的, 也可以使用.

img

后来互联网蓬勃发展, 到现在每天都有很多新的网站诞生, 此时想要依靠手机维护已经不现实了, 于是现在就有了DNS服务器来维护域名和IP的映射关系, 当你想要访问某个域名时, 就会自动请求DNS服务器, 然后就会返回具体IP地址进行访问.

如果电脑的DNS服务器配置不对, 或者是DNS服务器挂了, 就会出现一个典型的情况: 网络正常的情况下, QQ等应用程序可以用, 但是网页打不开了.

我们自己电脑的DNS服务器可以通过如下方式配置,

首先打开设置中 “网络和Internet” 中的 “高级网络设置” , 点击 “更多网络适配器器选项”.

img

然后右击WLAN或者以太网, 选择属性.

img

然后选择IPv4的的字段就可以进行配置了.img

这里可以自己去配置DNS服务器的地址, 常用地址百度一下就行, 很多的, 也可以选择自动获取(从路由器中获取).

全球共有13台根域名服务器, 这13台根域名服务器中名字分别为 “A” 至 “M”, 其中A为为主根服务器, 放置在美国, 其余12个均为辅根服务器, 其中9个放置在美国, 欧洲有2个, 位于英国和瑞典, 亚洲有1个, 位于日本, 光有这些根服务器是满足不了全球用户的访问的, 各处的运营商就会架设镜像服务器, 镜像服务器会定时同步根服务器上的数据.

任何连接到因特网上的主机或路由都有唯一层次结构的名字即域名, 为了保证这里的唯一性, 因特网采用层次树状结构命名的方法, 域是名字空间中一个可被管理的划分(按机构组织划分), 域可被划分为子域,子域可再被划分, 即形成了顶级域名(一级域名), 二级域名, 三级域名等, 从右向左为顶级域名, 二级域名, 三级域名等, 用点隔开, 如:tieba.baidu.com, 它由三个标号组成, com即为顶级域名(还有.com, .cn, .org, edu等)表示公司, baidu为二级域名表示这个公司是百度, tieba即为三级域名对应了百度贴吧, 而且域名是不分区大小写的.

img

域名分级后, 对应的DNS服务器也是有分级的, DNS系统开发者设计了一个与分层DNS域名结构类似的层次化的DNS名称服务器结构, 把所有DNS名称服务器自高到低分为4个级别:根名称服务器, 顶级名称服务器, 权威名称服务器和本地域名服务器.

img

查询DNS服务器也是 “分级查询” 的, 从根域名开始, 依次查询每一级域名的NS记录, 直到查到最终的IP地址.

  • 76
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 56
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 56
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韵秋梧桐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值