目录
前言:
网络层协议解决什么问题
当我们在上层实现了应用层协议将字符流数据转化为结构体数据,在传输层完成了通信的实现,数据的传输,但是数据最终还是得从本主机输出,从网络中进入到远端的另外一台主机。
- 网络层协议IP解决的就是两台主机间数据的转移,也就是提供了一种将数据包从一台主机送到一台主机的能力。
- 传输层协议TCP/UDP解决的是网络传输的可靠性,将数据传输到相应的应用程序
- 应用层协议HTTP/HTTPS解决的是将字节流数据转化为结构体数据
如图:主机B发送数据包经由若干个路由器最终到达主机C
基本概念
- 主机: 配有IP地址, 但是不进行路由控制的设备;
- 路由器: 即配有IP地址, 又能进行路由控制;
- 节点: 主机和路由器的统称
- 路由控制是路由器根据路由控制表转发数据包的过程。
1.IP协议
1.1.IP协议格式
32位源IP和目的IP
表示发送端的ip地址,和数据报文的目的主机地址。
4位版本
对应着IP协议版本
- IPV4(表示4个字节表示IP地址)
- IPV6(16个字节表示地址)
4位首部长度
和TCP协议的4位首部长度一致,单位也是4字节,大小最大为40字节
8位协议
用来识别数据报文是TCP协议还是UDP协议,防止不同类型的协议之间进行通信
16位总长度
表示整个报文的长度,并且已知报头长度固定为20字节,那么通过报文长度 = 报头长度 + 有效载荷长度,即可分离报文和报头
8位服务类型
用于数据包发送质量、效果优先级的选择。
- 3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。
- 4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。
- 这四者相互冲突,只能选择一个。对于ssh/telnet这样的应用程序,最小延时比较重要; 对于ftp这样的程序, 最大吞吐量比较重要。
8位生存时间(TTL)
报文在路径转发过程中,经由路由器的跳数上限(不允许报文在路径节点进行无意义的节点转换,造成资源的浪费)
16位标识、3位标志、13位片偏移
因为在网络层的下一层数据链路层,最大允许发出报文长度为MTU=1500,也就是网络层形成报文之后可能大小会大于MTU,这时候就需要进行分片、多次发送。
- 16位标识(id):唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么每一个片里面的这个id都是相同的(用来区分不同的报文)
- 3位标志字段:第一位保留(默认填0,暂时没有意义)。第二位置为1表示禁止分片,这时候如果报文长度超过MTU,IP模块就会丢弃报文。 第三位表示"更多分片", 如果分片了的话,最后一个分片置为1,其他是0。类似于一个结束标记.
- 13位分片偏移:是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的。因此,除了最后一个报文之外,其他报文的长度必须是8的整数倍(否则报文就不连续了)
1.2.网段划分
1.2.1.知识引入
IP地址分为两个部分, 网络号和主机号
- 网络号: 保证相互连接的两个网段具有不同的标识;
- 主机号: 同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;
例如本机ip地址为127.0.0.1,其中127.0.0.为网络号,1为主机号
如图: 路由器连接了两个局域网,而在同一个局域网,我们发现网络号是相同的,不同的是主机号,所以我们就能够通过IP地址定位到网络号和主机号,进而找到唯一的主机!!!
路由器的作用:
- 连接不同的网络
- 构建子网
- 进行数据包的路由和转发
1.2.2.IP地址划分和子网掩码
IP地址划分
在1.2.1.中我们知道IP地址划分成了网络号和主机号,保证在互相连接的网络中每一台主机的ip地址都不同,那么这时就会出现一个问题:网络号和主机号怎么设计,IP地址如何进行划分?
如图所示,为过去的一种IP地址划分的方案,为了应对不同的场景下(对应局域网的主机数量)的网络方案。
随着Internet的飞速发展,这种划分方案的局限性很快显现出来,大多数组织都申请B类网络地址,导致B类地址很快就分配完了,而A类却浪费了大量地址;
- 例如,申请了一个B类地址,理论上一个子网内能允许6万5千多个主机。A类地址的子网内的主机数更多。
- 然而实际网络架设中,不会存在一个子网内有这么多主句的情况。因此大量的IP地址都被浪费掉了。
我们也可以从网络的拓扑