网络基础——网络层IP详解

IP地址,非常熟悉的名词,就算是非计科专业的人也有耳闻,他帮助我们在这个复杂的网络环境中确定一个合适的路径去找到我们要找的主机(IP=网络号+主机号),那他怎么找的呢,那就得说IP协议了,在谈IP协议前,我们先谈谈以前学过的TCP和IP的区别,更好我们去理解

问题1:IP协议vsTCP协议,各自都解决什么问题?

1、TCP协议是做决策的,他指挥下层协议应该怎么做,出了问题又应该怎么做,就比如TCP的一些决策:流量控制、拥塞控制等

2、IP协议则是执行命令的,他提供了一种能力,可以较大概率将主机A跨网络传送给主机B的能力。作为执行者IP不提供可靠性机制,可靠性则由上层协议完成

通过上面描述,我们已经可以分清楚IP和TCP的主要区别功能,接下来我们就要学习一下IP协议

概念补充:

                1、主   机:配有IP地址,但是不就行路由控制(不一定)

                2、路由器:配有IP地址,进行路由控制

                3、节   点:主机和路由器的统称

一、协议头格式

 

 1、4位版本:指IP地址用的是IPv4还是IPv6,一般都用的IPv4所以不用管,IPv6和IPv4并不通用。

2、4位首部长度:每位以字节为单位,整个IP首部的长度为20字节所以这4位一般为0101,表示5*4字节

3、8位服务类型:其中前三位优先权字段已经弃用,1位保留字段(必须置0),4位TOS(Type Of Server)字段分别表示:最小延时,最大吞吐量,最高可靠性,最小成本,这四者相互冲突,只能有一个置1。服务类型一般给路上的路由器节点用,根据需求来选择怎样传输,例如要小延时那就得加急传输。

4、16位总长度:表示该数据报整体占多少个字节

5、16位标识:唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个 id都是相同的.

6、3位标志:第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁 止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0. 类似于一个结束标记

7、13位片偏移:是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片 在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报 文的长度必须是8的整数倍(否则报文就不连续了)

8、8位生存时间(TTL):数据报的传输是一个节点传输到另一个节点,传输到下一节点叫做一跳,每经过一个路由TTL就减一,一直减到0还没有到达则会被丢弃。主要为了防止数据报的目标地址已经不存在但是他还一直在网络中跳来跳去损耗资源。

9、8位协议:用来记录向上交付时交付给哪个上层协议的类型(UDP还是TCP)

10、16位首部检验和:使用CRC进行校验, 来鉴别头部是否损坏.

11、32位源IP地址:表示发送端

12、32位目的IP地址(最重要):表示接收端

13、选择字段(不定长,最多40字节):略

在IP获得了数据后需要在这之后添加自己的报头,再给链路层传输,会遇到以下分片的问题

分片问题:IP分片不是大部分情况

问题2:为什么会分片?

        当我们从应用层到传输层到网络层再到数据链路层,数据链路层才是帮助我们往网络里发送数据,他一次发送的数据大小是有限的,允许发送的最大字节MTU:1500字节(ifconfig查看),所以当我们要发送的数据大于1500字节就需要分片,直到最后一片小于1500字节

问题3:为什么要在网络层里进行分片?

        1.只有网络层知道源IP和目标IP,数据链路层哪知道这些?他只知道发就行了

        2.谁组装谁分,当数据链路层拿到了数据要送给上层,那么上层就得组装

问题3:如何分片?

举例说明:网络层报文要发送1500字节

        1500字节加上20字节的IP报头=1520字节,已经大于1500字节,所以此时要分片,1500分成1480字节和20字节,每个片加上字节的IP报头就变成了  片1:1500字节+片2:40字节

问题4:分片真的好吗?

        当然是不好了,我们知道在数据传输的时候会可能丢包的情况,那包增多了,那丢包的概率也就更大了,所以并不好。所以说IP大部分情况我们最好不分片,所以我们有时候需要控制分片的问题

问题5:谁决定分片?

        是数据链路层吗?他好像只关心发送数据,那是网络层IP吗?IP说我也很难啊,上面给我这么多数据,我只管干活(添加报头)就完了,其它我也管不了了啊!所以分片是由传输层决定的。

        一般而言,我们还是为了减少分片,要TCP控制自己的单个报文的大小的,如果是UDP的话没有缓存区直接交付给下层那就得分片了

 解决了上面问题,对端IP接收到了数据报,那么怎么拆解数据报并提交给传输层呢(TCP/IP),就会出现以下问题:

问题6:如何区分是否是同一个报文?

        由16位标识符区分,没有分片,各报文不同,标识符是不同的,如果分片则标识符是一样的,属于同一个报文的分片的标识符是一样的

问题7:知道了是同一个报文,如何拼凑出一个完整的报文

        首先先升序排序即可

问题8:如何知道报文丢失了没有?

        通过13位片偏移量,我们可以计算出下一个报文的首地址,如果首地址对不上号那么就说明有报文丢失了,丢弃该报文重传。又有问题了,如果最后一个报文丢失了呢?

问题9:如何知道报文是否接收完整

        每个报文都有一个3位标志,其中的1位表示是否有更多分片,如果该报文后还有报文那么该位为1,如果没有了则为0接收就完成了,通过判断该位知道报文是否接收完整,也能解决问题8的,最后一个报文的标志位为1那么就说明后面还有,但是后面没了那就说明丢了。

问题10:接收端,如何得知报文是独立的还是一个分片?

        如果偏移量大于0或者更多分片的标志位为1,则是分片报文。如果偏移量为0并且更多分片标志位为0则是独立报文。

  

二、网段划分

IP地址分为两个部分,网络号和主机号

1.网络号:保证相互连接的两个网段具有不同的标识;

2.主机号:同一网段,主机之间具有相同的网络号,但是必须有不同的主机号;

3.不同的子网其实就是把网络号相同的主机放到一起.

4.如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网 中的其他主机重复

通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同. 那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情.

        有一种技术叫做DHCP(动态主机配置协议), 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.

        一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器

 路由器可以把一个IP分配给多个主机使用,这些主机对外表现出一个IP。

我有一点分不清交换机和路由器,交换机可以把很多主机连起来这些主机对外各有各的IP

问题1:为什么要网段划分?

举个例子:如果一名同学丢失了钱包,而正好你捡到了拾金不昧,想要归还,有什么办法呢?

第一种方法,在门口堵人挨个询问谁丢了钱包,效率太低,可能得找一天

第二种方法,将这个事情告诉班长,班长再发消息到班长群中,如果这个群里没人知道这名同学,那么由班长的上级院主席发送到院群中,根据该同学的学号,确定这名同学在哪个院的再交给这个院的班长群,这个群里的班长肯定认识这名同学,那么就找到了这名同学

通过几次的转发信息就确定了该同学是哪位,所以网段划分本质就是帮助我们排查,每次排查就可以排除一大批的人,帮助我们快速找到目标

问题2:如何网段划分?

过去曾经提出一种划分网络号和主机号的方案,把所有IP 地址分为五类

A类 0.0.0.0到127.255.255.255

B类 128.0.0.0到191.255.255.255

C类 192.0.0.0到223.255.255.255

D类 224.0.0.0到239.255.255.255

E类 240.0.0.0到247.255.255.255

随着互联网的飞速发展,这种网段分配方法的缺陷很快显现出来了,大多数组织都申请的是B类,则很快就申请完了,而A类则浪费了很多地址针对这种情况则提出了新的划分方案,CIDR

新的划分方式CIDR(Classless Interdomain Routing):

▪引入一个额外的子网掩码(subnet mask)来区分网络号和主机号

子网掩码也是一个32位正整数,通常用一串"0"来结尾

▪将IP地址和子网掩码"按位与"操作,得到的结果就是网络号;

▪网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

特殊IP地址

▪将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;

▪将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数 据包;

▪127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1

举例:

IP地址 :140.252.20.68

子网掩码:255.255.255.240

网络号:140.252.20.64

该网段的子网地址范围140.252.20.64~140.252.20.79

网络地址:140.252.20.64

广播地址:140.252.20.79

可用主机范围:140.252.20.65~140.252.20.78

IP地址的数量限制

我们知道, IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方 个IP地址, 大概是43亿左右. 而TCP/IP 协议规定, 每个主机都需要有一个IP地址.

这意味着, 一共只有43亿台主机能接入网络么? 实际上, 由于一些特殊的IP地址的存在, 数量远不足43亿; 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡 都需要配置一个或多个IP地址. CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然 不是很够用. 这时候有三种方式来解决:

1、动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到 的IP地址不一定是相同的;

2、NAT技术

3、IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表 示一个IP地址; 但是目前IPv6还没有普及;

私有IP地址和公网IP地址

如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都 可以,但是RFC 1918规定了用于组建局域网的私有IP地址

▪10.*,前8位是网络号,共16,777,216个地址

▪172.16.到172.31.,前12位是网络号,共1,048,576个地址

▪192.168.*,前16位是网络号,共65,536个地址

▪包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);

 ▪一个路由器可以配置两个IP地址, 一个是WAN口IP, 一个是LAN口IP(子网IP).

▪路由器LAN口连接的主机, 都从属于当前这个路由器的子网中.

▪ 不同的路由器, 子网IP其实都是一样的(通常都是192.168.1.1). 子网内的主机IP地址不能重复. 但是子网之 间的IP地址就可以重复了.

▪每一个家用路由器, 其实又作为运营商路由器的子网中的一个节点. 这样的运营商路由器可能会有很多级, 最外层的运营商路由器, WAN口IP就是一个公网IP了.

▪子网内的主机需要和外网进行通信时, 路由器将IP首部中的IP地址进行替换(替换成WAN口IP), 这样逐级 替换, 最终数据包中的IP地址成为一个公网IP. 这种技术称为NAT(Network Address Translation,网络地 址转换).

▪如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服 务器上. 这样的服务器可以在阿里云/腾讯云上进行购买

路由

在复杂的网络结构中, 找出一条通往终点的路线;

什么是路由呢?

举例子,我在北京的某个地方,我想去吃海底捞,但是我不知道怎么去,于是乎我找了个大爷问路,大爷这时候就有两个选项

1、知道,知道也分两种,海底捞就是他开的,第二种知道个大概方向,到了那你需要再问

2、不知道,大爷就会说,你去问问旁边的大妈吧她可能知道

网络是由多个路由器连接的,路由的过程,就是一跳一跳向下”问路“的过程

▪当IP数据包, 到达路由器时, 路由器会先查看目的IP;

▪路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;

▪依次反复, 一直到达目标IP地址

 那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护一个路由表

destination:目标网段            Gateway:网关(吓一跳路由器)      Genmask:子网掩码

Metric:跳数             iface:发送接口

Flags:U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的 地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发

destination:                  genmaske                          flag                 iface

192.168.10.0                  255.255.255.0                  U                    eth0

192.168.56.0                  255.255.255.0                  U                     eth1

default                            192.168.10.1                    U                     eth0

举例说明1:

如果要发送的数据包的目的地址是192.168.56.3

192.168.56.3与第一行子网掩码做按位运算得到192.168.56.0与192.168.10.0的目标地址不符

再与第二行的子网掩码与得到192.168.56.0,目的网络地址符合,因此从eth1接口发送出去

flag是U没有G说明目的网络地址与本机接口相连,因此就可以直接发到目的主机,不需要经路由器转发

举例说明2:

如果要发送的数据包的目的地址是202.10.1.2

依次和第一行第二行进行子网掩码与后比较,都匹配不上

所有按照缺省路由条目,那么就从eth0接口发出去,发往192.168.10.1路由器;

再由该路由器根据路由表决定吓一跳地址,循环往复直到找到目的地址

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值