天天看点

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

1. 概述

TCP/IP应该是程序员的基本功,但是之前对这个印象总是模模糊糊,花了一些时间对相关的东西进行了整理。本文介绍网络传输中的基本元素,主要包括如下内容

  • 帧的分类、结构及字段意义
  • 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义
  • 序列号和确认号
  • TCP的窗口机制和可用窗口大小协商机制

2. 帧

网络上,单次传输的数据量是有限。在传输数据时,会将大数据分割若干个数据包进行传输。这个数据包称作以太帧(Frame),帧也称为协议数据单元(PDU)。不同的协议使用不同的帧格式和MTU值(Maxitum Transmission Unit 最大传输单元),帧主要有两大类:

  • IEEE 802.3 以太网标准:又分为3种类型
    • Novell raw IEEE 802.3
    • IEEE 802.2 LLC
    • IEEE 802.2 SNAP
  • Ethernet II 帧,又称为DIX帧,是最常见的帧类型,是TCP/IP网络中使用的以太网帧格式

EEE 802.3帧和Ethernet II 帧是相互兼容,它们的格式也很像,如下图:

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

以太网帧的大小范围(即MTU)应该是[64=46+18, 1522=1500+22],其实最开始EthernetII和802.3规定最大帧为1518,后来为支持vlan,1998年802.3ac规定最大帧为1518+4(vlan)=1522

备注:如果帧长小于64字节,则要求“填充”,以使这个帧的长度达到64字节

2.1. IEEE 802.3格式

上节图中第一行:显示IEEE 802.3 格式,各个字段意义如下:

  • 一个帧以7个字节(Preamble)的前导码和1个字节(Start of frame delimiter)的帧开始符作为帧的开始。
  • 报头包含源地址(MAC source)和目标地址的MAC地址(MAC destination),以Payload部分的长度(length (IEEE 802.3))和可选的用于说明VLAN成员关系和传输优先级的IEEE 802.1Q VLAN 标签(802.1Q tag (optional))。
  • 帧校验码(Frame check sequence )是一个32位循环冗余校验码,以便验证帧数据是否被损坏。
  • 帧间距(Interpacket gap):当一个帧发送出去之后,发送方在下次发送帧之前,需要再发送至少12个octet的空闲线路状态码。
  • 负载(Payload):帧的负载

2.2. Ethernet II 帧格式

Ethernet II 帧是事实的标准,它和IEEE 802.3 帧除了以下部分外,其他基本都相同:

1. 前序部分,802.3拆分为Preamble(7 octets)和SFD(Start of frame delimiter, 1 octet);Ethernet II只有Preamble(8 octets)。

2. 对802.3来说,类型或长度部分(Ethertype (Ethernet II) or length (IEEE 802.3)),表示的是长度,其值小于等于1500;对Ethernet II来说,表示的是类型,其值大于1536,通过值大小即可区分两种帧。另外1500 and 1536之间的数字未定义。

“802.1Q tag (optional)”是可选部分,去除这个字段后,常用的Ethernet II 帧格式如下:

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

3. 包的概述

通过wireshark抓包,选取一个包

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

它主要包括5部分内容:

- 第一行物理层数据,物理层数据帧,这层数据单位为比特(bit)

- 第二行数据链路层数据,以太网帧头部信息,这层数据单位为帧(frame)

- 第三行网络层数据,IP头信息,这层数据单位为数据包(packet)

- 第四行传输层数据,TCP头信息,这层数据单位可以叫数据包(packet),为了区分如果是TCP的数据单元称为段 (segments)而UDP协议的数据单元称为数据报(datagrams)

- 第五行应用层数据,负载的数据,不是必须

下面会详细介绍前四层的详细结构和字段说明

4. 物理层数据帧概况

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

以上内容不是直接从网络中传送过来的,而是在解析帧时产生的。所以这些内容不计算在帧的长度中。

5. 数据链路层以太网帧头部信息

太网帧头部的格式如下:

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

在wireshark中详细的信息如下:

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

6. IP数据报格式

IP数据报格式如下:

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

各个字段的意义如下:

  • 目前的协议版本号是4,因此I P有时也称作I P v 4。
  • 首部长度指的是首部占 32 bit字的数目,包括任何选项。由于它是一个 4比特字段,因此首部最长为6 0个字节
  • 服务类型(TOS):现在大多数的T C P / I P实现都不支持TO S特性
  • 总长度字段是指整个 I P数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道 I P数据报中数据内容的起始位置和长度。由于该字段长 1 6比特,所以 I P数据报最长可达 6 5 5 3 5字节
  • 标识字段唯一地标识主机发送的每一份数据报。通常每发送一份报文它的值就会加 1
  • 标志字段和片偏移字段:在分片时使用,当发送的IP数据报的大小超过了MTU时,IP层就需要对数据进行分片,否则数据将无法发送成功。IP分片发生在IP层,不仅源端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比源端网络的MTU要小,路由器就可能对IP数据报再次进行分片。而分片数据的重组只会发生在目的端的IP层。
  • 生存时间字段设置了数据报可以经过的最多路由器数。它指定了数据报的生存时间。T T L的初始值由源主机设置,一旦经过一个处理它的路由器,它的值就减去 1。当该字段的值为 0时,数据报就被丢弃,并发送 I C M P报文通知源主机
  • 协议字段: TCP/UDP
  • 首部检验和字段是根据I P首部计算的检验和码。它不对首部后面的数据进行计算
  • 源 I P地址
  • 目的 I P地址
  • 任选项,是数据报中的一个可变长的可选信息

备注:T C P首部如果不计任选字段,它通常是 2 0个字节。

在wireshark中详细的信息如下:

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

7. TCP数据报格式

TCP数据报格式:

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

各个字段的意义如下:

  • 源端和目的端的端口号,用于寻找发端和收端应用进程。这两个值加上I P首部中的源端I P地址和目的端I P地址唯一确定一个T C P连接
  • 序号用来标识从T C P发端向T C P收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节。如果将字节流看作在两个应用程序间的单向流动,则 T C P用序号对每个字节进行计数。
    • 序号(Sequence Number):用来标识从TCP发端向TCP收端发送的数据字节流,它表示在这个报文段中的的第一个数据字节在数据流中的序号;主要用来解决网络报乱序的问题;
    • 确认序号(Acknowledgment Number):32位确认序列号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到数据字节序号加1。主要用来解决丢包的问题
  • 首部长度 需要这个值是因为任选字段的长度是可变的。这个字段占4 bit,因此T C P最多有6 0字节的首部。然而,没有任选字段,正常的长度是 2 0字节
  • 在TCP首部中有6个标志比特。它们中的多个可同时被设置为 1
    • URG 紧急指针,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据
    • ACK 确认序号有效
    • PSH 接收方应该尽快将这个报文段交给应用层。这个标志位表示Push操作。所谓Push操作就是指在数据包到达接收端以后,立即传送给应用程序,而不是在缓冲区中排队
    • RST 表示连接复位请求。用来复位那些产生错误的连接,也被用来拒绝错误和非法的数据包
    • SYN 同步序号用来发起一个连接。
    • FIN 发端完成发送任务。表示发送端已经达到数据末尾,没有数据可以传送了
  • 窗口大小:T C P的流量控制由连接的每一端通过声明的窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值,这个值是接收端正期望接收的字节。窗口大小是一个 16 bit字段,因而窗口大小最大为 6 5 5 3 5字节。
  • 校验和:检验和覆盖了整个的T C P报文段:T C P首部和T C P数据。这是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。
  • 紧急指针:只有当U R G标志置1时紧急指针才有效。紧急指针是一个正的偏移量,和序号字段中的值相加表示紧急数据最后一个字节的序号。 T C P的紧急方式是发送端向另一端发送紧急数据的一种方式。

备注:TCP头的信息长度为20字节

在wireshark中详细的信息如下:

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

8. 长度计算

在上文中出现了N个长度,全部罗列如下:

  • 帧长度,即整个包的总长度 = 2220字节
  • 物理层数据帧概述信息长度:此部分的数据不是从网络上传输的数据,而是接收到信息时产生的记录,所以不计算到帧的长度,即0字节
  • 数据链路层以太网帧头部信息长度 = 14字节,固定值
  • IP头长度 = 20字节
  • TCP头升序 = 20 字节
  • TCP负载的数据 = 2160 字节

我们整理一下它们的关系

帧长度(2220字节) = 物理层数据帧概述信息长度(0字节) + 数据链路层以太网帧头部信息长度(14字节) + IP头长度( 20字节) + TCP头长度 (20 字节) + TCP负载的数据 (2166 字节)

9. 序号增加规则和相对序号

TCP会话的每一端都包含一个32位(bit)的序列号,序列号为当前端成功发送的数据位数,确认号为当前端成功接收的数据位数。备注,如果收到的包有SYN标志位和FIN标志位,确认号也需要加1。

每个TCP会话中,初始序列号是随机的,可能是任何值,如0xf61c6cbe。但是在wireshark中,为了方便,使用相对序列号/确认号,而不是实际序列号/确认号。显示的相对值=(实际的序列号 - 会话初始的序列号)

10. TCP的窗口机制和可用窗口大小协商机制

TCP通过序列号及确认号机制让数据可靠的传送。如果每次发送一个数据都需要确认,则传输效率会很低。为此引入了滑动窗口机制。滑动窗口充分利用双方的带宽及缓冲区,发送方不必等待对方的确认,可以连续发送多个数据包给对方,而对方可以暂时把这些数据存放在缓冲区,并给对方一个确认。这样,可以大大增加数据传输的速度。为了避免接收方的缓冲区填满导致数据丢失的情况,引入了TCP窗口的可用窗口大小协商机制。通信双方通过TCP包中了字段Windows scale和windows size value来告知对方当前可用缓冲值。

10.1 下面通过抓包查看TCP会话是如何协商可用窗口大小

在默认的TCP协议里,报文只能用16位窗口,即最大值为65535。但是随着带宽已经大规模提升,千兆不很常见,65535长度窗口已经不够用,为了突破这个限制,便有了Window Size Scaling选项,使得真正的可用窗口大小为 2Window Size Scaling * windows size value 。

以三次握手协议说明窗口协商的过程

在双方第一次握手的协议包里

包中重要的属性如下:

windows size value : 8192

calculated window size : 8192 (因为双方还没有协商完毕,还不知道对方是否支持Windows scale,所以本次的可用窗口值等于calculated window size)

Windows scale: 2 (multiply by 4)

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

第二次握手

包中重要的属性如下:

windows size value : 14600

calculated window size : 14600 (因为双方还没有协商完毕,还不知道对方是否支持Windows scale,所以本次的可用窗口值等于calculated window size)

Windows scale: 7(multiply by 128):同时也表示自己支持这个属性

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

第三次的握手

包中重要的属性如下:

windowss size value : 16652

Calculated window size : 66608

因为双方都支持Window Size Scaling选项,所以启用这个功能,Calculated window size 变大。

Calculated window size = windowss size value * Windows size scaling factor

Windows size scaling factor : 4 = 2Window Size Scaling

即: 66608 = 16652 * 4 = 16652 * 2 2

所以告诉对方,我的可用窗口大小为66608

如果有一方不支持这个属性,则Windows size scaling factor不可用,窗口的大小只能是windowss size value值

网络系列一 结合wireshark学习TCP/IP协议中帧,IP包,TCP包的包结构及字段意义

继续阅读