网络层IP协议
一网络层的作用在复杂的网络环境中确定一个合适的路径.二IP报头•4位版本号(version):指定IP协议的版本, 对于IPv4来说, 就是4.•4位头部长度(header length):IP头部的长度是多少个32bit4字节, 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位目标地址:表示发送端和接收端.三网络号主机号子网公网局域网IP地址分为两个部分, 网络号和主机号• 网络号: 保证相互连接的两个网段具有不同的标识;• 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;• 不同的子网其实就是把网络号相同的主机放到一起.• 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能 和子网中的其他主机重复. 通过合理设置主机号和网络号, 就可以保证在相互连接的网络中, 每台主机的IP地址都不相同.那么问题来了, 手动管理子网内的IP, 是一个相当麻烦的事情.• 有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.• 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.怎么区分网络号和主机号呢CIDR(Classless Interdomain Routing)(无类别域间路由):• 引入子网掩码(subnet mask)来区分网络号和主机号;• 子网掩码是一个32位的正整数通常用一串 0 来结尾;• 将IP地址和子网掩码进行 按位与 操作, 得到的结果就是网络号;举例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地址如果一个组织内部组建局域网,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网络地址转换).• 如果希望我们自己实现的服务器程序, 能够在公网上被访问到, 就需要把程序部署在一台具有外网IP的服务器上. 这样的服务器可以在阿里云/腾讯云上进行购买.NAPT一、基础定义NAPT全称Network Address Port Translation中文叫网络地址端口转换业内也常简称PATPort Address Translation端口地址转换。它是NAT网络地址转换技术里应用最广的分支也是现在家用路由器、小区宽带、普通企业宽带默认开启的核心功能。二、前置知识点端口的作用TCP/UDP 协议依靠「IP 地址 端口号」唯一标识一条网络通信会话IPv4 地址定位全网哪一台主机端口号取值 0~65535定位一台主机上的具体应用 / 进程。0~1023知名端口固定给服务使用如 80 网页、443 HTTPS、22 SSH1024~65535动态临时端口客户端主动发起请求时随机使用NAPT 主要使用这一段。一台公网 IP 搭配不同端口理论可同时承载上万条并发连接完美解决「单公网 IP 带多台内网设备」的问题。三、核心原理NAPT 的核心是路由器维护一张NAPT 映射表规则内网私有 IP 内网端口 ↔ 公网路由器公网 IP 路由器临时端口所有进出内网的数据包都会根据这张表改写 IP 地址 端口号分 出网内网→外网和回包外网→内网两个流程下面用实例一步步拆解。环境示例路由器内网网段192.168.1.0/24私网路由器 WAN 口公网 IP112.xx.xx.xx唯一公网 IP内网设备 A192.168.1.10随机发起端口10240内网设备 B192.168.1.11随机发起端口20480外网目标服务器公网 IP223.5.5.5服务端口80流程 1内网设备访问外网数据包出方向主机发包设备 A 发起网页请求数据包信息 源 IP192.168.1.10源端口10240目的 IP223.5.5.5目的端口80到达路由器执行 NAPT 转换路由器识别这是内网访问外网的流量查询本地 NAPT 表无对应映射条目 → 从自身空闲高位端口中分配一个临时端口比如50001改写数据包把「源私网 IP 内网端口」替换成「路由器公网 IP 临时端口」写入映射表(192.168.1.10:10240) ↔ (112.xx.xx.xx:50001)。转换后数据包 源 IP112.xx.xx.xx源端口50001目的 IP223.5.5.5目的端口80转发外网改写后的数据包以路由器公网身份在互联网中路由转发。同一时间设备 B 也上网路由器会分配另一个临时端口如50002生成第二条独立映射两台设备流量互不干扰。流程 2外网服务器回包数据包入方向外网服务器回复数据服务器只知道路由器的公网地址回包信息 源 IP223.5.5.5源端口80目的 IP112.xx.xx.xx目的端口50001回到路由器查表还原路由器根据「公网 IP 目的端口50001」查询 NAPT 映射表找到对应的内网地址和端口反向改写数据包把「公网 IP 临时端口」还原为「内网私网 IP 原内网端口」。还原后数据包 源 IP223.5.5.5源端口80目的 IP192.168.1.10目的端口10240四IP分片和组装分片与组装的过程分片1. 检查MTU限制◦ 当一个IP数据报的大小超过了网络的MTU最大传输单元限制时就需要进行分片。MTU是数据链路层对IP层数据包进行封装时所能接受的最大数据长度。2. 分割数据报◦ IP层将原始的IP数据报分割成多个较小的片段◦ 对于每个片段IP层会设置相应的标识、偏移量和标志位字段◦ 同一个数据报的不同分片的标识字段相同◦ 偏移量字段指示了当前分片相对于原始数据报的起始位置以8字节为单位。◦ 标志位字段包含了3个位其中MFMore Fragment位用于指示是否还有更多的分片DF Do Not Fragment位用于指示数据报是否允许进行分片。3. 添加IP头部◦每个分片都会加上自己的IP头部与完整IP报文拥有类似的IP头结构但MF和Fragment Offset 等字段的值会有所不同。4. 发送分片◦ 分片在传输过程中独立传输每个分片都有自己的IP头部并且各自独立地选择路由。组装1. 接收分片◦ 当目的主机的IP层接收到这些分片后会根据标识字段将属于同一个数据报的所有分片挑选出来。2. 排序与组装◦ 利用片偏移字段IP层会对属于同一个数据报的分片进行排序。◦ 当所有的分片都到达并正确排序后IP层会将这些分片重新组装成一个完整的IP数据报。3. 传递给上层协议◦ 组装好的IP数据报会传递给上层的协议进行处理。IP 分片是不得已的兼容方案实际网络中弊端远大于优势任意分片丢失会导致整个报文进行重传而分片越多报文丢失的概率越大所以IP通信过程中分片并不能成为主流。MSS(TCP 最大分段大小) MTU(整个 IP 报文最大长度通常1500字节) - IP首部(20字节) - TCP首部 (20字节)通过以上公式TCP可以减少IP分片产生的弊端UDP 没有 MSSUDP 是无连接数据报协议不会主动分段所以 UDP 业务只能靠应用层限制包长防分片