[linux]linux网络之网络层协议详解(代码片段)

哦哦呵呵 哦哦呵呵     2022-12-24     533

关键词:

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

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

[linux]linux网络之tcp协议详解(代码片段)

目录1.传输层2.端口号3.TCP协议3.1TCP协议的特性3.1.1面向连接3.1.2可靠传输3.1.3面向字节流3.2TCP报头3.3TCP连接管理及可靠性问题3.3.1可靠性3.3.2保证可靠性的机制3.3.3保证效率的机制3.3.3.1滑动窗口机制3.3.3.2拥塞控制3.4其它机制3.4.1延... 查看详情

[linux]linux网络之数据链路层详解(代码片段)

1.数据链路层  处于TCP/IP中物理层,数据链路层的协议定义了通过通信媒介互连的设备之间的传输规范.在计算机中数据是由01表示的,实际通信时通信媒介处理的时电压的高低、光的闪灭及电波的强弱等信号。把这些信号与0... 查看详情

[linux]linux网络编程之http协议详解(代码片段)

...制协议在上一篇socket编程中谈到了协议,程序员系的网络程序,全部都部署在应用层。协议是一 查看详情

[linux]linux网络之数据链路层详解(代码片段)

...地址描述的时路途总体的起点与终点。数据转发过程  网络中进行数据传输时,数据从数据链路层出发,会经过路由器转发到外部网络,从路由器发出时源mac地址和目的mac地址会发生改变,并且每经过一个区间m... 查看详情

linux网络基础--传输层详解(代码片段)

网络基础--传输层详解🍅传输层🍋再谈端口号🥝netstat指令🥝端口号划分范围🥝常见的知名端口号(Well-KnowPortNumber):🍋UDP协议🥝UDP协议段格式🥝UDP协议的特点🍓面向数据报🥝UDP的缓... 查看详情

linux网络基础--传输层详解(代码片段)

网络基础--传输层详解🍅传输层🍋再谈端口号🥝netstat指令🥝端口号划分范围🥝常见的知名端口号(Well-KnowPortNumber):🍋UDP协议🥝UDP协议段格式🥝UDP协议的特点🍓面向数据报🥝UDP的缓... 查看详情

linux之网络基础?

网络基础网络模型有两种基本类型:协议模型和参考模型。TCP/IP模型描述了TCP/IP协议簇中每个协议层实现的功能,因此属于协议模型。开放式系统互联(OSI)模型是最广为人知的网际网络参考模型,用于数据网络设计、操作规范和... 查看详情

linux网络协议栈源码分析-网络层ip网际协议(代码片段)

1、IP报文1.1、IP报文格式         更详细的介绍参考《TCP/IP详解卷1:协议》第3章IP:网际协议。1.2、IP首部结构体structiphdr#ifdefined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4;#elifdefined(__BIG_ENDIAN_BITFIELD) __u8 vers 查看详情

linux网络基础--网络层与数据链路层(代码片段)

网络基础--网络层与数据链路层详解🌴网络层🌿网络层概念🌵网络层主要功能🌿网络层协议🌵IP协议🍁基本概念🍁协议头格式🍁网段划分🌱特殊的IP地址🌱IP地址的数量限制🌱私有I... 查看详情

linux网络基础--网络层与数据链路层(代码片段)

网络基础--网络层与数据链路层详解🌴网络层🌿网络层概念🌵网络层主要功能🌿网络层协议🌵IP协议🍁基本概念🍁协议头格式🍁网段划分🌱特殊的IP地址🌱IP地址的数量限制🌱私有I... 查看详情

linux网络协议栈源码分析-链路层arp地址解析协议(代码片段)

1、ARP报文格式 1.1、ARP报文格式ARP报文的格式如下:(具体各字段的含义参考《TCP/IP详解卷1:协议》第4章ARP:地址解析协议)1.2、内核定义op定义如下:#define ARPOP_REQUEST 1 /*ARPrequest */#define ARPOP_REPLY 2 /*ARPreply */协议类型定... 查看详情

linux系统诊断必备技能之二:tcpdump抓包工具详解

TcpDump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 查看详情

arp无应答?详解linux网络中arp(代码片段)

...直接用来进行通信的。这是因为IP地址只是主机在抽象的网络层中的地址。若要将网络层中传送的数据报交给目的主机,还要传到链路层转变成MAC帧后才能发送到实际的网络上。因此,不管网络层使用的是什么协议,... 查看详情

docker网络原理详解02(代码片段)

Docker网络网络基础Docker使用到的与Linux网络有关的技术分别有:网络名称空间、Veth、Iptables、网桥、路由网络名称空间为了支持网络协议栈的多个实例,Linux在网络协议栈中引入了网络名称空间(NetworkNamespace),这些独... 查看详情

linux内核网络udp数据包发送——udp协议层分析(代码片段)

1.前言本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调优。2. udp_sendmsg这个函数定义在net/ipv4/udp.c,函数很长... 查看详情

linux内核网络udp数据包发送——udp协议层分析(代码片段)

1.前言本文分享了Linux内核网络数据包发送在UDP协议层的处理,主要分析了udp_sendmsg和udp_send_skb函数,并分享了UDP层的数据统计和监控以及socket发送队列大小的调优。2. udp_sendmsg这个函数定义在net/ipv4/udp.c,函数很长... 查看详情

linux网络协议栈源码分析-传输层(tcp连接的终止)(代码片段)

1、连接终止过程(四处挥手)1.1、四次挥手        《TCP/IP详解卷1:协议》“图18-4连接终止期间报文段的正常交换”如下: 1.2、tcp状态变迁图2、close系统调用(第一次挥手)        客户端端调用close,发送FIN报文。2.1... 查看详情

linux网络协议栈源码分析-传输层(tcp连接的终止)(代码片段)

1、连接终止过程(四处挥手)1.1、四次挥手        《TCP/IP详解卷1:协议》“图18-4连接终止期间报文段的正常交换”如下: 1.2、tcp状态变迁图2、close系统调用(第一次挥手)        客户端端调用close,发送FIN报文。2.1... 查看详情