Post

文章详情预览
← 返回文章流

以太网、IP、TCP、UDP 头部格式

来源预览:personal-wiki/raw/blog-vioiv/posts/20200403-以太网、IP、TCP、UDP头部格式.md

以太网帧的格式

以太网帧格式图

其中的源地址和目的地址是指网卡的硬件地址,也叫 MAC 地址,长度是 48 位,也就是 6 个字节,是在网卡出厂时固化的。

注意网卡芯片收到的数据就是如上所示的一长串数据,其中包括以太网帧头、IP 报头、传输层协议段头和应用层所需数据。

以太网帧中的数据长度规定最小 46 字节,最大 1500 字节。ARP 和 RARP 数据包的长度不够 46 字节时,要在后面补填充位。最大值 1500 称为以太网的最大传输单元 MTU。

MTU 是指数据帧中有效载荷的最大长度,不包括帧首部的长度。

IP 报头格式

IP 是 TCP/IP 协议簇中最为重要的协议。所有的 TCP、UDP、ICMP 和 IGMP 数据都以 IP 数据报格式传输。IP 提供的是不可靠、无连接的协议。

IP 报头格式图

普通的 IP 首部长为 20 个字节,除非含有选项字段。

4 位版本:目前协议版本号是 4,因此 IP 有时也称作 IPv4。

4 位首部长度:首部长度指的是首部占 32 bit 字的数目,包括任何选项。由于它是一个 4 bit 字段,最大表示 15 行,一行 4 个字节,因此首部长度最长为 60 个字节。

服务类型 TOS:服务类型字段包括优先权字段、TOS 子字段和未用位。TOS 可表示最小时延、最大吞吐量、最高可靠性和最小费用。

总长度:总长度字段是指整个 IP 数据报的长度,以字节为单位。利用首部长度和总长度字段,就可以知道 IP 数据报中数据内容的起始位置和长度。

标识字段:标识字段唯一地标识主机发送的每一份数据报。如果分片的话,每一片的标识字段都是一样的,便于目的主机把这些分片组装起来。

3 位标志:

  • CU:保留位。
  • DF:表示如果这个包大于 MTU,不要分片,直接丢掉,并通过 ICMP 告诉源主机当前 MTU。
  • MF:1 表示这一片不是最后一片,后面还有分片;0 表示这是最后一片。

片偏移量:用于在目的主机把分片按顺序串起来。

生存时间:TTL 字段设置数据报可以经过的最多路由器数,每经过一个路由器值减 1,值为 0 时数据报被丢弃,并发送 ICMP 报文通知源主机。

协议:这个字段定义了 IP 数据报的数据部分使用的协议类型,常见值包括 ICMP、IGMP、TCP、UDP、IGRP 和 OSPF。

首部检验和:首部检验和字段是根据 IP 首部计算的检验和码,不对首部后面的数据进行计算。

TCP 首部格式

尽管 TCP 和 UDP 都使用相同的网络层 IP,TCP 却向应用层提供与 UDP 完全不同的服务。TCP 提供一种面向连接的、可靠的字节流服务。

如果不计任选字段,TCP 首部通常是 20 个字节。

TCP 首部格式图

源端口号和目的端口号:用于寻找发送端和接收端应用进程。这两个值加上 IP 首部中的源端 IP 地址和目的端 IP 地址,可以唯一确定一个 TCP 连接。

序号字段:序号用来标识从 TCP 发送端向 TCP 接收端发送的数据字节流,表示在这个报文段中的第一个数据字节。

当建立一个新的连接时,SYN 标志变为 1。序号字段包含由这个主机选择的连接初始序号 ISN。该主机要发送数据的第一个字节序号为 ISN 加 1,因为 SYN 标志消耗了一个序号。

确认序号:确认序号包含发送确认的一端所期望收到的下一个序号,因此确认序号应当是上次已成功收到的数据字节序号加 1。只有 ACK 标志为 1 时确认序号字段才有效。

首部长度:给出首部中 32 bit 字的数目。由于任选字段长度可变,需要这个值确定 TCP 首部实际长度。

标志字段:

  • URG:紧急指针有效。
  • ACK:确认序号有效。
  • PSH:接收方应该尽快将这个报文段交给应用层。
  • RST:重建连接。
  • SYN:同步序号,用来发起一个连接。
  • FIN:发送端完成发送任务。

窗口大小:TCP 的流量控制由连接的每一端通过声明窗口大小来提供。窗口大小为字节数,起始于确认序号字段指明的值。

检验和:检验和覆盖整个 TCP 报文段,包括 TCP 首部和 TCP 数据。

紧急指针:只有当 URG 标志置 1 时紧急指针才有效。它表示紧急数据最后一个字节的序号。

选项:最常见的可选字段是最长报文大小 MSS。每个连接方通常都在建立连接的 SYN 报文段中指明这个选项。

UDP 首部

UDP 是一个简单的面向数据报的运输层协议。进程的每个输出操作都正好产生一个 UDP 数据报,并组装成一份待发送的 IP 数据报。

UDP 首部格式图

端口号:用来表示发送和接收进程。TCP 端口号与 UDP 端口号是相互独立的。

长度:UDP 长度字段指的是 UDP 首部和 UDP 数据的字节长度。该字段的最小值为 8 字节。

检验和:UDP 检验和是一个端到端的检验和,由发送端计算,然后由接收端验证,用于发现 UDP 首部和数据在传输过程中发生的改动。