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

Linux网络编程-网络层IP协议

文章目录

  • 一. 协议头格式
  • 二. 分片和组合
    • 2.1 简述
    • 2.2 分片的过程
  • 三.IP地址
    • 3.1 简述
    • 3.2 IP五大IP分类
    • 3.3 CIDR技术
    • 3.4 IP数量限制
    • 3.5 特殊的IP地址
    • 3.6 私有IP
    • 3.7 NAT技术
  • 四. 路由
    • 4.1 简述
    • 4.2 路由表
    • 4.3 路由过程

一. 协议头格式

4位版本号: 指定IP协议的版本,对于IPv4来说,就是4

4位头部长度: IP头部的长度是多少个32bit,也就是 长度 * 4 的字节数。4位最大的数字是15,因此IP头部最大长度是60字节。

8位服务类型: 3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)。TOS分别表示: 最小延时(1000)、最大吞吐量(0100)、 最高可靠性(0010)、 最小成本(0001),一般服务(0000),只能选一个。

16位总长度: IP数据报整体占多少个字节

16位标识: 唯一的标识主机发送的报文. 如果IP报文在交付给数据链路层被分片了, 那么每一个片的标识都是相同的

3位标志字段: 第一位保留,第二位置为1表示禁止分片,这时候如果报文长度超过MTU(Maximum Transmission Unit最大传输单元),IP模块就会丢弃报文,第三位置为1表示后面还有分片

13位分片偏移: 表示当前分片数据开始位置在原报文中处在哪个位置。实际偏移的字节数是这个值 * 8 得到的,除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了

8位生存时间: 数据报到达目的地的最大报文跳数, 一般是64。每次经过一个路由, TTL -= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环

8位协议: 表示上层协议的类型

16位头部校验和: 使用CRC进行校验,来鉴别头部是否损坏

32位源地址和32位目标地址: 表示发送端和接收端.

选项: 不定长,最多40字节

在这里插入图片描述

二. 分片和组合

2.1 简述

数据链路层往网络里发送数据是有大小限制的,也就是不能超过MTU,CentOS7默认的MTU为1500,网络层的IP协议将数据报交付给数据链路层时整个报文最大只能是1500字节。如果我们传输层一个数据段过大那么就需要拆分发送,也就是进行分片,到了接收端再进行组合。

2.2 分片的过程

如图所示,如果一个数据包过大时,就会被分成很多部分发送,假设我们报头为20字节时,每个数据报的数据最多是1480字节。发送端将数据报分片,那接收端就需要组合起来。为了使组合时数据的有序性和完整性,需要用到IP数据报报头的16位标识,3位标志,和13位片偏移。16位标识位能够将分片之前的数据集合到一块,3位标志位可以确保最后一个分片不会被丢包,13位片偏移可以保证数据被有序的组合。

在这里插入图片描述

三.IP地址

3.1 简述

IP地址一般是分为两部分,网络号和主机号。网络号标志着这个IP处于哪个子网,主机号用来标志同一个子网下的不同主机。

3.2 IP五大IP分类

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

在这里插入图片描述

3.3 CIDR技术

上面的五类划分存在一定的局限性,一个B类子网中允许有6万多台主机,而A类更多,实际中一个子网中很少存在那么多的主机的,所以又提出了新的划分方案, 称为CIDR(Classless Interdomain Routing无类域间路由选择)。引入一个额外的子网掩码(subnet mask)来区分网络号和主机号,一个32位的正整数,通常用一串 “0” 结尾。将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号。网络号和主机号的划分与这个IP地址是A类、B类还是C类无关。

IP地址140.252.20.68
子网掩码255.255.255.240
网络号140.252.20.64
子网地址范围140.252.20.64~140.252.20.79

3.4 IP数量限制

CIDR在一定程度上缓解了IP地址不够用的问题,提高了利用率,减少了浪费。但是IP地址的绝对上限并没有增加,仍然不是很够用,这时候有三种方式来解决,分别是动态分配IP地址、NAT技术,IPv6。 动态分配IP地址: 只给接入网络的设备分配IP地址,同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的。

3.5 特殊的IP地址

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

3.6 私有IP

一个组织内部组建局域网,IP地址只用于局域网内的通信,而不直接连到英特网上。私有IP地址包含在这个范围中的,其余的则称为全局IP(或公网IP)

  • 10.*,前8位是网络号,共16777216个地址
  • 172.16.到172.31.,前12位是网络号,共1048576个地址
  • 192.168.*,前16位是网络号,共65,536个地址

3.7 NAT技术

一个路由器可以配置两个IP地址,一个是WAN口IP,一个是LAN口IP(子网IP)。路由器LAN口连接的主机, 都从属于当前这个路由器的子网中。不同的路由器, 其子网IP都是一样的(通常都是192.168.1.1)。每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器,WAN口IP就是一个公网IP了。子网内的主机需要和外网进行通信时,路由器将IP首部中的IP地址替换成WAN口IP,这样逐级替换,最终数据包中的IP地址成为一个公网IP。 这种技术叫做NAT(Network Address Translation网络地址转换)。

在这里插入图片描述

四. 路由

4.1 简述

路由的过程,就是一跳一跳(Hop by Hop) “问路” 的过程。所谓 “一跳” 就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间。当IP数据包,到达路由器时,路由器会先查看目的IP。路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器,依次反复,一直到达目标IP地址。

4.2 路由表

如下图,是一个路由表(route命令可以查看)这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络。路由表的Destination是目的网络地址,Genmask是子网掩码,Gateway是下一跳地址,Iface是发送接口,Flags中的U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。

在这里插入图片描述

4.3 路由过程

比如目的地址是192.168.56.3,首先跟路由表的第一行的子网掩码做与运算得到192.168.56.0,与第一行的目的网络地址不符,再跟第二行的子网掩码做与运算得到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去。192.168.56.0是与eth1接口直接相连的网络。因此可以直接发到目的主机,不需要经路由器转发。 如果目的地址是202.10.1.2依次和路由表前几项进行对比,发现都不匹配,按缺省路由条目,从eth0接口发出去。发往192.168.10.1路由器,由192.168.10.1路由器根据它的路由表决定下一跳地址。

相关文章:

  • 神经网络图像识别代码,编码解码神经网络
  • 5分钟从掌握到精通---进制转化
  • centos安装zabbix
  • 前缀和以及哈希表优化
  • 【JavaSE】多线程篇(一)线程的相关概念与线程的基本使用
  • 8、学习 Java 中的方法(方法的定义、可变参数、参数的传递问题、方法重载、方法签名)通过官方教程
  • 数据库基本结论
  • Django-(3)
  • HyperLynx(十五)多板仿真
  • ElasticSearch(四):ES nested嵌套文档与父子文档处理
  • java 基于springboot员工实训项目管理系统
  • SaaS行业的六大安全问题
  • Geoserver+Cesium 发布带样式矢量数据
  • 【C语言】数据类型、存储类
  • 免关注阅读CSDN博客和复制代码(2022.9.1)
  • 「译」Node.js Streams 基础
  • 【React系列】如何构建React应用程序
  • 5、React组件事件详解
  • android图片蒙层
  • Angular6错误 Service: No provider for Renderer2
  • CODING 缺陷管理功能正式开始公测
  • css属性的继承、初识值、计算值、当前值、应用值
  • docker容器内的网络抓包
  • python docx文档转html页面
  • python 装饰器(一)
  • Redis中的lru算法实现
  • Vue2.x学习三:事件处理生命周期钩子
  • 从零搭建Koa2 Server
  • 记一次删除Git记录中的大文件的过程
  • 记一次用 NodeJs 实现模拟登录的思路
  • 讲清楚之javascript作用域
  • 警报:线上事故之CountDownLatch的威力
  • 漂亮刷新控件-iOS
  • 日剧·日综资源集合(建议收藏)
  • 入门到放弃node系列之Hello Word篇
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 与 ConTeXt MkIV 官方文档的接驳
  • 我们雇佣了一只大猴子...
  • ​【已解决】npm install​卡主不动的情况
  • #单片机(TB6600驱动42步进电机)
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (SpringBoot)第二章:Spring创建和使用
  • (搬运以学习)flask 上下文的实现
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (转)Mysql的优化设置
  • (转)Oracle存储过程编写经验和优化措施
  • (转载)Linux网络编程入门
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .mysql secret在哪_MySQL如何使用索引
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET/C# 使用 SpanT 为字符串处理提升性能