本文主要是介绍小白学TCP/IP(四)IP协议篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
IP协议篇
网络层与数据链路层之间的关系
网络层负责端到端之间(消息发送端与消息接收段)的通信,但至于中间消息是怎样被转发的,得通过数据链路层实现,也就是说数据链路层负责每个数据链路从源MAC地址到目标MAC地址之间的数据传输,而网络层则是规定了数据最开始的发送端和最终的接收端.
把这个过程比喻成快递运输,假如我在北京要发送一个快递到武汉市华中科技大学机械大楼,IP层完成的任务就是在快递单上写上寄件人地址和收件人地址(源地址和目的地址)和其他信息,然后贴到快递包裹上,然后快递点通过一张规定好的快递传输信息表(比如目的地为武汉,则直接发送到郑州快递中转站),这张信息表在网络传输中叫做路由控制表,这样快递就从寄件人----北京----郑州中转站----武汉总站----华中科技大学站----华中科技大学机械学院----收件人手中,其中北京到郑州中转站之间的传输即为数据链路层的传输,只负责从一个中转点运输到下一个中转点(数据链路层的主要作用是在互联同一种数据链路的节点之间进行包传递)
IP协议为什么是面向无连接的
IP面向无连接,在发包之前不需要建立与对端目标地址之间的连接,将这个功能实现委托给了TCP层去实现.
- 为了简化,面向连接比起面向无连接处理相对复杂.
- 为了提速,面向连接每次通信之前都要建立连接,会降低处理速度.
- 分层实现不同的功能,IP只负责将数据发给目标主机,而TCP负责保证对端主机确实接收到数据.每一层的分工明确,简化协议的实施与编程,有利于协议今后的扩展和性能优化.
IP地址分类
IP地址(32位)分为四个级别,分别是A类,B类,C类,D类.
A类地址
首位以0开头,从第1位到第8位是它的网络标识
十进制表示: 0.0.0.0~127.0.0.0是A类的网络标识,后24位用于主机标识
一个网段可容纳主机地址上限为:16,777,214个
B类地址
首位以10开头,从第1位到第16位是它的网络标识
十进制表示: 128.0.0.0~191.255.0.0是A类的网络标识,后16位用于主机标识
一个网段可容纳主机地址上限为:65,534个
C类地址
首位以110开头,从第1位到第24位是它的网络标识
十进制表示: 192.0.0.0~223.255.255.0是A类的网络标识,后8位用于主机标识
一个网段可容纳主机地址上限为:254个
D类地址
首位以1110开头,从第1位到第32位是它的网络标识
十进制表示: 224.0.0.0~239.255.255.255是A类的网络标识,没有主机标识,常被用于多播.
补充知识:
主机标识位上不可以全是0或者全是1,这两种情况有特殊用处
全是0代表对应的网络地址或IP地址不可获知的情况
全是1的主机地址通常被作为广播地址
子网掩码
引入子网后,IP地址就有了两种识别码,一个是IP地址本身,一个是表示网络部的子网掩码
子网掩码的作用: 将IP地址划分为更小粒度的网络,而不再受限于ABCD类地址划分方式.
子网掩码的构成: 采用32位二进制表示,对应IP地址网络标识部分的位全部为"1",对应主机标识部分的位全部为"0".
子网掩码的两种表示方式:
以172.20.100.52的前26位为网络标识为例
- IP地址:172.20.100.52 子网掩码:255.255.255.192
- IP地址:172.20.100.52/26(直接在IP地址后面追加网络地址的位数,用"/"隔开)
路由控制
路由控制表的作用:
发送数据包所使用的地址为网络层的地址(IP地址),但是仅仅有IP地址无法完成将数据包传输到对端目标地址,因为中间可能存在很多数据链路.在数据发送过程中还需要指明路由器或主机的信息,保存这种信息的就是路由控制器.
路由控制表的形成方式:
- 静态路由控制:由管理员手动设置
- 动态路由控制:路由器与其他路由器相互交换信息时自动刷新
路由控制转发的原理:
前提: 路由控制表中记录着网络地址和对应的下一步应该转发的路由器的地址.
在发送IP包时,首先要确定IP包首部中的目标地址,再从路由控制表中找到与该地址具有相同网络地址的记录,根据该记录将IP包转发至对应的下一个路由器(如果路由控制表中存在多条相同网络地址的记录,就选择一个最为吻合的网络地址,即相同位数最多的网络地址,例如172.20.100.52的网络地址与172.20/16和172.20.100/24两项都是匹配的,但是172.20.100/24是最吻合的,应该转发到该地址对应的路由器.
补充知识:
环回地址:环回地址是在同一台计算机上不同程序之间进行网络通信所使用的默认地址,即127.0.0.1,也可以用localhost来代替,使用该IP时,数据包并不会流向网络.
IP分割处理与再构成
每种数据链路的使用目的不同,所以可承载的MTU也不同
为何需要将IP报文分割
每个数据链路的最大传输单元(MTU)不尽相同,一旦IP报文的大小比数据链路中最小的MTU大的时候,就会发生IP报文分割,也就是分片.(可以理解为数据链路的运输能力不够,只能将单个报文分割成多个报文运输)
为何经过分片后的IP数据报的重组只能由目标主机进行
如果在中途重组,有可能在之后又面临分片的尴尬处境,这会给路由器带来多余的负担,也会降低网络传输效率.
路径MTU发现
路径MTU:是指从发送端主机到接收端主机之间不需要分片时最大的MTU大小,也就是路径中所有数据链路中最小的MTU.
路径MTU发现原理:
- 首先源地址将数据报的分片标志位设置为不分片,并将IP数据报发送出去
- 路径上任何需要将分组进行分片的设备都会将这种数据报丢弃并返回“数据报过大和当前数据链路允许的最大MTU“的ICMP响应到源地址
- 源地址主机将IP分片,并重新设置最大MTU,再次将IP数据报发送出去
- 不断探索发送直到不再收到ICMP响应,这样源主机就”学习“到了无需分片就能通过这条路径的最大的最大传输单元。
[外链图片转存失败(img-fi9yRcRw-1565752177829)(https://raw.githubusercontent.com/zrysmt/mdPics/master/HTTP协议/tcp-ip/12.png)]
IPv4首部
IP首部中包含用于IP协议进行发包控制时所有的必要信息
属性 | 大小(比特) | 作用 | 举例(补充说明) |
---|---|---|---|
版本 | 4 | 标识IP首部的版本号 | IPv4的版本号为4 |
首部长度 | 4 | 表明首部的大小,单位为4字节(32比特) | 没有可选项时,首部长度设置为5,即IP首部长度为4*5=20字节 |
区分服务 | 8 | 表明服务质量 | 基本被所有网络无视,没有投入使用 |
总长度 | 16 | IP首部+数据部分的总字节数 | IP包的最大长度为65535(=2的16次方)字节 |
标识 | 16 | 用于分片重组 | 单个IP数据报被分割后的分片,该标识相同 |
标志 | 3 | 表示包被分片的相关信息 | 第1个比特未使用,目前必须为0,第二个比特表示是否分片,第三个比特表示被分片的情况下是否为最后一个包 |
片位移 | 13 | 标识被分片的每一个分段相对于原始数据的位置 | 第一个分片对应的值为0 |
生存时间 | 8 | 可以中转多少个路由器 | 每经过一个路由器,TTL减1,变为0则丢包,可以避免IP包在网络内无限传递 |
协议 | 8 | 表示IP包传输层的上层协议编号 | TCP编号为6,UDP编号为17 |
首部校验和 | 16 | 校验数据报的首部,确保IP数据报不被破坏 | |
源地址 | 32 | 表示发送端地址 | |
目标地址 | 32 | 表示接收端地址 |
IPv6
IPv6是为了根本解决IPv4地址耗尽的问题而被标准化的网际协议.
IPv4地址长度为4个8位字节,即32比特,而IPv6的地址长度为128比特,一般写成8个16位字节.
IPv6用十六进制表示(8个16位字节)
FEDC:BA98:7654:3210:FEDC:BA98:7654:3210
IPv6地址区分
地址名称 | 区别 |
---|---|
全局单播地址 | 全世界唯一的一个地址 |
链路本地单播地址 | 同一个数据链路内唯一的地址 |
唯一本地地址 | 不进行互联网通信时所使用的地址 |
这篇关于小白学TCP/IP(四)IP协议篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!