TCP/IP协议簇
IP协议是TCP/IP协议簇中的核心协议,它的主要作用是对网络中传输的数据进行统一封装,提供数据传输地址,以及隔离软件和硬件。
用IP协议封装的报文称为IP数据报。大部分数据都需要封装成IP数据报再进行传输。
IP协议
IP数据报的首部包括固定部分和可选部分,固定部分长度20字节,可选部分长度0~40字节。所以IP数据报首部的长度在20~60字节。
- 版本:占4位,指定IP协议的版本。值为4时,表示IPv4数据报。
- 报头长度:占4位,指示首部长度。单位为4字节,取值范围为5~15,即首部长度为20~60字节。
- 服务类型:占8位,为数据报添加的一个标志,通常用于指示数据报转发时的优先级。
- 总长度:占16位,指示IP数据报总长度(含首部和数据部分)。一个IP数据报的最大长度为65535字节(64KB)。
- 标识、标志、片偏移:在数据报分片和重组时使用。
- 生存时间(TTL):占8位,取值0~255。数据报每经过一次路由其TTL值就减1,当TTL减为0时就丢弃这个数据报。
- 协议:占8位,指示携带的数据所使用的协议。比如:数据是TCP数据报时为6,是UDP数据报时为17,是ICMP数据报时为1。
- 首部校验和:占16位,用于检验数据报在传输中报头是否出错。
- 源地址、目的地址:各占32位,指示源和目的的IP地址。
- 可选字段:0~40字节,保存一些额外参数,比如时间戳等。
- 填充:首部长度必须为4的整数倍,如果不是用填充来补足。
例:一个在ping操作时抓取的IP数据报,内部封装的是ICMP数据报。

IP地址和MAC地址的区别
- IP地址是逻辑地址,需要在设备上进行配置;MAC地址是物理地址,是设备出厂时自带的。
- IP地址是网络层地址,带有网络信息,可以跨网络;MAC地址是数据链路层地址,没有网络信息,只能在一个网络内部使用。
- 在IP数据报中封装的是IP地址,可指定世界上任何一台设备的地址;MAC地址封装在帧中,只能指定本网络中的设备。
- 能够处理IP数据报的设备是网络层设备,它们可以跨网络传输数据;只能处理帧的设备是数据链路层设备,它们不能向其它网络传输数据。
IP数据报的分片与重组(选读)
IP数据报还需要封装成帧才能在网络中传输,当IP数据报的长度超过帧容量时,需分片传输。
MTU
MTU称为最大传输单元,是指一帧允许携带的最大数据量,以字节为单位。
MTU值和网络有关,以太网的MTU值是1500,无线网络的MTU值是1492,蓝牙的MTU值是672。
路径MTU是指在整个传输路径中最小的MTU值。当数据报通过一个MTU值较小的段时,要求结点具有分片功能。
IP数据报的分片与重组
当IP数据报的长度超过它所在网络的MTU值时,需要把IP数据报分片传输,到达目的主机时再把各分片重组为原来的IP数据报。
分片的IP数据报在首部用标识、标志和片偏移字段:
- 标识:占16位。这是一个计数器,主机每发送一个数据报就把计数值增1,这个计数值就写在数据报的标识字段。如果数据报进行了分片,其所有分片的标识字段值是相同的。
- 标志:占3位。中间一位称为DF,为1时表示不允许分片。最后一位称为MF,为1时表示还有分片,为0时表示这是最后一个分片。
- 片偏移:占13位。表示本片数据在原数据报中的相对位置,以字节为单位。重组时把本分片中的数据放在该位置处。
例:一个IP数据报的长度为2000字节(含20字节的首部),而网络的MTU值为1500,则这个数据报需分成2片进行发送。
该数据报中的数据大小为1980字节,分片后,第1片数据大小为1480字节,第2片数据大小为500字节。
每片都要再添加20字节的首部,所以第1片长度为1500字节,第1片长度为520字节。
MTU值的查看与测试
使用命令:netsh interface ip show interfaces 可查看本机中各网络连接的MTU值。

Loopback是本机回环,它有一个很大的MTU值。所以本机内部传输IP数据报通常不用分片。
使用的连接不同,MTU值也会不一样。
由于到达目标主机可能会经过多个不同的网络,用 ping -f -l 长度 目标地址 可测试网络允许通过的数据报大小。
参数 -f 表示不允许对IP数据报分片(就是把标志中的DF设置为1)。
参数 -l 表示把指定大小的测试包发往目的主机(是字母l不是数字1)。
如果可以ping通,表示指定大小的数据报可以通过网络,如果ping不通,说明指定的大小超过了途经网络的MTU值。

指定的长度不包括报头,所以传输1500字节的数据时需进行分片。

传输1440字节的数据时不需分片。
考虑到IP数据报有20~60字节的报头,所以该网络的MTU值为1500。
分片会增加系统处理时间,影响访问速度。如果在传输过程中有一个分片出错,都需要重传整个IP数据报,浪费网络资源。所以在设计网络时需考虑这个问题。
ICMP协议
ICMP协议用于在网络设备间传递消息,包括网络通不通、网络是否可达、数据报出错等。
典型的应用就是 ping 命令,它会向目的主机发送几个ICMP请求报文,如果目的主机返回了ICMP响应报文,说明网络是连通的。
另外,如果数据报在传输过程中出错,转发节点会丢弃该数据报,并向源主机发送消息也是用ICMP协议发送的。
ICMP数据报
ICMP数据报需要封装在IP数据报中进行传输。
常见报文类型和代码
请求报文:类型 - 8,代码 - 0
响应报文:类型 - 0,代码 - 0
差错报告报文:
网络不可达:类型 - 3,代码 - 0
主机不可达:类型 - 3,代码 - 1
超时:类型 - 11,代码 - 0
ARP协议
ARP协议称为地址解析协议,用于根据IP地址查找目标主机的MAC地址。
IP数据报需要封装成帧才能在网络中传输,IP数据报中的地址是IP地址,而帧中的地址是MAC地址,所以在封装时需获取目的主机的MAC地址。
ARP表
当源主机第一次访问目的主机时,它首先向网络中广播一个ARP查询包。
目的主机收到后,向源主机发送一个ARP响应包,里面包含了本机的MAC地址。
源主机用这个MAC地址封装帧,同时把它记录在本机的ARP表中。
当源主机再次访问同一个目的主机时,会直接使用ARP表中的MAC地址。
在计算机上可以用 arp -a 查看本机的ARP表。
注:如果源主机和目的主机不在同一个网络中,则ARP查询到的是网关设备的MAC地址。
ARP表的配置
通过ARP协议获得的表项是有失效期的,过一段时间就会自动清除。
我们可以用手工方式向ARP表中添加项目,这种项目称为静态表项。
添加ARP表项:arp -s IP地址 MAC地址
删除ARP表项:arp -d IP地址
利用静态ARP表项可防范由ARP欺骗攻击导致的网络瘫痪问题。