[Linux] Linux网络之网络层协议详解

  网络层使用IP协议,IP协议基于IP地址转发分包数据,IP是跨网络传送数据包得,使整个互联网都能收到数据的协议。
  网络层与数据链路层的关系。数据链路层提供两个设备之间的通信,网络层提供在整个网络中的起始地与目的地,数据链路层负责在一个网络中的两个设备的通信,而网络层提供整个网络中的通信。

1. IP协议

  IP协议主要解决端到端,点到点的数据传输,即将数据经过路径选择,送达到对方主机的过程(路由)。
  IP给通信双方提供了一种能力,将数据从A主机跨网络送到B主机的能力,但IP不保证可靠性,可靠性交给TCP保证。

1.1 概念

路由
在这里插入图片描述

路由是将分组数据发送到最终目标地址的功能,可以通过路由控制确定到达目标地址的通路。
其中路径中的到达一个一个站点的过程叫做"跳",一跳指利用数据链路层以下分层的功能传输数据帧的一个区间,以太网等数据链路中使用MAC地址传输数据帧,一跳是指从源MAC地址到达目标MAC地址之间传输帧的区间。

IP面向无连接

在发包之前,不需要建立与对端目标地址之间的连接。上层发送数据时,会被立即压缩成为IP包发送出去。
在发送数据时,一定有传输层TCP先建立好了连接,并且可靠性也由上层协议进行保障
即IP只负责发送数据,可靠性有TCP保证

IP地址
IP地址由两部分构成,网络地址 + 主机地址
网络地址保证相连接的每个段的地址不重复,相同段内的主机具有相同的网络地址,但主机地址一定不同
通过上述条件保证了网络中不会由两台重复的主机出现。

IP地址的分类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
广播地址:主机号全为1的地址,如果向广播地址发送信息,则这个网络号内的所有主机都能收到该信息。

子网掩码
  上述的分类就由子网掩码进行标识,网络号的位置子网掩码全1,主机号子网掩码全为0
在这里插入图片描述

1.2 IP协议的报头

在这里插入图片描述

  • 4位版本: 标识是协议的什么版本 ipv4
  • 4位首部长度: 标识IP首部的大小不包含有效载荷,单位为4字节,最大长度为60字节(415)。如果没有有效载荷,长度就为5, 所以首部长度为 45=20字节。
  • 8位服务类型: 前三位表示优先级(不使用), 中间三位表示最小延迟、最大吞吐量、最大可靠性、最小成本。最后一位保留
  • 16总长度: 表示IP报头与有效载荷的总字节数。最大长度为 2^16=65536.
  • 16位标识: 用于分片重组。同一个分片的标识相同。
  • 3位标志: 标识当前分片的数据后还有没有分片信息。第一位未使用,第二位表示禁止分片,第三位表示当前分片是否为最后一片。
  • 13位片偏移: 分片相对于原始数据中的位置,表示当前分片在整个数据包中的位置,用于标定分片顺序。第一个分片片偏移位0。最大的偏移位置为2^13=8192。
      IP数据包的最大总长度为2^16=65536个字节,计算在整个数据包中的偏移字节数量时: 偏移的字节大小=13位片偏移 * 2^3
  • 8位生存时间(TTL): 允许IP数据包最大经历的路由器的数量,即跳数,每经过一跳TTL-1,TTL为0时,还没有达到对端主机,就丢弃该数据包。
  • 8位协议: 表示当前的IP数据包向上交付个哪一个协议。
  • 16位首部校验和: 只校验数据报的首部,不校验数据部分。校验IP数据报不被破坏。
  • 32位源地址: 表示发送端地址,在传输过程中一般情况下不会发生改变,但是私网向公网转换时可能就改变了
  • 32位目的地址: 接收端地址

1.3 IP的分片与组装

1.3.1 IP为什么要进行分片传输?

  因为在数据链路层中有一个MTU(最大传输单元),指的是物理网卡一次发送数据所能承受的最大载荷,默认值为1500字节。
  所以在IP层向下层交付数据时,总长度不能超过1500字节,即除去IP报头的长度,传输层传来的数据只能由1480个字节,如果上层超过这个长度,那么数据链路层无法一次性转发这么多数据,所以需要进行分片传输。
  谁分片谁就进行组装。

1.3.2 如何进行分片

  如果此时有4500个字节的数据从传输层传输给IP层,那么就需要将此数据分为4片进行传输,4500只是数据的总长度,网络层进行分片时还需要加上IP协议的20个字节的报头,所以必须进行4次分片传输。

1.3.3 如何进行组装

  IP的上层协议并不知道IP进行了分片,因为上层协议不关心下层协议的实现细节,只保证能收到完整的数据包。上层协议需要知道下层的分片细节,否则无法进行组装,需要知道同一个分组中的分片,与同一分组内分片的次序

  • 由3位标志位标识出哪些报文进行了分片
  • 16位标识确定哪些分片属于一组
  • 13位片偏移标定分片的顺序

分组时可以根据偏移确定报文是否丢失,因为IP报头中含有有效载荷的长度,可以根据片偏移与长度确定丢失的是哪一块数据。

注意

  分片在网络中进行传输时,不同的分片可能走的是不同的路由,分片到达对端主机时,可能不是按照分片顺序到达的。

1.4 问题

1. 如何分离IP报头与有效载荷?

IP报头中的首部长度可以确定报头长度,16位总长度确定了数据包的总长度。总长度-报头长度=有效载荷长度。

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

TCP数据不需要网络进行分片传输
  由于TCP在三次握手过程中,已经协商了各自传输的最大报文段数据长度(MSS),而各自报文段的最大长度由各自的MTU计算得来 MSS + TCP_header + IP_header <= MTU.
  通信双方在协商时,采用最小的MSS。TCP在传递数据至网络层时,严格按照MSS进行传输,传输到网络层的数据一定是小于MTU的。所以不需要分片传输。
  MTU的大小由数据链路层规定,默认值为1500字节

3. IP协议在传输UDP数据时,是否需要IP协议进行分片传输?

如果发送的数据长度超过MTU需要分片传输
  UDP是面向数据报,整条数据交付给网络层,UDP协议的最大传输数据是2^16=65536字节,有可能UDP递交给网络层时,就已经超过了MTU。
  UDP整条交付的数据大于MTU,则网络层需要进行分片传输。
  UDP整条交付的数据小于MTU,则网络层不需要对齐进行分片传输。

4. 如果某一分片丢失是重发分片还是整个数据包?

会重发整个数据包,网络层并不保证可靠传输,如果分片丢失,那么在校验数据时就会不通过,则接收端会请求重发报文,因为IP并不保证可靠性,所有的可靠性都是由传输层协议保证
UDP分片传输是最麻烦的,如果UDP中的一个分片丢失,那么整个数据包就丢弃了,但是UDP没有重传机制。

2. 公有地址与私有地址

互联网中的每一个IP地址唯一标识了一台主机。但是IP地址只有32位,势必会造成IP地址不够的情况。使用NAT进行私有地址和公有地址进行转换。

在这里插入图片描述
私有IP最早没有计划连接互联网,而只用于互联网之外的独立网络。然而,当一种能够互换私有IP与全局IP的NAT技术诞生以后,配有私有地址的主机
与配有全局地址的互联网主机实现了通信。

2.1 NAT转换

  • 静态NAT: NAT服务器,针对私网IP一对一转换为公网IP
  • 动态NAT: NAT服务器维护多个公网IP地址,当私网主机想要访问互联网是,找一个空闲的IP地址与之转换。

以上两种方法,转换时还是一对一的关系,并没有实质性解决IP枯竭的问题

  • NAPT: 动态NAT重载,不仅将私网IP转换为公网IP,还需要将端口转换成为不同的端口,NAPT可以使用统一的公网IP地址,映射不同的私网IP,一个公网IP最多可以映射2^16个私网IP

总结

  • NAT服务器将网络划分成了公网和私网
  • NAT服务器针对私网请求数据进行转换源IP地址,针对公网回复的应答数据转换目的IP地址
  • NAT服务器的转换,针对消息的双方是透明的,无感知的
  • 网络请求只能由私网主机发起,进行NAT转换由公网主机应答
  • NAT服务器在转换之后,需要保存映射关系

3. 路由

在这里插入图片描述

路由选择是为是网络数据选择合适的设备进行转发
路由器上面的端口,WAN:是当前路由器连接的上级路由器的网口,LAN:是子网内机器连接本路由器的网口。

3.1 路由过程

在这里插入图片描述

3.2 路由表

在转发设备内部会维护一张路由表,存储的是目标网络的网络号,默认网关,子网掩码。

过程:(目的IP地址 & 子网掩码) 与当前网络号比较,对比上说明当前的数据是想要递交给当前路由器下的某一台主机(目的主机和源主机在同一子网中)。没有对比上会经过默认网关,发送给上级路由。

路由表中的最后一行,主要由下一跳地址和发送接口两部分组成,当目的地址与路由表中不匹配时,按照默认路由直接发送到下一跳。

4. ICMP协议

ICMP协议是一个 网络层协议
一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通; 但是IP协议并不提供可靠传输. 如果丢包了, IP协议并不能通知传输层是否丢包以及丢包的原因.,ICMP正是提供这种功能的协议;
ICMP功能

  • 确认IP包是否成功到达目标地址.
  • 通知在发送过程中IP包被丢弃的原因.
  • ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 因此人们仍然把它归结为网络层协议;
  • ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6;
    在这里插入图片描述

ping命令 基于ICMP实现的

  • 注意, 此处 ping 的地址可以是域名, 而不是url! 一个域名可以通过DNS解析成IP地址.
  • ping命令不光能验证网络的连通性, 同时也会统计响应时间和TTL(IP包中的Time To Live, 生存周期).
  • ping命令会先发送一个 ICMP Echo Request给对端;
  • 对端接收到之后, 会返回一个 ICMP Echo Reply
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值