(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~https://blog.csdn.net/ky233?type=blog
点个关注不迷路⌯'▾'⌯
目前已经学完了应用层以及传输层,我们应用层是把数据发送到传输层的缓存区里,而我们的传输层把数据交到哪里了呢?网络吗?并不是,而是向下交付到网络层!
在应用层,我们关注数据使用的问题,在下三层我们关注的是网络通信的细节,将数据可靠的从A主机传输的B主机!
一、IP协议的概念
IP协议帮我们解决了什么问题呢?提供一种能力,从A主机送到B主机的能力!有很大的概率,如果发送失败了则重新调用网络层传输!
二、IP协议的报头
首先数据层肯定是TCP向下交付的数据加上TCP的报头和http的报头
1.如何封装和解包
首先IP的报头也是有固定大小的,前20个字节就是它的报头,其中这里面有4位首部长度,用用首部减20字节就是选项,没有选项那首部就是20自己,它采用的是定长报头加+自描述字段!
2.如何进行分用
8位协议里面用来表识是udp还是tcp
3.四位版本
永远填的是IPV4,IPV4是用4字节表示的,和IPV6不兼容
4.四位首部长度
四位首部长度是由4个比特位来决定的也就是0000-1111,也就是0-15,但是4位首部长度是由单位的,基本单位是4字节,也就是说假设4位首部长度为x,则真实的长度应该是4*x!
5.八位服务字段
这里面有三个优先权字段已经被弃用了
有4位TOS字段,分别表示:最小延迟,最大吞吐量,最高可靠性,最小成本,这四个选项互相冲突最多只能选择一个!还有1个保留位必须置为0!
6.十六位总长度
总长度包含报头和有效载荷!所以有效载荷=16位总长度-(4位首部长度*4)
7.生存时间
当一个报文在路上转发的时候,有可能因为路由器因为一个bug在某一个局部网络当中进行来回互相转发,所以为了防止这样的情况所以就要设置生存时间!
这就相当于一个计数器,每次转发都会--,当到0时就直接被丢弃!
8.八位协议
里面包含的就是我们上层主机的具体协议,如TCP或者是UDP
9.16位首部校验和
如果我们在校验的时候失败了,这个报文就直接而被丢弃了,我们并不怕被丢弃,因为有TCP再次发送!使用CRC进行校验, 来鉴别头部是否损坏!
10.32位源ip和32位目的ip
当时我们绑定端口号和IP地址,ip地址就是在这里用的!
———————————————————————————————————————————
我们的ip报文的形式和TCP报文的形式非常类似,如都是20字节,所以我们称之为TCP/IP协议
其中应用层把数据交给传输层,传输层决定发多少什么时候发,怎么办,全部都是把这些交给网络层,未来还会继续交付给数据链路层,但是由于链路层有物理特性的原因,一般无法转发太大的数据,所以链路层,一次转发到网络的报文有大小限制(1500字节,MTU)!
那么如果网络层要想下交付2500字节的数据呢?这时候我们的网络层就要进行数据分片。到时候会在接受层的网络层进行组装然后在向上交付!
所谓分片就是将一个比较大的报文,拆分成多个小的、满足条件的报文。分片的行为是网络层做的,同样组装的行为也必须是对方网络层做的!
为什么要组装呢?是因为上层给自己的网络层是一个完整的TCP报文,所以向上交付也要是一个完整的报文!
IP分片的行为,TCP是不知道并且不关心的!
———————————————————————————————————————————
11.16位标识
有了上面的基础知识,下面的就好理解了
16位标识:唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的.
12.3位标示字段
第一位是保留的,第二位标识是标识禁止分片的,置为1就是不分片,如果大于链路层的最大允许则直接丢弃;第三位是标识更多分片,如果分片了最后一个置为0,其他则置为1;
13.13位片偏移
假设一个数据被分为3段,第一个片偏移就是0,第二个就是原始报文的最后一个位
三、解决分片问题
有下面几点要解决
1.分片不是主流!
分片的坏处:
- 在网络层分片和组装的过程中,上层(传输层和应用层)知道么?答案是不关心,不知道的
- 丢包是有概率的,分片会增加丢包的概率,一个丢包了就组装不起来,需要重新发
- 彻底解决分片问题要在传输层!
2.具有识别报文和报文的不同
- 用16位标识来区分,不同报文它的标识不同,相同报文的分片,标识是相同的!
3.具有识别报文是否被分片
- 如果没有被分片则更多分片标志位为0并且13为片偏移一定为0
- 只要收到了大量的报文,用三位标识符的更多分片,如果更多分片比特位为1,就代表这个报文被分片了
- 如果我就是最后一个分片了呢?那么更多分片标志位一定是0,那么13位片偏移一定不为0,
所以结合2、3两点,就可以将报文的分片区分出来,并放在一起!
4.识别出哪些报文时开始,哪些分片是中间,哪些是结尾
- 开始:那么更多分片一定是1,片偏移一定为0!
- 中间:更多分片是1,并且片偏移不是0!
- 中间多个报文保证收全:偏移量+自身大小=下一个报文的偏移量,所以根据偏移量进行升序排序,结合对应的偏移量+自身大小=下一个报文的偏移量,这样的算法来扫描报文,如果中间不匹配则中间一定有丢失的,如果计算到结尾,就一定收取完整了!
- 结尾:更多分片一定是0,片偏移一定不是0!
这点能做到,区分是否收全,并提供组装方案!
5.异常处理,如果在组装过程中,任何一个分片丢失则都要识别出来
- 组装功能如上:偏移量+自身大小=下一个报文的偏移量,所以根据偏移量进行升序排序,结合对应的偏移量+自身大小=下一个报文的偏移量,这样的算法来扫描报文,如果中间不匹配则中间一定有丢失的,如果计算到结尾,就一定收取完整了!
四、网段划分
我们需要将ip进行各种划分,要有各种网络划分的方案
IP地址分为两部分,网络号和主机号
网络号表征的是:不同的区域,根据网络好就可以进行不同区域的转发!同一个区域的网络标识一定是一样的,主机标识一定是不一样的,在不同区域网络标识一定不同,但主机号有可能相同!
所以IP=网络+主机
网络号可以在不同的查找过程中,是不断的变大,并且收敛的!网络号就类似我们的学号!
网络距离边长要解决两个问题!
一个是可靠性的问题:这个是由TCP来解决的
一个是定位目标主机:这个是由IP和IP地址来解决的!
那么为什么要把IP地址划分成网络号和主机号呢?
答案是便于定位以及提高查找效率!
不同的子网其实就是把网络号相同的主机放到一起.
如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网 中的其他主机重复
那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情
- 有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
- 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器
子网掩码:
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
- 子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;
- 将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
- 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
也就是说目的ip&当前路由器的子网掩码=该报文要去的目的地的网络
因为不同的路由器一定至少要级联2个网络。每一个网络的网络号可能是不同的!所以每个路由器都要给自己直接连接的网络都要对峙对应的子网掩码!
可见,IP地址与子网掩码做与运算可以得到网络号, 主机号从全0到全1就是子网的地址范围;
IP地址和子网掩码还有一种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的高 24位是1,也就是255.255.255.0
五、公网IP和私网IP
我们上面所说的全部是公网ip,因为ipv4的严重不足,所以我们又有了私网ip
如果一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到Internet上,理论上 使用任意的IP地址都 可以,但是RFC 1918规定了用于组建局域网的私有IP地址
- 10.*,前8位是网络号,共16,777,216个地址
- 172.16.到172.31.,前12位是网络号,共1,048,576个地址 1
- 92.168.*,前16位是网络号,共65,536个地址
包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP);
换句话说我们现在能接触到的,全部都是私有ip
也就是说,我们所有的主机先经过家用路由器的私网然后到运营商的私网,然后进入到公网,在根据需要的信息来进行数据交换!
那么IP不足是怎么缓解的呢? 私有网络对应的ip是局部的,可以在不同的子网中重复出现!!
上图就是我们的主机从私网ip进入对应的公网ip所要做的事情;首先要将报文中的源ip替换成路由器的WAN口ip,每经过一个路由器都要这样做(除了公网路由器),这样就可以一层一层的向上递进,直到到达了公网,公网和公网可以直接通信,然后再次从公网到达最后从私网到公网的转换的路由器!
接下来具体到达自己的主机过程现在还说不了,因为并没有学呢,后面会解答!
六、路由的过程
在复杂的网络结构中, 找出一条通往终点的路线;
路由的过程, 就是这样一跳一跳(Hop by Hop) "问路" 的过程. 所谓 "一跳" 就是数据链路层中的一个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间.
IP数据包的传输过程也和问路一样.
- 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
- 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
- 依次反复, 一直到达目标IP地址;
七、线程demo
1.如何分片的细节
为了支持支持未来组装,每一个分片都必须有ip报头!
注意分片应该这样分片!
2.
八、小结
TCP协议帮我们解决的是可靠性的问题,而IP协议帮我们解决了数据转发的功能,经过这两个层就可以可靠的将数据从A主机到B主机!
传输方只是两端主机有的,而中间层没有!
ip根据目的IP,对子网划分,路由表查找与路由算法,来找到对端主机!
但是,IP没有解决设备转发的具体功能,ip提供的是转发的策略!是对路径的选择!