IP层
IP 是 什么 ?
网络通信的本质 是什么 ?
IP: 一个将数据 报从A 主机 跨网络送到 B 主机的能力 , 但是 可靠性 由 TCP 保证
IP 将数据A 跨网络走到数据B 的 能力
路径选择 | 在路径选择 中目标 IP非常重要 决定了 网络路径应该如何走
IP = 目标网络 + 目标 主机
IP协议报头
如何将报头和有效载荷 分离 ?
读取 IP 报头长度
报头长度信息存储在IP报头的 头部长度 这个字段占 4位
报头的实际长度单位 是 len(头部长度) * 4
头部长度的最小值是5,表示最小长度为 5 * 4 = 20
分离 IP 报头和有效载荷
读取报头长度字段,确定IP报头的实际字节长度。
有效载荷的长度确实等于 总长度 - IP头部的长度
如何交付?
网段划分
概述
在互联网中,每一台主机都需要隶属于某一个子网,以便能够高效地定位和管理网络中的每一台主机。IP地址通常由两部分组成:网络号和主机号。
IP地址的组成
网络号:用于标识一个子网。相互连接的不同网段之间必须有不同的网络号。
主机号:在同一网段内,主机之间的网络号相同,但主机号必须唯一,以确保每台主机在子网内的唯一性。
192.168.1.100/24 在默认子网掩码
255.255.255.0
下:网络号:
192.168.1
主机号:
100
/24
=11111111.11111111.11111111.00000000
前面24 位网络号剩下的最后 8 位则用来标识主机号
子网的作用
不同的子网是通过将网络号相同的主机划分在一起实现的。子网划分的优势包括:
如果要在一个子网中新增一台主机,这台主机的网络号需要和子网的网络号一致,但主机号必须不同于现有主机,以确保不会重复。
传统IP地址分类的缺陷
传统的IP地址分为A、B、C类:
A类和B类地址浪费了大量的IP地址。例如,一个B类地址可以支持约65,000个主机,而A类更多。实际网络架设中,通常不会存在单个子网内有如此多的主机,因此导致了IP地址的浪费。
CIDR(无类别域间路由)
为了解决IP地址浪费问题,引入了CIDR(Classless Inter-Domain Routing),即无类别域间路由。CIDR使用子网掩码来区分网络号和主机号,突破了传统的A、B、C类分类限制。
子网掩码
子网掩码是一个32位的正整数,用于划分网络号和主机号。通常用一串 "0" 结尾。
将IP地址和子网掩码进行按位与操作,得到的结果即为网络号。
使用子网掩码,可以灵活地调整网络号和主机号的长度,与IP地址的传统分类无关。
路由器功能
路由器在网络中的作用是 分配和管理IP地址、 转发数据包、 组建局域网
路由器的核心功能是 转发数据包。
当一个IP数据包到达路由器时,路由器会检查数据包中的目标IP地址,查找内部的 路由表,根据最佳路径将数据包转发到目标地址或下一跳的路由器。
如果目标IP地址在当前子网范围内,路由器会将数据包直接发给目标主机;否则,数据包会被转发到下一个合适的路由器,直到最终到达目的地。
DHCP
路由器通常会内置 DHCP服务器,用于为局域网(LAN)内的设备分配IP地址。这样可以方便管理和动态分配IP地址,而不需要手动配置每台设备的IP。
NAT
它允许多个内部网络设备共享一个公共的外部IP地址访问互联网
静态NAT:每一个内部IP地址都有一个固定的外部IP地址映射。
动态NAT:从可用的外部IP地址池中动态分配。
端口地址转换 ,也称为 端口映射**,是一种特殊形式的NAT,使用端口号来区分不同的内部设备,允许多个设备使用同一个外部IP地址。
路由器的配置
目标网络和子网掩码:在配置路由器时,需要为每个接口或子网指定网络和对应的子网掩码,以便进行精确的网络匹配和数据包转发。
默认网关 :如果数据包的目标网络在路由表中找不到匹配条目,则会将数据包发送到 默认网关,通常是连接到互联网的路由器。
路由器对IP数据包的管理
目的IP检查:每次IP数据包到达路由器时,路由器会根据数据包中的目的IP地址进行检查,以决定数据包的路由路径。
TTL处理:每经过一个路由器,IP数据包的TTL值会减1。当TTL减到0时,路由器会丢弃该数据包,以防止数据包在网络中无限循环。
路由器工作过程举例
数据包到达 读取 目的IP地址
路由表查找
路由表 中查找目标IP所属的网络和子网掩码
路由表: 目标网络信息 | 下一跳的路由器信息 | 网关信息
选择路径
如果目标IP在当前子网内,路由器会将数据包直接发送给目标设备
如果目标IP在其他子网内,路由器会选择一条合适的路径,将数据包转发到下一个路由器
发送数据包 更新数据包的头部信息(如TTL字段),然后将数据包发送到下一跳
路由表
🤓☝️route 18:22:45 # windows 使用route print 命令查看
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 35 0 0 eth0
192.168.9.0 0.0.0.0 255.255.255.0 U 291 0 0 eth0
_gateway 0.0.0.0 255.255.255.255 UH 35 0 0 eth0
目的IP & 路由表配置的 Genmask 确定该报文要去的目标网络
Destination 目的地址
Gateway 网关
Genmask 掩码
iface 是 发送连接口 接口 (一般为网卡) 通过 iface 接口发出报文
flags
U标志表示此条目有效(可以禁用某些 条目),G标志表示此条目的下一跳地址是某个路由器的 地址,
没有G标志的条目表示目的网络地址是与本机接口直接相连的网络,不必经路由器转发
根据路由表的信息决定 下一跳的地址
路由表 生成算法 距离向量算法, LS算法, Dijkstra算法
数据链路层
用于两个设备同一个数据链路节点之间进行传递
ethernet 帧格式
源地址和目的地址是指网卡的硬件地址 也 是 MAC 地址 长度为 48 字节
帧 协议 类型 字段有 三种值 分别对应 三种值 IP ARP RARP
帧末尾 是 CRC 校验码
MAC 地址 是长度48 位 出厂的时候 就确定了 不能修改,mac地址 通常是全球唯一
IP 地址 和 MAC 地址
IP地址 描述的 是 路途总体的起点 和 终点
MAC 地址描述的 是 路途上每一个区间的 起点和 终点
MTU
最大传输单元 不同网络有不同大的 MTU
是 对发包的时候对 包的尺寸的限制,这个限制 是 不同的 数据链路层 对应的物理层产生的限制
以太网帧 数据长度 最小46字节 最大 1500 字节 当数据包长度不够的时候 后面补充位
如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片
数据包分片
数据包分片和组装不是主流情况
IP 层 只负责 数据发送 不能决定单个报文的大小
单个报文不超过1500【IP报头+IP 报文】 是 MAC 帧的最大有效载荷
如果 TCP 发过来的报文很大 IP 又只能负责传输 但是 MTU 最大就是 1500 MAC帧的有效载荷
所以就要对 TCP 发来的报文进行分片 和 组装
如何分片和组装?
在 IP的 报文头中
16位 标识 : 唯一标识主机发送的 报文
3位标志字段 :
保留位(Reserved Bit) : 目前未使用,必须设置为 0
不分片标志(Don't Fragment, DF) :
DF = 0:允许分片。
DF = 1:不允许分片。如果数据包长度超过 MTU,则会被丢弃,并返回 ICMP 错误消息。
更多分片标志(More Fragments, MF):
MF = 0:这是最后一个分片。
MF = 1:后面还有更多的分片。
第一个分片为 001 中间分片001 最后一个分片 000
13位分片偏移 : 分片对于原始报文开始处的 偏移 ,就是 表示 当前分片在原报文 IP 报文的 那个位置 | 实际偏移字节 数的值 * 8 ,除了最后一个其他报文长度必须是 8 的倍数
接收
怎么知道报文被分片了 ?
if MF == 1 该标识是报文分片
if MF == 0 && 片偏移量 > 0 说明是 分片 否则 不是
同一个报文的分片能被识别出来?
根据16位标识符
哪一个 是第一个 ? 哪一个是 最后一个 ? 有没有收全 或者丢失 ?
第一个 : MF 1 && 片偏移 0
最后一个 更多分片 == 0 ,片偏移 > 0
当前起始位置 + 自身长度 = 下一个报文中填充的 偏移量 大小
合并
那个在前 那个在后?
按照 偏移量 进行升序排序即可
怎么保证合起来的报文是正确的 ?
TCP / IP 协议 有头部校验和
分片 :
并不是 一个很好的策略
一个报文被拆成了多个 丢失任意一个报文 就会造成拼接组装失败 会造成 对整个报文进行重传
网络传输
网络传输是一个主机到服务器 是 跨无数个局域网 子网转发的结果,了解理解 局域网 报文转发原理
同一个局域网的主机能不能直接通信 ?
可以 每台 主机 都有唯一的标识符| 定长 每一张网卡都有唯一的一个 sn 该网卡的mac地址是全球范围内 具有为一性的(只需保证局域网内唯一就可以 | 防止生产厂商生产相同的)
MAC帧报头
局域网(LAN)中的混杂模式是一种网络接口模式,在这种模式下,网络接口卡(NIC)会接收所有通过网络的数据帧,而不仅仅是那些目标地址与其自身MAC地址匹配的数据帧。这种模式通常用于网络分析和抓包工具,以便监控和分析网络流量。
局域网转发的原理 基于协议
局域网转发的原理
基于协议的转发:局域网中的所有主机都能接收到对应的MAC地址的数据帧。大部分主机通过对比数据帧中的目标MAC地址和自身的MAC地址来决定是否进行后续处理。
在局域网中,任何时刻只能有一个主机发送消息。如果多个消息同时发送,会导致数据碰撞,产生无效数据。
令牌环
令牌环网络使用一种称为“令牌”的特殊数据帧来控制网络访问。只有持有令牌的设备才能发送数据,这类似于编程中的互斥锁(mutex),确保在任何时刻只有一个设备可以发送数据。这种方式可以避免数据碰撞,但由于令牌需要在网络中传递,效率较低,尤其是在网络规模较大时。
以太网
以太网则采用一种称为载波监听多路访问/碰撞检测(CSMA/CD)的机制。设备在发送数据前会监听网络,如果检测到网络空闲就发送数据。如果多个设备同时发送数据导致碰撞,设备会停止发送并在随机时间后重试。这种方式虽然可能会有数据碰撞,但整体效率较高,特别是在现代以太网中,交换机的使用进一步减少了碰撞的可能性。
碰撞域和碰撞检测:
局域网中的碰撞域是指一个网络段内可能发生数据碰撞的范围。每个局域网通常是一个碰撞域。
主机使用碰撞检测和碰撞避免算法来减少数据碰撞的发生。
临界资源管理:
碰撞检测和碰撞避免确保任何时刻只有一台主机能够向临界资源中写入数据。
通过识别局部性的碰撞,对碰撞数据不做转发,从而降低碰撞概率。
划分碰撞域可以有效管理局域网的规模和性能。
因为有碰撞域,一台主机发送数据的时候,发送数据量 长了好,还是短了好?为什么?
长数据帧
长数据帧可以在一次传输中发送更多数据,从而减少相对开销。
长数据帧可以提高网络的整体吞吐量,因为在相同时间内可以传输更多数据
如果发生碰撞,长数据帧会导致更多数据需要重传,从而增加网络负载
长数据帧在传输过程中占用更多时间,可能导致其他主机需要等待更长时间才能发送数据
短数据帧
减少碰撞影响:短数据帧在发生碰撞时,重传的数据量较少,从而减少网络负载
降低延迟:短数据帧传输时间短,其他主机可以更快地获得发送机会
由于每个数据帧都有固定的开销,短数据帧会增加相对开销,从而降低网络效率
短数据帧在相同时间内传输的数据量较少,从而降低网络的整体吞吐量
交换机的作用:
交换机可以将局域网划分为多个碰撞域,从而减少碰撞的发生。
交换机在接收到数据时,会根据目标MAC地址将数据转发到相应的端口,从而提高网络效率。
主机将数据交付给下一跳(下一跳的主机还是路由器等其他节点) 前提一定是 该数据帧被路由过,因为网络层在链路层的上层
MAC 由数据链路层MTU 的 限制 对于较大的数据包进行 分片
MTU 影响的UDP
一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报. 这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在 网络层被分片, 整个数据被丢失的概率就大大增加了
MTU 影响 TCP
TCP 的 数据包不能 无限大 受制于MTU
TCP的单个数据报的最大消息长度称为MSS(Max Segment Size)。
MSS的值受限于数据链路层的MTU(最大传输单元)。
在TCP建立连接的过程中,通信双方会进行MSS协商。
双方在发送SYN报文时,会在TCP头部写入自己能支持的MSS值。
最理想的情况下,MSS的值应当是IP不会被分片处理的最大长度。 这个长度仍然受制于数据链路层的MTU
双方在得知对方的MSS值之后,会选择较小的值作为最终的MSS。 MSS的值在TCP首部的40字节变长选项中(kind=2)进行设置
查看硬件地址 和 MTU
ifconfig
eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1432
inet 192.168.9.179 netmask 255.255.255.0 broadcast 192.168.9.255
inet6 240e:446:644:3527:b30f:7b57:7910:6685 prefixlen 64 scopeid 0x0<global>
inet6 240e:446:644:3527:b514:8d16:8b8e:5b68 prefixlen 128 scopeid 0x0<global>
inet6 fe80::34a4:e20e:1fdb:1a3 prefixlen 64 scopeid 0x20<link>
ether 84:7b:57:fb:7a:e8 txqueuelen 1000 (Ethernet)
RX packets 12 bytes 844 (844.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 25 bytes 2222 (2.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Arp 协议
ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议
发送信息需要封装成mac 帧 发送给目标主机
ARP协议建立了主机 IP地址 和 MAC地址 的映射关系
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃
因此在通讯前必须通过ARP协议获得目的主机的硬件地址
ARP 的 数据报格式
以太网帧和格式
ARP 数据报文的格式
到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况 是多余的,但如果链路层是其它类型的网络则有可能是必要的
硬件类型指链路层网络类型,1为以太网
硬件地址长度对于以太网地址为6字节
协议地址长度对于和IP地址为4字节
协议类型指要转换的地址类型,0x0800为IP地址
op字段为1表示ARP请求,op字段为2表示ARP应答
ARP 协议的工作 流程
发送ARP 请求
IP地址是xx.xx.xx.xx的主机的硬件地址是多少”,
并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播
接收 ARP 请求
主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自 己的硬件地址填写在应答包中
每台主机都维护一个ARP缓存表,可以用
arp -a
命令查看。缓存表中的表项有过期时间(一般为20分钟),如 果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址因为 网络中的设备可能会频繁更换IP地址或MAC地址。如果ARP缓存表项没有过期时间,表中的信息可能会变得过时和不准确,导致数据包无法正确传输 减少 ARP 攻击的影响
C:\Users\chen>arp -a
接口: 172.27.144.1 --- 0xa
Internet 地址 物理地址 类型
ARP 请求流程(地址解析协议)
主机检查缓存:
主机在发送数据前会检查自己的ARP缓存,看是否已经有目标IP地址对应的MAC地址。
如果缓存中存在,直接使用;如果不存在,发起ARP请求。
发送ARP请求:
主机向本地网络发送广播ARP请求数据包,目标MAC地址设为全FF(广播地址)。
请求包中包含发起者的IP和MAC地址,以及目标的IP地址。
目标主机响应:
在同一子网中,接收到ARP请求的所有主机会检查请求中的目标IP地址。
如果目标IP地址与自己的IP地址匹配,则返回ARP响应,包含自己的MAC地址,直接发送给请求者的MAC地址(单播)。
缓存结果:
请求方收到响应后,将目标IP地址和MAC地址的对应关系存入ARP缓存中,便于后续使用。
完成通信:
主机使用获取的目标MAC地址封装数据链路层帧,完成通信。
ARP请求仅在局域网(同一子网)内有效,跨子网通信需要通过网关处理。
ARP 是将 IP 地址转换成 物理地址
RARP 是将物理地址 转换成 IP地址
ARP 欺骗
攻击者向目标主机发送伪造的ARP响应,声称自己的MAC地址对应目标主机的IP地址或网关的IP地址。
目标主机更新其ARP缓存表,将攻击者的MAC地址与目标IP地址对应起来。
结果是,目标主机将数据包发送到攻击者的MAC地址,而不是实际的目标设备。
数据截获 和 数据篡改 达到监听中间人的效果
DNS
基于UDP的 一整套从域名映射到IP的系统
一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系
现在在域名解析的过程中仍然会优先查找hosts文件的内容.
如果新计算机接入网络, 将这个信息注册到数据库中;
用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
域名解析过程
域名解析过程
客户端查询顺序:浏览器缓存 → 系统
hosts
文件 → 本地DNS解析器缓存 → 本地域名服务器。递归查询:客户端到本地域名服务器是递归查询,即由本地域名服务器负责完成整个查询流程。
迭代查询:本地域名服务器和其他DNS服务器之间的查询是迭代查询,每次获取下一级服务器的地址并继续查询。
返回结果:本地DNS服务器将查询结果返回给操作系统,操作系统传递给浏览器。**
结果缓存:浏览器和操作系统会缓存该结果,以加快后续访问速度。
如果某一步缓存命中,后续查询流程会终止,直接返回结果。
DNS为什么用UDP?
DNS 会使用TCP 和 udp
UDP传输不需要经过TCP的三次握手过程,从而大大提高了响应速度
客户端向DNS服务器查询域名时,一般返回的内容不会超过UDP报文的最大长度,512字节
DNS使用TCP的情况:
区域传送:当进行区域传送(主域名服务器向辅助域名服务器传送变化的数据)时,会使用TCP,因为数据同步传送的数据量较大,TCP允许的报文长度更长。
保证数据正确性:TCP是基于可靠连接的协议,能够保证数据的正确性。
递归查询和迭代查询区别?
递归查询:
如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户端的身份,向其他根域名服务器继续发出查询请求报文,即替主机继续查询,而不是让主机自己进行下一步查询。
迭代查询:
当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP 地址,要么告诉本地服务器下一步应该找哪个域名服务器进行查询,然后让本地服务器进行后续的查询。
浏览器中输入url后, 发生的事情
当你在浏览器地址栏输入一个URL后回车,将会发生的事情?-CSDN博客
ICMP协议
ICMP协议是一个 网络层协议 一个新搭建好的网络, 往往需要先进行一个简单的测试, 来验证网络是否畅通;
但是IP协议并不提供可靠传输. 如果丢 包了, IP协议并不能通知传输层是否丢包以及丢包的原因
ICMP主要功能包括:
确认IP包是否成功到达目标地址.
通知在发送过程中IP包被丢弃的原因.
ICMP也是基于IP协议工作的. 但是它并不是传输层的功能, 为网络层协议;
ICMP只能搭配IPv4使用. 如果是IPv6的情况下, 需要是用ICMPv6
ping命令基于ICMP, 是在网络层. 而端口号, 是传输层的内容. 在ICMP中根本就不关注端口号这样的信息
NAT
解决 IPv4 数量不足 的两种方式 IPV6 | NAT
NAT 功能
NAT能够将私有IP对外通信时转为全局IP. 也就是就是一种将私有IP和全局IP相互转化的技术方法
全局IP要求唯一, 但是私有IP不需要; 在不同的局域网中出现相同的私有IP是完全不影响的
NAT 的 转换过程
NAT路由器将源地址从10.0.0.10替换成全局的IP
NAT路由器收到外部的数据时, 又会把目标IP 替换回 原来的内网IP
在NAT路由器内部, 有一张自动生成的, 用于地址转换的表
当 内网IP 第一次向 外网 发送数据时就会生成表中的映射关系
NAPT
如果局域网内, 有多个主机都访问同一个外网服务器, 那么对于服务器返回的数据中, 目的IP都是相同 的. 那么NAT路由器如何判定将这个数据包转发给哪个局域网的主机?
这时候NAPT来解决这个问题了. 使用IP+port来建立这个关联关系 端口 映射
这种关联关系也是由NAT路由器自动维护的. 例如在TCP的情况下, 建立连接时, 就会生成这个表项; 在断开连接后, 就 会删除这个表项
由于NAT依赖这个转换表, 所以有诸多限制: {中国 移动大内网 | 电信分配 公网IP | 联通也会分配公网IP }
无法从NAT外部向内部服务器建立连接;
转换表的生成和销毁都需要额外开销;
通信过程中一旦NAT设备异常, 即使存在内部连接 所有的TCP连接也都会断开
NAT和代理服务器
[仅用于技术学习] [仅用于技术学习] [仅用于技术学习]
代理:
ow:广域网中的代理.
负载均衡: 局域网中的代理
NAP 和代理 的区别
NAT偏向于底层网络功能,解决IP资源不足、提供网络地址转换
代理服务器偏向应用层功能,提供特定需求的网络服务,主要用于请求转发、缓存和访问控制,充当客户端和目标服务器之间的中介。
正向代理 和反向代理
正向代理
客户端与目标服务器之间的中介
客户端必须配置代理服务器的地址
代理服务器为客户端提供服务
反向代理
客户端无需感知反向代理的存在,也无需配置代理地址
代理服务器为目标服务器提供服务
通常用于优化和保护目标服务器。
数据在公网的收发流程