一、网络层的作用
路径规划
地址管理
TCP和UDP是传输层协议,关注的只是数据传输的可靠性和效率,真正负责数据在网络中的传输则是网络层和数据链路层。
我们再来回顾一下TCP/IP模型。
在网络中,数据的传输并不是直接从一方的传输层直接发送到另一方的传输层,而是需要将传输层的数据层层向下传递,经过网络层和链路层的层层封装,通过网络传输到另一方的链路层,再向上经过层层分用,最终传输层拿到数据,最后传给应用层。
那么网络层做的事情:
路径规划
在保证数据传输的稳定性的情况下,选择最优(最快)的传输路线
地址管理
数据从哪里来,到哪里去,需要将网络中的联网设备的位置信息用一个统一的标准给表示出来。
二、IP协议是什么?
IP指网际互连协议,Internet Protocol的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务
三、IP报文格式
版本: 占四位,目前的版本号只有两种,4和6,也就是IPv4和IPv6
首部长度: 占四位,四个bit能表示0~15.它的单位是四字节,所以最大的IP报头为60个字节。
图中已经标注了报头部分占20个字节,剩下的40个字节在‘选项’中,这一点和TCP报头相同。
服务类型: TOS(type of service): 3位优先权字段(已经弃⽤), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表⽰: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择⼀个.对于ssh/telnet这样的应⽤程序, 最⼩延时⽐较重要; 对于ftp这样的程序, 最⼤吞吐量⽐较重要.
最小延迟:传输过程消耗的时间最短
最大吞吐量:单位时间内传输的数据量
最高可靠性:数据发生丢包的概率最低
最小成本:系统最小的开销
总长度: 整个IP数据包的长度。IP数据包并不是最高只能有64KB,IP拥有一个自动拆包和装包的功能,当长度过长时,就会自动拆成几个包,到达接收方就会自动再拼接好。
如图,当所要传输的数据报过长时,IP就会自动将其拆分成多段,分段进行传输,
在到接收方后,再次进行拼接。
拼接当然不是随机拼接的。
标识就是可以知道哪个几个是一个整体,拼接时就会将这几个进行拼接。
标志用于得知这个IP数据报是不是分片。
片偏移就是可以知道这几个片段的位置,比如谁是报头谁是载荷,谁该放到什么位置
那么用这种方法,是不是就能解决UDP数据报的64KB长度大小限制呢?
答案是不可以
因为即使可以将UDP数据报拆分成几个分片
但在接收方还是要将他们组合在一起,组合成为一个数据报
在传输层要对UDP数据报进行解析,分析报头和拿到载荷
这里的拿到载荷需要根据UDP报头中的长度信息来拿到载荷,
此时你的载荷过长,而UDP报头中的长度信息表示范围有限,那么拿到的载荷就不完整
标识: 唯⼀的标识主机发送的报⽂. 如果IP报⽂在数据链路层被分⽚了, 那么每⼀个⽚⾥⾯的
这个id都是相同的.
标志: 第⼀位保留(保留的意思是现在不⽤, 但是还没想好说不定以后要⽤到). 第⼆位置为1表
⽰禁⽌分⽚, 这时候如果报⽂⻓度超过MTU, IP模块就会丢弃报⽂. 第三位表⽰"更多分⽚", 如果分⽚了的话, 最后⼀个分⽚置为1, 其他是0. 类似于⼀个结束标记
片偏移: 是分⽚相对于原始IP报⽂开始处的偏移. 其实就是在表⽰当前
分⽚在原报⽂中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后⼀个报⽂之外, 其他报⽂的⻓度必须是8的整数倍(否则报⽂就不连续了).
生存时间: 数据报到达⽬的地的最⼤报⽂跳数. ⼀般是64. 每次经过⼀个路
由, TTL -= 1, ⼀直减到0还没到达, 那么就丢弃了. 这个字段主要是⽤来防⽌出现路由循环
次数: 每经过一个路由器,次数就减一。减到0这个数据报就要丢弃。
协议: 表⽰上层协议的类型
首部校验和: 使⽤CRC进⾏校验, 来鉴别头部是否损坏
源IP地址: 表示发送端
目的IP地址: 表示接收端
源IP和目的IP地址是32位,也就代表IP地址是存在着上限的。
0~42亿9千万
解决IP地址不够用
那么就引入了几种解决方案来解决这个问题
1. 动态分配
也就说当机器上网时,才分配IP地址,不上网就不分配
这种解决方案没有从根本上解决问题。
2. NAT网络地址转换
私网IP
公网IP
外网IP 必须不能重复
内网IP 在不同的局域网中,可以重复
3. IPv6
使用16个字节,128位,;但是⽬前IPv6还没有普及。
四、IP地址基本规则
1.网段划分
同一个局域网的主机,按照一定的规则分配IP地址
将一个IP地址分为两部分
前半部分,网络号:标识局域网
后半部分,主机号:区分同一个局域网中的主机
但是,网络号相同,不一定在一个局域网中
局域网之间,网络号可以相同,但两个相同的局域网(同一个路由器,WAN口和LAN口处于两个不同的局域网)网络号不能相同。
2.ABCDE分类划分
这种规则现在已经不再使用,取而代之的是子网掩码,接下来会讲到。
这种规则规定了网络号和主机号的划分。
一个网络号下,例如在A类地址中,一个子网下可以拥有一千六百多万的主机,而在现实的情况下,根本没有那么多的主机在同一个子网下运行,这就造成了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
当要判断一个IP地址是属于哪一类时,只需要遍历IP地址的前五个比特位,第几个比特位最先出现0值,那么这个IP地址对应就属于A、B、C、D、E类地址。
为了减少IP地址大量浪费的这种情况,引入了新方案CIDR(Classless Interdomain Routing):
引⼊⼀个额外的⼦⽹掩码(subnet mask)来区分⽹络号和主机号;
⼦⽹掩码也是⼀个32位的正整数. 通常⽤⼀串 “0” 来结尾;
将IP地址和⼦⽹掩码进⾏ “按位与” 操作, 得到的结果就是⽹络号;
⽹络号和主机号的划分与这个IP地址是A类、B类还是C类⽆关;
3.子网掩码(Mask)
是一个32位的整数
左半部分都是1,右半部分都是0
不会0和1交替出现。
这里我们的IP地址是 101.7.142.67
子网掩码是 255.255.225.0
那么我们的网络号就是101.7.142
主机号就是67
子网掩码是什么?有什么作用?
4.特殊的IP地址
将IP地址中的主机地址全部设为0, 就成为了⽹络号, 代表这个局域⽹;
将IP地址中的主机地址全部设为1,就成为了广播地址。向广播IP上发送数据,就相当于向整个局域网中的设备发送数据。TCP不支持,UDP支持。
127.*这样的IP地址就是环回地址(loopback)向这个IP发送数据,也是自己接收数据,一般是127.0.0.1
五、路由选择
在网络中,一个主机通过网络向另一个主机传输数据,之间要经过很多的路由器(自己家中的路由器,通信厂商的地区局部路由器,总路由器等),每一个路由器在传输数据时,可能并不知道直接的路径是什么,它只知道与它相连的路由器的路径,在这些路径中会选择一个比较快(近)的来及进行传输
在传输过程中,是选择性的寻找最优解来进行传输。