TCP/IP协议(5): IP(Internet Protocol) 协议 —— 连接各个网络的协议
关于 IP(Internet Protocol) 协议
IP(Internet Protocol) 协议是 TCP/IP 协议族 中的核心协议。 IP 协议根据数据 包(Packet) 中的 IP 地址, 为上层协议提供一种 无连接(Connectionless), 尽力而为(Best-effort Delivery) 的数据传输功能。
- 尽力而为的交付(Best-effort Delivery) 用于描述既不保证数据成功交付, 也不保证数据交付满足某种服务质量的网络服务。在尽力交付的网络中,所有的用户获得的都是尽力交互的服务,这就意味着他们传输数据的比特率、延迟和包丢失受当前网络的流量负载情况的影响而变化。
(Best-effort delivery describes a network service in which the network does not provide any guarantee that data is delivered or that delivery meets any quality of service. In a best-effort network, all users obtain best-effort service, meaning that they obtain unspecified variable bit rate and latency and packet loss, depending on the current traffic load. )- 无连接通信(Connectionless Communication) 是一种数据包交换网络的数据传输方法。在该网络中, 每个数据单元是根据其携带的信息独立寻址和路由,而不是像面向连接通信那样预先设置固定的数据通道。
(Connectionless communication is a data transmission method used in packet switching networks in which each data unit is individually addressed and routed based on information carried in each unit, rather than in the setup information of a prearranged, fixed data channel as in connection-oriented communication.)
IP 协议的主要内容
IP 协议的主要内容如下图,该例子将会在本部分的最后一小节详细介绍。
在电信技术中, 协议数据单元(Protocol Data Unit, PDU) 表示在计算机网络的对等实体间作为单个单元传输的信息。
与 OSI 模型中的前四层相关的协议数据单元如下:
- 物理层(第一层) 的 PDU 是位(bit)。
- 数据链路层(第二层) 的 PDU 是帧(frame)。
- 网络层(第三层) 的 PDU 是 包(packet)。
- 传输层(第四层)的 TCP 协议 的 PDU 是段(segment), UDP 协议 的 PDU 是数据报(datagram)
(In telecommunications, a protocol data unit (PDU) is information that is transmitted as a single unit among peer entities of a computer network.
Protocol data units are relevant in relation to each of the first four layers of the OSI model as follows:
- The physical layer (layer 1) PDU is the bit.
- The data link layer (layer 2) PDU is the frame.
- The network layer (layer 3) PDU is the packet.
- The transport layer(layer 4) PDU is the segment for TCP or the datagram for UDP.)
分片(Fragment)
网络层接收到上层协议的协议数据单元(Protocol Data Unit, PDU) 后,会在前面加上 IP 协议首部,封装成 IP 数据包。
由于数据链路层有效载荷的最大传输单元(Maximum Transmission Unit, MTU) 限制,如果上层协议的 PDU 加上 IP 首部长度大于 MTU,网络层会将上层协议的 PDU 拆分给多个 IP 数据包,这个操作被称之为分片(Fragment)。
IP 协议 本身是不保证数据顺序传输,因此需要分片后的 IP 首部 能提供 IP 数据包 的相关字段来复原上层协议 PDU。这些字段包括:
- 标识(Identification): 用于标识哪些分片属于同一个上层 PDU 的标识(Identification)。
- 标记(Flag):用于判断当前分片后面是否还有分片以及是否不能分片的
- 片偏移(Fragment Offset):用于记录当前分片在原上层 PDU 中的相对位置。
最大传输单元(MTU) 是用八位字节指定的可以用在基于包或帧传输的网络,如因特网,传输的最大包或帧的大小。在 Windows 95 中, 默认的 MTU 设为 1500 字节,部分是因为这是以太网的标准 MTU。因特网实际上的 MTU 是 576 字节, 但是 ISP 通常建议使用 1500 字节。
(A maximum transmission unit (MTU) is the largest size packet or frame, specified in octets (eight-bit bytes), that can be sent in a packet-based or frame-based network such as the Internet. In Windows 95, the default MTU was 1500 octets (eight-bit bytes), partly because this is the Ethernet standard MTU. The Internet de facto standard MTU is 576, but ISPs often suggest using 1500. )
IP 包转发(Forwarding)
当主机将数据通过 TCP/IP 协议栈将数据封装成帧后,通过局域网协议(如:以太网协议(IEEE 802.3) 或 Wi-Fi 协议(IEEE 802.11)) 将数据传输到当前局域网的网关(Gateway)。
网关接收到数据后,拆开数据帧,查看 IP 数据包 首部的目的 IP 地址。然后根据目的 IP 地址以及路由协议转发该数据帧。
在 IP 网络中,客户端自动将目标地址在给定子网掩码指定的网络之外的 IP 数据包发送给网关。如,一个网络号为 192.168.0.0, 子网掩码为 255.255.255.0 的私有网络中,目的地址不是 192.168.0.X 的数据将会被发送给该网络的网关。在转发 IP 数据包到其他网络时,网关可能会执行网络地址转换(Network Address Translation, NAT) 操作。
(On an Internet Protocol (IP) network, clients automatically send IP packets with a destination outside a given subnet mask as defined by a combination of network address and subnet mask to a network gateway. For example, if a private network has a base IP address of 192.168.0.0 and has a subnet mask of 255.255.255.0, then any data going to an IP address outside of 192.168.0.X will be sent to that network’s gateway. While forwarding an IP packet to another network, the gateway might or might not perform Network Address Translation.)
生存时间(Time To Live, TTL)
IP 数据包在网络间转发过程中,很可能会“迷路”或进入循环网络,造成网络堵塞。在 IP 首部的TTL字段通过控制 IP 数据包 存活的 跳数,以避免“迷路”的 IP 数据包长期占据网络带宽。
首部校验和(Header Checksum)
当数据帧到达目标主机/路由器后,会拆掉它的MAC 首部和尾部,恢复成 IP 数据包。然后根据 IP 首部的首部校验和简单地校验数据传输是否正确。如果正确,则路由器会继续将其封装成帧,传输给下一跳。
重组(Reassembly)
分片封装成的 IP 数据包 到达完全,校验成功后,通过 IP 首部的 标识(Identification),标记(Flag) 和 片偏移(Fragment Offset) 字段将分片的上层 PDU 重组。
例子详解
- 分片:主机 A 将上层 PDU 分片打包成 IP 数据包,然后封装成帧,发送到局域网中。
- 转发:数据帧在主机 A 所在的局域网 L1中找不到地址为 IP(B) 的主机,于是将该数据帧发给网关路由器 R1,路由器 R1 拆开该数据帧,查看IP 数据包 首部的目的 IP 地址 ,然后根据IP 地址将该数据帧转发到相应的网络 Net1。
- TTL:路由器转发数据帧时,会打开其负载的数据包,查看 TTL 值。当 TTL 值为 0 时,路由器会丢弃该数据包。否则路由器会将 TTL的值减一,然后封装成帧,传输给下一跳。
- 首部校验和:数据帧 从 Net1 路由到 路由器 R1,发送到 局域网 L2中。根据局域网协议,该数据帧最终被主机 B 接收。在传输过程中遇到的 路由器/主机 将拆掉数据帧的 MAC 首部 和 尾部,得到其负载的 IP 数据包。然后根据 IP 首部的首部校验和简单地校验数据传输是否正确。如果不正确,则直接丢弃该 IP 数据包,不做差错处理(上层协议会做处理)。
- 重组:分片封装成的 IP 数据包到达完全,校验成功后,通过 IP 首部的标识(Identification),标记(Flag) 和 片偏移(Fragment Offset) 字段将分片的上层 PDU 重组。
IP 协议包(Packet)
- 版本(Version):4位。IPv4 是 4, IPv6 是 6。
- Internet 首部长度(Internet Header Length, IHL):4位。IPv4 的首部长度(单位: 32位字)。
- 服务类型(Type of Service, ToS):8位。现在分为用于支持不同服务的 区分服务(Differentiated Services, DiffServ) 字段(前 6 位) 和用于拥塞控制的显示拥塞控制(Explicit Congestion Notification , ECN) 字段(后 2 位)。
- 总长度(Total Length):16位。IP 数据包的首部和数据的总长度(单位:字节)。
- 标识(Identification): 16位。对数据包进行编号,同一个的上层 PDU 分片得到的各个 IP 数据包 编号相同。标识字段用于分片后的重组。
- 标志(Flag):3位。最低位记为 MF(More Fragment), 当 MF = 1 时,表示后面还有与当前数据包分片自同一上层 PDU 的数据包。中间为记为 DF(Don’t Fragment), 当 DF = 0 时,才允许分片。最高位保留,必须置为 0。
- 片偏移(Fragment Offset):13位。上层 PDU 分片后的 IP 数据包 在原 PDU 中的相对偏移位置。偏移单位是 8 字节。也就是说,每个分片的长度一定是 8 字节(64 位) 的整数倍。
- 生存时间(Time To Live, TTL):8位。该 数据包 最多经过的路由器个数。每经过一个路由器,该值减一。当 TTL 为 0 时,路由器丢弃该 数据包。
- 协议(Protocol): 8位。指出当前数据包携带的数据是使用哪种协议。如,ICMP 是 1, IGMP 是 2, TCP 是 6, UDP 是 17。
- 首部校验和(Header Checksum):16位。简单校验数据包首部是否出差错。如果出错,则直接丢弃。每经过一个路由器都会计算一下首部校验和,因为首部的 TTL 等字段可能会发生改变。
- 源地址(Source address): 32 位。
- 目标地址(Destination address): 32位。
- 选项(Options):不常用。
参考文献
- Internet Protocol- Wikipedia
- Best-effort delivery - Wikipedia
- Connectionless communication - Wikipedia
- Protocol data unit - Wikipedia
- Maximum transmission unit - Wikipedia
- maximum transmission unit (MTU)
- Gateway (telecommunications) - Wikipedia
- W.Richard Stevens等著,《TCP/IP 详解(卷一: 协议)》
- 谢希仁编著, 《计算机网络》