IP 协议详解

IP协议

网络层:在数据链路层已经实现局域网内部主机间可以通信的前提下,实现跨LAN的主机间通信

完成路由功能,路由器这个设备就是工作在网络层的

网络层最重要的协议:IP(Internal Protocol)网际协议

IP地址

IP地址有:IPv4和IPv6版本

  • IPv4:32位的无符号整数(4个字节),通常,每个字节以十进制表示,中间以.连接,例如192.168.18.253,这种分法称为点分法
  • IPv6:长度128位,是IPv4的4倍,目前正在推广,但是还是广泛使用IPv4

IP地址由网络号 + 主机号组成,WAN是由一个个小网络组成的,每个小网络对应这一个网络号,就好像身份证的前几位就代表你所在省市,IP地址也是这样的

怎么把IP地址拆解成网络号和主机号?

  1. 静态方式(提前规定好),这种方式了解即可,使用不多

比如一个ip地址:10.138.25.184

把最左侧的第一个十进制转化为二进制就是0b00001010,以0开头的就是A类地址

IP 协议详解_第1张图片

但是这种静态方式使用不多,因为运营商在分配的时候经常分配一整个网络号,太浪费了

  1. 动态方式,添加了一个网络掩码(network mask)的因素

网络掩码:无符号32位整数,特点,前面全是1,后边全是0,比如:11111111 00000000

如果是1和0交替的,那就不是网络掩码,比如:11101101 11010011

网络掩码的写法有两种:一种是点分发,比如224.0.0.0;另一种就是只写1的个数,比如/3,表示前三个二进制都是1,后面都是0

通过IP地址 + 网络掩码,如何计算网络号和主机号?

网络号 = ip地址 & mask

主机号 = ip地址 & (~mask)

第一个:180.210.242.131/21 网络号:180.210.240.0 主机号:0.0.2.131

第二个:10.253.182.113 网络号:10.192.0.0 主机号:0.61.182.113

特殊IP地址

  • 主机号全0的IP,不会分配个主机使用,一般作为网络号使用,比如192.168.13.0/24是不会分配的
  • 主机号全1的IP,不会分配给主机使用,一般作为广播号使用,比如192.168.13.255/24是不会分配的
  • 127.0.0.0/8,保留为环回地址,一般使用的是127.0.0.1
  • 内网地址 和 公网地址,就比如酒店的电话是内网电话号,在酒店的客房中拨通一个另一个房间号002,是可以拨通的,但是如果用私人手机号拨打这个房间号002,是打不进去的,唯一的办法就是给总机打电话,然后由总机转接;IP地址同理,一个信道只能由内网向外网主动建立,外网不能主动向内网建立,外网想要和内网通信,就必须通过内网的外网地址;所以,我们个人使用的只有内网地址的电脑是无法作为服务器,因为在内网中做服务器,只有内网地址能访问该地址,外网的地址无法直接访问

常用的内网地址:

10.0.0.0 ~ 10.255.255.255,即10.?.?.?/8

172.16.0.0 ~ 172.31.255.255

192.168.0.0 ~ 192.168.255.255,最常见

除了这些内网地址,剩下的就是公网地址

网络中的IP地址可以重复,但同一个网络内不允许重复:

意思是不同的内网之间,都可以存在都一个IP地址,但是同一个内网之间不允许IP地址重复,且这些内网的外网地址也是不重复的

比如几个独立的内网之间,可以都用192.168.1.1,这些内网的外网地址是不同的

一跳一跳的网络数据传输

UDP/TCP发送数据的时候,本机IP(提前绑定好),目标IP地址,这个目标IP就是长期目标

但是想要到达长期目标需要短期目标,那么如何根据长期目标得到短期目标?

通过主机内部维护着的路由表来完成,只要工作在网络层及以上的设备,都有路由表

所以交换机是没有路由表的,交换机工作在数据链路层,那么也就意味着交换机没有寻路功能

Windows系统下电脑中的路由表:

IP 协议详解_第2张图片

网关:上图中192.168.1.1就是出口,即下一跳的地址;一旦匹配命中,就通过网卡得到短期目标(下一跳地址),如果是在链路上,就是在同一个LAN中,此时的长期目标就是短期目标

匹配方式:长期目标(IP) & 网络掩码 == 网络目标

比如长期目标:192.168.1.3,从下往上匹配,当匹配到24/的时候,结果是192.168.1.0,就匹配上了,如果网关是在链路上,则下一跳IP是就是目标IP,即192.168.1.3

比如长期目标:118.252.137.68,匹配到0.0.0.0,结果是0.0.0.0,匹配上了,则下一跳IP(下一个短期目标)就是该网关192.168.1.1

这种网络掩码为0.0.0.0的,任意IP地址都能与其匹配,一般这条记录就称为“默认网关”,这个一般就是路由器的IP地址了,总的来说,能自己搞定就自己搞定,如果搞不定,就交给路由器

路由器中的记录来源:

静态(手动配置)、动态计算(路由算法生成)

IP Packet

Header部分:

IP 协议详解_第3张图片

  • 4位版本号:指的是IP协议的版本,是ipv4或ipv6,两者的header格式不同,该图中是ipv4,版本号4bit定长
  • 4位首部长度:首部长度以32bit(4 bytes)为单位进行计算,而4个bit位能表示的最大数字是15,因此header的最大长度是4 * 15 = 60字节
  • 8位服务类型:这里包括三部分,前3位是优先权字段(先以启用);中间4位是TOS字段,分别是最小延时(尽快传输, 有数据就进行发送)、最大吞吐量(传输量尽可能大, 可以晚点传,但每次传的数据要大)、最高可靠性和最小成本,这四者之间是相互冲突的,所以只能选择其中一个,对于SSH/Telnet这样的应用程序,最小延时会更重要,对于FTP这样的程序,最大吞吐量比较重要;最后一位是保留字段(必须置为0)
  • 16位总长度:IP数据报整体占用字节大小,同样是以字节为单位
  • 8位生存时间TTL(Time to Live):数据报到达目的地的最大报文跳数,也是IP Packet在网络中生存的最大时长,这个生存时间并不以时间单位计算,而是以跳数计算,不同的OS中TTL是不同的,一般为64;IP包每次网络一跳,寿命就-1,如果一直到0还没有到达,那就直接丢弃了,一般来说,TTL是不会减为零的,这种设计主要是为了放置网络环路,防止IP包在网络中无限传递;其次,TTL是可以影响到网络层以上的层次的(传输层/应用层),比如TCP协议中的MSL
  • 8位协议:TCP协议或UDP协议,主要用于分用
  • 16位首部检验和:使用CRC进行校验,来鉴别首部是否有损坏
  • 32位源地址和目标地址:即发送端和接收端的IP地址

上面的这些比较容易理解,在首部中,还有3个内容没有提及,分别是:16位标识、3位标志以及13位片偏移

在介绍这3个之前,我们先假设一个场景:在网络层的下层(数据链路层)一般是有每次能发送的数据大小限制的,假设有4台主机分别以千兆以太网、令牌环网、无线网这3个不同的数据链路层协议连接,以太网和无线网协议下假设能够发送100字节的数据,而令牌环网只能发送10字节的数据,那么在数据传输的过程中,就会有传不过去的情况

在这种情况下,有两种处理方式:

  • 方式一:如果发送不过去,干脆直接丢掉好了,这种处理方式造成了网络不可靠,但是网络层并不负责可靠性的职责
  • 方式二:进行分片发送,把100字节的数据分成10份10字节的数据,分别发送,到达目的之后在组装

一般电脑上的分片功能都是关闭的

第二种处理方式引出了新的挑战,对于接收端来说,分片发送来的数据并不能保证其顺序,也不知道哪些数据是一起的

  1. 因此就需用用到header中的16位标识:

唯一的标识主机发送的报文。如果IP报文在数据链路层被分片了,那么属于同一份数据的分片里面的这个id都是相同的

通过16位标识,我们能够将哪些分片属于哪部分数据区分开来,但是每份数据中分片之间的顺序还不能确定

  1. 于是我们又需要这13位分片偏移:

是分片相对于原始IP报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置

当我们能够对每份数据中的分片进行正确排序之后,我们还有最后一个问题,什么时候分片组装完成了?换言之,我们需要知道哪个分片是这份数据中的最后一个分片?

  1. 针对这个问题,我们要引出这个3位标志:
  • 第一位:保留保留的意思是现在不用,但是还没想好说不定以后要用到
  • 第二位:“不分片”的标志(DF),为0表示可以分片,为1表示不允许分片
  • 第三位:“更多分片”的标志(MF),表示后面是否还有分片,为1则说明后面还有分片,为0则说明后面没有分片,该分片已是最后一位了

Windows下通过tracert命令,可以看到每一跳的IP地址

IP 协议详解_第4张图片

你可能感兴趣的:(JavaEE,tcp/ip,网络,网络协议)