IP协议,卫冕之王

2023-10-08 16:10
文章标签 ip 协议 之王 卫冕

本文主要是介绍IP协议,卫冕之王,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2. 网络层协议

TCP:UDP我们合作一统天下。

IP:切,还需要合作,合作你们也得听我的。

UDP:…。

在网络层,IP 协议几乎一统天下。IP 协议目前主要有两个版本 IPv4 和 IPv6。

2.1 路由和寻址、IPv4

2.1.1 概念
  1. IP 协议(Internet Protocol):是一个处于垄断地位的网络层协议。IPv4 就是 IP 协议的第 4 个版本,是目前互联网的主要网络层协议。IPv4 为传输层提供 Host-To-Host 的能力,IPv4 需要底层数据链路层的支持。

  2. 延迟、吞吐量、丢包率:这三个是鱼和熊掌不能兼得

  3. IP 协议的工作原理:IP协议接收传输层的数据,进行分片,封包,然后通过寻址和路由能力最终把封包送达目的地。

    1. 分片(Fragmentation):分片就是把数据切分成片。 需要适配底层传输网络的传输能力。这就需要把大的数据切片。 当然也可能选择不切片,IP 协议提供了一个能力就是把封包标记为不切片,当底层网络看到不切片的封包,又没有能力传输的时候,就会丢弃这个封包。

    2. 封包(Datagram):IP 协议为每个片段(Fragment)增加一个 IP 头(Header),组成一个IP 封包(Datagram)

    3. 协议头(IP Header)

在这里插入图片描述

  1. Type Of Service 服务的类型,是为了响应不同的用户诉求,用来选择延迟、吞吐量和丢包率之间的关系。2. IHL(Internet Header Length)用来描述 IP 协议头的大小。IHL 只有 4 位,最大值 1111 = 15。协议头最大是 15 个双字(15*4 字节 = 60 字节)。3. Total Length 定义报文(封包 Datagram)的长度。4. Identification(报文的 ID),发送方分配,代表顺序。5. Fragment offset 描述要不要分包(拆分),以及如何拆分。6. Time To Live 描述封包存活的时间。因此每个 IP 封包发送出去后,就开始销毁倒计时。如果倒计时为 0,就会销毁。比如中间的路由器看到一个 TTL 为 0 的封包,就直接丢弃。7. Protocol 是描述上层的协议,比如 TCP = 6,UDP = 17。8. Options 代表可选项。9. Checksum 用来检验封包的正确性。
  1. “鱼和熊掌”不能兼得——延迟、吞吐量、丢包率:Type of Service(服务类型)就是为了在延迟、吞吐量和丢包率三者间选择。

    1. 延迟(latency):延迟指的是 1 bit 的数据从网络的一个终端传送到另一个终端需要的时间。
    2. 吞吐量(Throughput):吞吐量指单位时间内可以传输的平均数据量。比如用 bit/s 作为单位,就是 bps。
    3. 丢包率(Packet loss):丢表率指发送出去的封包没有到达目的地的比例。
    4. Type of Service 字段里,有以下 4 种主要的类型可以选择:低延迟、高吞吐、低丢包率、低成本。
2.1.2 寻址(Addressing)

给一个地址,然后找到这个东西。IPv4 协议的寻址过程是逐级寻址。

子网掩码:子网掩码的作用就是帮助根据 IP 地址找到对应子网。子网掩码是很多个1接着很多个0,和 IP 地址一起使用。

寻址过程

  1. 步骤 1:找到顶层网络:比如103.16.3.1最顶层的网络号可以和255.0.0.0(子网掩码)做位与运算得到103.16.3.1 & 255.0.0.0 = 103.0.0.0
  2. 步骤 2:找到下一层网络:找到下一级网络,就需要用 IP 地址和下一级的子网掩码做位与运算。103.16.3.1 & 255.255.0.0 = 103.16.0.0
  3. 步骤 3:找到再下一级网络:接下来使用255.255.255.0子网掩码找到下一级网络是103.16.3.0。
  4. 步骤 4:定位设备:设备就在子网103.16.3.0中,最终找到的设备号是1。

当然子网掩码也不一定都是255,比如这个子网掩码255.240.0.0也是可以的。但通常我们把 IPv4 的网络分成这样 4 层。

2.1.3 路由(Routing)

假如,我们要为 IP 地址 14.215.177.38 寻址,当前路由器所在的网络的编号是16.0.0.0。那么我们就需要知道去往 14.0.0.0 网络的 Gateway IP 地址。

如果你在当前网络中用route查看路由表,可能可以看到一条下面这样的记录。

Destination:14.0.0.0

Gateway:16.12.1.100

Mask:255.0.0.0

Iface:16.12.1.1

这条记录就说明如果你要去往 14.0.0.0 网络,IP 地址 14.215.177.38 先要和 255.0.0.0 进行位运算,然后再查表,看到 14.0.0.0,得知去往 Gateway 的网卡(IFace)是 16.12.1.1。

2.1.4 总结

这一讲我们学习了 IP 协议和 IP 协议的工作原理。首先 IP 协议会进行分片,将上游数据拆成一个个的封包(Datagram),然后为封包增加 IP 头部。封包发送出去后,就开始了寻址过程。寻址就是找到 IP 地址对应的设备。在局域网内,如果找不到设备,就需要路由。路由就是找到数据应该往哪里发送。最后通过层层路由定位到具体的设备。

2.1.5 路由和寻址的区别是什么?

寻址(Addressing)就是通过地址找设备。和现实生活中的寻址是一样的,比如根据地址找到一个公寓。在 IPv4 协议中,寻址找到的是一个设备所在的位置。

路由(Routing)本质是路径的选择。就好像知道地址,但是到了每个十字路口,还需要选择具体的路径。

所以,要做路由,就必须能够理解地址,也就是需要借助寻址的能力。要通过寻址找到最终的设备,又要借助路由在每个节点选择数据传输的线路。因此,路由和寻址,是相辅相成的关系。

2.2 Tunnel 技术和IPv6

IPv6 的工作原理和 IPv4 类似,分成切片(Segmentation)、增加封包头、路由(寻址)这样几个阶段去工作。

2.2.1 IPv6地址

IPv4 的地址是 4 个 8 位(octet),总共 32 位。 IPv6 的地址是 8 个 16 位(hextet),总共 128 位。

Pv4 的地址用.分割,如103.28.7.35。每一个是 8 位,用 0-255 的数字表示。

IPv6 的地址用:分割,如0123:4567:89ab:cdef:0123:4567:89ab:cdef,总共 8 个 16 位的数字,通常用 16 进制表示。

以下的IPv6地址可以简写0123:4567:0000:0000:0123:4567:0000:cdef0123:4567::0123:4567:0000:cdef::只能出现一次,相当于省略了若干组0000。不允许出现两个::的省略,会产生歧义。

还有一种情况我们想要后面部分都填0,比如说3c4d::/16,这个代表只有前16位有数据,后面是01234:5878:abcd/64代表只有左边64位有数据,后面是 0;再比如ff00/8,只有左边 8 位是有数据的。

2.2.2 IPv6寻址

IPv6 的寻址分成了几种类型:

  1. 全局单播寻址:(和 IPv4 地址作用差不多,在互联网中通过地址查找一个设备,简单来说,单播就是 1 对 1);
    1. 总的来说,IPv6 地址太多,因此不再需要子网掩码,而是直接将 IPv6 的地址分区即可
    2. 站点前缀(Site Prefix)48bit,一般是由 ISP(Internet Service Providor,运营商)或者RIR(Regional Internet Registry, 地区性互联网注册机构),RIR 将 IP 地址分配给运营商;
    3. 子网号(Subnet ID),16bit,用于站点内部区分子网;
    4. 接口号(Interface ID), 64bit,用于站点内部区分设备。
  2. 本地单播:(类似 IPv4 里的一个内部网络,要求地址必须以fe80开头,类似我们 IPv4 中127开头的地址);
    1. 虽然 IPv6 可以将所有的设备都连入一个网络。但在实际场景中,很多公司还是需要一个内部网络的。
    2. 在局域网络中,实现设备到设备的通信,就是本地单播。
    3. 本地单播地址必须以fe80开头,后面 64 位的 0,然后接上 54 位的设备编号。
  3. 分组多播:(Group Multicast),类似今天我们说的广播,将消息发送给多个接收者;
    1. IPv6 中设计了分组多播,来实现广播的能力。当 IP 地址以 8 个 1 开头,也就是ff00开头,后面会跟上一个分组的编号时,就是在进行分组多播。
    2. 这个时候,我们需要一个广播设备,在这个设备中已经定义了这些分组编号,并且拥有分组下所有设备的清单,这个广播设备会帮助我们将消息发送给对应分组下的所有设备。
  4. 任意播:(Anycast),这个方式比较特殊,接下来我们会详细讲解。
    1. 任意播,本质是将消息发送给多个接收方,并选择一条最优的路径。这样说有点抽象,接下来我具体解释一下。
    2. 比如说在一个网络中有多个授时服务,这些授时服务都共享了一个任播地址。当一个客户端想要获取时间,就可以将请求发送到这个任播地址。客户端的请求扩散出去后,可能会找到授时服务中的一个或者多个,但是距离最近的往往会先被发现。这个时候,客户端就使用它第一次收到的授时信息修正自己的时间。
2.2.3 IPv6和IPv4的兼容

情况 1:IPv4 网络和 IPv6 网络通信

例如一个 IPv6 的客户端,想要访问 IPv4 的服务器,步骤如下图所示:

在这里插入图片描述

  1. 客户端通过 DNS64 服务器查询 AAAA 记录。DNS64 是国际互联网工程任务组(IETF)提供的一种解决 IPv4 和 IPv6 兼容问题的 DNS 服务。这个 DNS 查询服务会把 IPv4 地址和 IPv6 地址同时返回。
  2. DNS64 服务器返回含 IPv4 地址的 AAAA 记录。
  3. 客户端将对应的 IPv4 地址请求发送给一个 NAT64 路由器
  4. 由这个 NAT64 路由器将 IPv6 地址转换为 IPv4 地址,从而访问 IPv4 网络,并收集结果。
  5. 消息返回到客户端。

情况 2:两个 IPv6 网络被 IPv4 隔离

这种情况在普及 IPv6 的过程中比较常见,IPv6 的网络一开始是一个个孤岛,IPv6 网络需要通信,就需要一些特别的手段。

不知道你有没有联想到坐火车穿越隧道的感觉,连接两个孤岛 IPv6 网络,其实就是在 IPv4 网络中建立一条隧道。如下图所示:

在这里插入图片描述

隧道的本质就是在两个 IPv6 的网络出口网关处,实现一段地址转换的程序

2.2.4Tunnel 技术是什么

Tunnel 就是隧道,这和现实中的隧道是很相似的。隧道不是只有一辆车通过,而是每天都有大量的车辆来来往往。两个网络,用隧道连接,位于两个网络中的设备通信,都可以使用这个隧道。隧道是两个网络间用程序定义的一种通道。具体来说,如果两个 IPv6 网络被 IPv4 分隔开,那么两个 IPv6 网络的出口处(和 IPv4 网络的网关处)就可以用程序(或硬件)实现一个隧道,方便两个网络中设备的通信。

2.3 局域网,NAT(网络地址转换)

2.3.1 内部网络和外部网络

我们通常把内部网络称为局域网,外部网络就叫作外网。

2.3.2 局域网数据交换(MAC 地址)

为了区别每个网络接口,互联网工程任务组(IETF)要求每个设备拥有一个唯一的编号,这个就是 MAC 地址

IP 地址更像现实生活中的地址,而 MAC 地址更像你的身份证号。

数据的发送方,将自己的 MAC 地址、目的地 MAC 地址,以及数据作为一个分组(Packet),也称作 Frame 或者封包,发送给交换机。交换机再根据目的地 MAC 地址,将数据转发到目的地的网络接口(网卡)

2.3.3 地址解析协议(ARP)

我们在使用传输层协议的时候,清楚地知道目的地的 IP 地址,但是我们不知道 MAC 地址。这个时候,就需要一个中间服务帮助根据 IP 地址找到 MAC 地址——这就是地址解析协议(Address Resolution Protocol,ARP)。

如果一个网络接口已经知道目标 IP 地址对应的 MAC 地址了,它会将数据直接发送给交换机,交换机将数据转发给目的地

如果网络接口不知道目的地地址呢?这个时候,地址解析协议就开始工作了。发送接口会发送一个广播查询给到交换机,交换机将查询转发给所有接口。如果某个接口发现自己就是对方要查询的接口,则会将自己的 MAC 地址回传。接下来,会在交换机和发送接口的 ARP 表中,增加一个缓存条目。

2.2.4 连接内网

有时候,公司内部有多个子网。这个时候一个子网如果要访问另一个子网,就需要通过路由器。

发送接口需要通过 IP 协议,将数据发送到路由器,再由路由器转发信息到子网 2 的交换机。这里提一个问题,子网 2 的交换机如何根据 IP 地址找到接收接口呢?答案是通过查询 ARP 表。

2.3.5 连接外网(网络地址转换技术,NAT)

跨网络必然会通过多次路由,最终将消息转发到目的地。但是这里存在一个问题,寻找的目标 IP 地址22.22.22.22是一个公网 IP,可以通过正常的寻址 + 路由算法定位。当22.22.22.22寻找192.168.0.1的时候,是寻找一个私网 IP,这个时候是找不到的。解决方案就是网络地址转换技术(Network Address Translation)。

NAT 技术转换的是 IP 地址,私有 IP 通过 NAT 转换为公网 IP 发送到服务器。服务器的响应,通过 NAT 转换为私有 IP,返回给客户端。通过这种方式,就解决了内网和外网的通信问题。

这篇关于IP协议,卫冕之王的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/166463

相关文章

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A

Modbus-RTU协议

一、协议概述 Modbus-RTU(Remote Terminal Unit)是一种基于主从架构的通信协议,采用二进制数据表示,消息中的每个8位字节含有两个4位十六进制字符。它主要通过RS-485、RS-232、RS-422等物理接口实现数据的传输,传输距离远、抗干扰能力强、通信效率高。 二、报文结构 一个标准的Modbus-RTU报文通常包含以下部分: 地址域:单个字节,表示从站设备

网络原理之TCP协议(万字详解!!!)

目录 前言 TCP协议段格式 TCP协议相关特性 1.确认应答 2.超时重传 3.连接管理(三次握手、四次挥手) 三次握手(建立TCP连接) 四次挥手(断开连接)  4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答  9.基于字节流 10.异常情况的处理 小结  前言 在前面,我们已经讲解了有关UDP协议的相关知识,但是在传输层,还有

linux下查看自己的外网ip

局域网的服务器是通过ADSL路由器连接外网的,但ADSL是从ISP运营商那儿通过动态获得IP的,那么我怎么知道自己的外网地址是多少呢? 今天得到几个办法: curl -s http://whatismyip.org wget http://whatismyip.org 然后再  cat index.html 也可以看到