目录
- 一、IP协议基本概念
- 二、IP协议头格式
- 1、报头和有效载荷如何分离
- 2、有效载荷是如何向上交付(分用)的
- 3、具体IP报头
- 三、网段划分
- 1、什么是网段划分
- 2、如何进行子网划分?
- 再次理解子网划分及如何划分
- 3、私有IP地址和公网IP地址
- 4、路由
- 四、分片
一、IP协议基本概念
TCP所谓的“发送”,是什么意思,TCP是真的发送了吗?向下交付,IP层
一般能认识和识别TCP报文的是发送方主机和接收方主机,不考虑特殊设备,一个报文在网络中,通信的被中间设备能认识识别的最多到IP层,所以TCP层只有在发送方的TCP层和接收方的TCP层双方是能认识的,而报文真正被推送到网络能被网络识别的要么就是mac和ip的有效载荷。
IP、IP地址,IP能干什么?
我们举个例子:我感觉张三每次考试都有考100分的能力,这个能力是100%能做到吗?
每次都是考99分,你认为他能考100分,这里的能力是有较大的概率,比如想让张三每次考试都是100%满分,所以张三去考试第一次考了100,第二次考了99分,
所以这次张三拿回家,他爸爸问为什么没有考100分,所以他爸爸就去学校组织,这次重新考,要么单独考,让张三还没考到100分,就再考,直到考了100,所以你有较大的概率考100分,我就要保证你100%每次考到100分,如果你概率小,我就不让你重考。
那么张三和他爸爸组合起来,张三有较大概率考100分,就保证他每次都能考100分,所以真正参与考试的是张三,是办事的,而他校长爸爸天天在办公室,干了什么呢?他爸爸叫考试控制,为张三考试提供策略。
IP协议,提供一种能力,将数据从A主机跨网络送到B主机的能力
有能力你一定能做到吗?网络设备里,有没有可能出现故障,有没有可能一个报文长时间积压,导致丢失的?都有可能IP的数据包没有被对方收到,但是,到了网络环境里,ip报文是真正办事的,允许丢包,不能丢的太多,太多就到TCP的拥塞控制了,毕竟是把将数据从A主机跨网络送到B主机,所以网络当中会有一些意外情况,有这个能力,并不代表这个IP能把报文100%送到
所以IP提供的是有很大的概率,但是我们要的不是概率,是100%做到,因为用户要的是100%,你怎么保证ip报文 100%被对方收到,多方要么收到,要么没收到,所以要保证这个100% ,所以张三是IP,他校长爸爸是TCP,所以TCP是提供传输策略,所以TCP/IP是将数据从A主机可靠的跨网络送到B主机
IP地址的认识
去哪里玩,比如北京,天安门广场,我们都是先去那一座城市
1、先到景点所在的城市
2、然后到达景点
所以IP地址 = 目标网络 + 目标主机
二、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字节
1、报头和有效载荷如何分离
里面的有效载荷是TCP数据段,滑动窗口交给他的,4位首部长度的基本单位是4字节,也就是报文对应的宽度
如何分离?
先识别前20个字节,然后提取报头的4位首部长度乘以4,如果首部长度标准标准是20,4位首部长度里就是0101,是5,再乘以单位4,就是20个字节,如果报头里携带选项,直接拿4位首部长度乘以4,再减去20个字节,剩下的字段就是选项的长度
2、有效载荷是如何向上交付(分用)的
8为协议代表的是自己有效载荷里承担的数据,也就是自己的有效载荷承担的是什么报文,也就是表示了向上层的那个协议去交付
3、具体IP报头
IP给TCP提供服务,提供数据传输的服务,你要怎么传,所以有了8位服务类型,针对不同种类的IP传输策略,其中有3位是弃用的
IP不是面向数据流的,是IP数据包,ip要把收到的IP报文向上一个一个的交付,也要区分报头和有效载荷,但是有效载荷是多少,所以有了16位的总长度,用16位的总长度减去4位首部长度就是有效载荷的长度
8位生存时间:该报文,转发过程中,最多经历的路由器的次数,没经历一次减减
首部校验和:校验首部的大小
为什么把点分10进制风格的ip地址转换成4字节IP地址?因为协议需要,IP报文需要你的源IP和目的IP。
为什么是4字节?报头中,OS内部是用4字节32位的源IP和32位目的IP,因为OS是用4字节,所以你传参也要4字节
三、网段划分
1、什么是网段划分
IP地址分为两个部分, 网络号和主机号
- 网络号: 保证相互连接的两个网段具有不同的标识;
- 主机号: 同一网段内, 主机之间具有相同的网络号, 但是必须有不同的主机号;
- 不同的子网其实就是把网络号相同的主机放到一起.
- 如果在子网中新增一台主机, 则这台主机的网络号和这个子网的网络号一致, 但是主机号必须不能和子网中的其他主机重复
我们举个例子:学校的学号是有规律的 – 是学校管理者顶层设计出来的
学号是定位学生的唯一性
学校有各种各样的学院
学院有学生会主席,每个学院是有各自群的
比如有一个学生张三,在学校走,捡到一个钱包,钱包里有一串学号,你只知道钱包里有学号,并不知道这个人是谁,现在你准备把钱包给失主,有效信息就学号,所以,你就守在学校门口,逮住一个人就问,对照学号,但是人很多,一个一个问,我也许就毕业了,失主也许也毕业了,这样找,效率太低了,所以逮住一个人就问,就是遍历我们学校的所以人,O(n),就是查找,排除,一次排除一个人,也许还会碰到同一个人,钱包就相当于报文,学号相当于目的IP地址,我要把数据交给目标主机,一个一个问,效率太低了,
所以张三不能这样做,每个学院都有一个群,有计算机学院,理学院,化工,机械,经管等等,其中张三是计算机学院的,在群里,每个学院都有一个对应的院学生会主席,院学生会主席也会加一个群,群主就是院学生会主席,各个院学生会主席也会建一个群,叫学生会主席群。
学号是有规律的,给每个学院编制,计算机学院是10开头,理学院是11开头,化工是12开头,机械是13开头,经管是14开头等等,
张三的学号是299,所以张三对应学号是10299,假如钱包里的学号是14003,
所以张三,一定不知道你是谁,但是能辨别是不是我们学院的,张三把信息扔到院学生会主席群的,院学生会主席不知道每个学院的学生,但是假设认识院群里的学生,也一定知道学院之间的开头,院学生会主席,就把信息转到学生会主席群,@一下经管学院的院学生会主席,问是不是你们学院的,让他和张三联系一下
假设院学生会主席认识群里的每个学生,在群里@一下这个学生,问是不是你的钱包,联系一下张三,然后他两就私下联系了一下。
所以归还钱包的效率明显提高,为什么?
这次查找不是以个人为单位查找的,是以群为单位的,查找的本质是排除的过程,选择一个群,就是排除了其他所以的群,查找效率大大提高了,所以一个一个对应的院学生会群叫子网,对应的院学生会主席叫路由器,学生会主席群就是转发集群,也就是公网,张三这些学生都叫主机
所以在进行钱包归还的过程,经历了两个阶段
1、先找到目标群(子网)
2、在找到目标人(目标主机)
所以现实生活中为什么要拉群?提高查找效率
所以每个主机的学号都不是乱构成的,所以学号 = IP地址,
为了主机之间跨网络进行高效的把数据从A送到B主机,必须要进行子网划分,所以IP地址的构造,不是一件事情的原因,他是子网划分的结果,为了提高全球中任何一台主机查找另一台主机的效率
国类的网络一定是被国内的运营商顶层设计的,国际的是国内运营商大家商量着来,我们的IP地址都是被管理的,所以不是我们设计的
每一个学院都有自己的院号,院号之间不一样,与网络号一个道理,两个网段具有不同的标识,可以有相同的网络号,不能有相同的主机号
比如,计算机学院,每个学生学号不一样,但是院号是一样的,
院里有各个专业,专业也有群,也可以带上一个路由器,路由器也是可以连接两个子网的,但是路由器必须配两个不同IP,但是至少两张网卡,网卡是不确定的,
路由器的主机标识一般都是一个子网的1号,
我们主机的IP地址是ipv4地址,而默认网关就是路由器的ip地址,
比如我的ip地址是192.168.2.102,路由器的ip地址是192.168.2.1,主机号是不一样的,一个是102,一个是01,
因为构建子网都是路由器帮你构建的,所以是1号。
比如,你开热点,给两个人分享,你们三个人就构建一个子网,你的手机就相当于一个路由器
所以一般合理的设计主机号和网络号,就可以保证在相互连接的网络中,每台主机的IP地址是不相同的?
如何设计?有一种技术叫DHCP,路由器内自带的功能,因为子网划分是路由器给我们划分的
路由器可以构建子网,可以给我们分配动态ip的能力
路由器也能工作在应用层,进入路由器界面,就是一个表单,说明用的就是http协议,就是在应用层
2、如何进行子网划分?
- 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
A类有2的7次方的网络,每个子网中可以有2的24次方个主机
B类第二个为0,说明是B类,有2的14次方的网络,每个B类网络中可以有2的16次方个主机
C类第三个为0,说明是C类,有2的21次方的网络,每个B类网络中可以有2的8次方个主机
申请A类网络比较少,所以申请A类比较少,或者很快被人拿完了,
申请的时候,都会申请B类,网络比较多,主机号也比较多,可以容纳很多主机,但是一个机构B类网络申请完了,任何一个机构很难把2的16次方的主机用完,
一个子网哪有2的16次方的主机这么多,所以一定是B类申请完了,但是用不完,你的网络号也约束了别人,别人也用不了,就浪费了IP地址,
所以针对父类划分方案,有了新的划分方案,CIDR法,不考虑分类了,所以有了子网掩码来区分网络号和主机号
把IP地址和子网掩码,按位与,就是网络号,
比如默认网关(路由器)ip地址192.168.2.1,子网掩码255.255.255.0,我机器上的ipv4地址是192.168.2.102
我自己对应的目标网络号是:我机器上的ipv4地址与子网掩码,按位与,就变成了192.168.2.0,这就是我的网络号,路由器的网络号也是192.168.2.0,所以他们是同一个子网
我们就可以调整子网掩码中的1的个数来调整网络编号,想子网本身变小点,网络号变大点,主机数变少点,就把二进制序列中的1增多有点,想子网本身变大点,也就是主机数多点,网络号就变小点,就减少1
再次理解子网划分及如何划分
全球视角,理解如何进行子网划分?如何划分?
所谓的子网划分谁做的?是运营商,也就是移动、电信、联通
公网IP地址,只有2的32次方个,是有限的,所以IP地址的划分是有限的,
子网在划分的时候,并不是按国家划分的,是按人口或发达与否划分的,或者按组织专人专项划分的,比如学校的网等待
但是,我们今天就按照国家为单位划分,以便理解
比如有美国、中国、印度、俄罗斯、新加坡五个国家
ip地址一共是32比特位,我们就按8个比特位划分,
美国的IP地址的网络号就是0000 0001…/8,中国IP地址的网络号就是0000 0010…/8、印度0000 0100…/8、俄罗斯0000 0011…/8、0000 0101…/8,前8个比特位作为他的网络号
假设每个国家都有国际路由器,内部都会直连每个国家的网络号,每个国家都有运营商,为了全球通网,这些运营商就商量把这些国际路由器接到同一个网络里,这就是公网
接下来,对于我们中国来讲,有34个省,比如有陕西,河南、贵州等等,再你拿出6个比特位来充当我们的子网掩码
陕西的网络编号0000 0010 0000 01…/14,子网掩码为14位,河南的网络编号0000 0010 0000 10…/14、贵州0000 0010 0000 11…/14
每个省也有省路由器,把中国的国家路由器和省路由器也构建成一个大的子网,在国内也叫公网,只是上一个公网是全球运营商构建,而这个是国内运营商构建。
河南省下也有个个市,用4个比特位划分,
比如贵阳市0000 0010 0000 01 0001…/18、遵义0000 0010 0000 01 0100…/18
然后,把省路由器和市路由器,也构建成一个大的子网,这也是公网
到了贵阳在向下划分,有个个区,所以这要划分ip地址是不够的,到贵阳这里不用公网划分了,运营商就给我们构建局域网
贵阳的完整网络是0000 0010 0000 0100 0100 0000 0000 0000/18,子网掩码是18位,对应0 2 0 4 4 0 0 0,对应2.4.4.0/18
假设贵阳的一主机IP地址是2.4.4.23,如果美国想访问这个服务,美国划分的ip地址是1.?开头的,并不知道2.4.4.23是谁,但是美国一定知道这个ip地址一定不是我的,所以直接把这个报文扔到了公网上,当然也包含了自己的ip地址1.2.3.4,这就是源ip地址和目的ip地址,这个公网路由器一定认识2开头的是谁,这个公网就把报文转到我们国家的路由器口,然后用0000 0010…/8与2.4.4.23按位与,得到我们所对应的网络号,变成了2.0.0.0,所以我拿着你给我划分的网络子网掩码与你对应的目标网络按位与,是我们国家的,就传进来,然后就把这个报文扔到我们国家的公网了,然后继续向下递交,就到贵阳了,然后就有办法转到我们的主机上
子网掩码的个数越来越大,就代表离我们越来越近了,
但是,并不是这样乱分的,大地区就用A类,小地区就用B类,但是也会有浪费,所以就有了子网掩码,因为子网掩码可以逐比特位来调整子网掩码的位数,几乎可以使IP地址达到最大使用率
为什么要有子网的能力呢?
首先,未来我们网络的形态是什么样子,现在就是什么样子,现在是被运营商精心设计过的,为什么要这么干?
比如:学生会主席群就是公网,院学生会主席群就是内网,没有这些群,就进行线性遍历,效率很低,在还钱包时,必须知道归还给谁,但是学生并知道这个人是谁,只知道他的学号,我虽然不知道这个钱包是谁的,但是我知道这个钱包不是我们院的,就交给院学生会主席群,就由院学生会主席进行交互,院学生会主席必须知道每个院的编号,在公网还要选择目标会长,也就是要淘汰了其他的会长,正是他淘汰了很多人,所以他的效率很高
所以子网划分可以提高搜索效率,在学生会主席群并不会群发这个报文,在学生会主席群中每个院的会长都会把自己院的名字和编号发一遍,这就是路由器的交换,这个消息就是群发的,大家是一个群的,就可以做,以后就不会再发了,
所以在日常生活中访问网站,必须要有搜索引擎或域名
子网划分本质就是在调整整个网络的拓扑结构,子网淘汰效率很高,所以他的查找效率高,又因为子网是改变网络的拓扑结构,所以结构决定算法
每一个路由器可能会集连多个子网,所以每一个路由器针对每个子网,都要在自己内部的路由表中,保存好他所直连的目的网络号和该网络的子网掩码,因为我们要拿收到的网络IP和该子网的子网掩码进行按位与后,再和自己直连的目标网络做对比,是就转发,不是就不转发,每个子网都要有子网号和子网掩码,市面上有多少子网,就配了多少子网掩码。
一般在一个子网内部,子网全1和全0的地址是群内,也就是子网内的广播地址,所以全0和全1的地址是不用的,所以0到255的子网内的主机数是254个
我们举个划分子网的例子:
3、私有IP地址和公网IP地址
IP地址不是按主机的台数来配的,是按网卡来配的,所以对应的路由器才可能有两个以上的IP,和两个以上的子网,所以才能转发,
但是IP还是不够的,那么怎么解决呢?
所以有三种方案:
- 第一、动态IP地址分配,比如家里的路由器,你家里的网络设备都是路由器给你动态分配的,你不用这这个网络设备后,路由器就回收这个IP地址,回收,就是这个IP不在被别人占用,用的时候给你,不用的时候,回收,所以这ip是共享的,但是连接的太多了,这个动态就分配不过来
- 第二、NAT技术,是和动态分配是并行的,正是有了NAT技术,才能动态分配,这个几乎解决了IP地址不够的问题,这也是阻碍了ipv6的发展
- 第三、ipv6技术,这就根本解决了IP不够的问题,只有中国在内网中推广,没有在公网中推广,因为一个技术是需要一套技术的,是需要大量时间的,所以我们国家在08年就开始搞ipv6了,等用的时候,就瞬间能拿来用了。
运营商也有局域网,如果有局域网,IP地址只用于局域网内的通信,而不自己连接到Internet上
所以前面我们按国家所讲的,直到了广域网这个位置,再分下去,主机号就不够了,2的16次方也不是很多,一个城市的要用的IP很多,到一个城市后,运营商就会组一个局域网,用私有IP组建
现在把网线拉到家里,都是拉的光纤,你在接到你的路由器上,才能上网,一般上网时候,从硬件上,都是先把数据交给路由器,在硬件上,把数据再交给猫的
首先家里都是有猫的,猫是纯硬件的,所以数据进来先是交给猫的,猫再调试解调器再交给路由器,再给你,这就是硬件层面上的传输数据
软件上,是工作人员会给我们的路由器进行配置,上网,不仅仅是把网线连过来就上网了,工作人员还要给我们开户,需要账号,工作人员就先给我们开户
所以,路由器配置的时候,一般要配两个密码,路由器里有一套账号是用来运营商来识别你的,能认证你是否欠费,所以运营商给你一个电话号码,又怕你把卡丢了,就免费送你一个手机,所以第一套是为了运营商来认证你账号的,所以工作人员要上门,第二个是为了连接路由器上网的
i.e:营业厅有个历史任务,就是普及网络,以前运营商大力普及网络,没想到销户的问题,所以销户比较困难
网络是一个系统的工程。运营商是如何把我的报文转交到公网上的?
大厂的服务器一定是在某个地区的,省内的交互是没问题的,因为都是在同一个群里的,推广到省上,就能到其他地方了
私有IP在个个区域内是可以重复的
我的私有IP:src:192…200
目的IP:dst:122…3
路由器一般有两个IP,一个是LAN口IP,一个是WAN口IP,一个是对内,一个是对外
私有IP到了公网就回不来了,所以私有IP不能出现在公网上,所以运营商就给了一个方案,到家用路由器时,家用路由器一看你的目的IP是到公网,转交时,就会先做一件事情,把LAN口IP转接成WAN口IP
所以会把src:192…200替换成10.1.1.2,发现是不是私有IP,就继续交互,向上交互,继续替换,把LAN口IP转接成WAN口IP,把10.1.1.2替换成122.77.241.4,就直接到了公网,然后就构建响应,形成响应报文,src就变成了122…3,dst变成122.77.241.4,所以最终就可以通过公网转发就可以返回到内网了,运营商子网的入口处,接下来就通过方法转发到主机
所以源IP在内网环境不断被替换:就是NAT技术
4、路由
我们举个例子:
比如我刚上大学,我去上海上大学的时候,刚下火车,我发现我东西丢,可能也没拿,东西丢了,什么都没有了,但是我不知道怎么走,怎么把自己送到大学呢,那就问人吧,问人的时候,通常都会有如下几个答案,对不起,我不知道、一般问路,都会有人拒绝你,也有人不知道,会一直帮助你,我们不考虑不帮助你的,问路,你一定要告诉别人你去哪里,但你问大爷,大爷一定会先思考,拿着你的目的地址在脑中思考,找到与找不到都会给你一个结果,大爷这种动脑子就是查路由表,如果大爷不知道是哪里,但他知道谁知道,就会把你推到知道的人哪里,在路上你只要问同济大学怎么走,而不是问同济大学18号寝室怎么走。在路上我们就是通过子网IP查找,当到路口路由器处,我们要的是18号宿舍楼,我们就问这个路由器,我们要去的目标主机在哪里。所以整个报文转发过程是先根据目的网络进行路上路由进行转发,当到了目的网络,目标路由器入口处再根据目标主机进行交互
我们不谈路由表的形成,但是我们要知道路由表里有什么。
- 路由表可以使用route命令查看
- 这台主机有两个网络接口,一个网络接口连到192.168.10.0/24网络,另一个网络接口连到192.168.56.0/24网络
- Destination:代表这个路由器连接的子网,和哪个子网连着的
- Gateway:代表当前路由器相关的信息,代表下一跳是什么类型的
- Genmask:代表对于这个路由器,针对特定的条目配的子网掩码,有多少个条目就有多少个子网掩码
- Flags:U表示正在使用,G表示Gateway,他是路由器,也就是和自己这台主机直接连接的缺省路由,一旦我发现这台主机发送的报文我不清楚了,不知道如何转发了,就交给缺省路由给我们转发
- Iface:是系统内部给我们形成的网络接口,就是一种设备,相当网卡的接口
转发过程例1: 如果要发送的数据包的目的地址是192.168.56.3
- 跟第一行的子网掩码做与运算得 到192.168.56.0,与第一行的目的网络地址不符
- 再跟第二行的子网掩码做与运算得 到192.168.56.0,正是第二行的目的网络地址,因此从eth1接口发送出去
- 由于192.168.56.0/24正 是与eth1 接口直接相连的网络,因此可以直接发到目的主机,不需要经路由器转发
转发过程例2: 如果要发送的数据包的目的地址是202.10.1.2
- 依次和路由表前几项进行对比, 发现都不匹配
- 按缺省路由条目, 从eth0接口发出去, 发往192.168.10.1路由器
- 由192.168.10.1路由器根据它的路由表决定下一跳地址
子网掩码是在路由器内部配置好的,路由器会给每个子网配置子网掩码,路由器会集连多个子网,就有多个条目,所以有多少个条目就有多少个子网掩码
大部分路由都是在公网里路由,内网里的路由并不复杂
比如我收到一个报文,192.168.56.3,ip报头里包含了目的IP,先拿着你的目的IP对条目中的子网掩码进行比较,网络不一样,就开始遍历下一个,如果都没有,就按缺省路由条目,从eth0接口发出去
四、分片
为什么不把滑动窗口里面的范围报文之间打一个包,整体发出,为什么一般教材多个报文?
首先IP为什么要分片,tcp是这样?
因为有数据链路层,里面mak帧,因为规定有效载荷不能超过MTU - 也就是1500字节,所以倒逼着IP报文,你交给我的报文,整体大小不能超过1500字节,不然我不帮你送
IP传多大,由IP决定吗?我不能决定,是由TCP决定的。
比如,TCP给IP说,我有3000字节,你给我发送出来,数据链路层又不给我传,所以IP层就有了分片的概念,
tcp给IP交了大量的数据,分片工作由IP层做,数据链路层不能做,因为是你的报文太大,不是我的报文,是TCP给你的报文,我只关心这个功能,到了目的,组装不起来,是你的问题,不是我的问题,我只管送
所以分片的时候,必须考虑组装的问题,组装的问题也是由对方的ip层做,所以只能由IP来进行分片和组装
所以IP报文里有16位标识、3位标志、13位片偏移
怎么做的分片和组装?
16位标识:在一段时间类,保证某些ip报文彼此之间是不一样的,不考虑分片和组装,ip报文如何区分不同呢,就是用16位标识来区分,
3位标志:其中有一位是不用的,就是保留位,就还剩2个位,第二位为1表示禁止分片,但是都是0,所以也不考虑,就只剩下一位了,如果分片了,最后一个标志位置为0,没分片也是0,因为你没有分片,所以你后面也没有更多分片了,如果分片了,且不是最后一个分片,就置为1,表示后面还有更多分片,就像字符串,如果分片了,以0结尾,后面全是1,就表示后面还有更多分片
13位偏移:分片后,每一个分片在原始报文的起始位置是哪里
每一个分片后的片的16为标识都是一样的,
关于分片和组装的问题:
1、在接受报文的时候,携带了源IP的,所以就具有了区分不同客户端的能力
2、你怎么知道分片了?
a.只要片偏移不是0,也可以看更多分片是否是1,就提取对应的标识
b.如果我是整个报文的第一个报文呢,你怎么知道我分片了,此时我的片偏移就是0
如果片偏移为0,第一情况是没有分片,第二情况是分片了,我们看更多分片为1,就注定是分片的了,片偏移为0,更多分片为1,就一定分片了的。
已经分片了,片偏移为0,更多分片为0,这种是不存在的
已经分片了,我怎么判断开始报文、中间报文、结束报文:
开始报文:更多分片1,片偏移为0,就是开始报文
中间报文:更多分片1,片偏移为>0,就是中间报文
结束报文:更多分片0,片偏移为>0,就是结束报文
片偏移为0,更多分片为0:就是独立报文
3、你怎么保证你把分片收全了?
你保证尾没丢,头没丢,中间没丢,
a、头尾丢失,我们能知道
b、未来在组装的时候,只需要进行偏移量排序,第一个报文的片偏移加上这个报文自身的长度,就是下一个分片的起始位置
进行排序,就知道是尾丢还是头丢,还是中间丢
4、收全后,你怎么把他组装在一起呢?
对偏移量进行排序
5、组合在一起了,你怎么保证组合在一起的报文一定是对的?与原始报文不一样呢?
TCP里有16位校验和,IP里有16位首部校验和,IP的校验和是分片的时候校验他的首部有没有出问题,但是内容有没有问题,是你可靠性的问题,是交给上层TCP来校验
不同主机还是同一个主机的16位标识是不一样的,我们不用担心,
IP收到数据要立马向上交互的,IP没有缓冲区
a、网络中,分片尽量让它成为少数情况
TCP给IP报文,分片是IP做的,TCP不管,但是IP有两片丢了,TCP是补发那两片还是整个报文呢?
作为TCP发送方一定能做到,给你补发IP丢的报文,但是我要补发其中丢失的报文,我就要知道你报文分片的情况,我的设计就更复杂,所以IP就一直发送
b、为什么?因为过多的分片,容易增加丢包率。一片丢了就是整个丢了,TCP就进行重传,
c、怎么做?
解决分片的问题,这个问题还是要交给上层,我为什么会产生这么多分片,是因为你交给我的数据太大,所以TCP给IP发报文就不发太大了,所以滑动窗口会拆成成多个报文,向下交互的
所以让TCP协议,尽量发送数据不要过大
但是,应该是多少呢?
数据链路层有效载荷是1500,IP的数据是报头20加1480的有效载荷,对应数据链路层的1500,而TCP中的数据是报头20加1460的有效载荷,对应IP层的有效载荷去
所以TCP协议发送的有效载荷的数据最大是1460,1460叫MSS,也叫最大段尺寸,TCP中的数据叫数据段,IP中叫数据报,数据链路层叫数据帧,所以TCP中叫最大段尺寸
所以三次握手也会告诉对方的MSS,滑动窗口为什么会拆成多个块,也是因为有最大段尺寸
举个例子,我们自己做一次分片
假设IP报文 有3000字节,已经被封装的IP报文,里面有20字节的报头,和有效载荷加起来就是3000字节
分片也是IP报文,前半部分要加报头,后半部分也要报头
所以分片之后,每一片都是IP报文,也有报头,要不然怎么组装
那么要分几片?所以是3片
第一片报头加有效载荷一共1500字节,是20+1480字节
剩下的也要拆一下,所以第二片也是20+1480,还剩20字节,16位标识不变,3位标志不变,13位偏移量就填上1500,原始报文的长度
第三片就是20+20
组装后,就进入到IP层正常报文的处理流程了,就向上交互给TCP