TCP/IP 学习笔记 | IP:网际协议
切记:少就是多,慢就是快。
IP (Internet Protocol) 是 TCP/IP 协议族中最为核心的协议。所有的 TCP、UDP、ICMP 及 IGMP 数据都以 IP 数据报格式传输的。
特性
不可靠
(unreliable)IP大哥牛皮哄哄地说:“我只管寄包裹,传得到传不到我不管,但是如果没传成功,我儿子ICMP会通知你。想要可靠,你还是找我另一个儿子TCP吧。”无连接
(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,下面介绍一下每部分的含义:
Version4bit
协议版本号,例如 IPv4 的版本号为 4Header Length4bit
首部长度,32bit 的数量,一般情况下值为 0101b,即 5x4=20B,最大 1111b,即 60BTOS | DSCP8bit(Type of Service)
服务类型,前 3bit 优先级字段(现已忽略),后 4bit 分别代表:最小时延、最大吞吐量、最高可靠性和最小费用,且只能置其中 1bit。如果所有 4bit 均为 0,那么就意味着是一般服务。最后 1bit 为保留字段。如下图所示:
后来在
RFC2474中又重新对TOS进行了划分,即 Differentiated Services Field Codepoints,简称DSCP。Total Length16bit
IP 包总长,单位 Bytes,长度 16bit,因此 IP 包的最大长度为 2^16-1 = 65535B,上面抓包的例子中 IP 包总长为 57B。ID16bit(Identification)
标识字段,相当于IP数据报的ID,通常每发送一份报文它的值就会加 1。如果因为数据大于链路层MTU导致IP数据报分段(Fragment)的话,则每个分段的IP数据报的标识都是一样的。
从我本地抓包结果看,从本机发往外部IP的TCP包,这个字段恒为 0,有大神可以解释么?Flags3bit
该字段第一位不使用。第二位是DF (Don't Fragment)位,DF位设为 1 时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF (More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为 1。Offsets13bit
位偏移,用于分段后标志该IP数据报相对原来数据报的偏移量。以 8 个字节为偏移单位,也就是说,每个分片的长度一定是8B (64bit)的整数倍。TTL8bit(Time to Live)
生存时间,标识了可以经过的最多路由器数,TTL的初始值由源主机设置(通常为 32 或 64),一旦经过一个处理它的路由器,它的值就减去 1。当该字段的值为 0 时,数据报就被丢弃,并发送ICMP报文通知源主机。Protocol8bit
协议,常用的有:ICMP(1)、TCP(6)、UDP(17),详细清单见 维基百科Header Checksum8bit
首部校验,根据IP首部计算的检验和码,它不对首部后面的数据进行计算。如果校验失败则丢弃该数据报,但不会跟TTL为 0 时一样发送ICMP报文,而是交给上层协议发现数据丢失进行重传。Source & Destination Address2 x 32bit
源地址和目标地址,例如7f 00 00 01表示127.0.0.1。要注意除非使用NAT,否则整个传输的过程中,这两个地址不会改变。Optionsn x 32bit
可选项,一般为空,是数据报中的一个可变长的可选信息,主要用于测试。目前,这些任选项定义如下:
• 安全和处理限制(用于军事领域,详细内容参见RFC 1108[Kent 1991])
• 记录路径(让每个路由器都记下它的IP地址,见7.3节)
• 时间戳(让每个路由器都记下它的IP地址和时间,见7.4节)
• 宽松的源站选路(为数据报指定一系列必须经过的IP地址,见8.5节)
• 严格的源站选路(与宽松的源站选路类似,但是要求只能经过指定的这些地址,不能经过其他的地址)。
附录
电子书下载:《TCP/IP详解 卷一:协议》
OSI 七层模型图解:
