路由器是三层设备,他要处理IP地址,还要封装数据
网络层( Network)
◼ 网络层数据包(IP数据包,Packet)由首部、数据2部分组成
数据:很多时候是由传输层传递下来的数据段(Segment)
32位4字节,5行,20字节
网络层首部 —版本、首部长度、区分服务
◼ 版本(Version)
占4位
0b0100:IPv4
0b0110:IPv6
◼ 首部长度(Header Length)
一行占4位,二进制乘以4才是最终长度
0b0101:20(最小值)
0b1111:60(最大值)
◼ 区分服务(Differentiated Services Field)
占8位
可以用于提高网络的服务质量(QoS,Quality of Service)
客户端向服务器发送请求的过程,肯定要经过路由器,在路由器上有设置如果发现网络层数据包首部的区分服务里面有特殊的东西(大于0),就让这条数据包优先通过,如果没有,就平等对待。
DSF牵扯到路由器设置,网络管理,可以在操作系统里面配置。
路由器发现DSF值不为零,可以让它优先通过,提高网络带宽的利用效率。
网络层首部 —总长度
◼ 总长度(Total Length)
占16位
首部 + 数据的长度之和,最大值是65535
◼ 由于帧的数据不能超过1500字节,所以过大的IP数据包,需要分成片(fragments)传输给数据链路层
每一片都有自己的网络层首部(IP首部)
网络层首部 —标识、标志
◼ 标识(Identification)
占16位
16位是有限的,一旦数据包超过65535个,就会从零开始
数据包的ID,当数据包过大进行分片时,同一个数据包的所有片的标识都是一样的
发送给服务器的帧那么多,它怎么区分那个跟那个是同一个数据包,就是通过同一个数据包的所有片的标识都是一样的来进行区分。
有一个计数器专门管理数据包的ID,每发出一个数据包,ID就加1
假设,我们有100个数据包,每发送一个就加1,通过这个机制,我们可以保证我们发送的数据包是唯一的。
◼ 标志(Flags)
占3位
第1位(Reserved Bit):保留
第2位(Don’t Fragment):1代表不允许分片,0代表允许分片
第3位(More Fragments(是否有更多的片)):1代表不是最后一片,0代表是最后一片
服务器用来判断接收到的帧是否完整。
网络层首部 —片偏移
◼ 片偏移(Fragment Offset)
占13位
片偏移乘以8:字节偏移
因为片偏移只占13位,很容易就会不够,所以要除以8来进行保存。
拿到网络层的片偏移,不代表是第几个字节,要乘以8来代表是这一段数据包的第几个字节。
每一片的长度一定是8的整数倍
主要用来服务器接收到帧之后进行排序。
ping —几个用法
◼ ping /?
查看ping的用法
◼ ping ip地址 -l 数据包大小
发送指定大小的数据包
ping baidu.com -l 800
◼ ping ip地址 -f
不允许网络层分片
◼ ping ip地址 -i TTL
设置TTL的值
ping baidu.com -i 1
网关回复我的,可以通过逐渐增大TTL,来获得数据通过哪些路由器
◼ 通过tracert、pathping命令,可以跟踪数据包经过了哪些路由器
tracert baidu.com
pathping baidu.com
实例演示:
先给baidu.com发送800字节的数据包,打开wirshare捕抓数据流,对数据流进行分析,
网络层数据总长度828怎么来的?
网络层首部至少20字节,ICMP协议首部8个字节,加上传输的数据800字节。
数据链路层帧长度842,说明了数据包没有分片。
先给百度发送4000字节的数据包,百度服务器做了限定,太大的数据不收,那就换其他的,发现都不行,放弃了。
ip.addr == 14.22.3.189 //查看跟该IP地址相关的数据流
判断是否是同一个数据包,看唯一标识。
网络层首部 —生存时间
◼ 生存时间(Time To Live,TTL)
占8位
每个路由器在转发之前会将TTL减1,一旦发现TTL减为0,路由器会返回错误报告
路由器在转发数据包之前会把你的TTL减一,发现大于0,就会帮你转,发现是0,就会由这个路由器返回错误报告给你。
数据只需要经过几十个路由器就可以传到很远的地方,穿过几个主要的路由器就可以跨国了。
意义:
发送一个路由器不知道该怎么走的数据包,路由器就会走默认路由,它也不知道该怎么走,就也会走默认路由,有可能会传回去,形成互相之间踢皮球的现象,如果没有TTL,就会一直占用带宽,这样就会因为管理员配置错误,或者路由表配置的有问题,导致这一段路线一直被占用,一直被消耗流量。这就是TTL设置的意义,防止路由死循环。
观察使用ping命令后的TTL,能够推测出对方的操作系统、中间经过了多少个路由器
一般公司服务器用的是linux
Mac OS是用来做客户端开发的
网络层首部 —协议、首部校验和
◼ 协议(Protocol)
占8位
表明所封装的数据是使用了什么协议,是UDP呢,还是TCP
ARP属于网络层吗,为什么在PCT软件里面却标在数据链路层。
由ARP目的出发,根据一个IP地址,我想要它对应的MAC地址,进行数据传输,牵扯到网络层的东西,所以它仍然属于网络层。
ICMP为什么不属于传输层?
ICMP没有传输层的机制,比如可靠传输、流量控制、拥塞控制、滑动窗口,所以它依然属于网络层。
◼ 首部校验和(Header Checksum)
用于检查首部是否有错误,相当于Ethernet V2技术,
一开始首部校验和全为0,然后根据一个算法对首部进行一个计算,生成一个值,算出来的值在填充到首部校验和里面去,接下来服务器拿到这个数据后,根据一个算法进行计算,然后和首部校验和进行比对。
有些协议是没有传输层的,我们学习的tcp/ip协议只是数据传输封装过程中的一种,例如icmp、arp、ip协议。
基本上网络层数据包首部是20字节。