传输层协议用来确保通信的准确性,而网络层协议则是用来建立通信的,接下来我们看看网络层是如何建立通信的;
两台主机通信,需要有可以唯一标识主机的符号,主机通过这个符号才可以识别不同主机,而这个符号就是IP地址;
1.IP地址结构
一台主机想要找到它传输信息的目标主机,这是一个查找的过程,而查找本身又是一个排除的过程;而如何让这个排除的过程尽量高效呢?IP协议通过将IP地址划分为目标网络+目标主机;通过先排除目标主机不在的网络,再到目标主机所在的网络中寻找到目标主机,这样的排除的方式高效的寻找到目标主机,实现快速定位;
如果你想问,路由器是怎么知道目标主机在或不在一个网络中呢?每个路由器可以通过IP地址知道目标主机是不是自己这个局域网的;所以快速定位的关键就在于IP地址的精心设计:
IP地址=目的网络+目标主机
还可以通过下面找同学的例子来理解(自用复习) :
那至于IP地址更加精细的设计,下面的内容会继续穿插;
2.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模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话,最后一个分片置为0, 其他是1. 类似于一个结束标记.
13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
8位协议: 表示上层协议的类型
16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.
32位源地址和32位目标地址: 表示发送端和接收端.
选项字段(不定长, 最多40字节)
3.生活中的网络
生活中使用最多的就是无线网络,在家我们可能使用的是无线的WIFI(也可能是有线宽带),这些都是由路由器提供的;外出时我们使用的是运营商的数据流量,数据流量是运营商建设的基站提供的;
路由器与基站负责将局域网中的数据通过光纤或者其他链路传回传送回运营商;基站回传链路还有无线信号(4G5G)甚至是卫星信号;接下来我们看看这些设备究竟为网络做了什么;
4.路由器
在现实生活中因为网络传输的距离有时候非常的遥远,就比如跨城市的通信,这个时候两个主机已经不再同一个网络中心(运营商设施),那么这个时候就需要运营商的网络中心将数据进行转发,转发到目标主机所在的网络中心,这期间可能会经过非常多的网络中心(网络中心其实也是很多路由器和交换机组成的非常复杂的设施),而这样的转发其实就是我们常说的下一跳的选择;
路由器特点:
1. 路由器本质也是特定一个子网的主机,也要配置ip地址
2. 路由器一定至少要连接2个子网,路由器也就相当于同时在两个子网中
3. 路由器一般是一个子网中的第一台设备,一般他的IP地址都是:网络号.1(某个网路号中的第一号主机)
4. 路由器功能主要是对报文的转发与构建局域网
我们可以将路由器看作一个只有网络层以下部分的主机;
5.IP地址分配
分配方式:
1.分类划分与子网掩码方式
2.动态分配,当主机联网时才分配
3.NAT分配技术
5.1 历史划分(分类划分)
在开头的第一点中,我们就有说过IP地址划分为网络号+地址号;而在历史中IP地址又被划分为了这些:
但是这样的划分面临着一些IP地址的浪费,例如很多机构喜欢申请B类地址,而它们某个网络号中的主机数量达不到2^16-2=6万5千个,所以又出现了子网掩码;
5.2 子网掩码(CIDR划分方式)
因为历史分配方式,会导致大量IP地址浪费的原因,通过子网掩码的方式可以灵活的划分IP地址减少了IP地址的浪费;
子网掩码通俗的说是一串前一半为全1后一半为全0的二进制32位数字,通过将子网掩码与IP地址进行按位与的操作,获得IP地址的网络号,知道网络号后就可以知道IP地址所在的网络了;
通过这样子网掩码的方式就可以灵活的划分IP地址了,而子网掩码一般是内嵌入路由器中的,路由器通过将子网掩码与IP地址按位与后的结果与其子网网络号对比如果相同则目标主机在此子网中,如不同则继续转发;
注意点:
在这种划分中每个网络号的第一位与最后一位是被占用的,第一个是网络号的IP最后一个是广播号的IP;
主机号的个数也是和掩码个数相关的:假设掩码个数为24,那么网络号主机数量为32-24=8,2^8-1=255个主机号
5.3 NAT技术
5.3.1 公网私网划分
由于IPv4地址的不足,上面的划分技术只能减少IPv4地址的浪费,提高利用率,而NAT技术则是很好的减少了被占用的IP地址数量,其中公私网划分就是其中一个非常关键的方式;
在我们国家私有IP地址一般是这些:
10.*,前8位是网络号,共16,777,216个地址
172.16.*到172.31.*,前12位是网络号,共1,048,576个地址
192.168.*,前16位是网络号,共65,536个地址
包含在上面这些范围中的, 都是为私有IP, 其余都为公有IP;
在我们生活中平时所接触的全部都是私网IP,我们打开电脑cmd输入ipconfig这样输出的IP地址都是私网IP:
那么我们现如今可以接触到的公网IP基本上只有例如云服务器上的IP地址:
在世界的网络中,可以直接识别找到目标主机的只有公有IP,也就是说我们现在接触的私有IP在网络上想要直接访问我们,是无法访问的,而NAT技术就是解决这一问题的关键:
我们可以看到请求报文可以成功转发到达目标主机,因为目标主机的IP地址是公网IP可以在世界的网络中查找到,但是响应时无法通过私有IP地址找回到原主机,私有IP地址无法在网络上直接访问到;
5.3.2 NAT过程
通过替换报文的源IP地址的方式,让目标主机可以找到上次转发的路由器,并建立映射关系,从而可以一层层的找回发起请求报文的主机;
报文替换很好理解,但是建立映射的细节下面再附加讲解一下:
1. NAT如何工作
路由器在执行NAT时,会对数据包进行修改,以确保每个内网设备的数据流量可以正确地发送出去并接收响应。这个修改通常发生在以下几个字段中:
- 源IP地址:路由器会将内网设备的私有IP地址替换为其WAN口的公网IP地址。
- 源端口号:路由器会将内网设备的源端口号(例如
12345
)替换为一个唯一的端口号(例如10001
)。2. 添加“标识”在报文中的位置
这个“标识”——其实是新的源端口号——是添加在数据包的传输层(TCP或UDP层)中的。具体来说:
- 在TCP/UDP数据包的头部,会有一个源端口号和一个目标端口号字段。在NAT过程中,路由器会修改源端口号字段,将原本内网设备的端口号(如
12345
)替换为一个新的端口号(如10001
)。- 这样,通过不同的端口号,路由器就能区分不同的内网设备,确保每个设备发出的数据包能够通过相同的公网IP,但不同的端口号来区分。
3. 映射表
路由器还会创建一个NAT映射表,记录每个内网设备的源IP地址和源端口号与公网IP地址和新分配的源端口号之间的映射关系。这个映射表就像是一个“地址簿”,确保每个外部响应都能找到正确的内网设备。
例如:
- 内网设备A (
192.168.1.10:12345
) 通过路由器的WAN口发送数据时,路由器会将其替换为203.0.113.1:10001
,并在NAT表中记录下这个映射。- 内网设备B (
192.168.1.20:54321
) 通过路由器的WAN口发送数据时,路由器会将其替换为203.0.113.1:10002
,并在NAT表中记录下这个映射。4. 返回的响应
当外部服务器响应数据包时,返回的目标地址是公网IP地址加端口号(例如
203.0.113.1:10001
)。路由器会查找NAT映射表,找到对应的私有IP和端口号,然后将目标地址改回内网设备的IP和端口号(例如192.168.1.10:12345
),最终将数据包转发给正确的设备。5. 总结
所以,路由器通过修改数据包中的传输层端口号来区分不同设备的请求,而这种修改是直接发生在TCP/UDP报文的头部中的源端口字段。这样即使多个设备共享同一个公网IP,路由器依然能够通过端口号来区分它们,确保响应数据包能正确地返回到对应的设备。
在路由转发时,路由器内会建立一张这样的表:
通过这张表就可以让转发的路径可以追本溯源,让请求到达的同时可以让响应成功返回;
5.3.3 内网穿透
frp技术(gitee与githup上搜索)
通过一台公网设备将报文转发给内网设备,起到访问内网设备的效果;
要访问的内网设备与公网设备建立长链接,之后无论在什么地方只要可以访问到公网服务器,就可以通过报文转发到要访问的内网设备;
5.4 路由选择
路由选择时可能发生情况:
路由器回通过网络号(子网掩码按位与目的IP地址),来寻找下一跳路由器,至于怎么寻找,在路由器中其实也是有一张路由表的;我们在linux系统中输入route命令:
route命令输出各元素讲解:
1. Destination
含义:目标网络或目标地址。这是数据包最终要到达的目的地。它可以是一个具体的IP地址或一个网络地址(如
192.168.1.0
,表示整个子网)。示例:
0.0.0.0
表示默认路由,所有不匹配其它路由的流量将通过这个路由发送。2. Gateway
含义:数据包要到达目标网络时经过的下一跳网关地址。如果目标在本地网络中,网关通常是空(或
0.0.0.0
)。示例:
192.168.1.1
可能是连接到互联网的路由器的IP地址。3. Genmask
含义:子网掩码,它表示目标网络的网络部分和主机部分。通过子网掩码,路由器可以判断目标IP是否在本地网络中,或者是否需要通过网关转发。
示例:
255.255.255.0
,表示该网络有256个IP地址(从192.168.1.0
到192.168.1.255
)。4. Flags
含义:表示路由条目的标志,显示此路由的状态。常见的标志有:
U: 路由是可用的
G: 路由是通过网关的(而不是直接到目标)
H: 目标是一个主机(而不是网络)
D: 该路由是由动态路由协议学习到的
示例:
UG
表示这个路由通过网关并且是可用的。5. Metric
含义:路由的优先级,数字越小表示优先级越高。路由器会选择具有最低metric的路径来转发数据包。
示例:
10
表示该路由的优先级是10,较低的值表示更优的路由。6. Ref
含义:参考计数,通常在使用动态路由协议时有意义,表示有多少个路由条目引用了这个路由。
示例:一般来说,在静态路由配置中,这个值通常是
0
。7. Use
含义:表示该路由被使用的次数或次数的计数器。可以显示此路由实际使用的频率。
示例:如果该值是
10
,说明这个路由表项被使用了10次。8. Iface
含义:表示使用的网络接口(例如,
eth0
、wlan0
等),即数据包发送到目标时使用的网络接口。示例:
eth0
表示数据包通过以太网接口发出,wlan0
表示通过无线网络接口。
每个报文会通过子网掩码按位与目的IP地址获得的网络号来对比这个路由表中的Destination下的网络号,如果相同就会转发到Gateway中目标路由器所在的IP地址,如果对比整个路由表没有发现与之匹配的Destination,就会转发到默认的路由器,这个默认的路由器一般是运营商的网络中心,这个网络中心中有非常的多的路由器,通过网络中心去继续找下一跳路由器;
6.IP报文分片
在报文发送时往往还有一个叫MTU(最大传输单元)的标准,最后的传输报文的大小不能超过这个大小,这是为了保证数据传输的可靠性;在上层传输层中UDP协议的报文是没有做处理直接向下交付的所以往往会存在报文长度过大超过MTU的情况,这个时候就需要IP协议对封装的IP报文进行分片了;注:MTU所指的是最后传到数据链路层有效载荷的最大长度;
而分片的关键主要在IP协议报头的这一部分:
16位标识(id): 唯一的标识主机发送的报文. 如果IP报文在数据链路层被分片了, 那么每一个片里面的这个id都是相同的.
3位标志字段: 第一位保留(保留的意思是现在不用, 但是还没想好说不定以后要用到). 第二位置为1表示禁止分片, 这时候如果报文长度超过MTU, IP模块就会丢弃报文. 第三位表示"更多分片", 如果分片了的话,最后一个分片置为0, 其他是1. 类似于一个结束标记.
13位分片偏移(framegament offset): 是分片相对于原始IP报文开始处的偏移. 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的. 因此, 除了最后一个报文之外, 其他报文的长度必须是8的整数倍(否则报文就不连续了).
现象(复习用):
7.数据链路层
7.1 以太网帧报文结构
1.源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化
2.帧协议类型字段有三种值,分别对应IP、ARP、RARP
3.帧末尾是CRC校验码
7.2 MAC地址
mac地址的内容在前面博客讲过,这里不再重复讲述:
7.3 碰撞与安全问题
7.4 MTU与MSS
在前面6.IP分片处,我们就讲到了IP报文因为MTU的限制最后的IP报文要小于等于MTU,于是当上层报文大小太大时,就需要将报文进行分片再向下传输,可是IP报文的分片时,如果任意一个分片报文丢失都会导致报文不可用,大大减小了可靠性,所以最好不要分片;但是IP报文的初始大小是上层传递下来的(比如TCP协议);所以为了减少分片的发生,TCP协议就会尽量配合,像滑动窗口原本应该是对方主机的最大接收能力,但是这个接收能力的字节一般都很大,如果直接将滑动窗口中的数据打包为一个报文向下传递肯定更方便,但是TCP没有这么做,是通过序号与确认序号,将它们划分为一条条小的报文,这就是为了保证下层打包后最后的数据帧不大于MTU,而TCP报文的有效载荷的最大长度就是MSS;
MTU(最大传输单元):
这是指的以太网帧有效载荷的最大长度:
MSS(最大报文长度) :
这是TCP报文有效载荷的最大长度:
7.5 ARP
复习图片:
在(4.路由器,5.3.2NAT过程,5.4路由选择)处,我们都有讲到路由器下一跳的选择,数据包是过路由器转发来完成跨网络传递的;而在(7.2MAC地址)处我们可以知道每次数据包打包是是需要不断变化MAC起始和目标地址,才能起到定位下一跳路由器的能力;可是关键在于如何定位下一跳呢,在(5.4路由选择)处,我们可以通过路由表知道下一跳路由器的IP地址,但只知道IP地址不知道MAC地址,但我们的数据链路层数据帧是必须要MAC地址才能准确的定位主机的,所以如何获取下一跳路由器/主机的MAC地址呢?这个时候就需要ARP报文来完成了;
7.5.1 ARP报文结构
1.注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况 是多余的,但如果链路层是其它类型的网络则有可能是必要的。
2.硬件类型指链路层网络类型,1为以太网;
3.协议类型指要转换的地址类型,0x0800为IP地址(IPV4协议);
4.硬件地址长度对于以太网地址为6字节;(mac地址长度)
5.协议地址长度对于和IP地址为4字节;
6.op字段为1表示ARP请求,op字段为2表示ARP应答。
7.5.2 ARP协议位置
在网络协议栈中,ARP协议是在数据链路层上层的,但是它又归属与数据链路层,大概处于下面这样的位置:
7.5.3 数据传输过程(ARP操作)
当主机A要向主机B发送请求,而主机A与主机B不在一个局域网中,这样的跨网络通信需要路由器来辅助传输,首先主机A首先应该做的就是制作好请求的报文,请求报文中存有主机B的IP地址(目的IP),当主机A的报文到达路由器A时,路由器A通过路由表找到了下一跳是路由器B,此时路由器A只知道路由器B的IP地址,路由器A需要通过IP地址找到路由器B的mac地址,这个时候路由器A只需要向B发送一个ARP请求报文就可以获得路由器B返回的MAC地址了;
那路由器AB分别发送的ARP报文是什么样的呢?
当路由器A获得了路由器B的MAC地址后,就会建立路由器B的mac地址与IP地址的映射关系存储在路由器中,存储实践几十分钟不等;此时在路由器A中等待转发的报文填充MAC地址后打包完成可以向下一跳转发;
7.5.4 中间人拦截(ARP欺骗)
可以试着搜一搜ARP欺骗的软件和室友试一试
由于ARP中建立的映射关系往往接收的是最新ARP报文中的映射关系,而中间人就可以通过这一特点,进行ARP欺骗;
双向欺骗:
断网错觉:
8.PARP,DNS,ICMP(粗略讲解)
PARP
PARP协议是在主机知道MAC地址时,寻找同一局域网中MAC地址对应主机的IP地址的协议;(不常用)
DNS
DNS是一个提供域名转换的服务器,每次在浏览器中输入域名时,浏览器会先将域名转发到DNS服务器中,DNS将解析好的IP地址发送回浏览器,浏览器再去访问目标服务器;
linux下cat /etc/hosts输出主机名和IP地址的映射关系;
这是通过域名解析后获得IP地址保存在hots文件中的映射关系
ICMP
主要用来诊断与测试网络,例如ping命令;
我们所知的ping命令采用的就是ICMP协议,ping命令基于ICMP, 是在网络层. 而端口号, 是传输层的内容. 在ICMP中根本就不关注端口号这样的信息.ping命令跳过传输层直接在网络层形成报文;
traceroute命令也是基于ICMP协议的,用来探查报文经过的每一个路由器;
9.代理服务器(浅显理解)
复习图片:
其实代理服务器顾名思义,就是起到一个中间代理的作用,将请求或者响应进行某些转发,实现收益或者提高管理效率的作用;
9.1 正向代理
正向代理可以看作直接对用户主机进行管理和转发的服务器;
9.2 反向代理
9.3 特殊正向代理服务器
有些正向代理服务器可以访问到原本被运营商屏蔽不能直接访问到的网站,就比如我们经常使用的游戏加速器,比如steam商店的加速,我们直接访问steam商店时,运营商会对其进行拦截,直接丢弃我们的访问报文;而某些正向的代理服务器是可以直接访问的,至于这些正向服务器是如何做到直接访问外网服务器的,这里我不太清楚;我们其实也可以看作代理服务器帮我们进行了报文的转发起到中间人的作用;
有时候如果运营商对我们的报文进行解析解析出域名是被屏蔽的外网域名,会直接进行拦截,这个时候http隧道技术,或者用其他协议将我们原本访问目标外网主机的报文包裹起来,让运营商看到的只是普通的报文,也可以起到解除屏蔽的作用;
复习图片: