当前位置:网站首页>IP协议(网际协议)
IP协议(网际协议)
2022-08-02 21:00:00 【CHIAJ176】
IPV4
IP(Internet Protocol)网际协议,是TCP/IP协议的核心部分,虽然IPV4终将会被IPV6替代,但是目前IPV4仍然是IP协议的主流版本。
IP协议首部格式(IPV4)

- 4位版本号(Version):用来指定IP协议的版本,IPV4的版本号就是4,如果这个IP报文是IPV4版本,那么这个字段的值就是4,用4位来标识就是0100。IPV6的版本号则是6。
- 4位首部长度(Internet Header Length):表明IP首部的大小,单位是4个字节,length * 4的字节数,因为这一字段共4个比特位,所以这一字段最大值为2 ^ 4 - 1即15,所以IP首部最大长度为15 * 4即60字节;在默认情况下,该字段被设置为5,所以默认IP首部20字节。
- 8位服务类型(Type Of Service):前三位表示优先度(已经弃用),第4位表示最低延迟、第5位表示最大吞吐、第6位表示最大可靠性、第7位表示最小代价,这四位互相冲突,只能选择一个。需要根据不同情况进行选择,如果是SSH/TELNET这类远端登录,那么就应该选择最小延时,如果是FTP类型的程序,则应该选择最大吞吐量;第8位是保留位,目前没有使用,必须填0。
- 16位总长度(Total Length):表示IP首部和后面携带的数据部分一共有多少个字节。该字段有16个比特位,因此IP数据报整体最大长度为65535个字节。
- 16位标识(ID):唯一地标识主机发送的报文,如果一份IP报文在数据链路层被分片,那么每一片的该字段应该都是相同值。帮助对端主机在接收后进行分片重组。
- 3位标志(Flag):第一位保留(保留的意思是现在不使用,未来如果需要的话再使用),必须填0;第二位用来指明是否可以分片,如果为0则可以分片,如果为1则不能分片,假如一个IP报文禁止分片且长度还大于了MTU(Maximum Transmission Unit最大传输单元,后面详细介绍),则该本文只能被丢弃;如果报文被分片,第三位为1表示它是分片中段的报文,即后续还有分片报文,如果第三位为0则表示这是最后一片。
- 13位片偏移(Fragment Offset):该字段表示分片相对于原始IP报文开始处的偏移量,其实就是表示当前分片在原报文中所处的位置,第一个分片对应值为0。由于该字段总共13个比特位,因此最多可以表示2 ^ 13即8192个相对位置。单位为8字节,所以最大可以表示8192 * 8 = 65536个字节的位置。
- 8位生存时间(Time To Live):数据报到达目的地的最大报文跳数(Hop,指网络中一个区间,IP数据包正是在网络中一个跳间被转发),一般为64,每次经过一个路由,TTL–,如果TTL == 0时还没到达目的地,那么这个报文就会被丢弃。这个字段主要是为了防止出现路由循环,数据包在一个循环中一直转发,浪费网络资源。
- 8位协议(Protocol):表示IP的上层是什么协议,我们熟知的TCP、UDP、ICMP等都是在IP上层的。
- 16位首部校验和(Header Checksum):使用CRC进行校验,鉴别IP首部是否收到损坏,如果损坏直接丢弃,它只校验IP头部,不校验下面的内容,因为内容部分的校验是上层传输层(TCP)需要考虑的,IP协议只要发现首部有问题就直接丢弃该报文。
- 32位源IP地址(Source Address):表示发送端的IP。
- 32位目的IP地址(Destination Address):表示接收端的IP。
- 选项字段(Options):不定长,最大可以到40个字节。
分片与组装:
MTU(Maximum Transmission Unit最大传输单元)是在IP层下面的MAC协议中的概念,MAC协议我们可以理解为是物理层的一些协议,它位于IP协议的下层,那么在发送数据时相当于是用户数据 + 应用层协议报头(如HTTP请求报头)作为有效载荷交给传输层(如TCP协议),TCP协议再将TCP报头 + 应用层传来的数据下交给IP层,IP层再将IP协议首部 + TCP层传来的TCP报文交付给MAC帧。因此每个MAC帧其实是IP协议首部 + IP层的有效载荷。而MAC帧是有长度限制的,所以就要求IP数据报向下交付时并不是随心所欲想发多长就发多长,如果MAC帧要求MTU为1500字节,而IP数据包总长度有2000字节,那么就需要分片,将原有的IP数据包分成两片,依次发送,对端的主机在接收后,由对端的IP层再完成组装。我们在Linux环境下可以使用ifconfig命令查看到MTU。

分片和组装对于上层TCP/UDP和下层的MAC都是透明的,即上层和下层都不知道IP层将数据包进行了分片操作,因此分片和组装操作会由发送方IP层和接收方IP层自动完成。但是分片意味着需要把一份数据变为多组数据传输,并且在对端还需要进行组装,这样会大大降低网络传输效率以及提升错误风险,因此在传输过程中应当尽量避免分片,即尽量不要发送超过MTU长度的IP数据报。
IP地址
IP地址的定义:
IPV4中我们由32位正整数来表示IP地址,计算机内部会直接以二进制来保存IP地址,不过人并不善于记忆二进制整数,所以我们采用点分十进制来记录IP地址:即将32位IP地址每8位一组,分成4组,组间用’ . '进行分隔,再将每组转换为十进制。
因此我们可以直接算出,在IPV4标准下最多有2 ^ 32 = 4292967296个IP地址,但是能被人们使用的远远不足这个数字。(比如某些IP地址是有特殊作用被预留的,某些设备如路由器会占有多个IP地址)
IP地址的组成:
IP地址由网络标识(网络地址)和主机标识(主机地址)两部分组成。
网络号:保证互相连接的两个网段具有不同的标识。
主机号:保证在同一个网段中,两台主机具有不同的标识。
IP地址的划分:
IP地址划分为五个级别,分别为A类、B类、C类、D类和E类(一直没有使用过),所以目前我们所能见到的IP地址只有A、B、C、D四类。划分的依据就是IP地址从第1位到第4位的比特位。
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引入子网掩码:
随着Internet的发展,使用前四位是否为1来分类的方案弊端开始显现:那就是很多子网的申请者都会去申请B类网络地址,因为A类根本用不完,而C类不够用。导致B类的网络地址很快就被分配完了。而申请了A类的网络又会浪费大量的IP地址,在这种情况下,人们提出了新的划分方案:CIDR(Classless Interdomain Routing无类型域间选路)
- 引入子网掩码来区分网络号和主机号
- 子网掩码也是一个32位的正整数,但结尾通常是一串0
- 将IP地址与子网掩码进行&操作,所得结果就是网络号
- 网络号和主机号的划分就与这个IP地址是A类、B类还是C类无关了
一些特殊的IP地址
将IP地址中的主机地址全设置为0,即该局域网的网络号,这个IP地址代表这个局域网。
将IP地址中的主机地址全设置为1,可以变成广播地址,这个广播地址可以给同一个链路中互相连接的所有主机发送数据包
127.*的IP地址用于本地环回测试,通常是127.0.0.1
私有IP地址和公网IP地址
RFC1918规定了组建局域网的私有IP地址的规范:
10.* 前8位是网络号,共有16,777,216个地址
172.16.*~172.31.* 前12位是网络号,共有1,048,576个地址
192.168.* 前16位是网络号,共有65,536个地址
上述范围内的IP地址都是私有IP,不在上述范围内的IP则为全局IP地址(公网IP地址)。
IPv6
IPv6由40个字节的固定头部和可变长的扩展头部组成。
- 4位版本号:IP协议版本,IPv6值为6
- 8位通信类型:指示数据通信类型和优先级
- 20位流标志:用于某些对连接服务质量有特殊要求的通信。
- 16位净荷长度:指IPv6扩展头部和应用程序数据长度之和,不包含固定头部长度
- 8位下一个包头:指紧跟IPv6固定头部的包头类型,如扩展头或上层协议。
- 8位跳数限制:和IPv4的TTL含义相同
- 后两项IP地址:IPv6地址一般用16进制字符串表示,用‘:’分割为8组,每组两个字节。
边栏推荐
- Xcode13.1 run engineering error fatal error: 'IFlyMSC/IFly h' file not found
- Nervegrowold hands-on learning deep learning V2 - Bert pre training data set and code implementation
- 56.【全局变量和局部变量专题】
- 回文自动机+CodeTON Round 2 C,D
- 并发与并行
- 传感器工作原理
- [C题目]力扣234. 回文链表
- 快速构建电脑软件系统 、超好用经典的网页推荐汇总
- [21 Days Learning Challenge] Bubble Sort and Insertion Sort
- 交 叉 数 组
猜你喜欢

A brief discussion on the transformation of .NET legacy applications

iframe------------frame-

X 2 Earn必须依靠旁氏启动?GameFi的出路在哪?(下)

The software testing process specification is what?Specific what to do?

【3D视觉】深度摄像头与3D重建

Mysql用户管理

PyRosetta 安装方法之Conda安装

管理工具|宝藏书签收藏管理工具

56.【全局变量和局部变量专题】

你我都会遇到的需求:如何导出MySQL中的数据~ 简单!实用!
随机推荐
10 种最佳 IDE 软件 ,你更忠爱哪一个?
Use the TCP protocol, we won't lost package?
Which thread pool does Async use?
ORB SLAM3加载Vocabulary更快ORBvoc.bin
华为设备配置BFD多跳检测
How to quickly compare two byte arrays for equality in .NET
博客主页rrs代码
矩阵白化原理及推导
【C语言进阶】--指针典题剖析
源码构建LAMP环境-3
PLC working principle animation
工厂模式理解了没有?
快速学会ansible的安装
用了TCP协议,就一定不会丢包吗?
DataGrip 安装教程 详细版
正则表达式
用户之声 | 我与GBase的缘分
微软SQL服务器被黑客入侵以窃取代理服务的带宽
模糊查询like用法实例(Bee)
iframe------------frame-