目录
[1. 协议头格式](#1. 协议头格式)
[2. 网段划分](#2. 网段划分)
[3. 特殊的IP](#3. 特殊的IP)
[4. 公网IP && 内网IP](#4. 公网IP && 内网IP)

网络层的IP协议主要解决的是什么问题?------将数据包从B主机发送给C主机;传输层协议tcp提供可靠的策略;网络层IP协议提供数据数据传输的能力;

发送报文时,传输路径的选择;想要去一个景点要怎么去?所在城市 + 景点;IP地址也是如此,IP地址就包含了:目标网络,目标主机的信息;IP = 网络号 + 主机号;
任何一台主机一定在某一个局域网(子网)中;
- 主机:配有IP地址, 但是不进行路由控制的设备;
- 路由器:即配有IP地址, 又能进行路由控制;
- 节点:主机和路由器的统 称;
1. 协议头格式

**4位版本号:**指定IP协议的版本,对于IPv4来说,就是4;
关于IPv4和IPv6:
- IPv4:4字节IP地址(32位,大约42亿个IP地址)随着网络的发展(智能家电、手机、电脑...),4字节IP面临着不够用的问题;
- IPv6:16字节ip地址128位,可表示的主机数量2的128次方,数量比4位IP大的多,目前并没有被广泛使用(国内使用较多主要原因:IPv4和IPv6不兼容);
4位首部长度:0000,4位bit位可表示[0~15],单位也是4字节,可表示范围[0~60]字节;标准报头长度是20字节(不包含选项);
**16位总长度:**属于自描述字段,报头(含选项)+有效载荷的长度;
8位服务类型 :3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0)
4位TOS分别表示:最小延时,最大吞吐量,最高可靠性,最小成本;
这四者相互冲突,只能选择一个,对于 ssh / telnet 这样的应用程序,最小延时比较重要;对于ftp这样的程序,最大吞吐量比较重要;
16位标识(id):唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个 id都是相同的;
3位标志字段 :第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位 置为1表示禁 止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话, 最后一个分片置为1, 其他是0. 类似于一个结束标记;
13位分片偏移: 是分片相对于原始IP报文开始处的偏移;其实就是在表示当前分片 在原报文中处在哪个位置;实际偏移的字节数是这个值 * 8 得到的.;因此, 除了最后一个报文之外, 其他报 文的长度必须是8的整数倍(否则报文就不连续了);13位 * 8本质是为了补位到16位;
第二行(**16位标识、3位标志字段、13位分片偏移)**涉及到数据分片:
背景: MTU的限制,MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制,限制最大为1500字节,最小为46字节;也就是说发送的每个数据包大小不能超过1500字节,超过了就需要分包发送;
举例示例中就不再 * 8;
比如:这有一个要发送的数据包,大小是3000字节;

受到MTU的限制,需要对数据包进行分包:

分成三个包进行划分;接收方收到数据包后,需要进行装片:
如何知道标识(16位标识)的报文分片了?
- 收到分片,更多分片是1,就证明分片了
- 如果更多分片位(第三位)是0,看片偏移是否为0,(为0表示没有分片,不为0表示是分片的最后一片)
如何保证分片收全?
- 3位标志和13位偏移可以确保收到开头(开头偏移是0);
- 3位标志可和13位偏移以确保收到结尾(偏移不为0,标志位为0);
- 按照 片偏移进行升序排序,然后进行计算(根据偏移量判断),确保中间是否收到;
如何正确组装?
- 根据片偏移进行排序,然后去掉后续的报头,进行组装;
8位生存时间(Time To Live, TTL):数据报到达目的地的最大报文跳数,一般是64,每次经过一个路由, TTL -= 1, 一直减到0还没到达,那么就丢弃; 这个字段主要是用来防止出现路由循环;如下图的情况:
8位协议:表示上层协议的类型,由发送方填充,接收方识别;如果是TCP协议,8位协议就填充为TCP,对方接收到报文,网络层解析报文,通过协议号区分,向上交付时是交给TCP还是UDP;
**16位头部校验和:**使用CRC进行校验, 来鉴别头部是否损坏;
IP地址:访问服务时:./tcp_client 192.1.1.1 8888;IP被填充在报头的32位目的IP地址中,端口号被填充在TCP报头中的目的端口中;
2. 网段划分
知道了它的协议格式,那如何做到数据发送呢?虽然协议中有8位生存时间,但是依然没有路由选择的策略啊?比如:从一个路由器转发给另一个路由器该如何选择?选择的策略需要根据网段进行选择;在此之前需要了解网段的划分;
IP地址分为两个部分,网络号和主机号;
- 网络号:用于标识网络的唯一性,标识特定的网络或子网,保证相互连接的两个网段具有不同的标识;
- 主机号:表示网络中设备的唯一性,同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号;
一个路由器通常至少需要连接到两个局域网;一个路由器集连两个网络,那就要有两个IP、两个网卡、两个不同的网络物理接口;

比如:在家里连网线,都会有一个路由器,路由器在安装时都会连接网线,这个网线来自于运营商提供的宽带网络线路(电信、移动、联通)通过线路可以连接到运营商的网络;联网之后在家就可以使用局域网上网了;使用手机或电脑发送消息时,就是先发给家中的路由器,然后路由器再将信息发送给运营商,由运营商替你发送请求;由此也可以知道,路由器也有构建子网的功能;这里的路由器就集连了两个局域网,一个家中的局域网,一个运行商的局域网;
路由器构建子网,同时也可以对局域网内的IP地址进行管理;
DHCP服务(应用层):能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便,一般的路由器都带有DHCP功能,因此路由器也可以看做一个DHCP服务器;现在的路由器,主要工作是在网络层,但不仅仅只工作在网络层,比如:DHCP、http它都可以支持,http访问路由器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
这种分配方法有很大的问题:
一个B类地址,理论上一个子网内能允许6万5千多个主机;A类地址的子网内的主机数更多;然而实际网络架设中,不会存在一个子网内有这么多的情况。大多数情况下很多的IP地址都被浪费掉了;
大多数组织都申请B类网络地址,导致B类地址很快就分配完了B类只能分配1万6千多个子网,
C类8位主机号,只能允许有256台主机,不满足需求;针对这种情况提出了新的划分方案,称为CIDR(ClasslessInterdomain Routing):
引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;子网掩码也是一个32位的正整数,由一串 "0"来结尾;将IP地址和子网掩码进行"按位与"操作,得到的结果就是网络号;网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
子网掩码的作用:左边全为1,右边全为0;可以动态的调整划分;
示例:比如一个B类IP(通常是16位网络号,16位主机号),在实际情况下,16位主机号可能就只用了(低)8位;此时就可使用子网划分,划分出多个不同的子网,怎么划分子网?------通过子网掩码调整网络号;
比如:这个B类的IP,主机号在实际使用中可能只用了后8位(红色部分);前8位(紫色部分)并没有使用,那么就可以使用子网掩码来动态调整,将没有使用的前8位主机号转化成网络号;
子网掩码:255 . 255 . 255 . 0;
前16位标识的路由器下可以继续组建子网:

这些路由器前16位都是一样的,中间的8位作为网络号的一部分,用来区分这些路由器;
因此:可以划分给256个路由器;当然,这些路由器也都可以构建自己的子网;

划分网络号有什么用?提高定位和查找主机的效率;
举个例子:

比如:计算机学院的张三,捡到了一张学生证(李四丢失),张三想要把学生证还给李四,因此他就需要找到李四;怎么找?
在教学楼门口,来一个学生问一下学号,是否与学生证上的学号相同吗?这样等于是遍历全校所有的学生,这样效率大慢了,那怎么找呢?------根据学号,学号有院号和个人编号,根据学号的前几位找到李四所在的院系,张三通过自己院系的学生会主席,找到音乐学院的学生会主席(假设学生会主席知道学院所有的学生),然后学生会主席去通知李四,这样就把学生证交到了李四手中;
网络传输也是如此,只不过是把院系换成一个一个的子网;
3. 特殊的IP
- 将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;
- 将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
- 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1;
4. 公网IP && 内网IP
- 10.*,前8位是网络号,共16,777,216个地址
- 172.16.到172.31.前12位是网络号,共1,048,576个地址
- 192.168.*,前16位是网络号,共65,536个地址
包含在这些范围中的,都属于私有IP,其余的则称为全局IP(或公网IP); 通常情况下,我们手机电脑使用的都是私有IP(内网IP);

家用路由器内使用的都是内网IP,通过上图可以发现,在不同的家用局域网中,存在相同的IP;主要原因是因为子网的私有IP不会出现在公网中,大大缓解了IP地址不足的问题;
比如:在家用路由器中,使用手机请求某音的短视频(公网),手机把发送请求发送给家用路由器,路由器识别到网络编号不属于自己的子网,就会把请求交给自己所在的子网路由器(运营商路由器),然后通过运营商路由器发送请求访问公网中的某音服务器;
现在有新的问题,如何把响应报文从公网中返回回来?任何一个内网路由器,在转发报文的时候,都要将源IP,替换成路由器的WAN口IP;
举个例子:使用手机发送请求给家用路由器,家用路由器发送给运营商路由器时,就会将源IP(手机IP)替换成自己的(路由器的)WAN口IP,运营商路由器发送请求也是如此;这样在返回时,公网的服务器起码知道,要返回的下一级IP是哪个------这种计算就是NAT技术;
其实家用路由器发送请求时,也是将请求到一个更大的子网中,在学校使用校园网也是一样;手机发送请求,先发给学校的路由器(机房),然后机房再将请求发送给运营商路由器(更大的子网,上边可能还有),最终就可以请求到公网的服务器;
拓展
运行商在网络中扮演什么样的角色?

不仅仅我们是运营商的客户,互联网公司也是运营商的客户,也要有机房宽带;
家用路由器中拥有两套密码:
- 局域网名、密码
- 账号:手机号、密码:XXXX
举个例子:比如家里的无线局域网,一般都会有一个关联的电话号,只要电话不欠费,就可以一直上网,电话号的话费(网费);手机号账户的密码一般只有运营商知道,发送数据时,会连带着手机号的账号一起发送给运营商;运营商记录着账户的费用,如果发现账户欠费,那就直接将报文丢弃
欠费时运营商可以拦截,如果访问的是非法网址(外网),运营商也可以拦截;
而我们日常上网所使用的网络,也基本都是运营商组建的局域网;
IP地址(IPv4)是一个4字节32位的正整数,那么一共只有 2的32次方个IP地址,大概是43亿左右;而TCP/IP,协议规定,每个主机都需要有一个IP地址,这意味着,一共只有43亿台主机能接入网络么?
实际上,由于一些特殊的IP地址的存在(192.168.限定的内外IP),IP的实际数量远不足43亿;另外IP地址并非是按照主机台数来配置的,而是每一个网卡都需要配置一个或多个IP地址;
CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率,减少了浪费,但是IP地址的绝对上限并没有增加),仍然不是很够用,这时候有三种方式来解决:
- 动态分配IP地址:只给接入网络的设备分配IP地址,因此同一个MAC地址的设备,每次接入互联网中,得到的IP地址不一定是相同的;
- NAT技术:(允许子网中IP地址的重复)
- IPv6:IPv6并不是IPv4的简单升级版,这是互不相干的两个协议,彼此并不兼容;IPv6用16字节128位来表示一个IP地址;但是目前IPv6还没有普及;
关于NAT技术:
一个路由器可以配置两个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的服务器上、这样的服务器可以在阿里云/腾讯云上进行购买;
使用命令查看路由表:route
示例:

-
路由表匹配:当数据包到达路由器时,路由器会查看路由表,尝试找到一个匹配的路由条目(通常是目的IP地址)。如果找到了匹配的路由条目,路由器会将数据包转发到指定的下一跳地址及其对应的发送接口。
-
缺省路由:如果路由器未能找到与目的IP地址匹配的条目(即目的地址不在任何已知的子网中),则路由器会使用缺省路由(通常是一个"0.0.0.0/0"条目)将数据包转发到指定的下一跳地址(通常是上级局域网)。缺省路由用于处理所有未处理的流量。
-
**同一子网中的路由:**路由表可以包含同级路由器的地址以及同一子网中的其他入口或出口。这便于局域网内设备之间的通信,也有助于确保流量能够根据最佳路径转发
怎么理解网络结构?

IP在划分时首先根据国家进行划分,全球国家组成一个巨大的广域网;
国内根据省份再次划分IP,组建以省份为单位的广域网;然后再到市级,地区...;
比如:郑州市的子网路由器的路由表中就有其他市区的路由信息(其他子网的入口),同样也有河南省省级局域网路由器(网关)的地址(自己所处子网的出口);
总结
以上便是本文的全部内容,希望对你有所帮助,感谢阅读!