ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Linux下 网络层IP协议详解

Linux下 网络层IP协议详解 欢迎来到我的频道【点击跳转专栏】本文所有代码已托管至码云【点此转跳】文章目录0. ⽹络层1. IP协议1.1 基本概念补充1.2 几个简单问题入门1.2.1 初步理解IP作用1.2.2 IP地址的构成和查找目标主机的方法是什么1.2.3 TCP VS IP1.3 协议头格式1.4 ⽹段划分重要1.4.1 划分原理1.4.2 为什么要进行网段划分1.4.3 分类划分法1.4.4 CIDR⽆类别域间路由1.4.5 特殊的IP地址1.5 IP地址的数量限制1.6 私有IP地址和公⽹IP地址1.7 尝试理解公⽹1.8 路由公网2. IP分⽚和组装的具体过程2.1 分片2.2 组装2.3 如何和为什么要避免分片0. ⽹络层在复杂的⽹络环境中确定⼀个合适的路径。1. IP协议1.1 基本概念补充主机: 配有IP地址, 也要进行路由控制的设备;路由器: 即配有IP地址, 又能进行路由控制路由器本质上也是主机的一种;节点: 主机和路由器的统称;在网络中 我们一般将 两端称为主机中间途经的叫节点1.2 几个简单问题入门1.2.1 初步理解IP作用数据从B-C,中间要经历无数个子网转发而主机是根据报文中的目的IP进行路径选择的1.2.2 IP地址的构成和查找目标主机的方法是什么IPV4是由4字节组成的IP地址 目标网络子网 目标主机子网中的编号如学号 学院号 专业号 班级号 个人编号组成这样就能很方便我们找到这个学号对应的人这也就表明 单纯的数字是能够具有一定的指向性的我们要理解的不是单纯一个数字真正要理解的是网络的组织结构在这个特定场景下 IP地址才有指向意义1.2.3 TCP VS IPIP协议提供了一种能力把数据包从主机A 跨网络 经过路径选择路由转发传送到主机B的能力我们要知道什么叫能力我们说你有进大厂的能力 不是说你一定能进大厂而是你有极大的概率能做成这件事情而光有能力还行你还得保证可靠性即知道怎么失败的失败后怎么改进怎么做能成功于是你就找到了你学校导师她负责帮你培训帮你改简历帮你分析面试失败原因给你解决方法直到你顺利进入大厂。进入大厂靠的是你自己的能力相当于IP协议而保障你能顺利不出岔子为你进入大厂提供策略的老师就相当于TCP协议一个提供可靠性策略TCP而具体落地完成靠的是IP协议综上TCP提供可靠IP提供能力就能保障将数据包可靠的从A主机传送到主机B1.3 协议头格式首先要认识IP本身是内核内的一个结构体4位版本号version指定 IP 协议的版本对于 IPv4 来说就是4。4位头部长度header lengthIP 头部的长度是多少个 32bit也就是length * 4的字节数。4bit 表示最大的数字是 15因此 IP 头部最大长度是 60 字节。有了这个IP报头和有效载荷分离的问题自然而然就解决了8位服务类型Type Of Service3 位优先权字段已经弃用4 位TOS 字段和1 位保留字段必须置为 0。4 位 TOS 分别表示最小延时、最大吞吐量、最高可靠性、最小成本(即 优先选择最便宜的传输路径)。这四者相互冲突只能选择一个。对于ssh/telnet这样的应用程序最小延时比较重要对于ftp这样的程序最大吞吐量比较重要。16位总长度total lengthIP 数据报整体占多少个字节整个 IP 数据报的总字节长度 IP 首部 IP 数据部分65535 字节这就是 IP 数据包最大总长度16位标识id(暂时先不管)3位标志字段(暂时先不管)13位分片偏移fragment offset(暂时先不管)8位生存时间Time To Live, TTL数据报到达目的地的最大报文跳数。一般是 64。每次经过一个路由TTL - 1一直减到 0 还没到达那么就丢弃了。这个字段主要是用来防止出现路由循环。8位协议表示上层协议的类型是TCP还是UDP等如TCP6、UDP17由发送端来填。16位头部校验和使用CRC进行校验来鉴别头部是否损坏上层是UDP直接丢不关心TCP则会重传。32位源地址和32位目标地址表示发送端和接收端。选项字段不定长最多40字节 略。数据UDP或者TCP报文。1.4 ⽹段划分重要1.4.1 划分原理IP地址分为两个部分, ⽹络号和主机号⽹络号:保证相互连接的两个⽹段具有不同的标识主机号:同⼀⽹段内, 主机之间具有相同的⽹络号, 但是必须有不同的主机号路由器有个核心能力DHCP协议知道就行叫做构建子网局域网不同的⼦⽹其实就是把⽹络号相同的主机放到⼀起如果在⼦⽹中新增⼀台主机, 则这台主机的⽹络号和这个⼦⽹的⽹络号⼀致, 但是主机号必须不能和⼦⽹中的其他主机重复通过合理设置主机号和⽹络号, 就可以保证在相互连接的⽹络中, 每台主机的IP地址都不相同那么问题来了, ⼿动管理⼦⽹内的IP, 是⼀个相当⿇烦的事情有⼀种技术叫做DHCP,能够⾃动的给⼦⽹内新增主机节点分配IP地址, 避免了⼿动管理IP的不便般的路由器都带有DHCP功能. 因此路由器也可以看做⼀个DHCP服务器1.4.2 为什么要进行网段划分讲个故事每个学院由院学会于是学生会长和该院所有学生拉了个群叫院群然后学校所有院的学生会长又再一起拉了个校群其中学号前两位代表学院如计算机学院是01后三位代表你是学院里的哪一个有一天张三学号01123捡到个钱包只有学号06321作为 计算机学院的普通一份子正常人都不会关心其他学院是几开头的但是知道06不是计算机学院的于是就在院群学生会主席学生会主席虽然不知道321具体是机器学院的谁但是他知道06是机器学院的再在校群机器学院的学生会主席机器学院主席一看是机器学院06序号321的学生的于是就在他们院群321学号的人321的学生李四 看到就说“钱包是我的”就此 钱包顺利归还在这个故事里面张三就是源主机李四就是目标主机钱包就是报文学生会主席就是路由器院群就是内网或者子网校群就是公网报文交给目标主机的本质其实就是个查找工作而查找的本质就是淘汰我们学习过线性遍历他查找效率为什么慢因为他一次只淘汰一个而二分为什么快因为他一次淘汰一半而张三决定将学号交给院学生会主席本质就是淘汰一整个计算机学院的人而院学生会主席机器学院学生会主席本质是淘汰除机器学院其他学院的所有人所以为什么要网段划分本质 是为了支持我们查找时的快速淘汰大大提高查找效率一次淘汰一整个其他网段不用遍历全网几十亿台主机这就是子网划分的根本意义。1.4.3 分类划分法A类 0.0.0.0到127.255.255.255B类 128.0.0.0到191.255.255.255C类 192.0.0.0到223.255.255.255D类 224.0.0.0到239.255.255.255E类 240.0.0.0到247.255.255.255随着Internet的⻜速发展,这种划分⽅案的局限性很快显现出来,⼤多数组织都申请B类⽹络地址, 导致B类地址很快就分配完了, ⽽A类却浪费了⼤量地址例如, 申请了⼀个B类地址, 理论上⼀个⼦⽹内能允许6万5千多个主机. A类地址的⼦⽹内的主机数更多然⽽实际⽹络架设中, 不会存在⼀个⼦⽹内有这么多的情况. 因此⼤量的IP地址都被浪费掉了分类划分法最大的问题IP地址使用不充分的问题。1.4.4 CIDR⽆类别域间路由针对这种情况提出了新的划分方案,称为CIDR(Classless Interdomain Routing)(无类别域间路由):引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;子网掩码往往是内置在路由器内部这个24 就表示其子网掩码为255.255.255.0(左半部分24个1)可⻅,IP地址与⼦⽹掩码做与运算可以得到⽹络号, 主机号从全0到全1就是⼦⽹的地址范围IP地址和⼦⽹掩码还有⼀种更简洁的表⽰⽅法,例如140.252.20.68/24,表⽰IP地址为140.252.20.68, ⼦⽹掩码的⾼24位是1,也就是255.255.255.0那么这两种方法冲突吗不冲突比如说 A机构申请了个A类的地址0000 0111 XXXXX...但是如果我最多只能有2的16方个主机那么不就有8位浪费了于是我就可以把子网掩码设置成16位于是我内部不就可以凭白多搭建2的8次方的子网于是我就能把我的资源在我的内部再次进行好好划分即在子网里面搭建新的子网7.0.0.0到7.255.0.0不就是我能新划分的子网吗分类划分和子网划分本质属于粗分和细分可以通过子网掩码动态调整位数的方式为申请好的A类或者B类网络进行更加精细化的划分1.4.5 特殊的IP地址将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.11.5 IP地址的数量限制我们知道IP 地址IPv4是一个 4 字节 32 位的正整数那么一共只有2的32次方个 IP 地址大概是 43 亿左右。而 TCP/IP 协议规定每个主机都需要有一个 IP 地址。这意味着一共只有 43 亿台主机能接入网络么实际上并非如此原因有二由于一些特殊的 IP 地址的存在实际可用的数量远不足 43 亿IP 地址并非是按照主机台数来配置的而是每一个网卡都需要配置一个或多个 IP 地址。CIDR 在一定程度上缓解了 IP 地址不够用的问题提高了利用率减少了浪费但是 IP 地址的绝对上限并没有增加仍然不是很够用。这时候有三种方式来解决动态分配 IP 地址只给接入网络的设备分配 IP 地址。因此同一个 MAC 地址的设备每次接入互联网中得到的 IP 地址不一定是相同的NAT 技术后面会重点介绍IPv6IPv6 并不是 IPv4 的简单升级版。这是互不相干的两个协议彼此并不兼容IPv6 用 16 字节 128 位来表示一个 IP 地址但是目前 IPv6 还没有公网环境普及。1.6 私有IP地址和公⽹IP地址如果⼀个组织内部组建局域⽹,IP地址只⽤于局域⽹内的通信,⽽不直接连到Internet上,理论上 使⽤任意的IP地址都可以,但是RFC 1918规定了⽤于组建局域⽹的私有IP地址10.*,前8位是网络号,共16,777,216个地址172.16.*到172.31.*,前12位是网络号,共1,048,576个地址192.168.*,前16位是网络号,共65,536个地址包含在这个范围中的,都成为私有IP,其余的则称为全局IP(或公网IP);⼀个路由器可以配置两个IP地址, ⼀个是WAN⼝IP, ⼀个是LAN⼝IP(⼦⽹IP).路由器LAN⼝连接的主机, 都从属于当前这个路由器的⼦⽹中.不同的路由器, ⼦⽹IP其实都是⼀样的(通常都是192.168.1.1). ⼦⽹内的主机IP地址不能重复. 但是⼦⽹之间的IP地址就可以重复了每⼀个家⽤路由器, 其实⼜作为运营商路由器的⼦⽹中的⼀个节点. 这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN⼝IP就是⼀个公⽹IP了⼦⽹内的主机需要和外⽹进⾏通信时, 路由器将IP⾸部中的IP地址进⾏替换(替换成WAN⼝IP), 这样逐级替换, 最终数据包中的IP地址成为⼀个公⽹IP. 这种技术称为NAT(Network Address Translation⽹络地址转换)当对方服务器返回时路由器内部会有一个映射表将其原分不动的转换回去具体细节以后再说。细节1:我们所有人都不可能直接连接公网我们都是通过先连到局域网中通过局域网入的公网细节2:私有IP可以重复但是公网IP是不能重复的但也因为私有IP可以重复IP不足问题不就被大大缓解了细节3内网到公网的过程途经路由器都会替换src ip变成自己的WAN口IP公网内就不做替换这个替换工作只在内网转发进行1.7 尝试理解公⽹真实的⽹络结构⾮常复杂即涉及到划分公⽹IP的组织ICANN还要在全球范围内进⾏区域划分⽐如亚太北美欧洲等⼜要考虑各个国家内部的ISP代理整体拓扑⾮常复杂我们简化所有过程简单理解公⽹即可。可以把这张图理解成“从全球互联网一路找到某家公司电脑”的过程。图中最上方的云是国际互联网俄罗斯、美国、英国、法国、中国、意大利等国家或地区都通过路由器接入这里。每个国家或大型网络拥有一段公网 IP 地址例如图中用1.0.0.0/8、2.0.0.0/8、5.0.0.0/8表示不同的大网络。这里的/8表示前 8 位是网络部分后面的地址可以继续划分。中国得到5.0.0.0/8后又继续划分成更小的网络。例如中国公网5.0.0.0/8 省级网络5.1.0.0/16 城市网络5.1.16.0/20 公司对应出口5.1.16.X图中的“国家级公网”“省内公网”“市级部分”可以看成不同层级的道路。路由器通过 BGP 等路由协议互相交换信息知道“访问5.1.16.0/20的数据应该往哪个方向转发”。因此当国外用户访问5.1.16.X时数据大致会经过国外网络 → 国际互联网 → 中国国家级公网 → 对应省级网络 → 对应城市网络 → 公司出口路由器 → 公司内部网络公司出口路由器外侧使用的是公网地址例如5.1.16.1内侧通常使用192.168.x.x、10.x.x.x等私网地址。比如公司内部可能是公司内网192.168.1.0/24 员工电脑192.168.1.20 公司出口公网 IP 5.1.16.1员工电脑访问互联网时数据先从192.168.1.20发到公司路由器再由 NAT 把私网地址转换成公网地址5.1.16.1然后进入公网。外部网络通常只能看到公司的公网地址不能直接看到内部的192.168.1.20。所以公网就是不同国家、地区、运营商和组织之间共同连接的、可以通过公网 IP 和路由协议互相到达的网络。图中的国际公网、国家公网、省级公网和市级公网都属于公网图中公司内部的192.168.x.x、10.x.x.x网络则属于内网。需要注意图中的地址划分主要是为了教学演示现实中的公网地址分配并不是简单地“一整个网段对应一个国家”。1.8 路由公网在复杂的⽹络结构中, 找出⼀条通往终点的路线。举个例子小明要去清华大学问了一个大爷大爷说不知道路由表没有于是告诉你前面有个大娘默认路由一般是其出口即更高级路由器她知道你可以问她大娘告诉你位置说往前走坐公交32路坐两站下车即可查路由表告诉你下一跳结果然后下车后问了一个保安保安说 这里就是找到目标网络后面你问保安5号楼怎么走保安告诉你左转第一个路口再右转即可内网转发根据目的主机进行转发IP数据包的传输过程也和问路一样.当IP数据包,到达路由器时,路由器会先查看目的IP;路由器决定这个数据包是能直接发送给目标主机,还是需要发送给下一个路由器;依次反复,一直到达目标IP地址;那么如何判定当前这个数据包该发送到哪里呢?这个就依靠每个节点内部维护一个路由表;路由表可以使⽤route命令查看:如果⽬的IP命中了路由表, 就直接转发即可;路由表中的最后⼀⾏,主要由下⼀跳地址和发送接⼝两部分组成,当⽬的地址与路由表中其它⾏都不匹配时,就按缺省路由条⽬规定的接⼝发送到下⼀跳地址路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;注意如果看到eth0、eth1等则表示网卡设备名。loloopback 回环网卡127.0.0.1本机自己和自己通信wlan0无线 WiFi 网卡wlan wireless lan转发过程例1目的地址192.168.56.3跟第一行的子网掩码做与运算得到192.168.56.0与第一行的目的网络地址不符再跟第二行的子网掩码做与运算得到192.168.56.0正是第二行的目的网络地址因此从eth1接口发送出去由于192.168.56.0/24正是与eth1接口直接相连的网络因此可以直接发到目的主机不需要经路由器转发。转发过程例2目的地址202.10.1.2依次和路由表前几项进行对比发现都不匹配按缺省路由条目从eth0接口发出去发往192.168.10.1路由器由192.168.10.1路由器根据它的路由表决定下一跳地址。2. IP分⽚和组装的具体过程16位标识id唯一的标识主机发送的报文。如果 IP 报文在数据链路层被分片了那么每一个分片里面的这个 id 都是相同的。3位标志字段第一位保留保留的意思是现在不用但是还没想好说不定以后要用到。第二位置为 1 表示禁止分片这时候如果报文长度超过 MTUIP 模块就会丢弃报文。第三位表示更多分片如果分片了的话最后一个分片置为 0其他是1。类似于一个结束标记。13位分片偏移fragment offset是分片相对于原始 IP 报文开始处的偏移。其实就是在表示当前分片在原报文中处在哪个位置。实际偏移的字节数是这个值* 8得到的。因此除了最后一个报文之外其他报文的长度必须是 8 的整数倍否则报文就不连续了。给大家个结论在数据链路层有效载荷不能超过MTU1500字节2.1 分片1. 检查 MTU 限制当一个IP 数据报的大小超过了网络的MTU最大传输单元限制时就需要进行分片。MTU是数据链路层对 IP 层数据包进行封装时所能接受的最大数据长度。2. 分割数据报IP 层将原始的 IP 数据报分割成多个较小的片段真正分片是有效载荷在分片。对于每个片段IP 层会设置相应的标识Identification、偏移量Fragment Offset和标志位Flags等字段。标识字段用于标识属于同一个数据报的不同分片确保所有分片能够被正确地重新组装。偏移量字段指示了当前分片相对于原始数据报的起始位置以 8 字节为单位。标志位字段包含了 3 个位其中MFMore Fragment位用于指示是否还有更多的分片DFDo Not Fragment位用于指示数据报是否允许进行分片。3. 添加 IP 头部每个分片都会加上自己的 IP 头部与完整 IP 报文拥有类似的 IP 头结构但MF和Fragment Offset等字段的值会有所不同。4. 发送分片分片在传输过程中独立传输每个分片都有自己的 IP 头部并且各自独立地选择路由。2.2 组装1. 接收分片当目的主机的 IP 层接收到这些分片后会根据标识字段将属于同一个数据报的所有分片挑选出来。2. 排序与组装利用片偏移字段IP 层会对属于同一个数据报的分片进行排序。当所有的分片都到达并正确排序后IP 层会将这些分片重新组装成一个完整的 IP 数据报。3. 传递给上层协议组装好的 IP 数据报会传递给上层的协议进行处理。如何确定分片是齐的当前分片片偏移 自己的长度 下一片的片偏移 我们最后只需要根据顺序遍历一遍所有分片即可。2.3 如何和为什么要避免分片我们不建议分片和组装第一个是慢第二点是只要丢一个分片都算丢包因为分片和组装是网络层的事觉定要不要发送是传输层的事情如果分片丢失那么传输层只能完整重传报文这么做会增加丢包概率但是是否要分片 不是网络层决定的是他上层决定的传输层给他多大他就必须处理多大这也就是为什么 传输层在滑动窗口里是一小段一小段发送的就是为了减少分片和组装因为你数据链路层规定MTU是1500不代表别的路由器规定不会小于1500所以说 如果TCP和IP采用标准报头长度的话TCP数据最大就是1460称为MSS 最大段尺寸即双方通信的时候 如果双方能得知对方的MSS就能保证以更好的效率进行传输那么怎么得到对方的MSS呢其实在三次握手的时候TCP的报头选项里面有字段专门传输MSS。
返回列表