公司动态
Linux —— 网络层
目录网络层IP协议编辑网络层中IP的地位IP构成问题基本概念协议头格式网段划分/子网划分 (重要)特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址尝试理解公网路由路由表生成算法(了解)IP分片和组装网络层在复杂的网络环境中确定一个合适的路径。IP协议网络层中IP的地位TCP提供可靠性IP提供执行的能力。IP地位IP提供了一种能力把数据从A主机跨网络送到B主机的能力是执行者的角色所以TCP所对应的所有的数据包也并不是直接发送到网络中的而是向下被封装成IP报文发出去的。之前的TCP中建立连接是要三次握手三次握手是如何发送给对方的是要被封装成IP报文打包过去的所以TCP会将所有的报文全部给IP封装成IP报文然后向目标主机发送。网络层重点解决的问题就是帮助我们将数据从A主机跨网络传输给B主机。TCP / IP 提供把数据从A主机可靠的跨网络送到B主机的能力IP构成问题目标地址 所在城市 具体的目标地址IP 目标网络 目标主机eg我们的学号的前若干位是一样的院号、班级号、个人学号学号的构成是比 IP 还复杂的。基本概念主机配有IP地址也要进行路由控制的设备路由器既配有IP地址又能进行路由控制节点主机和路由器的统称协议头格式4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4。4位头部长度(header length): IP头部的⻓度是多少个32bit, 也就是 length 4 的字节数. 4bit表示最⼤的数字是15, 因此IP头部最⼤⻓度是60字节。8位服务类型(Type Of Service): 3位优先权字段(已经弃用), 4位TOS字段, 和1位保留字段(必须置为0). 4位TOS分别表示: 最小延时, 最大吞吐量, 最高可靠性, 最小成本. 这四者相互冲突, 只能选择⼀个. 对于ssh/telnet这样的应⽤程序, 最⼩延时⽐较重要; 对于ftp这样的程序, 最大吞吐量比较重要。16位总长度(total length): IP数据报整体占多少个字节。16位标识(id): 唯⼀的标识主机发送的报⽂. 如果IP报⽂在数据链路层被分片了, 那么每⼀个片里面的这个id都是相同的。3位标志字段: 第⼀位保留(保留的意思是现在不用, 但是还没想好说不定以后要⽤到). 第二位置为1表示禁止分片, 这时候如果报⽂⻓度超过MTU, IP模块就会丢弃报⽂. 第三位表示更多分片, 如果分片了的话, 最后⼀个分片置为0, 其他是1. 类似于⼀个结束标记。13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 8 得到的。因此, 除了最后⼀个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了)。8位⽣存时间(Time To Live, TTL): 数据报到达目的地的最⼤报⽂跳数. ⼀般是64. 每次经过⼀个路由, TTL - 1, ⼀直减到0还没到达, 那么就丢弃了. 这个字段主要是⽤来防止出现路由循环8位协议: 表示上层协议的类型16位头部校验和: 使用CRC进⾏校验, 来鉴别头部是否损坏。32位源地址和32位⽬标地址: 表示发送端和接收端。选项字段(不定⻓, 最多40字节): 略网段划分/子网划分 (重要)运营商、内网、公网、路由IP地址分为两个部分网络号和主机号网络号: 保证相互连接的两个网段具有不同的标识;主机号: 同⼀网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;不同的子网其实就是把⽹络号相同的主机放到⼀起。如果在子网中新增⼀台主机, 则这台主机的网络号和这个子网的网络号⼀致, 但是主机号必须不能和子网中的其他主机重复。电脑在没有连上家里的WIFI的时候电脑是没有能够用于上网的IP地址的即使有IP地址也是本地环回的IP地址。连接路由器的本质是是在向路由器申请IP地址。得出路由器具有局域网中IP地址管理的功能通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同。那么问题来了, ⼿动管理子网内的IP, 是⼀个相当麻烦的事情。有⼀种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.⼀般的路由器都带有DHCP功能. 因此路由器也可以看做⼀个DHCP服务器. [ 路由器不仅仅有路由的功能路由器不是只能工作在网络层的也是可以工作在应用层的家用的路由器中的IP地址输入到浏览器中就能打开路由器的配置界面了意味着路由器也部署着HTTP服务 ]过去曾经提出⼀种划分网络号和主机号的⽅案, 把所有IP 地址分为五类, 如下图所示(该图出 自[TCPIP])。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地址都被浪费掉了.针对这种情况提出了新的划分⽅案, 称为CIDR(Classless Interdomain Routing)(⽆类别域间路由)引入⼀个额外的子网掩码subnet mask)来区分网络号和主机号;子网掩码也是⼀个32位的正整数. 通常⽤⼀串 0 来结尾;将IP地址和子网掩码进行 按位与 操作, 得到的结果就是网络号;网络号和主机号的划分与这个IP地址是A类、B类还是C类⽆关;现实生活中统一用的是子网掩码的方案。家用路由器和企业路由器的区别家用路由器配置要低一点点也是有内存、系统、CPU、芯片而企业级别的路由器配置要高一点。可见IP地址与子网掩码做与运算可以得到⽹络号, 主机号从全0到全1就是子网的地址范围;IP地址和子网掩码还有⼀种更简洁的表示方法,例如140.252.20.68/24,表示IP地址为140.252.20.68, 子网掩码的⾼24位是1,也就是255.255.255.0特殊的IP地址将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同⼀个链路中相互连接的所有主机发送数据包;127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1(不经过网络)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技术(后面会重点介绍);IPv6: IPv6并不是IPv4的简单升级版. 这是互不相⼲的两个协议, 彼此并不兼容; IPv6⽤16字节128位来表示⼀个IP地址; 但是⽬前IPv6还没有普及;私有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地址是用来组建局域网的是家用路由器会自动帮我们组建局域网路由器不仅仅具有路由功能还有组建局域网的功能所以网络宏观的划分局域网/子网公网ifconfig我们平时能接触到的网络没有公网IP只有内网IP云服务器有公网IP在家里不管是有线还是无线大概率是192.168.开头的在学校里面大概率是172.开头的学校再大一点的话是以10.开头的⼀个路由器可以配置两个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网络地址转换).如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在⼀台具有外网IP的服务器上. 这样的服务器可以在阿⾥云/腾讯云上进⾏购买.地区或者国家IP的分布https://zh-hans.ipshu.com/country-list尝试理解公网真实的网络结构非常复杂即涉及到划分公⽹IP的组织ICANN还要在全球范围内进行区域划分比如亚太北美欧洲等⼜要考虑各个国家内部的ISP代理整体拓扑⾮常复杂我们简化所有过程简单理解公网即可附录有关于建设公网的参与者和职责说明AI提示词公网的整个构建过程需要涉及到谁各自核心角色和作用是什么网络 内网 公网我们买的云服务器就可以理解为是跟西安、延安、咸阳地位对等的机器其实实际上的网络拓扑结构要比上面画的图要复杂的多但是大道至简最终就是上面图中的那个样子路由在复杂的网络结构中, 找出⼀条通往终点的路线;上面的默认网关就是缺省路由查路由表结果1. 缺省路由2. 明确下一跳3. 到达入口路由器内网转发Linux机器、Windows操作系统是 TCP/IP 协议栈本身就是工作在应用层的但是底层是兼容了网络层的这个就是Liunx机器上的路由表Windows上查找路由表的命令[唐僧问路例子1]路由的过程, 就是这样⼀跳⼀跳(Hop by Hop) 问路 的过程。所谓 ⼀跳 就是数据链路层中的⼀个区间. 具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。IP数据包的传输过程也和问路⼀样。当IP数据包, 到达路由器时, 路由器会先查看目的IP;路由器决定这个数据包是能直接发送给⽬标主机, 还是需要发送给下⼀个路由器;依次反复, ⼀直到达⽬标IP地址;那么如何判定当前这个数据包该发送到哪里呢? 这个就依靠每个节点内部维护⼀个路由表;[唐僧问路例子2]路由表可以使用route命令查看如果目的IP命中了路由表, 就直接转发即可;路由表中的最后一行,主要由下⼀跳地址和发送接口两部分组成,当⽬的地址与路由表中其它行都不匹配时,就按缺省路由条目规定的接口发送到下⼀跳地址。假设某主机上的网络接口配置和路由表如下这台主机有两个网络接口,⼀个网络接口连到192.168.10.0/24⽹络,另⼀个网络接口连到192.168.56.0/24网络;路由表的Destination是⽬的网络地址,Genmask是子网掩码,Gateway是下⼀跳地址,Iface是发送接⼝,Flags中的U标志表⽰此条目有效(可以禁用某些 条目),G标志表示此条目的下⼀跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发;转发过程例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路由器根据它的路由表决定下⼀跳地址;路由表生成算法(了解)路由表生成算法本质就是图形或是树形算法以图形算法为主。IP分片和组装我们学习网络的本质是在学习一个报文的整个生命周期如何组装细节1分片会导致丢包概率增加导致整个报文重传细节213位的片偏移能表示16位总长度的数据吗但是如果整个报文的有效载荷为65500的话又该如何表示所以片偏移字段规定必须是8的整数倍8刚好是2的三次方所以刚刚写的偏移量1480这样写是不对的只能写1480 / 8 185所以偏移量为185对端收到的话会进行 * 8 操作。相当于就是13位片偏移模拟对应的16位总长度。÷ 8 相当于是右移 * 8 相当于是左移。任意一个数字是8的整数倍在二进制层面上低3位一定是0。÷ 8 和 * 8 的原因就是IP报文对应的总长度是16位为了表示超过2的13次方的数据必须拿13位的片偏移表示16位的数约定了片偏移是8的整数倍IP分片不是主流那么如何做到让IP不分片---IP分不分片IP自己说了不算传输层说了算要求传输层网络层说传输层你不要一次给我太多的数据要不然我分片给你看我也没办法之前的滑动窗口