- IP: 提供一种能力,将数据从A主机送到B主机的能力,但不一定会成功
-
主机 : 配有 IP 地址 , 但是不进行路由控制的设备 ;
-
路由器: 即配有 IP 地址 , 又能进行路由控制 ;
-
节点 : 主机和路由器的统称;
协议头格式
如何封装和解包: 定长报头 + 自描述字段
如何交付(分用) : 8位协议(udp或tcp)
第一层
- 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4.
-
4位头部长度(header length):
- 4为首部长度虽然是4个bit位,但是单位是字节
- 0000->1111 => 0 -> 15,即范围是0 -> 60字节
- 报头的范围: [20,60]
- x * 4 = 20 推出 x = 5->0101
- x * 4 = 60 推出 x = 15->1111
- 8位服务类型(Type Of Service):
- 3位优先权字段(已经弃用),
- 4位TOS字段(a.最小延时, b.最大吞吐量, c.最高可靠性, d.最小成本)
- 1位保留字段(必须置为0)
- 16位总长度(total length): IP数据报整体占多少个字节
第三层
- 8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数. 一般是64. 每次经过一个路由, TTL-= 1, 一直减到0还没到达, 那么就丢弃了. 这个字段主要是用来防止出现路由循环
- 8位协议: 表示上层协议的类型 (udp或者tcp)
-
16位头部校验和: 使用CRC进行校验, 来鉴别头部是否损坏.
-
32位源地址和32位目标地址: 表示发送端和接收端.
第二层
分片问题
- 网络层的下层链路层由于物理特征的原因,一般无法发生太大的数据
- 这时发送端的网络层就会把数据进行分片然后发送,而接收端的网络层就会进行组装
将一个比较大的ip报文,拆分成为多个小的满足条件的报文,
分片的行为是网络做的,同样组装的行为也必须由对方的网络层来做
- 网络向上交付也必须是一个完整的报文,
- IP分片和组装的行为,TCP是不知道的,不关心的
如何实现分片
- 16位标识: IP报文序号
- 3位标志:
-
第一位 保留 (保留的意思是现在不用, 但是还没想好说不定以后要用到).
-
第二位置为 1表示禁止分片 , 这时候如果报文长度超过MTU, IP模块就会丢弃报文.
-
第三位表示 "更多分片" , 如果分片了的话,最后一个分片置为1, 其他是0(结束标记)
-
- 13位片偏移: 是分片相对于原始IP报文开始处的偏移(确认位置)
区分分片并确认收全->提供组装方案
- 分片行为不是主流
- 在网络层分片和组装中,丢包是有概率的,分片会增加丢包的概率
- 识别报文与报文的不同
- 不同报文的16位标识不同,这就能区分报文和报文之间的不同,
- 识别报文是否被分片
- 如果更多分片标志位是1,就表明它被分片了
- 如果我就是最后一个分片,但这个更多分片标志位就是0,无法区分是否被分片了
但是最后一个分片的13位片偏移,一定不为0,能区分是否被分片了
if(报文->更多分片 & 0x1) return 分片的
else if(报文->片偏移 > 0) return 分片的
else return 独立的报文
- 识别那些分片是开始,中间,结尾
- 开始: 更多分片1,片偏移0
- 中间: 更多分片1,片偏移不是0
- 结尾: 更多分片0,片偏移不是0
- 识别任何一个分片丢失
- 通过16位标识,确定这个报文的所有分片,并将其放在一起
- 然后按照片偏移进行升序排列
偏移量 + 自身大小 = 下一个报文的偏移量 - 扫描整个报文如果不匹配,中间就一定会有丢失的,
如果成功计算到结尾,就一定收取完整了(组装时也是这样做的)
- 分片之前,一定是一个独立的ip报文
- 分片之后,每一个分片都要有ip报文,
- 为了支持未来的组装,每一个分片都必须有ip报文
网段划分(重要)
ip = 网络号+主机号
- 网络号: 保证相互连接的两个网段具有不同的标识;
- 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
通过
合理设置
主机号和网络号
,
就可以保证在相互连接的网络中
,
每台主机的
IP
地址都不相同
.
那么问题来了
,
手动管理子网内的
IP,
是一个相当麻烦的事情
.
- 有一种技术叫做DHCP, 能够自动的给子网内新增主机节点分配IP地址, 避免了手动管理IP的不便.
- 一般的路由器都带有DHCP功能. 因此路由器也可以看做一个DHCP服务器.
过去曾经提出一种划分网络号和主机号的方案, 把所有IP 地址分为五类, 如下图所示(该图出 自[TCPIP])。
- 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
的飞速发展
,
这种划分方案的局限性很快显现出来
,
大多数组织都申请 B 类网络地址 , 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址
大多数组织都申请 B 类网络地址 , 导致 B 类地址很快就分配完了, 而 A 类却浪费了大量地址
- 例如, 申请了一个B类地址, 理论上一个子网内能允许6万5千多个主机. A类地址的子网内的主机数更多.
- 然而实际网络架设中, 不会存在一个子网内有这么多的情况. 因此大量的IP地址都被浪费掉了.
针对这种情况提出了新的划分方案, 称为CIDR(Classless Interdomain Routing):
-
引入一个额外的 子网掩码 (subnet mask)来区分网络号和主机号;
-
子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;
-
将IP地址和子网掩码进行 " 按位与 " 操作, 得到的结果就是网络号;
-
网络号和主机号的划分与这个IP地址是A类、B类还是C类无关;
- 可以给不同的路由器配置不同位数的子网掩码,就能看到不同的网络号
- 目的IP & 当前路由器的子网掩码 = 该报文要去的目的网络
- 又因为不同的路由器一定至少要级联2个网络,每一个网络的网络号可能是不同的
每一个路由器都要给自己直接链接的网络配置对应的子网掩码
特殊的IP地址
-
将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
-
将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
-
127.*的IP地址用于 本机环回(loop back)测试 ,通常是127.0.0.1
IP地址的数量限制
- 我们知道, IP地址(IPv4)是一个4字节32位的正整数. 那么一共只有 2的32次方个IP地址, 大概是43亿左右.
- 而TCP/IP 协议规定, 每个主机都需要有一个IP地址. 且还有一些特殊的IP地址的存在, 数量远不足43亿;
- 另外IP地址并非是按照主机台数来配置的, 而是每一个网卡 都需要配置一个或多个IP地址.
- CIDR在一定程度上缓解了IP地址不够用的问题(提高了利用率, 减少了浪费, 但是IP地址的绝对上限并没有增加), 仍然不是很够用.
这时候有三种方式来解决
-
动态分配IP地址 : 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到的IP地址不一定是相同的;
-
NAT技术 (后面会重点介绍);
-
IPv6 : IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表 示一个IP地址; 但是目前IPv6还没有普及;
私有IP地址和公网IP地址
- 路由器天然的会构建区域网(子网),内网IP,
- 家用路由器:
- 对内: 面对自己构建的子网
- 对外:自己本身也是别人构建子网的一个主机
- 所有路由器一定要有两套地址:
- 对内: Lan口IP,局域网ip(私有ip)
- 对外:WAN口IP,自己所在上级子网给自己分配的ip(公有ip)
- 私有网络对应的IP是局部的,可以在不同的子网中重复出现->IP不足问题就大大缓解了
缓解IP不足->NAT技术
路由器要做的一个事情:
- 将报文中的源IP替换成为路由器的WAN口IP
- 每经过一个运行商的内网路由器,都要做这个工作(公网路由器不做)
- 目的IP地址是不变的,源IP地址在不同的内网,通过不同层级的网络节点中转发(替换),
这种技术就叫做: NAT技术
路由
- IP报文,被千里送到主机C的入口路由器,接下来需要进行交付给目标主机: 封装MAC报头,所以就必须知道主机C的MAC地址
- IP提供的是转发的策略,想要解决设备转发的具体功能,需要交给数据链路层解决
数据链路层
1.以太网帧格式->数据帧格式
-
源地址和目的地址是指 网卡 的 硬件地址 (也叫 MAC地址 ), 长度是48位,是在网卡出厂时固化的;
-
帧协议类型字段有三种值,分别对应IP、ARP、RARP;
-
帧末尾是 CRC校验码 ->标识主机 唯一性 的方案
认识
MAC
地址
-
MAC地址用来识别数据链路层中相连的节点;
-
长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)在网卡出厂时就确定了, 不能修改.
-
mac地址通常是 唯一 的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址)
对比理解MAC地址和IP地址
-
IP地址描述的是 路途总体 的 起点 和 终点;
-
MAC地址描述的是路途上的 每一个区间 的起点和终点;
2.重谈局域网通信原理
- 局域网中的主机是越少越好,且发送数据帧的时候,数据帧越短越好
这样就能有效的减少数据之间的碰撞 - 碰撞避免算法->发送的主机会休息随机时间,然后,在重新发送
- 局域网攻击原理.....
认识MTU
MTU相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.
-
以太网帧中的数据长度规定最小46字节,最大1500字节,
ARP数据包的长度不够46字节,要在后面补填充位; -
最大值1500称以太网的最大传输单元(MTU), 不同的网络类型 有 不同的MTU ;
-
如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation);
-
不同的数据链路层 标准的 MTU是不同的 ;
3.汇总到整体的通信流程汇总,发现问题--添补细节
- 在网络转发的`过程中,目的IP不变的,mac帧报头要变
MSS和MTU的关系
-
TCP的单个数据报的 最大消息长度 , 称为MSS(Max Segment Size);
- MTU的最大字节为1500 = IP
- IP有效载荷 = 1500 - IP报头(20) = TCP + 数据 = 1480
- 数据 = 1480 - TCP报头的长度(20) = 1460,即MSS不能大于1460
查看硬件地址和MTU
ARP协议(地址解析协议)
- 如果只知道目标主机的IP地址,而不知道对方的MAC地址,就无法封装MAC帧
- 在一个网段中,通过目标IP,得知对方MAC地址的方式叫做->ARP协议(地址解析协议)
ARP数据报的格式
- 硬件类型指链路层网络类型,1为以太网;
- 协议类型指要转换的地址类型,0x0800为IP地址;
- 硬件地址长度对于以太网地址为6字节;
- 协议地址长度对于和IP地址为4字节;
- op字段为1表示ARP请求,op字段为2表示ARP应答
模拟一次ARP过程
前提是知道对方的IP地址
- HA会给在这局域网中所有的主机都发送ARP请求(全广播)
- 每一主机拿到这个请求,都会先看自己的IP地址是否匹配目的IP地址,都会处理,并向上交付
- 不匹配就直接丢弃,匹配就发送ARP应答给对应主机
- HD这台主机会给HA主机发送ARP应答,在APR应答中就包括了HD自己的MAC地址
- 当然在这个局域网中其他的主机都会收到这个应答,但是不会处理,会直接丢弃
问题一: 如何理解上诉过程发生的两次丢弃
- 一次是在arp层丢弃的,一次是在底层mac层丢弃的
问题二: ,是不是每一次发送数据都要发送一个arp请求和一个arp应答
- 不是,arp请求成功之后,请求方会暂时将IP : MAC地址的映射暂时保存下来
问题三: 除了在目标最终的子网中进行arp,其他地方会不会也发生arp呢
- 会,arp过程会在网络中可能的所有路径中出现
小结
-
任何主机可能之前向目标主机发起过ARP请求,同时,未来一定会受到对应的ARP应答
-
任何一台主机,也有可能被别人发起ARP请求
-
在局域网中:任何一台主机受到ARP的时候,可能是一个应答,也可能是一个请求
arp伪装
DNS(Domain Name System)
- TCP/IP中使用IP地址和端口号来确定网络上的一台主机的一个程序. 但是IP地址不方便记忆.
- 于是人们发明了一种叫主机名的东西, 是一个字符串, 并且使用hosts文件来描述主机名和IP地址的关系.
最初, 通过互连网信息中心(SRI-NIC)来管理这个hosts文件的
-
如果一个新计算机要接入网络, 或者某个计算机IP变更, 都需要到信息中心申请变更hosts文件.
-
其他计算机也需要定期下载更新新版本的hosts文件才能正确上网.
这样就太麻烦了, 于是产生了DNS系统
- 一个组织的系统管理机构, 维护系统内的每个主机的IP和主机名的对应关系.
-
如果新计算机接入网络, 将这个信息注册到数据库中;
-
用户输入域名的时候, 会自动查询DNS服务器, 由DNS服务器检索数据库, 得到对应的IP地址.
遗留问题: 浏览器中输入url后,发生的事情
NAT的转换表
- 其实在进行源地址替换的过程中,可能不一定只替换原IP,必要的时候,源端口也要被替换
- 路由器在NAT转换的过程中,除了单纯的替换,还会为我们根据报文请求的四源组
为我们构建一个映射关系 - 源IP表示唯一的一台主机,源端口表示该主机上唯一的一个进程
源IP+源端口表示唯一的一个进程 -- 自己在自己的内网中的唯一性 - 无论从内向外,还是从外向内,都能在各自的网络中表示唯一性,
所以这个映射关系是:互为KEY值的!! - 如果我们从来没有访问过外网,外网能够直接访问内网吗? 理论上不能
但是有很多基于NAT原理的软件,能够帮助我们进行从外网访问内网 -- 内网穿透
正向代理服务器
- 正向代理是双向的,即请求和应答都会通过这个代理服务器
反向代理服务器
- 反向代理是单向的,且一般用于公司大型机房中,主要为了提高服务器的利用率,
- 将大量的请求通过代理服务器平均分配给所有主机,以提高效率
访问外网 - fq
- 在国内有的服务器是可以直接访问外网的,这种代理叫做正向代理
- 把要访问的IP(真实IP)用另一个IP(代理服务器IP)嵌套一层,并加密处理
- 从国内发送给运营商,运营商拿到这个报文,一看IP是国内的IP(代理服务器IP)就通过了
(运营商没有密钥无法解密,就无法看到我们真实想访问的IP) - 代理服务器拿到这个报文,进行解密然后根据IP发送给国外的服务器