Linux--网络4(网络层)

Posted 水澹澹兮生烟.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux--网络4(网络层)相关的知识,希望对你有一定的参考价值。

目录

一.IP协议

1.1IP协议格式

1.2IP地址管理

1.2.1IPV4版本的IP地址

1.2.2IP地址的早期划分方式:

二.路由选择


网络层完成了路由选择与地址管理。

一.IP协议

1.1IP协议格式

协议头格式如下图所示:

  •  4位版本:表示的是IPV4版本  0100
  •  4位首部长度:二进制数字计算出来的是数值,需要给计算出来的数值*4,才表示首部占用的字节数量。
  • 8位服务类型:前三位分别描述的是优先级,但是已经弃用;中间4位分别代表最小延时,最大吞吐量,最高可靠性,最小成本;最后一位为保留位。
  • 16位总长度:最大标识IP数据报长度为2^16,单位为字节,IP数据报最大长度时65536字节。从UDP角度上看,UDP数据长度位2^16;从TCP角度上看,TCP数据在将TCP数据递交给网络层之前是按照小于等于MSS大小的字节数量,将数据交给IP协议。
  • 16位标识:标识IP分片是属于哪一个数据包的。
  • 3位标志:第一位是保留位;第二位叫做禁止分片;第三位如果是1则表示后面还有分片,0的话则表示后面没有分片了。
  • 13位片偏移:在这里指的是分片相当于在原始数据当中的偏移量。能够表示的最大标识的数字是2^13(8192)。又因为IP数据报最大的数据总长度位2^16次方,因此得到结论:计算在整个数据报中偏移的字节数量的时候,偏移的字节大小=13位片偏移计算的值*2^3。
  • 8位生存时间:TTL,允许IP数据报最大经历的路由器数量。路由器没转发一次,TTL进行减1,如果TTL为0,没有到达对端主机,该IP数据报被网络丢弃,再进行转发。这样有效的预防了循环路由。
  • 8位协议:表示当前的IP数据报传递给传输层的哪一个协议。虽然说一个端口只能被一个进程所绑定,但是一个端口可以被TCP进程和UDP进程同时绑定
  • 16位首部检验和:校验数据在传输过程中是否是真。
  • 32位源IP地址与32位目的IP地址:一般情况下,32位源IP地址在传输的过程中不会改变,但是不排除有私网向公网网络转换的情况。

question:

1.IP协议在传递TCP数据时,是否需要分片传输?IP协议在传递UDP数据时是否需要分片传输?

  • IP协议分片传输的情况:MTU是数据链路层对到达数据链路层数据大小的规定。数据链路层进行发送数据的时候,是严格遵照MTU进行发送的。数据链路层发送到数据大小一定不会超过MTU。因此数据链路层就会要求网络层IP协议给数据链路层递交的数据大小不超过MTU。如果IP协议传输的数据大于数据链路层对于数据的限制(MTU),则IP协议需要将数据进行分片传输。将大于MTU的数据报进行切分,以满足MTU的要求。举例如下图:
  •  UDP是整条数据交付给网络层的,UDP协议最大传输数据大小是2^16,有可能UDP递交给网络层的数据已经超过了MTU。如果UDP整条交付的数据大小大于MTU,则网络层需要对UDP数据进行分片传输。将UDP数据分成不同的小片进行传输;如果UDP整条交付的数据大小小于MTU,则网络层不需要对UDP数据进行分片传输。将UDP数据分成不同的小片进行传输
  • 用于TCP在三次握手的过程当中已经协商了,各自传输的最大报文段长度。而各自的最大报文段长度,是由各自的MTU计算得来的。MSS+TCP-header + IP-header是小于等于MTU的,因此双方在协商的时候,才有了最小的MSS。TCP在传输数据到网络层的时候,严格按照MSS继续传输的。传输到网络层的数据一定小于MTU。因此,TCP的数据是不需要网络层IP协议进行分片传输的。

总结: 网络层的IP协议是否需要分片,取决于传输层协议给网络层协议传输的数据长度是否超过数据链路层对于发送的数据MTU的要求。

2.分片丢失会重发分片还是所有数据一起重发?

  •  如果有分片,那么说明是UDP数据进行传输,因为UDP协议是不保证可靠的,UDP协议也是不保证可靠的,因此UDP是不进行重发的。如果要重发,那只能从应用层协议触发重传,然后所有数据一起重发。而且此时在接受方接收到传来的数据是缺失的,没有办法进行组装,因此IP协议就会将这样的数据丢掉。因此是不会到达传输层UDP协议的。 因此接收方的应用层是无法收到的,此时要进行重传,一定是所有数据一起进行重传。

1.2IP地址管理

1.2.1IPV4版本的IP地址

  • IP地址本质上是unit32_t的整数,IP地址=网络号+主机号。
  • 网络号:可以在网络中表示一个子网,一个子网当中会有多个ip地址。
  • 主机号:在一个子网当中表示一个主机。

1.2.2IP地址的早期划分方式:

 A类:0.0.0.0~127.255.255.255,一个字网当中有16777216个IP地址。

高一位固定为0,后7位为网络号,24位为主机号。

网络号的范围:0 0000000~ 0 1111111 ,0~127 ,0.0.0.0~127.0.0.0

主机号范围:00000000 00000000 00000000~11111111 1111111 1111111 ,0.0.0~255.255.255。

B类:128.0.0.0~191.255.255.255,一个子网当中最大的IP数量位2^16。

高两位固定为10,,1位网络号,16位主机号

网络号范围:10 000000 00000000~ 10 111111 11111111,128.0.0.0~191.255.0.0

主机号范围:00000000 00000000~11111111 1111111 ,0.0~255.255

C类:192.0.0.0~233.255.255.255,,C类IP地址中,一个子网最大的IP树龄位为2^8。

高三位固定为110,网络号21位,主机号8位

网络号范围:110 0000 00000000 00000000~110 11111 11111111 11111111 ,192.0.0~233.255.255

主机号范围:00000000~11111111 ,0~255

D类:224.0.0.0~239.255.255.255

E类:240.0.0.0~247.255.255.255

1.2.3现在分配IP的方式--CIPR方式

CIPR完成的事情是更加精细化的划分子网,一个子网当中的IP地址,可以比C类地址少,可以定义子网当中的IP地址数量。它还引入了子网掩码。子网掩码本质上是unit32_t的整数,子网掩码从最高位到最低位需要有连续1的存在。IP地址子网掩码的关系如下:

  • 网络号=子网掩码&IP地址
  • 子网掩码取反=当前子网的主机(IP数量)数量 [结论:子网掩码有多少位为1,则表示主机号使用多少个比特位]

现在的IP地址都是经过CIDR方式分配的,不存在A类,B类,C类的地址说法。IP地址是由路由器设备给链接上的机器分配的;分配IP地址的时候,会分配上子网掩码。在这里,特殊的IP地址如下:

  • 0.0.0.0:代表本地机器所有网卡地址
  • 127.0.0.1:代表本地回环网卡地址
  • 主机号全为0:称之为子网网络号,可以表示当前的子网
  • 主机号全为1:称之为网络广播号

二.路由选择

路由选择是在为网络数据选择连接合适的设备进行转发。路由器上面的网口有WAN与LAN。

  • WAN:是当前路由器连接上级路由器的网口
  • LAN:是子网内机器连接本路由器的网口

如下图所示,是一张路由表:

假设现在产生了一条数据,他有五元组信息目的IP,源IP,目的端口,源端口,协议。要将这条消息进行发送,用网络数据的目的IP&路由项的子网掩码,得出来的结果与当前路由项的网络号进行比对,比对上了,说明当前的数据是想要递交给当前路由项当中的某一个机器的(隐含的意思是目的主机和当前的源主机在同一个子网下);没有对比上,则会最终通过默认网关,发送到上级路由。在这里我们要记住,网络层在进行选路,但是具体怎么从机器到相邻设备传输,网络层并没有关注。

以上是关于Linux--网络4(网络层)的主要内容,如果未能解决你的问题,请参考以下文章

Linux--网络4(网络层)

Linux网络设备驱动之设备驱动的结构

Linux 系统的网络基础_all

Linux 网络编程4网络层--UDP/TCP协议,3次握手4次挥手粘包问题等

Linux自学笔记——Linux网络基础命令及属性配置

linux网络协议栈源码分析 - 网络层IP网际协议