详解IP协议

news/2024/12/2 19:37:40/

在介绍IP协议之前,先抛出一个概念:IP地址的作用——定位主机,具有将数据从主机A跨网络传输到主机B的能力,有了TCP提供的策略,例如滑动窗口、拥塞控制等,IP去执行它,所以我们通常叫TCP/IP协议,有了这两个,就可以实现可靠的传输

路由器: 即配有IP地址, 又能进行路由控制

在路由器层面上,确实是根据IP报文进行路由的,但是在网络上跑的MAC帧

跨网络传输的本质是无数个局域网(子网)转发的结果,所以想理解网络传输,就是理解局域网通信,个人建议先看这篇文章:https://www.cnblogs.com/my_life/articles/6100830.html,然后在看这篇文章,就会更容易理解网络传输的本质

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模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话,最后一个分片置为1, 其他是0. 类似于一个结束标记.
13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
8位协议: 表示上层协议的类型
16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.
32位源地址和32位目标地址: 表示发送端和接收端
选项字段(不定长, 最多40字节): 略

1.如何将报头和有效载荷分离?

利用首部长度 报头长度在[20,60]之间,16位总长度-首部长度=有效载荷

2.如何分用?

利用8位协议

3.怎么知道报文被分片了?

如果是更多分片是1或者如果更多分片是0&&片偏移分片>0

4.如何保证是同一个报文的分片都能被识别出来

16位标识

5.哪一个是第一个,哪一个是最后一个?怎么确认其他的分片?

1.第一个:更多分片=1&&片偏移=0 2.最后一个更多分片=0&&片偏移>0 3.当前的起始位置+自身长度=下一个分片的位置

6.如何正确的组装起来?

片偏移升序即可

7.怎么保证合起来的报文是正确的?

TCP/IP校验和

8.如果有一个分片丢失是重传一个分片还是一个报文?分片好不好?

1.重传一个报文 2.分片不好,比如一个报文的不丢失概率是百分之90,分片以后每一个分片的丢失概率也是百分之90,这样丢失的概率会变得更大

子网划分

IP地址分为两个部分, 网络号主机号

网络号: 保证相互连接的两个网段具有不同的标识;
主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;

不同的子网其实就是把网络号相同的主机放到一起,如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复

下面讲的都是CIDR划分方案,按照IP地址的五类去划分局限性很大

引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
子网掩码也是一个32位的正整数. 通常用一串 “0” 来结尾;
将IP地址和子网掩码进行 “按位与” 操作, 得到的结果就是网络号;
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;

路由器是连接两个或多个网络的硬件设备,在路由器上有两种网络接口,分别是LAN口和WAN口:

  • LAN口(Local Area Network):表示连接本地网络的端口,主要与家庭网络中的交换机、集线器或PC相连。

这里的LAN口应该就是所谓的网关地址(我猜的)

  • WAN口(Wide Area Network):表示连接广域网的端口,一般指互联网。
    我们将LAN口的IP地址叫做LAN口IP,也叫做子网IP,将WAN口的IP地址叫做WAN口IPO,也叫做外网IP。

我们使用的电脑、家用路由器、运营商路由器、广域网以及我们要访问的服务器之间的关系大致如下:

在这里插入图片描述

  • 不同的路由器,子网IP其实都是一样的(通常都是192.168.1.1),子网内的主机IP地址不能重复,但是子网之间的IP地址就可以重复了。
  • 每一个家用路由器,其实又作为运营商路由器的子网中的一个节点,这样的运营商路由器可能会有很多级,最外层的运营商路由器的WAN口IP就是一个公网IP了。
  • 如果希望我们自己实现的服务器程序,能够在公网上被访问到,就需要把程序部署在一台具有外网IP的服务器上,这样的服务器可以在阿里云/腾讯云上进行购买。

NAT

由于私网IP不能出现在公网当中,因此子网内的主机在和外网进行通信时,路由器会不断将数据包IP首部中的源IP地址替换成路由器的WAN口IP,这样逐级替换,最终数据包中的源IP地址成为一个公网IP,这种技术成为NAT(Network Address Translation,网络地址转换)。

在这里插入图片描述

  • NAT路由器将源地址从10.0.0.10替换成全局的IP 202.244.174.37;
  • NAT路由器收到外部的数据时, 又会把目标IP从202.244.174.37替换回10.0.0.10;
  • 在NAT路由器内部, 有一张自动生成的, 用于地址转换的表; 当 10.0.0.10 第一次向 163.221.120.9发送数据时就会生成表中的映射关系;

NATP

那么问题来了, 如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系

实际上通信的并不只是A、B、C这几个主机,通信的是A、B、C上特定的进程!进程都是有自己的端口号,可能一个主机有多个进程要访问外网,NAT路由器还要区分同一台主机上不同的进程

在这里插入图片描述

这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就会删除这个表项

代理服务器

关于这部分内容,这篇文章我个人觉得写得很不错https://blog.csdn.net/qq_45217499/article/details/120892537

路由

在复杂的网络结构中, 找出一条通往终点的路线;

数据在路由的过程中,实际就是一跳一跳(Hop by Hop)“问路”的过程。所谓“一跳”就是数据链路层中的一个区间,具体在以太网中指从源MAC地址到目的MAC地址之间的帧传输区间

IP数据包的传输过程中会遇到很多路由器,这些路由器会帮助数据包进行路由转发,每当数据包遇到一个路由器后,对应路由器都会查看该数据的目的IP地址,并告知该数据下一跳应该往哪跳。

路由器的查找结果可能有以下三种:

路由器经过路由表查询后,得知该数据下一跳应该跳到哪一个子网。
路由器经过路由表查询后,没有发现匹配的子网,此时路由器会将该数据转发给默认路由。
路由器经过路由表查询后,得知该数据的目标网络就是当前所在的网络,此时路由器就会将该数据转给当前网络中对应的主机。

我们可以使用route命令查看云服务器的路由表

在这里插入图片描述

Destination代表的是目的网络地址。
Gateway代表的是下一跳地址。
Genmask代表的是子网掩码。
Flags中,U标志表示此条目有效(可以禁用某些条目)G标志表示此条目的下一跳地址是某个路由器的地址,没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发。
Iface代表的是发送接口。

当IP数据包到达路由器时,路由器就会用该数据的目的IP地址,依次与路由表中的子网掩码Genmask进行“按位与”操作,然后将结果与子网掩码对应的目的网络地址Destination进行比对,如果匹配则说明该数据包下一跳就应该跳去这个子网,此时就会将该数据包通过对应的发送接口Iface发出。

如果将该数据包的目的IP地址与子网掩码进行“按位与”后,没有找到匹配的目的网络地址,此时路由器就会将这个数据包发送到默认路由,也就是路由表中目标网络地址中的default。可以看到默认路由对应的Flags是UG,实际就是将该数据转给了另一台路由器,让该数据在另一台路由器继续进行路由。

数据包不断经过路由器路由后,最终就能到达目标主机所在的目标网络,此时就不再根据该数据包目的IP地址当中的网络号进行路由了,而是根据目的IP地址当中的主机号进行路由,最终根据该数据包对应的主机号就能将数据发送给目标主机了


http://www.ppmy.cn/news/1078906.html

相关文章

Android11去掉Setings里的投射菜单条目

Android11去掉【设置】--【已连接的设备】--【连接偏好设置】里的投射菜单条目&#xff0c;具体如下&#xff1a; commit 0c0583e6ddcdea21ec02db291d9a07d90f10aa59 Author: wzh <wzhincartech.com> Date: Wed Jul 21 16:37:13 2021 0800去掉投射菜单Change-Id: Id7f…

【数据结构回顾】

数据结构回顾 一、单链表二、单循环链表 一、单链表 #include <stdio.h> #include <stdlib.h>typedef struct Node {int data;Node *next; }Node;Node* initList() {Node *list (Node*)malloc(sizeof(Node));list->data 0;list->next NULL;return list; }…

vue3的provide

provide 和 inject 通常成对一起使用&#xff0c;使一个祖先组件作为其后代组件的依赖注入方&#xff0c;无论这个组件的层级有多深都可以注入成功&#xff0c;只要他们处于同一条组件链上。 provide&#xff1a;提供一个值&#xff0c;可以被后代组件注入。 inject&#xff…

freemarker学习+集成springboot+导出word

目录 一 FreeMarker简介 二 集成springboot&#xff0c;实现案例导出 三 常见面试题总结 一 FreeMarker简介 FreeMarker 是一款 模板引擎&#xff1a; 即一种基于模板和要改变的数据&#xff0c; 并用来生成输出文本(HTML网页&#xff0c;电子邮件&#xff0c;配置文件&…

Qt 动态中英文切换

背景&#xff1a; 需要界面实现动态国际化&#xff0c;一键点击切换中英文或其他语言。 前提&#xff1a; 已经完成了整个界面的翻译&#xff0c;拿到匹配的ts翻译文件&#xff0c;注意&#xff1a;要保证界面切换后&#xff0c;翻译的全覆盖&#xff0c;要保证任何需要反应的地…

第P3周:天气识别

一、前期准备 1、设置GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, datasetsimport os,PIL,pathlibdevice torch.device("cuda" if torch.cuda.is_available() …

一些进程/线程调试经验和基础

查看进程/线程/系统运行状况等的命令 主线剧情02-ARM-Linux基础学习记录_Real-Staok的博客-CSDN博客 里面的 Linux Shell 一节 的 任务后台执行 / 任务&进程查看 部分。 关于Linux下进程的详解【进程查看与管理】 - AshJo - 博客园 (cnblogs.com)。 linux top命令查看内存…

kubevirt虚机创建svc通过NodePort的方式暴露端口

背景 存在kubevit存在的三个虚机&#xff1a; ubuntu-4tlg7 7d22h Running True ubuntu-7kgrk 7d22h Running True ubuntu-94kg2 7d22h Running True 网络没有做透传&#xff0c;pod也不是underlay网络想要通过NodePort方式暴露虚机22端口进行远程登录。 …