当前位置: 首页 > news >正文

Linux网络编程_网络层_ip协议

Linux网络编程_网络层_ip协议

IP协议预备知识

IP协议保证有较大概率能将数据报跨网络从A主机传送到B主机,具体来说,IP协议保证A、B两端的主机具备唯一性,而TCP/UDP等传输层协议保证的是进程到进程间的问题(端口号)

  1. 主机:配有ip地址的需要进行路由控制的设备
  2. 路由器:配有ip地址,同时主要工作为进行路由控制的设备(注:现代路由器往往就是小型计算机)
  3. 节点:主机和路由器的统称
  4. 路由的本质理解:从一个子网到另一个子网
  5. 一个公网ip由两部分构成,分别是网络号和主机号,网络号常用子网掩码进行划分,而主机号则用来保证该子网内主机的唯一性

IP协议报头


Linux底层IP协议结构体:

  1. 4位版本号:即IPV4或IPV6-》目前常用IPV4
  2. 4位首部长度:与TCP报头的4位首部长度功能类似,用于表示IP报头总长度(20Byte + 选项字段长度)
  3. 8位服务类型:3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置
    为0).4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本。这四者相互冲突,只能选择
    一个,对于ssh/telnet这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要
  4. 16位总长度(字节数):表示整个IP报文的大小-》与4位首部长度配合可以确保正确提取IP报文与分离报头与正文
  5. 8位生存时间(TTL):确保IP数据报不会长期存在于网络中(集线器会加强信号,若不规定该字段,数据报会不死不灭,造成严重的资源浪费甚至网络阻塞)
  6. 8位协议:即传输层协议(常用UDP、TCP)
  7. 16位首部校验和:校验报文正确性
  8. 32位源IP地址:即发送方主机IP
  9. 32位目的IP地址:即接收方主机IP
  10. 关于16位标识,3位标志,13位片偏移这三个字段,稍复杂,下一个标题会具体讲解

IP协议16位标识,3位标志以及13位片偏移的功能

IP分片

首先,要了解到,对于网络层的下一层——数据链路层,它要求网络层传递给它的sk_buff必须不超过1500字节(MTU,即最大传送单元),因此,若网络层收到了sk_buff超过MTU的sk_buff,就必须要进行分片处理,具体来说,其会把sk_buff分成多个不超过MTU的报文交给数据链路层,而网络层进行分片的缺点是,当这些分片之一丢失,传输层会认为整个报文丢失,发送方需要重发所有分片,从而会严重影响效率,因此,该解决方案并不是主流,但仍较为重要,下面详细来说:该方案的实现依赖于IP协议中第二行的三个字段,即16位标识,3位标志以及13位片偏移,其功能分别是:

  1. 16位标识:若当前IP报文具备分片,则同组分片的各个IP报文16位标识相同
  2. 3位标识:第一位标识目前未规定功能,待协议规定,必须为0第二位为1表示禁止分片,若此时正文大小超过MTU,就会直接丢弃该报文,相应的,0表示允许分片;第三位为“更多分片”标识,需要分片时,除最后一个分片外,其他分片该标识需置1,最后一个分片中,该标识为0
  3. 13位片偏移:表示当前分片位于整组报文中的字节偏移量(总字节数/8),首先需保证,非最后一片的每个分片的正文字节数是8的整数倍(即不包含IP报头的大小),然后,具体来说,若每个分片的大小均为为1480字节正文 + 20字节IP报头(最后一个分片正文大小可能小于1480),则第一个分片13片偏移为0,第二个分片片偏移字段为1480 / 8 = 185,第三个分片该字段则为2960 / 8 = 370,最后一个分片为剩余字节数(小于MTU-》1500字节)
    注:每个分片大小可以不同,但一般都是相同的(最后一个分片除外)

IP分片丢失检验与组合为完整报文

  1. 判断是否分片:若分片,则最后一个分片的偏移量一定不为0,且中间分片偏移量也不为0,同时,第一个分片与中间分片的3位标识的最后一位为1
  2. 判断分片是否丢失:接收方将所有16位标识相同的报文放到一起,然后根据片偏移升序排序,然后依次比较第0 ~ X个报文的总字节数与X报文的片偏移 * 8的大小,当全都相等且最后一个报文的3位标识最后一位为0时,表示分片能够组合为完整报文,则正确组合,交由上层,否则则认为分片丢失,会要求发送端重新发送

注:上面已经提到,网络层分片具备显著缺点,而要保证网络层发送给数据链路层的单个sk_buff不超过MTU,其实只要确保传输层的正文部分不超过1472/1460字节(除去UDP报头的8字节或TCP报头的20字节,以及IP报头的20字节)就可以了,因此,对于TCP协议,解决方案就是将传到传输层的sk_buff分为多个不超过1460字节的正文再封装为TCP报文即可,而这也就是当初学习TCP协议滑动窗口时,窗口中的报文被分成了多块的原因,这也是常用解决方案之一

IP报文封装

当网络层收到传输层传来的sk_buff指针后,IP报头封装的工作也是通过移动sk_buff的data指针与tail指针进行的,但与传输层不同的是,网络层封装时可能也会在尾部添加一些必要数据,因此也可能需要后移tail指针

注:IP层、MAC层、某些netfilter/隧道/校验相关逻辑可能需要进行tail指针的后移,而一般应用层,传输层不会进行tail指针的移动

IP划分方式

IP分类划分法

  1. 划分方式

    • A类0.0.0.0到127.255.255.255
    • B类128.0.0.0到191.255.255.255
    • C类192.0.0.0到223.255.255.255
    • D类224.0.0.0到239.255.255.255
    • E类240.0.0.0到247.255.255.255
  2. IP分类划分的缺点与不足

    • 首先,该种划分方案会导致ip地址的浪费,可能分配出E类ip,但使用场景仅需要2个ip地址,如此,该网段其他ip地址就被浪费了
    • 该划分方案是网络发展之初提出的,当时认为ip地址是绝对够用的,可32位的ip地址仅仅2 ^ 32 = 4,294,967,296(约等于43亿)个,现如今已经远远不足

无类域间路由(CIDR)

由于上述IP分类划分法的不足,提出了无类域间路由(CIDR),其不固定网络类别,而是采取子网掩码的方式进行网段划分,如:

该种策略能确保网段划分粒度更细,解决了ip地址的浪费问题,但ip数量不足的问题仍待处理,后续将会提出对应解决方案

注:两种策略并非谁优谁劣,而是根据实际需求进行选择,且大多情况下两者是互补的

特殊的IP地址

  1. 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网
  2. 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包
  3. 127.*的IP地址用于本机环回(loopback)测试,通常是127.0.0.1

路由器功能

  1. 路由器中至少具备两套ip,一套用于接收数据报(LAN),另一套用于发送数据报(WAN)
  2. 路由器本身可以用于数据报传输,同时,其还具备分配子网的功能
  3. 路由器LAN端口IP与WAN端口IP不属于同一网段-》路由器具备隔绝子网的功能
  4. 当连接WIFI时,路由器会自动为连接者提供一个属于接收数据报的ip地址,该分配使用DHCP协议

IP传输数据过程的理解

为什么要将ip地址分为两部分呢?直接使用ip地址本身不久具备唯一性吗?答案是,便于管理,提高效率,通过下面示例即可深刻认识该特点:

示例:
学校中,张三捡到一个钱包,其中仅具备失主的学号信息,那么,若仅将学号当作一个数字,那张三想要找到失主就要遍历所有学号,但如果将学号当作按规律划分的一串数据(如前XX位表示年级,后XX位表示二级学院,最后XX位表示专业班级个人),那张三就可以先通过前XX位找到失主的年级,这样,一次查询便减少了3/4的查询次数,然后,再通过二级学院等信息,进行快速筛选,仅需几次就能正确找到失主,如此,查询次数从几万次更新为了几次,大大提高了效率-》同类设计也有身份证号,手机号等等

而网络本身也是如此,这里假设,每个国家都会分配到不同的网段,而每个省又将分配到获得网段的子网……如下图(注,该图为极简网络拓补图,现实要复杂的多):

其中,每个国家可以看作上述的每个学院,对于单个国家的大网段,会向下划分为各个小网段,差不多到市级网段(不一定),就开始采取WAN为公网IP,LAN为内网IP确保IP足够,后续再向下分配,就采取WAN与LAN均为内网IP的方案了,同时,每个学院都会有一个代表(国际路由器)与其他学院代表建群,且学院代表也会与本学院的各专业代表(省间路由器)建群,且各专业代表也会与专业各个班级的代表(市间路由器)建群……-》即,每个路由器都会至少加两个群(至少具备两组IP),用于未来数据的转发

借助上述图示,来粗略描述下IP传输数据过程:假设一个数据要从俄罗斯转发到西安路由器(即目标IP为5.1.16.0/20),那么,俄罗斯的国际路由器会查询自己的路由表的国际字段部分,对比子网掩码,发现匹配到了中国的网络地址,然后返现下一跳地址为5.0.0.1,于是将数据通过国际主干网(学院代表群)交给中国的国际路由器,而后中国国际路由器收到该报文,发现该报文是发给自己的,就去查路由表的省间字段部分(自身所处的本学院各个专业代表群),发现目标IP位于陕西,于是,将报文转发给陕西路由器,陕西路由器收到后,查询自身路由表的市路由部分,查到目标IP在西安,于是将报文转发到了西安……

注:就算是国际路由器,也不会LAN和WAN共用一套公网IP,而是会和国际通信用一套,和各省通信用一套,如上图中,中国WAN1使用5.0.0.1/8与国际通信,WAN2使用5.6.0.1/16与各省通信,这样做的优点是,两套ip可以解决安全隔离 + 运营商限制的问题

IP地址不足的解决方案

IPv6技术

IPv6是我国提出且在大力推行的解决方案,具体来说,IPv4技术中,ip地址为32位,而IPv6则将ip地址设置为128位(即43亿 ^ 4),但由于IPv6与IPv4互不兼容,所以目前仍未在国际中推行

虚拟IP技术(私网IP(Private IP)+ NAT(公网IP共享))

虚拟IP技术是现在国际通用的解决IP地址不足的方案,接下来从以下角度进行了解:

  1. 先聊聊公网和内网:

    • 现代网络在宏观上被分为两类:公网和内网(子网/局域网),而公网ip在全球范围内是唯一的,内网仅在所在局域网内唯一,也就是说同一个内网ip在全球可能有多份
    • 按道理来说,任何ip都可以作为内网ip,但RFC1918规定,仅有以下网段可以用作内网ip:
      • 10.*,前8位是网络号,共16,777,216个地址;
      • 172.16.*到172.31.*,前12位是网络号,共1,048,576个地址;
      • 192.168.*,前16位是网络号,共65,536个地址
    • 我们每个人连接到的,使用的ip都是内网ip
    • 内网ip绝不会出现在公网上
    • 误区:要理解到,公网和内网ip没有任何关系,不存在内网ip必须和对应公网ip处于同一网段的限制,但内网IP必须落在该局域网的网段范围内,即必须与该网段的子网掩码一致
    • 示例:

      连接广域网的图中B主机以及F路由WAN口IP:122.77.241.4/24,I路由WAN口IP:122.77.241.5/24即为公网IP,其余IP均为内网IP,能够发现,路由F的子网IP(LAN口IP)与路由G,H的WAN口IP在一个子网内,但路由G的LAN口IP与B,C两主机的IP属于同一子网,也就是说,B,C主机的IP与路由F,G,H构成的子网无关,换言之,通过路由器构建分配子网的功能 + 路由器隔离子网(即WAN口与LAN口不在同一内网) + 内网IP全球可重复(局域网唯一),所以,通过该种内网分配技术,即可充分解决IP地址不足的问题

    注:公网IP有限,但内网IP全球范围可重复(局域网内唯一),也可以是无限,当不足时,再套一组路由器即可

  2. NAT技术:

    • 简单来说,该技术的功能就是,将内网ip映射为公网ip,以便实现数据传输
    • 从下面示例进行详细理解:

      假设需要从B主机发送消息到A主机,B主机将IP报文交给路由器G,路由器通过子网掩码发现目标A的IP地址为不在本局域网内,就会用自己的WAN口IP与端口号替换源IP与端口号,并将更新后的IP报文传递给F路由器,当F收到后,发现目标A的IP为不在本局域网内,会使用自身WAN口IP与端口号替换IP报文中的源IP与端口号,然后将IP报文发送到广域网中,最终被A主机接收,该过程中使用WAN口IP替换报文中源IP与源端口号的技术就称为NAT技术
      注:上述过程其实路由器也可直接通过目标IP不符合内网IP规则判断出为公网IP,直接层级发送到广域网,但目前实际不会采取该方案,一般仅通过比较路由表来搜索目标IP进行报文转发

文中源IP与源端口号的技术就称为NAT技术`
注:上述过程其实路由器也可直接通过目标IP不符合内网IP规则判断出为公网IP,直接层级发送到广域网,但目前实际不会采取该方案,一般仅通过比较路由表来搜索目标IP进行报文转发

http://www.jsqmd.com/news/812249/

相关文章:

  • 1. 装修设计工作室怎么选?哪些才是真正的优质之选!2. 想找好的装修设计工作室?这些要点帮你精准挑选!3. 装修设计工作室哪家强?这份挑选攻略值得一看!4. 不知道装修设计工作室选哪家?看这里
  • 100GbE技术演进:背板PAM4与光模块25G的路线之争
  • 国际空间站千亿投资价值解析:从系统工程到商业航天的战略意义
  • 如何在 WordPress AMP 网站中为特定模板禁用 AMP 渲染
  • AI 术语通俗词典:Logistic 函数
  • 服务器中的算力运行
  • 代码托管工具在GEO工具中表现分析
  • Omnara:构建AI智能体统一控制中心,实现人机双向实时协同
  • 从CAN报文过滤到实战:手把手教你用SocketCAN设置接收规则(含掩码详解与避坑)
  • IoT设备安全调试:密钥分发与身份验证实践
  • 072-基于51单片机水平仪【Proteus仿真+Keil程序+报告+原理图】
  • 在线教程丨单卡即可爆改,面壁智能等开源MiniCPM-V-4.6,1.3B端侧模型支持图像理解/视频理解/OCR/多轮多模态对话
  • 从DO-178标准演进看多核系统耦合分析:隐式要求显式化与可视化实践
  • 华为交换机CE6855-HI系列交换机固件升级
  • Elasticsearch ES|QL “读取时模式”:你的未映射字段一直都在那里
  • 在Windows平台解锁iOS应用的全新体验:ipasim模拟器深度解析
  • AIGC实战指南1——PyTorch手搓DDPM:从噪声到图像的生成魔法
  • Auto Research 来了:当 AI 开始接管科研里最苦的活,意味着什么
  • RISC-V开源指令集架构:从设计哲学到商业落地的芯片设计新范式
  • 从温度计误差到数字设计:测量不确定性与工程信任链构建
  • Cursor Pro激活终极指南:深度解析多平台无限制使用方案
  • 2026年4月小蠹引诱剂靠谱品牌推荐指南:诱芯诱捕器、信息素诱捕器、天牛诱捕器、害虫诱捕器、小蠹引诱剂、小蠹诱捕器选择指南 - 优质品牌商家
  • 八、命令行参数和环境变量
  • 在AI时代重新定义“软件测试”:从找Bug到质量架构师
  • 【DeepSeek+Grafana可视化实战指南】:20年SRE亲授5大避坑法则与实时指标监控黄金配置
  • 宠物胰岛素注射剂量安全指南:从单位与毫升混淆到规范操作
  • ARM PMSWINC寄存器解析与性能监控实践
  • macOS WPS文档工作流优化:基于Pandoc的预处理与兼容性解决方案
  • 一键安装器设计指南:从Shell脚本到自动化部署架构
  • Instagit:基于MCP协议,让AI编程助手精准分析Git仓库代码