目录
[a. 确保将所有的分片全部聚到一起(相同的标识)](#a. 确保将所有的分片全部聚到一起(相同的标识))
[b. 片偏移排序(完成组转)](#b. 片偏移排序(完成组转))
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 模块就会丢弃报文 . 第三位表示 " 更多分片 ", 如果分片了的话 , 最后一个分片置为1, 其他是 0. 类似于一个结束标记 .
13位分片偏移(framegament offset) : 是分片相对于原始 IP 报文开始处的偏移 . 其实就是在表示当前分片在原报文中处在哪个位置. 实际偏移的字节数是这个值 * 8 得到的 . 因此 , 除了最后一个报文之外 , 其他报文的长度必须是8 的整数倍 ( 否则报文就不连续了 ).
8位生存时间(Time To Live, TTL): 数据报到达目的地的最大报文跳数 . 一般是 64. 每次经过一个路由 , TTL -= 1, 一直减到 0 还没到达 , 那么就丢弃了 . 这个字段主要是用来防止出现路由循环
8位协议: 表示上层协议的类型
16位头部校验和: 使用 CRC 进行校验 , 来鉴别头部是否损坏 .
32位源地址和32位目标地址: 表示发送端和接收端 .
选项字段 ( 不定长 , 最多 40 字节 ): 略
IP协议的本质工作:提供一种能力,将数据跨网络从A主机发送到B主机!
用户需要的是:提供一种能力,将数据可靠的跨网络从A主机送到B主机
IP=目标网络+目标主机
1.报头和有效载荷如何分离?固定长度+自描述字段(首部+总),报头20个字节
2.如何将有效载荷交付给上层?报头中的8位协议
网段划分
- 分类划分法:A、B、C、D、E
- 子网掩码
IP地址分为两部分,网络号和主机号
- 网络号:保证相互连接的两个网段具有不同的标识。
- 主机号:同一网段内,主机之间具有相同的网络号,但是必须要有不同的主机号
- 不同的子网其实就是把网络号相同的主机放到一起。
- 如果在子网中新增一台之际,则这台主机的网络号和这个子网的网络号一致,但是主机号必须不能和子网中的其他主机重复。
- 路由器的本质也是一个子网的主机,也要配置IP地址。
- 为了实现跨网段传输,路由器一定至少要连接两个子网 ,也就相当于同时在两个子网,因此路由器可以配置多个IP。
- 路由器一般是一个子网中的第一台设备,一般他的IP地址都是:网络号.1。
- 路由器的功能,ip报文的转发,不仅仅如此,还构建了子网(局域网)。
手动管理子网内的IP,是一个相当麻烦的事情。
- 有一种技术叫做DHCP,能够自动的给子网内新增主机节点分配IP地址,避免了手动管理IP的不便。
- 一般的路由器都带有DHCP功能,因此路由器也可以看作一个DHCP服务器。
过去曾经提出一种划分网络号和主机号的方案,把所有的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
随着Internet的迅速发展,这种划分方案的局限性很快就显现出来了,大多数组织都申请B类网络地址,因为B类网络号和主机号都比较多,好申请,导致B类地址很快就分配完了,而A类却浪费了大量地址。
例如 , 申请了一个 B 类地址 , 理论上一个子网内能允许 6 万 5 千多个主机 . A 类地址的子网内的主机数更多 . 然而实际网络架设中, 不会存在一个子网内有这么多的情况 . 因此大量的 IP 地址都被浪费掉了 .
针对这种情况 提出了心得划分方案,成为CIDR
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
- 子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;
- 将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
- 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
例如
理论上上述划分一个子网可容纳256台主机,但是 .0 和 .255两个IP地址分别被用来当网络号, 广播地址,因此实际可容纳的254台主机。
那么一个IP地址对应的网络号要怎么计算出来呢?
IP地址:140.252.20.68 == 140.252.20. 0100 0100
子网掩码:255.255.255.240 == 255.255.255.1111 0000
两者进行&运算即可
特殊的IP地址
- 将IP地址中的主机地址全部设为0, 就成为了网络号, 代表这个局域网;
- 将IP地址中的主机地址全部设为1, 就成为了广播地址, 用于给同一个链路中相互连接的所有主机发送数据包;
- 127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0
IP地址的数量限制
CIDR(Classless Interdomain Routing):
- 引入一个额外的子网掩码(subnet mask)来区分网络号和主机号;
- 子网掩码也是一个32位的正整数. 通常用一串 "0" 来结尾;
- 将IP地址和子网掩码进行 "按位与" 操作, 得到的结果就是网络号;
- 网络号和主机号的划分与这个IP地址是A类、B类还是C类无关
CIDR 在一定程度上缓解了 IP 地址不够用的问题 ( 提高了利用率 , 减少了浪费 , 但是 IP 地址的绝对上限并没有增加 ), 仍然 不是很够用. 这时候有三种方式来解决: - 动态分配IP地址: 只给接入网络的设备分配IP地址. 因此同一个MAC地址的设备, 每次接入互联网中, 得到 的IP地址不一定是相同的;
- NAT技术(后面会重点介绍):私有地址不断被替换的过程;
- IPv6: IPv6并不是IPv4的简单升级版. 这是互不相干的两个协议, 彼此并不兼容; IPv6用16字节128位来表示一个IP地址; 但是目前IPv6还没有普及;
私有IP地址和公网IP地址
如果一个组织内部组建局域网 ,IP 地址只用于局域网内的通信 , 而不直接连到 Internet 上 , 理论上 使用任意的 IP 地址都
可以 , 但是 RFC 1918 规定了用于组建局域网的私有 IP 地址
- 10.*,前8位是网络号,共16,777,216个地址
- 172.16.到172.31.,前12位是网络号,共1,048,576个地址
- 192.168.*,前16位是网络号,共65,536个地址
包含在这个范围中的, 都成为私有IP, 其余的则称为全局IP(或公网IP)
从内网到公网的过程中,不断用路由器的WAN口IP替换src ip地址 ,这个技术就做NAT技术。
那么为什么要使用NAT技术呢?IP地址不足,不同子网可以用相同的内网IP.
路由
目标网络 下一跳的路由器 子网掩码 U正在使用G表示路由器
查路由表的方法
拿着目标主机的IP & Genmask == Destination 进行比对
IP数据包的传输过程也和问路一样.
- 当IP数据包, 到达路由器时, 路由器会先查看目的IP;
- 路由器决定这个数据包是能直接发送给目标主机, 还是需要发送给下一个路由器;
- 依次反复, 一直到达目标IP地址
实际上,在一台主机中,报文并没有通过网络层直接发出去,而是交给了自己的下一层协议(数据链路层),而数据链路层,不能一次发送过大的报文!要求上层不能给其交付过大的报文,上限要求即下图所示mtu的值
IP报文分片
1.粗粒度谈谈分片
前置问题:怎么知道一个IP报文是被分片了呢?片偏移!=0 || 更多分片==1
a. 确保将所有的分片全部聚到一起(相同的标识)
组装过程如何识别是否有丢失分片
- 丢第一个:如果不存在偏移量为0的,便是丢失了第一个
- 丢中间:如果偏移量+分片长度不等于下一个分片的偏移量,便是丢失了中间分片
- 丢最后:如果不存在3位标志,第三位为0的话,就代表最后一个分片丢失了
b. 片偏移排序(完成组转)
但是实际上,并不建议分片,会增加丢包概率,组装失败,报文需要进行重发
2.分片细节
假设一个3000字节的IP报文,进行分片,需分成3个,大小分别为1500,1500,40
因为每个分片,都需要添加报头(20字节),后续才能根据标识进行组装.
数据链路层
直接相连的主机之间,进行数据交付的问题
MAC地址
在同一个局域网中,区分特定的主机
mac帧
- mac帧如何做到解包和封装?
定长报文
2.如何做到分用
mac帧只在局域网中有效,转发是由IP报头进行决策。
mtu是mac帧有效载荷的大小
传输层--MSS
数据链路层--MTU
局域网的通信原理
可能会发生数据碰撞 ---》碰撞避免算法
局域网中,主机越多,发生数据碰撞的概率就越高;因此,我们可以划分碰撞域,减少局域网碰撞,这便是交换机的作用。