引言:
在上篇文章网络原理之TCP/IP协议中,我们一起学习了TCP的相关知识,现在让我们再一起来共同学习有关IP协议的知识吧😊😊
网络层
IP协议
IP协议处于网络层,主要完成两方面的工作:
IP协议头格式
8位生存时间(Time To Live,TTL): 表示一个IP数据报,在网络上还能存在多久,这里的单位不是s或者ms,而是转发次数。IP数据报被发送的时候会有一个初始的TTL (比如常见的取值128或者64) IP数据报每次经过了一个路由器,TTL就会- 1,如果TTL减到0了,此时收到这个包的路由器就会把这个包给丢弃。 主要是因为有些包里面的IP地址,可能是永远也到不了的,像这样的包,不可能让它在网络上无休止的转发(占用硬件资源太多了),正常的IP数据报都会在既定的TTL内来到达。 8位协议: 表示我们当前传输层使用的是哪种协议,TCP或者UDP都有不同的取值 16位头部校验和: 使用CRC进行校验,来鉴别头部是否损坏。——也就是用来校验数据是否正确 32位源地址和32位目标地址: 源IP表示发件人地址,目的IP表示收件人地址;对于IPv4来说,一个IP地址本质上是32 位的整数,通常用 “点分十进制” 这样的方式来表示这个IP地址,三个点把32位整数分成4个部分(172.17.77.38),每个部分1个字节,每个部分的取值就是0 ~ 255,而给人看的通常就是点分十进制,给机器存储的IP,在底层仍然是按照4个字节整数来表示的。
地址管理
IP地址可以分成两个部分:网络号和主机号
- 网络号:描述当前的网段信息(局域网的标识)
- 主机号:区分了局域网内部的主机
要求同一个局域网里,主机之间的网络号是相同的,主机号不能相同;两个相邻的局域网(同一个路由器连接的),网络号也是不同的。
图解如下: 那么到底前多少个bit位是网络号呢?这是如何规定的?是固定3个字节嘛?
其实不是固定的??这就要引入一个“子网掩码”这样的概念了,用它来表示多少个bit位是网络号
特殊的IP地址
- 如果IP的主机号全为0,该IP就表示网络号(局域网里的一个正常设备,主机号不能设为0);
- 如果IP的主机号全为1,该IP就表示"广播地址",往往广播地址上发的消息,整个局域网中都能找到;
- IP地址是127开头的,该IP都表示"环回IP",表示自己主机;
- IP地址是10开头,192.168开头或172.16 - 172.31开头的,表示该IP地址是一个局域网内部的IP(内网IP);剩下的都是外网IP(直接在广域网上使用的IP)。
要求外网IP一定是唯一的,每个外网IP都会对应到唯一的一个设备,内网IP只是在当前局域网中是唯一的,不同的局域网里,可以有相同的内网IP的设备。
如何解决IP地址不够用的问题
按理说咱们预期的IP地址应该就表示一个网络上的唯一位置,结果这咋不同的局域网里,可以有相同的内网IP的设备,也就是说同一个IP咋就可以表示不同的设备了呢???
那是因为由于当前IPv4协议,使用的IP地址是32位的整数,而32位能表示的数据范围差不多为42亿9千万;如果给每个设备都分配一个唯一的IP地址,意味着世界上的设备就不能超过42亿9千万;但是 随着网络的发展,现在世界上的设备越来越多,已经超过了42亿9千万,因此让每个设备都有唯一的 IP地址已经不现实了。 那么该如何解决这个问题呢???????
动态分配IP地址
让每一个设备连上网的时候,才有IP,不连网就没有IP,让这个IP给别人用的人用。 但是这个方案不能从根本上解决问题(设备没有减少,IP也没有增加)🤔🤔
NAT机制
让多个设备共用同一个IP(外网IP)——就像我们在学校网购,学校这么多人填的收货地址都是学校的地址 把网络分成了内网(局域网)和外网(广域网),要求外网IP必须表示唯一的设备,同时内网中的若干设备,可以共用一个外网IP(就是内网IP可以重复出现,只有在当前局域网内才是唯一的) NAT机制,把IP分成了内网和外网,也隐含了一个重要的结论:
- 对于一个外网IP,可以在互联网的任意位置都能访问到
- 对于一个内网IP,只能在当前局域网内部访问局域网1的设备,不能使用内网IP访问局域网2的设备
NAT也是存在极限的(端口号的个数65535),如果一个局域网里的连接超过了65535,这个时候NAT就不一定能好使了,端口号就不够用了。所以NAT也没有从根本上解决问题,只是续命了一波,那么这也就引出了IPv6
IPv6
IPv6在报头中使用了一个更长字段来表示IP地址,IPv4是4个字节—32位,而IPv6是16个字节,128位
每个数字都是一个十六进制的数字(4bit),每个冒号分割了两个字节。 那么既然IPv6这么香,为啥现在还是在用IPv4 + NAT呢?? 这里最大的问题在于,IPv6和IPv4是不兼容的??对于一个设备来说支持IPv4和IPv6需要两个截然不同的机制,现有的大量的网络设备(路由器…很可能都是只支持IPv4,不支持IPv6)
路由选择
也就是规划路径,两个设备之间要找出一条通道能够完成传输的过程,要想找出通道,前提是得先认识路。 IP协议的路由选择也是类似的,IP数据报中的目的地址,就表示了这个包要发到哪里去,如果当前路由器直接认识就直接告诉你路了;如果当前路由器不认识就会告诉你一个大概的方向,让你走到下 一个路由器的时候再来问问,依次往后走,其实也是在离目标越来越近。这个时候就总会遇到一个认识这个地址的路由器,于是就可以具体的转发过去了;有的时候,不光遇到了一个认识这个地址的路由器,并且他还认识多个路,那么就可以选一个更合适的路 了。 那么什么叫路由器"认识"这个IP地址呢?
在路由器内部维护了一个数据结构——路由表,路由表里面就记录了一些网段信息 (网络号) , (目的IP就在这些网络号中匹配)以及每个网络号对应的网络接口(网络接口其实就对应到路由器里面具体的端口)
数据链路层
已经有IP地址了为啥还要物理地址?? 这是由于当年网络层协议和数据链路层协议,是各自独立研发出来的,导致mac地址和IP地址就有点重复了。 按理来说,一套地址就够了,现在的现状,就是当前mac地址和IP地址同时使用,表示不同的功能:
- IP用来表示一次传输过程中的起点和终点(不考虑NAT的情况,一个IP数据报中的源IP和目的IP是固定的)
- mac用来表示传输过程中,任意两个相邻节点之间的地址 (一个以太网数据帧,在每次转发过程中,源mac和目的mac都会改变)
MTU
就是一个以太网数据帧能够承载的数据范围,这个范围取决于硬件设备。 以太网和硬件也是密切相关的,其他硬件设备,对应的数据链路层协议,可能就又不一样了,那么MTU也不相同了。 数据链路层考虑的是相邻节点之间的数据传输,考虑这个细节的时候要关注交通工具是啥,那么如果数据报超过了MTU咋办??
IP层不是可以分包嘛,而IP层的分包,其实不是给IP的报头64k准备,更多的是为了适应数据链路层的MTU。
MTU对IP协议的影响
由于数据链路层MTU的限制,对于较大的IP数据包要进行分包。
- 将较大的IP包分成多个小包,并给每个小包打上标签;
- 每个小包IP协议头的 16位标识(id) 都是相同的;
- 每个小包的IP协议头的3位标志字段中,第2位置为0,表示允许分片,第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0);
- 到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层;
- 一旦这些小包中任意一个小包丢失,接收端的重组就会失败。但是IP层不会负责重新传输数
据;
MTU对UDP协议的影响
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报。
- 这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果
UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了。
MTU对于TCP协议的影响
- TCP的一个数据报也不能无限大,还是受制于MTU。TCP的单个数据报的最大消息长度,称为MSS—TCP中在IP不分包的前提下,最多搭载多少载荷(Max Segment Size);
- TCP在建立连接的过程中,通信双方会进行MSS协商。
- 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。
- 然后双方得知对方的MSS值之后,选择较小的作为最终MSS。
- MSS的值就是在TCP首部的40字节变长选项中(kind=2);
ARP协议
ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议;
ARP协议的作用
ARP报文并不是用来传输数据的,只是起到一个辅助的效果
路由器这样的设备在转发数据的时候首先拿到的是一个IP地址(目的IP) ,通过IP地址来决定接下来这个数据咋走(从哪个端口出去,发到哪个设备上),因此就得决定,接下来封装的以太网数据帧,目的mac是啥,需要根据ARP协议建立起IP -> mac这样的映射关系。这类似于hash表这样的键值对结构,但是这个表不一定是在内存里, 也可能是直接在硬件中存储。
当设备启动的时候就会向局域网中,广播ARP报文,每个设备收到之后,都会给出一个应答,应答的信息中就包含了自己的IP和mac发起广播的那一方, 就可以根据这些回应,建立起这个映射表了。
DNS协议(补充)
DNS,即Domain Name System,域名系统,是一个应用层协议。
由于IP地址不好记,即使写成了点分十进制,但是仍然对于人类来说不太友好,所以就可以使用一串英文单词来表示这个IP地址。这串英文单词,就称为域名。
|