文章目录
- 网络层
- 基本概念
- IP报头
- 分片和组装
- 如何分片
- 如何组合
- 16位标识符
- 13位片偏移
- 3位标志
- 网段划分
- IP地址的分类
- CIDR
- IP地址数量限制
- 私有IP和公网IP
- 运营商
- 路由
网络层
http和tcp只考虑了两端的问题,并没有考虑路途中的事情。路由查找
IP的构成:32位=网络号+主机号
-
TCP(教务处老爹)vsIP(试错满分工具人)各自解决什么问题?
决策问题vs执行问题
IP提供了一种能力,将数据以较大概率从A主机跨网络传送给主机B的能力。所以,IP层不提供可靠性机制!
TCP是提供可靠性的机制,什么超时重传,拥塞控制啥的,东西给你准备好,你去干就完了。
基本概念
主机:配有IP地址,也可以进行路由控制的设备。
路由器:既配有IP地址,又能够进行路由控制。
节点:主机和路由器的统称。
所有网络中的端点主机和中间路由设备都叫做节点,两端的叫主机。
TCP那里的数据流叫做数据段,IP那里叫做数据包,数据链路层叫做数据帧。
IP报头
标准长度是20字节
-
如何分离与封装?
4位首部长度,基本单位也是4字节。十进制0-15,0000-1111。因为长度是20,所以是5,0101。和TCP报头是一样的。就可以无脑提取前20个字节,去掉前几位4位首部长度得到的就是有效载荷。
有16位总长度,也就是IP是报文形式不是字节流,也必须一个报文一个报文的发出去,也要涉及边界问题,向上交付给传输层的字节流的时候,也要解决粘包问题,然后以流的形式交付给应用层。
这两个就可以实现分离报头和有效载荷,实现分离和封装。
-
如何向上交付践行分用?
8位协议,让IP知道把有效载荷交给谁。TCP or UDP谁传下来的8位协议写啥,然后到对端根据8位协议传给UDP或者TCP,实现分用。
16位首部校验和
:保证正确性,确认分片和组装情况。
4位版本(基本没有意义)IPV4
:给路上转发的路由器看的。
将数据包从一个节点跳转到下一个节点交租跳转到下一跳。
8位生存时间(TTL生存时间)
:就是为了处理游离报文的存在,每经过一个节点就–,让没有目标主机的游离报文自己就消失。
分片和组装
IP分片不是大部分情况。
- 报文为什么会进行分片?
封装:报文向下交互添加报头(每层特有)的过程,但是网络层交给数据链路层的数据大小是有限制的,就是一次向网络中发送的是MTU:1500字节。
-
所以,网络层需要怎么处理数据呢?太大的报文应该怎么处理呢?分片由网络层负责,数据链路层只管给你发固定大小不管分,毕竟分坏了不负责任的。
-
谁来进行组装呢?
得包含分片信息,由对端网络层根据你的分片信息进行组装,只有他才能解析报头文件。
如何分片
因为MTU的限制,每次网络层给数据链路层的数据最大是1500,在添加了IP报头20字节的报头信息的。所以,从传输层拿到的最大字节数是1480,如果超过1480,比如是1500,在添加了20字节为1520,超了,就在1500中余出20字节大小用来填充报头,余出来的20字节报文再用20字节报头包装构成40字节进行下一次向下交付就可以了。首先保证都有报头,其次就是分的时候别出现IP报头重复就行。
为了保证最好的效率,TCP单个数据报的最大消息长度就是MSS(max segment size)
如何组合
如何分片传输层是不知道的,各层解耦。所以在这端网络层分片就需要在对端网络层组装,实现双方传输层没有感知。
-
分片真的好吗?他会提高丢包的风险,所以IP分片并不是大多数情况。
-
如果丢包了怎么办?组装失败就会将整个报文全部丢弃。
-
如果不想分片,谁说了算呢?传输层,因为协议都是由他决定的,要tcp控制单个报文大小,你他吗少传点不就行了嘛。UDP是没有缓冲区的,所以这个协议就没有办法了。
16位标识符
没进行分片,不同报文之间的标识符都是不一样的。进行了分片,就将出现一群一样的标识符的报文,把它们归到一起组装就行了。
13位片偏移
假设没有丢包,根据片偏移组装进行升序排列就行了,在原始报文中的有效载荷的偏移量。起始位置+偏移量就可以确定下一个分片的偏移量。
- 如何判断报文都收全了呢?
如果计算连续的话,也就是进行升序排列的时候,片偏移的计算连续,说明中间就没丢;计算不连续就说明中间丢了,很好判断。
如果有片偏移=0,说明报头没丢。如果没有,就说明头丢了。
-
如何判断尾巴丢了呢?
16位总长度只对自己报头负责,只负责自己那部分大小,比如上面分片出来的40字节报文,他的16位中长度表示的就是40字节,跟从哪分的那个原始报文无关。
3位标志
所以引进3位标志位,1位保留(不用),1位标识禁止分片(报文丢了也不让你分片)。
1位标识后面是否还有报文。如果有就是1,如果没有就是0。
-
接收端如何辨别哪一个是独立的?那一个是分出来的呢?
-
片偏移量为0的就是独立的
-
3位标志也是0,说明跟后面没有报文了
-
网段划分
32位IP
网络号:保证相连接的两个网段的具有不同的标识;主机号:同一个网段中的不同主机,不可重复;
两个不同的网段通过路由器相连接进行路由转发,所以路由器应该各有一个这两个网段的IP;
所以一共存在2^32个IP,保证IP地址不同,但是存在上线,所以存在回收机制。
DHCP动态IP地址分配的功能,路由器当中也具备,你上线了就给你个IP,你下线了就把IP回收。
局域网中的给你地址的过程就是分配和回收的过程。
帮助理解:学号对于学生的划分,查找某一个学生,要先从我们这里入公网,由公网再进行派发到目标。
网络划分的本质就是为了提高效率,便于组网。
IP地址的分类
根据自己的需要按照分类进行选择。
但是每种都有自己的缺陷,B类地址很快分配完毕,但是A类会存在大量的浪费IP,所以引入CIDR减少浪费。
CIDR
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;
将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
引入额外子网掩码,通过设置左侧1个位数,来限制主机可用的IP个数。
-
划分主机的例子
IP地址数量限制
IP地址的绝对上限还是不够,因为很多中间设备也是需要IP地址的,这是有三种方式解决:
动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到
的IP地址不一定是相同的;NAT技术(后面会重点介绍);
IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表
示一个IP地址; 但是目前IPv6还没有普及;
私有IP和公网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:
云服务器公网IP:
公网IP不可重复,在一个局域网中私有IP不可重复, 在不同的局域网中,两个设备的ip地址是可以相同的,私有IP可以在不同的子网中重复出现。所以,主机使用私有IP,用路由器的方式连上公网,实现入网。
运营商
基础设施:光纤,交网费话费都是由这些运营商运营的,你才能使用网络,互联网公司是不会去做的。不止你在交钱,互联网公司都在交钱给运营商。手机欠费了上不了网打不了电话但是可以打给运营商的客服10086。
运营商组建了各种子网,子网划分。
路由器是可以用来组建局域网的。热点打开就是相当于路由器,构建子网。
每一个路由器都有:子网IP(LAN口),对自己管理之下的那些设备
WAN口,是自己被管控的上一层的IP标识。
公网转发实现了移动到联通的用户之间的交互。
- 所有的客户是在家用路由器中以局域网的形式接入网络的。
- 每个路由器都有自己的LAN和WAN口。
- 路由器是可以构建子网的,不断地进行子网划分。
- 互联网公司介入可以直接进公网。
-
如何将信息向互联网公司服务器发送呢?
家用路由器根据你请求中的目的IP,最起码能确定你要去外面,将你的源IP替换成家用路由器的WAN口IP 转发给上层路由器,逐层向上替换WAN口,最后在官网中找到目标(比如百度),构建响应时如果是你的私网IP,但是私有IP不具有唯一性,所以在我们自己的请求向外发送的时候,我们的源IP一直在被中间路由器的替换,就好像是那个路由器发出的,这样服务器构建响应时看到的你的源IP就是最上层路由器的,这就是NAT技术。所以,私有IP是不可能出现在公网上的。
-
那我和同一个局域网下不同子网的主机进行交流不用通过公网实现能做到吗?不能。其实不是主机交流而是主机上的软件交流,最好还是走公网。
-
墙(拦截我的请求),比如我欠费了,不让我访问各种网站。我没欠费也不让你访问各种违法网站,运行商会对你额网址进行拦截检测,如果不合法就会直接在基础设施阶段丢弃你的数据。
路由
路由过程:就是一跳一跳问路的过程。所谓的一跳就是数据链路层中的一个区间,具体在以太网中就是从源MAC地址到目的MAC地址之间的区间。
- IP数据报的传输过程
IP数据包到达路由器,根据目的IP决定这个数据包是直接发给目标主机还是下一个路由器(下一跳路由器or默认路由),依次反复一直到达目标IP地址,最后在内网中进行数据转发。依靠每个节点维护的路由表,进行判断下一跳。route
查看自己的路由表。
[xiaoawei@VM-24-10-centos ~]$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 0 0 0 eth0
10.0.24.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
假设我们的目的IP,
用目的IP和路由器本身路由表中的的子网掩码Genmask
进行&,得到的是一个网络号然后和Destination
进行比对是否符合,看看是不是一个网络号里面的,通过接口Iface
扔出去;如果不是这个范围,就用下一个掩码进行按位与,如果都不是,就直接走default
,走默认路由下一跳,在由默认路由器根据他的维护的路由表决定吓一跳的地址。
55.255.0.0 U 1002 0 0 eth0
假设我们的目的IP,
用目的IP和路由器本身路由表中的的子网掩码`Genmask`进行&,得到的是一个网络号然后和`Destination`进行比对是否符合,看看是不是一个网络号里面的,通过接口`Iface`扔出去;如果不是这个范围,就用下一个掩码进行按位与,如果都不是,就直接走`default`,走默认路由下一跳,在由默认路由器根据他的维护的路由表决定吓一跳的地址。