首先通过认识IP协议报头来了解IP协议
4位版本
IP协议的版本号,目前只有两个取值,4(0100)和6(0110)
4位首部长度
表示IP首部长度。最大数值是15(1111),单位是4个字节,所以IP首部最大长度为60字节。
8位服务类型(TOS)
3位优先权字段(已经弃用),4位TOS字段,和1位保留字段(必须置为0).所以说虽然是8位,但是其实只有4位是有效的
4位TOS分别表示为:最小延迟,最大吞吐量,最高可靠性,最小成本.(同一时刻,只能存在一种状态)
ip协议是规划两点之间的一条比较合适的路径,也就是选择上面四种状态之一尽心规划.
16位总长度
16位表示最大长度为64k,所以单个IP数据报最大的长度不能超过64k
如果需要一个更长的ip数据报(比如搭载的数据载荷就超过了64k),IP协议自己就实现了分包和组包这样的操作.
16位标识+3位标志+13位片偏移
因为这三部分共同完成分包和组包的操作,所以这里放在一起进行总结
拆分之后,接收方如何知道这几个小包是同一个数据拆分的呢?
此时就到了16位标识出场:所有从同一个数据拆分出来的小包,他们的16位标识都是一样的
此时接收方知道标识一样的小包是同一个数据拆分出来的小包,可是接收方面对数据仍然会手足无措,不知道这些小包应该按照什么样的顺序进行组合.
此时13位片偏移出场,描述这些包到底谁先谁后,需要注意的是,片偏移并不是单纯的表示1,2,3,4 而是基于片偏移计算出了每个包之间应该空出多少空间.(放置后发先至的情况.
此时数据拆分成三个包,因为网络原因,导致片偏移为2的数据报最后到达,但是因为片偏移的存在,最后仍然可以组合成一个完整的数据报,和发送方的数据报一模一样.
但是组合完成之后,接受方如何可以得知此时的ip数据报已经全部接收了呢?
此时3位标志出场,除了最后一个包,其他的包取值都为0,最后一个取值为1.
最后,接收方接受到整个ip数据报,皆大欢喜,可喜可贺.
8位生存时间(TTL)
表示一个ip数据报可以在网络中生存的时间,此时的单位不会是s或ms,而是转发的次数.IP数据报被发送的时候,会有一个初始的TTL(常见的值为128或64),IP数据报每次经过一个路由器,TTL就会-1,如果TTL减到了0,此时收到这个包的路由器就会将这个包丢弃.
因为有些包里面的IP地址,也许永远也到不了,这种包不可能在网络中永无休止的转发(浪费资源),正常的IP数据报都会在TTL内到达.
8位协议
传输层中使用的协议.比如TCP或UDP
16位首部校验和
用来校验数据是否正确
32位源IP地址+32位目的IP地址
源IP地址表示发件人地址,目的IP地址表示收件人地址.对于IPv4来说,一个IP地址本质上是32位的整数,通常用点分十进制表示这个ip地址,3个点把32位整数分成4部分,每部分1字节,每个部分的取值为0-255
ip地址是一个点分十进制构成的数据,咋们把ip地址分成两部分:网络号和主机号
网络号:描述了当前的网段信息(局域网的标识)
主机号:区别了局域网内的主机
同一个局域网中,主机之间的网络号是相同的,主机号不能相同,
两个相邻的局域网(同一个路由器相连),网络号也是不同的
子网掩码
子网掩码格式和IP地址一样,也是一个32位的二进制数。其中左边是网络位,用二进制数字“1”表示,1的数目等于网络位的长度;右边是主机位,用二进制数字“0”表示,0的数目等于主机位的长度。
此时的自子网掩码换算成二进制位1111 1111 1111 1111 1111 1111 0000 0000
前面为1的就表示为网络号,后面为0表示主机号
特殊的IP地址
将IP地址中的主机地址全部设为0,就成为了网络号,代表这个局域网;
将IP地址中的主机地址全部设为1,就成为了广播地址,用于给同一个链路中相互连接的所有主机发送数据包;
127.*的IP地址用于本机环回(loop back)测试,通常是127.0.0.1
IP地址是10开头,192.168开头 172.12 —172.31开头,表示该IP地址是一个局域网内部的IP(内网IP),除此之外,剩下的IP成为外网(直接在广域网使用的IP)
要求外网IP是唯一的,每一个外网Ip都对应到唯一的设备内网IP只是当前局域网中是唯一的,不同的局域网中可以有相同的内网IP的设备
目前的IPv4协议使用的IP地址是32位整数,32位表示的范围42亿9千万,如果给世界上每个设备分一个唯一的IP,意味着世界上的设备不能超过42亿9千万,但随着互联网的兴起,这是不可能的
所以需要解决ip地址不够的问题
这种方案不能从根本解决问题,设备没有减少,ip地址没有增加,治标不治本
把网络分成内网(局域网)和外网(广域网),要求外网ip必须表示唯一的设备,同时内网的若干个设备,可以共用同一个外网IP
此时每个外网IP都可以表示几千个甚至上万个设备,这个时候IP地址的压力就缓解了很多.
上图中的主机1如果访问一个网站,就通过运营商的外网IP去访问,但是这样会出现一个问题
如果主机1和主机2同时访问一个网站,那么网站就看到两个连接,这两个连接的IP地址都来自于同一个外网,此时网站如何区分两个主机(五元组)
不同的主机,就有不同的端口号,既然ip地址一样,那么就跟据端口号进行区分两个主机.
NAT机制将IP分为内网和外网,也隐藏一个重要的结论
对于一个外网IP,可以在网络中的任意位置访问到
对于一个内网IP,只能在当前局域网内部访问,局域网1的设备,不能通过内网IP访问到局域网2的设备
NAT机制也有极限:端口号的个数 (65535) 如果一个局域网的连接数超过65525,此时的NAT不一定好使,端口号不够用了
so,NAT只是缓解,但不能从根本解决
16个字节 128位
从根本上解决了ip地址不够用的问题
但是IPv6和IPv4不兼容
每一个数字都是一个16进制的数字,每个冒号分割了2字节
路由选择,就是规划路线,两个设备之间要找出一条通道,能够完成传输的过程
IP数据报中的目的地址,表示了这个包要发去哪里,这个目的地址,如果当前路由器直接认识,就告诉IP数据报具体的路线。
如果当前路由器不认识,就会告诉一个大概的方向,让数据报走到下一个路由器的时候再访问,依次往后走,其实就是再距离目标越来越近,这个时候就总会遇到认识这个地址的路由器,就可以具体的转发过去。
路由器内部维护了一个数据结构:路由表
路由表里面就记录了一些网段信息(网络号)(目的IP就在这些网络号中匹配)以及每个网络号对应的网络接口(网络就扣其实就对应到路由器里面具体的接口)
主要的协议:以太网
目的地址+源地址
通过6个字节来表示源地址和目的地址,这个比IPv4更长,这里的地址称为mac地址
mac地址做到了每个网卡都是唯一的(网卡出场的时候就写死了),所以我们可以通过mac地址确定唯一的主机
IP地址和mac地址的功能
IP用来表示一个传输过程中的起点和终点,(不考虑NAT的情况,一个IP数据报中的源IP和目的IP是固定的)
mac用来表示传输过程中,任意两个相邻点之间的地址(一个以太网帧,在每次转发过程中,源mac和目的mac都会改变
类型
类型不同表示后面的数据搭载不同的值
如果是0800 就是一个完整的IP数据报
如果是0806,那就是一个ARP请求
如果是8035,那就是一个RARP请求
CRC
帧尾就是一个基于CRC算法的校验和
循环冗余算法和(把数据的每个字节依次进行累加(溢出就溢出了))
图中的46-1500 为MTU
MTU 表示一个以太网数据帧能承载的数据范围 范围取决于硬件设备
其他硬件设备,对应的数据链路层协议,可能不一样,MTU也不一样
如果数据报超过了MTU怎么办
IP层的分包操作 ip层的分包,其实不是给ip的报头64k准备的,更多的是为了适应数据链路层的MTU
MTU对IP协议的影响
由于数据链路层MTU的限制,对于较大的IP数据包要进行分包。
- 将较大的IP包分成多个小包,并给每个小包打上标签;
- 每个小包IP协议头的 16位标识(id) 都是相同的;
- 每个小包的IP协议头的3位标志字段中,第2位置为0,表示允许分片,第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0);
- 到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层;
- 一旦这些小包中任意一个小包丢失,接收端的重组就会失败。但是IP层不会负责重新传输数据;
MTU对UDP协议的影响
让我们回顾一下UDP协议:
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)),那么就会在网络层分成多个IP数据报。
- 这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了。
MTU对于TCP协议的影响
让我们再回顾一下TCP协议:
- TCP的一个数据报也不能无限大,还是受制于MTU。TCP的单个数据报的最大消息长度,称为MSS(Max Segment Size);
- TCP在建立连接的过程中,通信双方会进行MSS协商。
- 最理想的情况下,MSS的值正好是在IP不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)。
- 双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值。
- 然后双方得知对方的MSS值之后,选择较小的作为最终MSS。
- MSS的值就是在TCP首部的40字节变长选项中(kind=2);
MSS:TCP中在IP不分包的前提下,最多搭载多少载荷
MTU也取决于TCP和IP的报头
分包的开销还是有,MSS对于TCP起到一个提示效果.如果当前传输TCP的数据不超过MSS的时候,是属于最高效的状态
ARP报文
ARP报文并不是用来传输数据的,只是起到一个辅助的效果
路由器这样的设备在转发数据的时候,首先拿到的是一个IP地址(目的IP),通过IP地址来决定接下来这个数据咋走(从哪个端口出去,发到哪个设备上),因此就得决定,接下来封装的以太网数据帧目的mac是啥,根据ARP协议就建立起IP->mac这样的映射关系.
当设备启动的时候,就会向局域网中,广播ARP报文,每个设备收到只有,都会给出一个应答,应答的信息中包含了自己的IP和mac,发起广播的一方,就可以根据这些回应建立起映射表