目录
快速开始
一、IP首部图片示例
二、首部协议标识
协议:封装的数据部分使用的什么协议,比如传输层过来的 tcp 和 udp、网络层产生的 arp 和 icmp
arp协议工作在网络层
icmp协议工作在网络层
我们ping的时候是没有经过应用层和传输层的
IP首部 + icmp首部 + 数据
类似的协议还有:
ppp 协议工作在链路层
csma/cd 协议工作在链路层
三、TTL
生存时间,允许传过路由器的数量,当ttl变为0时,对应的路由器会返回错误报文
通过ping命令,配置ttl,可以逐步查看穿过的路由器
网络层(Network )
网络层数据包(IP数据包,Packet)由首部、数据2部分组成
数据:很多时候是由传输层传递下来的数据段(Segment)
一、网络层首部 - 版本、首部长度、区分服务
版本(Version)
占4位
0b0100:IPv4
0b0110:IPv6
首部长度(Header Length)
占4位,二进制乘以4才是最终长度
0b0101:20(最小值)
0b1111:60(最大值)
区分服务(Differentiated Services Field)
占8位
可以用于提高网络的服务质量(QoS,Quality of Service)
二、网络层首部 - 总长度
总长度(Total Length)
占16位
首部 + 数据的长度之和,最大值是65535
由于帧的数据不能超过1500字节,所以过大的IP数据包,需要分成片(fragments)传输给数据链路层
每一片都有自己的网络层首部(IP首部)
三、网络层首部 - 标识、标志
标识(Identification)
占16位
数据包的ID,当数据包过大进行分片时,同一个数据包的所有片的标识都是一样的
有一个计数器专门管理数据包的ID,每发出一个数据包,ID就加1
标志(Flags)
占3位
第1位(Reserved Bit):保留
第2位(Don’t Fragment):1代表不允许分片,0代表允许分片
第3位(More Fragments):1代表不是最后一片,0代表是最后一片
四、网络层首部 - 片偏移
片偏移(Fragment Offset)
占13位
片偏移乘以8:字节偏移
每一片的长度一定是8的整数倍
五、网络层首部 - 生存时间
生存时间(Time To Live,TTL)
占8位
每个路由器在转发之前会将TTL减1,一旦发现TTL减为0,路由器会返回错误报告
观察使用ping命令后的TTL,能够推测出对方的操作系统、中间经过了多少个路由器
六、网络层首部 - 协议、首部校验和
协议(Protocol)
占8位
表明所封装的数据是使用了什么协议
首部校验和(Header Checksum)
用于检查首部是否有错误
ping的几个用法
1、查看ping的用法
ping /?(Windows)
ping(Mac)
2、发送指定大小的数据包
ping ip地址 -l 数据包大小 (Windows 默认发送4个ICMP数据包)
ping ip地址 -c 4 -s 数据包大小(Mac -c count 指定发送次数)
ping ke.qq.com -s 4000 -c 1
PING ke.qq.com (153.37.100.224): 4000 data bytes
4008 bytes from 153.37.100.224: icmp_seq=0 ttl=54 time=27.151 ms
--- ke.qq.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 27.151/27.151/27.151/0.000 ms
3、不允许网络层分片
ping ip地址 -f
4、设置TTL的值
ping ip地址 -i TTL(Windows)
ping ke.qq.com -m 1 -c 1(Mac)
ping ke.qq.com -m 2 -c 1
PING ke.qq.com (153.37.100.193): 56 data bytes
92 bytes from bogon (192.168.1.1): Time to live exceeded
5、通过tracert、pathping命令,可以跟踪数据包经过了哪些路由器
查看ping命令的使用
ping --help
查看百度
$ ping baidu.com -c 1 exit 2
PING baidu.com (110.242.68.66): 56 data bytes
64 bytes from 110.242.68.66: icmp_seq=0 ttl=249 time=16.737 ms
ttl=249代表数据从110.242.68.66到达我的电脑时ttl为249
可以推测出百度用的服务器是 Linux 版本是2.2.14 kernerl 或 2.4 kernel,他们默认的ttl是255
也就是说百度服务器发数据到我的电脑中间经历了 6 = 255 - 249 个路由
推测路径
# 发送1次,并且设置ttl为1
$ ping baidu.com -c 1 -m 1 exit 64
PING baidu.com (110.242.68.66): 56 data bytes
# 因为ttl只设置了1,所以到我的网关 10.249.31.254 时 ttl为0,路由器返回错误给我
36 bytes from 10.249.31.254: Time to live exceeded
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 17a5 0 0000 01 01 c5af 10.249.30.40 110.242.68.66
通过这种方式我们可以一个一个的测试下去,查找出经过了哪些路由
# 不知道为什么经过的第二个路由器获取不到??
$ ping baidu.com -c 1 -m 2 exit 2
PING baidu.com (110.242.68.66): 56 data bytes
--- baidu.com ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
# 经过的第三个路由器:125.208.12.193
lixiaoyi@lixiaoyideMacBook-Pro in ~
$ ping baidu.com -c 1 -m 3 exit 2
PING baidu.com (110.242.68.66): 56 data bytes
36 bytes from 125.208.12.193: Time to live exceeded
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 4243 0 0000 01 01 9b11 10.249.30.40 110.242.68.66
--- baidu.com ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
# 经过的第四个路由器:10.19.36.81
lixiaoyi@lixiaoyideMacBook-Pro in ~
$ ping baidu.com -c 1 -m 4 exit 2
PING baidu.com (110.242.68.66): 56 data bytes
36 bytes from 10.19.36.81: Time to live exceeded
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 5400 efc1 0 0000 01 01 ed92 10.249.30.40 110.242.68.66
--- baidu.com ping statistics ---
1 packets transmitted, 0 packets received, 100.0% packet loss
lixiaoyi@lixiaoyideMacBook-Pro in ~
$
行者常至,为者常成!