什么是IP
学习IP是入门网络的第一步, 要想了解网络的工作原理, 首先要了解的就是IP协议.
IP standards for Internet Protocol.
也就是说IP是Internet Protocol的缩写, 是internet通信协议.
通俗点讲, 如果接入internet的设备需要通信, 就必须要使用这个协议.
大家经常看到的IP协议有IPv4和IPv6两个版本, IPv4用的最多,本文只涉及IPv4.
IP 协议的功能
要想知道IP协议的内容, 就需要了解一下IP协议的包头定义了哪些字段.
图上0-31的数字代表bit, 也就是每个字段的长度.
比如, version这个字段是4bits, source ip address和destination ip address都是32bits.
如果从事网络管理, 需要理解以下字段.
字段 |
功能 |
TTL(Time To Live) |
包的存活时间, 如果为0, 则被网络设备丢弃 |
Source IP address |
源IP地址 |
Destination IP address |
目的IP地址 |
Protocol |
上层协议 |
Header Length |
包头长度, 这个通常都是20Bytes |
Total Length |
ip header + data length 是指包头和数据的总长度 |
下面通过一些实例来理解这些字段
TTL - Time To Live
TTL的值很容易通过ping这个命令来获得.
在下面的例子中, ttl=52, 每经过一个路由器, 这个值会减一.
ping www.baidu.com
PING www.a.shifen.com (36.152.44.96): 56 data bytes
64 bytes from 36.152.44.96: icmp_seq=0 ttl=52 time=59.546 ms
64 bytes from 36.152.44.96: icmp_seq=1 ttl=52 time=23.654 ms
64 bytes from 36.152.44.96: icmp_seq=2 ttl=52 time=21.083 ms
Source IP adress and Destination IP
还是用ping来做个例子, 源地址指的就是这个数据包从哪个机器发出来, 可以是你的笔记本电脑, 手机, 或者网络摄像头.
说是源地址, 其实是相对的, 当网站发数据给你时, 这个地址就是目的地址.
同样用一个实际的例子来理解:
在mac电脑上, 可以用tcpdump这个命令来查看包的具体内容.
在这个例子中,
第一行是从我的笔记本发出的icmp request包, source ip = 192.168.199.142, destination ip=36.152.44.95
第二行是从server的返回包, source ip = 36.152.44.95, destination ip = 192.168.199.142.
从实际抓取的数据包可以看到, source ip和destination ip会互换.
sudo tcpdump -vnn host 36.152.44.96
192.168.199.142 > 36.152.44.96: ICMP echo request, id 41479, seq 0, length 64
36.152.44.96 > 192.168.199.142: ICMP echo reply, id 41479, seq 0, length 64
在wireshark里, 很清楚的标出了这些地址
Protocol
这个协议字段是用来标识上层协议.
学过七层模型的都知道, IP协议是处于第三层的协议, 三层和四层之间的联系就是靠这个字段.
通常这个协议字段都是TCP, 现在绝大多数的应用都是基于TCP的, 当然由于TCP的一些限制, 导致传输效率不高, 很多也是基于UDP协议, 比如一些传输视频的数据包.
而在本文上面的例子中提到的ping, 则是基于ICMP协议.
下面给出一个协议号和协议的对应关系.
表中的协议号用十进制表示.
Protocol Number |
Protocol |
6 |
TCP |
17 |
UDP |
1 |
ICMP |
这个协议号, 同样可以清楚的在wireshark里看到
Total Length
这个字段很容易被忽略.
实际工作中, 有时候会遇到ping可以正常工作, 但是telnet或者ssh就是不行; 这种情况常见于有mtu issue的网络中.
其实使用ping这个简单的命令, 就可以发现网络中的mtu问题.
还是用文中之前的例子, 来理解这个长度字段.
这个例子中, ping没有加任何参数, 会发出默认的data length, 就是56Bytes.
一个简单的加法:
Items |
Length |
IP header |
20 |
ICMP header |
8 |
data |
56 |
ping www.baidu.com
PING www.a.shifen.com (36.152.44.96): 56 data bytes
64 bytes from 36.152.44.96: icmp_seq=0 ttl=52 time=59.546 ms
64 bytes from 36.152.44.96: icmp_seq=1 ttl=52 time=23.654 ms
所以我们在wireshark看到ip header中total length的长度是84.
可以在ping的命令中指定data的size, 用-s参数:
ping -s 1000 www.baidu.com
PING www.a.shifen.com (36.152.44.95): 1000 data bytes
1008 bytes from 36.152.44.95: icmp_seq=0 ttl=52 time=103.190 ms
1008 bytes from 36.152.44.95: icmp_seq=1 ttl=52 time=29.980 ms
1008 bytes from 36.152.44.95: icmp_seq=2 ttl=52 time=36.626 ms
ping的同时, 用wireshark抓包查看, 可以看到total length是1028.
Total Length = ip header (20) + icmp header (8) + data (1000)
实际测试中, 你会发现这个值不能一直增加, 增加到一定的值就ping不通了, 有兴趣可以自己做做测试.