[Linux] Linux网络之网络层协议详解
Posted 哦哦呵呵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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
以上是关于[Linux] Linux网络之网络层协议详解的主要内容,如果未能解决你的问题,请参考以下文章