TCP/IP 学习笔记 | IP:网际协议

切记:少就是多,慢就是快。

IP (Internet Protocol)TCP/IP 协议族中最为核心的协议。所有的 TCPUDPICMPIGMP 数据都以 IP 数据报格式传输的。

特性

  1. 不可靠 (unreliable)
    IP 大哥牛皮哄哄地说:“我只管寄包裹,传得到传不到我不管,但是如果没传成功,我儿子 ICMP 会通知你。想要可靠,你还是找我另一个儿子 TCP 吧。”

  2. 无连接 (connectionless)
    IP 大哥喝了口茶,又说:“每个包裹我都会分开来寄,你别管我每个包裹走哪条路线,我也不保证哪个包裹先送到。”

抓包

首先,我们先抓个包看看,一个完整的数据包是怎样的:

''' 这 61 Bytes 的数据就是完整的数据包结构了
-------------------------------------------------------------------------
0000   02 00 00 00 45 00 00 39 00 00 40 00 40 06 00 00   ....E..9..@.@...
0010   7f 00 00 01 7f 00 00 01 c1 69 0b b8 00 53 40 d6   .........i...S@.
0020   48 1d d8 7d 80 18 18 eb fe 2d 00 00 01 01 08 0a   H..}.....-......
0030   19 a1 d3 45 19 a1 d3 45 48 65 6c 6c 6f            ...E...EHello

我们像剥洋葱一样,将它一层一层剥开来分析。

''' 瞅瞅,最前面这一层 4 Bytes 的数据是 Mac 帧头,是链路层的数据结构
它说明了我们数据包走的是 Loopback 网卡
-------------------------------------------------------------------------
0000   02 00 00 00                                       ....
''' 这一层 20 Bytes 的数据就是 IP 头,是网络层的数据结构
它描述了这个包从哪来到哪去,家里有几口人,人均几亩地(咳咳)
-------------------------------------------------------------------------
0000   45 00 00 39 00 00 40 00 40 06 00 00 7f 00 00 01   E..9..@.@.......
0010   7f 00 00 01                                       ....
''' 这一层是 TCP 头,是传输层的数据结构
-------------------------------------------------------------------------
0000   c1 69 0b b8 00 53 40 d6 48 1d d8 7d 80 18 18 eb   .i...S@.H..}....
0010   fe 2d 00 00 01 01 08 0a 19 a1 d3 45 19 a1 d3 45   .-.........E...E
''' 最后包裹拆完就是传输的核心数据啦,下面是我们经过 utf8 编码的字符串数据 Hello
-------------------------------------------------------------------------
0000   48 65 6c 6c 6f                                    Hello

数据结构

下面有请主角 IP 协议,我们看看 IP 头的定义是怎样的:

从图中可以看出,IP头一般是 20 Bytes,包的总大小不超过 64 KB,下面介绍一下每部分的含义:

  1. Version4bit
    协议版本号,例如 IPv4 的版本号为 4

  2. Header Length4bit
    首部长度,32bit 的数量,一般情况下值为 0101b,即 5x4=20B,最大 1111b,即 60B

  3. TOS | DSCP8bit (Type of Service)
    服务类型,前 3bit 优先级字段(现已忽略),后 4bit 分别代表:最小时延、最大吞吐量、最高可靠性和最小费用,且只能置其中 1bit。如果所有 4bit 均为 0,那么就意味着是一般服务。最后 1bit 为保留字段。如下图所示:

    后来在 RFC2474 中又重新对 TOS 进行了划分,即 Differentiated Services Field Codepoints,简称 DSCP

  4. Total Length16bit
    IP 包总长,单位 Bytes,长度 16bit,因此 IP 包的最大长度为 2^16-1 = 65535B,上面抓包的例子中 IP 包总长为 57B。

  5. ID16bit (Identification)
    标识字段,相当于 IP 数据报的 ID,通常每发送一份报文它的值就会加 1。如果因为数据大于链路层 MTU 导致IP数据报分段 (Fragment) 的话,则每个分段的 IP 数据报的标识都是一样的。
    从我本地抓包结果看,从本机发往外部 IPTCP 包,这个字段恒为 0,有大神可以解释么?

  6. Flags3bit
    该字段第一位不使用。第二位是 DF (Don't Fragment) 位,DF 位设为 1 时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是 MF (More Fragments) 位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将 MF 位设为 1。

  7. Offsets13bit
    位偏移,用于分段后标志该 IP 数据报相对原来数据报的偏移量。以 8 个字节为偏移单位,也就是说,每个分片的长度一定是 8B (64bit) 的整数倍。

  8. TTL8bit (Time to Live)
    生存时间,标识了可以经过的最多路由器数,TTL 的初始值由源主机设置(通常为 32 或 64),一旦经过一个处理它的路由器,它的值就减去 1。当该字段的值为 0 时,数据报就被丢弃,并发送 ICMP 报文通知源主机。

  9. Protocol8bit
    协议,常用的有:ICMP(1)、TCP(6)、UDP(17),详细清单见 维基百科

  10. Header Checksum8bit
    首部校验,根据 IP 首部计算的检验和码,它不对首部后面的数据进行计算。如果校验失败则丢弃该数据报,但不会跟 TTL 为 0 时一样发送 ICMP 报文,而是交给上层协议发现数据丢失进行重传。

  11. Source & Destination Address2 x 32bit
    源地址和目标地址,例如 7f 00 00 01 表示 127.0.0.1。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。

  12. Optionsn x 32bit
    可选项,一般为空,是数据报中的一个可变长的可选信息,主要用于测试。目前,这些任选项定义如下:
    • 安全和处理限制(用于军事领域,详细内容参见RFC 1108[Kent 1991])
    • 记录路径(让每个路由器都记下它的IP地址,见7.3节)
    • 时间戳(让每个路由器都记下它的IP地址和时间,见7.4节)
    • 宽松的源站选路(为数据报指定一系列必须经过的IP地址,见8.5节)
    • 严格的源站选路(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)。

附录

  1. 电子书下载:《TCP/IP详解 卷一:协议》

  2. OSI 七层模型图解: