自学 Linux 15—Linux 用户层网络编程之 TCP/IP 协议族简介— TCP/IP 协议栈详细知识点

TCP/IP 协议栈

  在博客 中对 ISO/OSI7 层结构进行了简单的介绍,由于 ISO 制定的 OSI 参考模型过于庞大、复杂,在实现时造成了很多困难,从而招致了许多批评。在实际实现中,TCP/IP协议栈获得了更为广泛的应用,目前主流的操作系统网络协议栈基本上采用了 TCP/IP协议栈

1. TCP/IP 协议栈参考模型

  经典的 TCP/IP 参考模型从上至下分为 4 个层次:应用层传输层网络互联层主机到网络层。与 OSI 模型不同的是在 TCP/IP 参考模型中,根据实际情况将 OSI 参考模型的会话层和表示层合并到应用层中:同时,将 OSI 参考模型中的数据链路层和物理层合并为主机到网络层TCP/IP 参考模型与 OSI 参考模型的对照参见下图(TCP/IP 参考模型和 OSI 参考模型对照)。

TCP/IP 参考模型和 OSI 参考模型对照

  实际应用中 TCP/IP 的层次结构如下图(TCP/IP 参考模型的层次结构)所示,其各层的主要功能如下所述。

TCP/IP 参考模型的层次结构

  █ 主机到网络层:包括设备和数据链路层的主机到网络层,在 TCP/IP 参考模型中并没有描述这一层的具体实现,只是规定能给其上一层的网络互联层提供访问接口, 可以传输 IP 数据包,这一层的具体实现随着网络类型的不同而不同。
  █ 网络互联层:网络互联层是整个TCP/IP协议栈的核心。它将数据包进行分组并发 往目的主机或者网络,为了尽快地发送分组,一个数据包的分组可能要经过不同 的路径进行传递。这造成了分组之间到达目的网络或者主机的顺序不是原来发送 分组的顺序,需要在本层对分组进行排序。网络互联层定义了数据包的分组格式 和协议——IP 协议(Internet Protocol),因此网络互联层又经常称为 IP 层网络互联层的功能有路由、网际互联和拥塞控制等
  █ 传输层TCP/IP 参考模型中传输层的功能提供源主机和目标主机上的对等层之间可以进行会话的机制。在传输层中定义了两种协议,传输控制协议(transmission control protocol, TCP)用户数据报协议(user datagram protocol,UDP)
  TCP 协议是一个面向连接的、可靠的协议。它利用 IP 层的机制在不可靠连接的基础上实现可靠的连接,通过发送窗口控制、超时重发、分包等方法将一台主机发出的字节流发往互联网上的其他主机
  UDP 协议是一个不可靠的、无连接协议,主要 适用于不怕数据丢失、不需要对报文进行排序、流量控制的场景
  █ 应用层TCP/IP 参考模型中把 OSI 参考模型中的会话层和表示层取消,其功能被合并到应用层。基于 TCPUDP 实现了很多的应用层协议,如基于 TCP 协议的文件传输协议(File Transfer Protocol, FTP)Telnet 协议超文本链接协议(Hyper Text Transfer Protocol, HTTP)等,基于 UDP 的协议有简化的 FTP 协议 TFTP网络管理协议 SNMP域名服务 DNS网络文件共享 NFS 和 SAMBA 等,以及两种方式均有实现的协议,例如目前应用十分广泛的多种 P2P 协议(BitTorrent、 eMule 等)

  ㊨ 注意:IP 层中包含网际控制报文协议(ICMP)和地址识别协议,实际上它们并不是 IP 层的一部分,但直接同 IP 层一起工作。ICMP 用于报告网络上的某些出错情况,允许网际路由器传输差错信息或测试报文。ARP 处于 IP 和数据链路层之间,它是在 32 位 IP 地址和 48 位局域网地址之间执行翻译的协议

2. 主机到网络层协议

  通常情况下,主机到网络层的协议对应于 OSI 的数据链路层,对于硬件及其驱动层 TCP/IP 协议没有进行规范。由 TCP/IP4 层结构可以看出,本层主要为 IP 协议和 ARP 协议提供服务、发送和接收网络数据报。本层中由于要实现跨网和跨设备的互通,有很多的实现方式,例如串行线路(Seria丨Line IP,SLIP)、点对点 PPP 等,本博客中仅对以太网的实现方式进行简单地介绍。

  以太网是由数字设备公司(Digital EquipmentCorp,DEC)、英特尔公司和 Xerox 公司 在 1982 年公布的一个标准,目前 TCP/IP 技术主要基于此标准

  以太网采用一种带冲突检测的载波侦听多路接入的方法进行传输,即 CSMA/CD(Carrier Sense,Multiple Access with Collision Detection)。以太网的封包格式如下图(以太网的数据格式)所示,在 IP 数据的基础上增加了 14 个字节。

以太网的数据格式
  以太网用 48bit6 字节)来表示源地址和目的地址。这里的源地址和目的地址指的是硬件地址,例如网卡的 MAC 地址。

  在地址后面是两个字节的表示类型的字段,例如 0800 表示此帧的数据为 IP 数据,0806 表示此帧为 ARP 请求。

  类型字段之后是数据,对于以太网,规定数据段的大小范围是 46 个字节到 1500 个字节,不足的数据要用空字符填满。例如 ARP 协议的数据格式为 28 个字节,为了符合规范, 其后有 18 个字节的占位符用于满足最少 46 字节的要求。

  ㊨ 注意:数据段的长度有一个最大值,以太网为 1500,这个特性称为 MTU,即最大传输单元。如果 IP 层有一个要传送的数据长度比 MTU 大,在 IP 层数据要进行分片,使得每个片都小于 MTU

  CRC 字段用于对帧内数据进行校验,保证数据传输的正确性,通常由硬件实现,例如在网卡设备中实现网络数据的 CRC 校验。

  ㊨ 注意:以太网的头部长度为 14 的特点在某些平台的实现上会造成效率上的问题,例如 4 字节对齐的平台,在取得 IP 数据的时候通常会重新复制一次。

3. IP 协议

  IP 协议是 TCP/IP 协议中最重要的协议,它为 TCPUDPICMP 等协议提供传输的通路。IP 层的主要目的是提供子网的互联,形成较大的网络,使不同的子网之间能传输数据。

  IP层主要有如下作用:
  █ 数据传送:将数据从一个主机传输到另一个主机。
  █ 寻址:根据子网划分和 IP 地址,发现正确的目的主机地址。
  █ 路由选择:选择数据在互联网上的传送路径。
  █ 数据报文的分段:当传送的数据大于 MTU 时,将数据进行分段发送和接收并组装。IP 数据的格式如下图(IP 头部的数据格式)所示,不包含选项字段,其头部的长度为 20 个字节。

IP 头部的数据格式

1. 版本

  IP 协议的版本号,长度为 4 位,规定网络所实现的 IP 版本,例如,如果主机为 IPv4 协议,此字段的值为 4,而 IPv6 协议此字段的值为 6

2. 首部长度

  首部长度指的是 IP 字段除去数据的整个头部的数据长度,以 32 位的字为单元计算。

  IP 首部的长度以字为增量变化,最短的 IP 头是 20 字节(不包括数据和选项)。因此这个字段最小值是 520 字节为 160 位,160/ 32 位 = 5),也就是 532 位字长。由于它是一个 4 位的字段,所以 IP 的首部最长为 60 个字节(15 个字乘以 4)。

3. 服务类型(TOS)

  IP 的服务类型字段长度为 8 位。此字段包含 3 位的优先权(现在已经忽略),4位的 T 服务类型子字段和 1 位的保留位(必须置 0)。4 位的服务类型分别为最小延迟(D)、最大吞吐量(T)、最高可靠性(R)、最小费用(F)。这 4 个位中最多只用一个位置 1,如果全为 0,表示为一般服务。服务类型的具体含义参见下表(服务类型选项含义)。

字段优先权DTRF保留
长度3 位1 位1 位1 位1 位1 位
含义优先级延迟吞吐量可靠性费用未用

  █ 优先权字段 3 位,因此可以有 0〜7 的值(0 为正常值,7 为网络控制,但是此字段目前己经被忽略)。它允许传输站点的应用程序设定向 IP 层发送数据报文的优先权。该字段与 DTRF 相结合,确定应采取哪种路由方式。
  █ D 位字段为 1b 长度,当值为 1 时表示请求低时延。
  █ T 位字段为 1b 长度,当值为 1 时表示请求高吞吐量。
  █ R 位字段为 1b 长度,当值为 1 时表示请求高可靠性。
  █ F 位字段为 1b 长度,当值为 1 时表示请求低费用。

  例如,如果 IP 分组有两个以上的路由方式可进行选择,路由器读取这些字段的值,根据服务类型的设置情况来选择一个合适的路由。服务类型字段由应用程序进行设置,路由器仅在必要时进行读取,不进行设置。

4. 总长度

  总长度字段的长度是 16 位,表示以字节为单位的数据报文长度,长度包含 IP 的头部和数据部分。利用头部长度和总长度字段可以计算 IP 数据报文中数据内容的起始地址和长度,由于本字段的长度为 16 位,所以 IP 数据报文最大可达到 65535 个字节的长度。

5. 标识和片偏移

  IP 每发一份数据报文都会填写一个标识用来表示此数据包,发送完后此值会加 1。在 IP 进行分片的时候,将标识复制的 IP 的头部表示数据报文的来源,还要加上分片数据在原数据报文中的偏移地址,便于之后进行组装。利用字段总长度和片偏移可以重新组装 IP 的数据报文。总长度指出原始包的总长度,片偏移指出该包位于正在组装的 IP 报文的偏移量,偏移量从头部开始计算。

6. 生存时间(TTL)

  **TTL (Time To Live)**字段的值表示数据报文最多可以经过的路由器的数量。它指定数据报文的生存时间,源主机发送数据时设置 TTL(一般为 32 或者 64),经过一个路由器后 TTL 的值减 1。当 TTL0 的时候,路由器丢弃此包,并发送一个 ICMP 报文通知源主机。 TTL 的出现是由于在包的传递过程中可能会出现错误情况,引起包在 Internet 的路由器之间不断循环。为防止此类事件发生,因而引入了 TTL 限制报文经过路由器的个数。

7. 协议类型

  该字段为 8 位长度,表示 IP 上承载的是什么高级协议。在封包和解包的过程中,TCP/IP 协议栈知道将数据发给哪个层的协议做相关的处理,协议的值及含义参见下表(协议类型的含义)。例如,协议类型为 6 时,网络协议栈知道 IP 上承载的是 TCP 协议,IP 层处理完毕后会交给其上一层协议中 UDPTCP 中的 TCP 协议层进行处理。

协议类型协议类型
1ICMP6TCP
2IGMP17UDP
8. 校验和

  校验和是一个 16 位长度的数值,使用循环冗余校验生成,其作用是保证 IP 帧的完整性。发送端发送数据的时候要计算 CRC16 校验值,填入此字段;接收端会计算 IP 的校验值与此字段进行匹配,如果不匹配,表示此帧发生错误,将丢弃此报文。在路由的过程中,由于每经过一个路由器都要修改 TTL 的值,所以需要重新计算 CRC16,将结果填入此字段中。

9. IP 选项

  IP 选项字段是一个 32b 的字段,该选项用来识别 IP 的数据段是正常数据还是用做网络控制的数据。

  主要有如下定义:
  █ 安全和处理限制
  █ 路径记录:记录所经历路由器的 IP 地址。
  █ 宽松源站路由:指定数据报文必须经历的 IP 地址,可以经过没有指定的 IP 地址。
  █ 严格的源站路由:指定数据报文必须经历的 IP 地址,不能经过没有指定的 IP 地址。

10. 源地址和目的地址

  源地址表示发送数据的主机或者设备的 IP 地址,目的地址为接收数据的主机 IP 地址。这两个字段均为 32 位长度。字段的目的用于识别 Internet 上的主机。

4. 网际控制报文协议(ICMP)

  ICMP 协议用于传递差错信息、时间、回显、网络信息等报文控制数据。

1. ICMP 协议格式

  ICMP 协议的数据位于 IP 字段的数据部分,它是在 IP 报文的内部被传输的,如下图(ICMP 报文在 IP 报文中的位置)表示 ICMP 报文在 IP 报文中的位置。

ICMP 报文在 IP 报文中的位置

  ICMP 报文的数据格式如下图(ICMP 报文的数据格式)所示,ICMP 报文的前 4 个字节的格式是相同的,表示类型、代码和校验和,而后面的字节则互不相同。类型字段为 8 个位,可以表示 15 个不同类型的 ICMP 报文。代码段用于对类型字段 ICMP 报文的详细规定,最多可以表示 16 种类型。校验和表示的范围覆盖整个 ICMP 的报文,包括头部和数据部分,校验方法与 IP 一致(CRC16),ICMP 协议的校验和是强制性的。

ICMP 报文的数据格式

2. ICMP 的报文类型

  ICMP 的报文类型由类型和代码来决定报文的方式,具体含义见下表(ICMP 报文类型和代码的含义)。表格中的最后 两列表示报文用于査询还是差错,用 表示肯定。主要包含如下几类,目的不可达、时间戳请求应答、回显请求应答、地址掩码请求应答,具体含义在下表(ICMP 报文类型和代码的含义)中进行了详细的解释。

ICMP 报文类型和代码的含义

3. 目的不可达的报文格式

  ICMP 报文中项目最多的足报文不可达的差错报文,它的格式如下图(ICMP 报文的报文不可表达数据格式)所示。类型字段的值为 3,代码字段根据实呩情况进行设置。第 4〜7 个字节保留,必须设置为 0。余下的字段为不可达 IP 报文的头部(包含选项字段)和 IP 报文中数据部分的前 8 个字节。例如,如果源 IP 头部没有选项字段的话,ICMP 的报文长度为 36 个字节(1 个字节的类型,1 个字节的代码,2 个字节的校验和,4 个字节的保留字段,20 个字节的 IP 头部,8 个字节的数据)。

ICMP 报文的报文不可表达数据格式
  例如,一个端口不可达的 ICMP 报文,可能的数据格式如下图(“ UDP 端口不可到达” 的数据结构示意图)所示。报文包含 14 个字节的以太网头部,20 个字节的 IP 地址头部,加上 ICMP8 个字节的头部,ICMP 数据部分包含出错报文的 IP 头部和 8 个字节的 UDP 头部。

“ UDP 端口不可到达” 的数据结构示意图

4. 地址掩码的请求应答格式

  无盘工作站在启动的时候使用 RARP 协议获得本机的 IP 地址,而子网掩码的获得使用 ICMP 协议获得或者 BOOTP 协议获得。地址掩码请求的格式如下图左图(ICMP 子网掩码请求应答的数据格式)所示,与下图右图(ICMP 报文的数据格式)中的 ICMP 报文相比,这个报文额外包含 3 个字段:标识符、序列号和子网掩码。在发送请求的时候标识符和序列号由请求的主机随意填充,应答时会返回这些值;应答的主机填充子网掩码后发送给请求主机,请求主机对比发送和接收到的标识符和序列号是否一致,由此来决定本机的请求是否有效。

ICMP 子网掩码请求应答的数据格式 和 ICMP 报文的数据格式

  地址掩码请求和发送的过程均对上述的字段进行处理,下面是一个请求发送和接收的具体过程和相关的操作
  █ 请求方类型值为 17,代码为 0,填充标识符和序列号,计算校验和后将请求发送到网络上。
  █ 应答方类型值为 18,代码为 0,标识符和序列号为请求方的值,填充合适的子网掩码,计算校验和后返回给请求方。

5. 时间戳的请求应答格式

  一个主机可以使用 ICMP 的时间戳请求向另一个主机査询当前时间,其格式如下图(ICMP 时间戳请求应答的数据格式)所示。标识符和序列号的含义与网络掩码的请求应答相同。时间截表示的是一个自子夜开始的毫秒数,发起时间戳为发起方发起请求时的时间,接收时间戳为接收方接收到请求的时间戳,传送时间戳为接收方发送响应的时间戳。发起时间戳由请求主机填充,接收时间戳和传送时间戳由应答主机填充,通常后两个时间戳是一致的。

ICMP 时间戳请求应答的数据格式

  利用时间戳请求应答可以计算网络上与目的主机的响应时间,如下图(利用时间戳请求应答计算主机间的响应时间)所示。其中的 “请求” 为请求方到应答方的网络传输时间(还有协议栈的处理时间,但是很少),“应答” 为应答方到请求方的网络传输时间。“请求”过程时间为接收时间戳与请求时间戳的差值。“应答” 过程时间为请求方接收到应答的时间与传送时间戳的差值。

利用时间戳请求应答计算主机间的响应时间

5. 传输协议(TCP)

  传输控制协议(Transmission Control Protocol),简称 TCP 协议,它在原有 IP 协议的基础上,增加了确认重发、滑动窗口和复用/解复用等机制,提供一种可靠的、面向连接的字节流服务。

1. TCP 的特点

  TCP 协议的特点如下所述。
  █ 字节流的服务:使用 TCP 协议进行传输的应用程序之间传输的数据可视为无结构的字节流,基于字节流的服务没有字节序问题的困扰。
  █ 面向连接的服务:在数据进行传输之前,TCP 协议需要先建立连接,之后的 TCP 报文在此连接的基础上传输。
  █ 可靠传输服务:基于校验和应答重发机制保证传输的可靠性。接收方对接收到的报文进行校验和计算,如果有误,不发送确认应答,发送方在超时后会自动重发此报文。
  █ 缓冲传输:缓冲传输可以延迟传送应用层的数据,允许将应用程序需要传送的数据积攒到一定的数量才进行集中发送。
  █ 全双工传输:各主机 TCP 协议以全双工的方式进行数据流交换。
  █ 流量控制TCP 协议的滑动窗口机制,支持主机间的端到端的流量控制。

2. TCP 的数据格式

  TCPIP 协议的基础上进行传输数据,TCP 数据在 IP 报文中的位置,如下图(TCP 数据在 IP 报文中的位置)所示。

TCP 数据在 IP 报文中的位置
  TCP 数据包含头部和数据两部分,其数据格式如下图(TCP 报文的数据格式)所示。主要有源端口号、目的端口号、序列号、确认号、头部长度、控制位、窗口尺寸、TCP 校验和、紧急指针和选项等字段。

TCP 报文的数据格式

  █ 源端口号和目的端口号:这两个字段均为 16 位的长度,表示发送端和接收端的端口,用于确认发送端和接收端的应用程序。发送端的 IP 地址和端口号及接收端的 IP 地址和端口号可以确认一个在 Internet 上的 TCP 连接。
  █ 序列号:序列号是一个 32 位长度的字段,表示分配给 TCP 包的编号。序列号用来标识应用程序从 TCP 的发送端到接收端发送的字节流。当 TCP 开始连接的时候,发送一个序列号给接收端,连接成功后,这个序列号作为初始序列号 ISN(Initial Sequence Number)。建立连接成功后发送的第一个字节的序列号为 ISN+1,之后发送数据 ISN 将按照字节的大小进行递增。序列号是一个 32 位的无符号数,到达 232 次方减 1 之后从 0 开始。
  █ 确认号:发送方对发送的首字节进行了编号,当接收方成功接收后,发送回接收成功的序列号加 1 表示确认,发送方再次发送的时候从确认号幵始。
  █ 头部长度:表示 TCP 头部的长度,由于 TCP 的数据有可选字段,头部长度用于表示头部的长度。此字段的长度为 4 位,表示的是 32 位字长的数据。因此 TCP 的头部最长为 60 个字节,如果没有可选字段通常为 20 字节。
  █ 保留位6 位长度没有使用,必须设为 0
  █ 控制位6b,用做控制位,可以多个位一起设置,含义在下表(TCP 控制位的含义)中进行说明。

字段含义
URG紧急指针字段
ACK表示确认号有效
PSH表示接收方需要尽快
RST重建连接
SYN用于发起一个 TCP 的连接
FIN用于表示将要断开 TCP 连接

  █ 窗口尺寸:窗口尺寸也称接收窗口大小,表示本机上 TCP 协议可以接收的以字节为单位的数目,本字段为 16b 大小。
  █ 校验和16b。用于校验 TCP 传输数据的正误,包括 TCP 头和所有数据,TCP 的数据必须强制校验。
  █ 紧急指针16b。只有设置了 URG 位才有效,它指出了紧接紧急数据的字节的顺序编号。
  █ 选项:经常使用的为最大分段长度 MSS(Maximum Segment Size)TCP 连接通常在第一个通信的报文中指明这个选项,它指明当前主机所能接收的最大报文长度。

3. 建立连接的三次握手

  主机 A 和主机 B 要使用 TCP 协议进行通信,需要先建立一条 TCP 连接,如下图(三次握手过程)所示。为了建立一条 TCP 的连接,主机 AB 需要进行三次通信过程(通常称为 “ 三次握手“ three way handshake)。

三次握手过程

  (1) 主机 A 发送一个 SYN 段到主机 B 告诉 B 想要连接的主机端口,以及初始的序列号(ISN,这里为 1234567890)。
  (2) 主机 B 应答,其中 SYN 段为主机 B 的初始序列号(ISN,这里为 987654321),ack 段为主机 A 发送的 ISN+1,即 1234567891
  (3) 主机 A 将主机 B 发送的 SYN+1 作为确认号返回给主机 B 作为应答。

  上面 3 个步骤完成了 TCP 连接的建立,连接建立之后,主机 A 和主机 B 之间可以进行 TCP 的数据接收和发送操作了。

4. 释放连接的四次握手过程

  建立一个 TCP 连接需要 3 次握手,而终止一个 TCP 连接则需要 4 次握手。如下图(释放 TCP 连接的四次握手过程)所示为一个主机 A 主动发起的与主机 B 终止 TCP 连接的过程。

释放 TCP 连接的四次握手过程
  (1) 主机 ATCP 协议栈发送 FIN 字段,序列号为 1234567891 的释放连接请求。
  (2) 主机 B 先确认主机 AFIN 请求,确认号为 1234567892,在主机 A 序列号上加 1
  (3) 主机 B 发送 FIN 请求。
  (4) 主机 A 对主机 BFIN 请求确认。

5. TCP 的封装解封过程

  下图(TCP 通信的数据封装解封过程)所示为使用 TCP 协议的应用程序的数据传输过程,用户数据由主机 A 发送给主机 B,数据封装在 TCP 的数据部分。

TCP 通信的数据封装解封过程

  发送的过程是一个封包的过程。在主机 A 上,在传输层,用户发送的数据增加 TCP 头部,用户数据封装在 TCP 的数据部分,在 IP 层增加 IP 的头部数据,TCP 的数据和头部都封装在 IP 层的数据部分。IP 层将数据传输给网络设备的驱动程序,以太网增加头部和尾部后,发送到以太网上。

  接收数据的过程是一个解封包的过程。在主机 B 上,驱动程序从以太网上接收到数据,然后将数据去除头部和尾部并进行 CRC 校验后,将正确的数据传递给 IP 层。IP 层剥去 IP 头,进行校验,将数据发送给其上层 TCP 层。TCP 则将 TCP 的包头剥去,根据应用程序的标识符判断是否发送给此应用程序。在主机 B 上的应用程序会得到干净的有效数据,然后进行处理。

6. 用户数据报文协议(UDP)

  UDP 是一种基于 IP 协议的不可靠网络传输协议,在 IP 数据的位置如下图(UDP 数据在 IP 数据的位置)所示。

UDP 数据在 IP 数据的位置

  UDP 协议是 TCP/IP 的传输层协议的一部分,与 TCP 的传输不一样,它提供无连接的、不可靠的传输服务。UDP 协议把应用程序需要传递的数据发送出去,不提供发送数据包的顺序;接收方不向发送方发送接收的确认信息,如果出现丢包或者重包的现象,也不会向发送方发送反馈,因此不能保证使用 UDP 协议的程序发送的数据一定到达了接收方或者到达接收方的数据顺序和发送方的一致性。

  使用 UDP 协议传输数据的应用程序,必须自己构建发送数据的顺序机制和发送接收的确认机制,以此来保证发送数据的正确到达,保证接收数据的顺序与发送数据的一致性,也就是说,应用程序必须根据 UDP 的缺点提供解决方案。

  UDP 协议相比较 TCP 协议执行时的速度要比 TCP 快得多,因为 UDP 协议简单得多,对系统造成的负载低。在高负载的系统(例如服务器)或者系统资源受限的系统(例如嵌入式系统)上应用比较多,在不需要可靠传输的应用程序上有比较广泛的应用,例如流媒体的传输、域名服务器、嵌入式机顶盒系统等。

1. UDP 的数据格式

  UDP 传输数据时的字段格式如下图(UDP 数据格式)所示。

UDP 数据格式

  █ 源端口号和目的端口号分别是一个 16 位的字段,用来表示发送方和接收方的 UDP 端口。
  █ UDP 数据长度表示 UDP 头部和 UDP 数据段的长度,单位为字节。由于 UDP 头部为 8 个字节,因此发送 UDP 的长度字段最少为 8 字节。UDP 的长度与 IP 协议的长度有关联性,IP 的长度指的是数据的全长,UDP 的长度等于 IP 的长度减去 IP 头部的长度。
  █ UDP 校验和表示整个 UDP 字段的 CRC16 校验和,它的计算方法与 IP 字段是一致的。UDP 的校验和字段是可选的,即可以不进行 CRC 校验,此时校验和部分为全 0UDP 校验和允许发送的数据为奇数长度,此时要加一个空字节,即全 0 的字节进行填充,这个字节仅仅为了方便计算校验和,不发送到目的地址。

2. UDP 数据的传输过程

  如下图(UDP 协议层的用户数据传输过程)所示为使用 UDP 协议的应用程序的数据传输过程,用户数据由主机 A 发送给主机 B,数据封装在 UDP 的数据部分。

UDP 协议层的用户数据传输过程

  发送的过程是一个封包的过程。主机 A 上,在传输层,用户发送的数据增加 UDP 头部,用户数据封装在 UDP 的数据部分。在 IP 层增加 IP 的头部数据,UDP 的数据和头部都封装在 IP 层的数据部分。IP 层将数据传输给网络设备的驱动程序,以太网增加头部和尾部后,发送到以太网上。

  接收数据的过程是一个解封包的过程。主机 B 上,驱动程序从以太网上接收到数据,然后将数据去除头部和尾部并进行 CRC 校验后,将正确的数据传递给 IP 层。IP 层剥去 IP 头,进行校验,将数据发送给其上层 UDP 层。UDP 则将 UDP 的包头剥去,根据应用程序的标识符判断是否发送给此应用程序。在主机 B 上的应用程序会得到干净的有效数据,然后进行处理。

7. 地址解析协议(ARP)

  在以太网为基础的局域网中,每个网络接口都有一个硬件地址,这是一个 48b 的值,标识不同的以太网设备,在局域网中的必须知道网络设备的硬件地址才能向目的主机发送数据。而在网际网中数据传输的目的地址是 IP 地址,数据要能够正确地传输,必须建立 IP 地址和硬件地址的对应关系,ARP 协议就是起这种作用的。

  ARP 协议为 IP 地址到硬件地址提供动态的映射关系,如下图(IP 地址到硬件地址映射的 ARP 协议)所示为进行 IP 地址和硬件地址映射的 ARP 映射关系图。ARP 的高速缓存维持这种映射关系,其中存放了最近 IP 地址到硬件地址的映射记录,高速缓存中的每项记录的生存时间为 20 分钟,开始时间从映射关系建立时算起。

IP 地址到硬件地址映射的 ARP 协议

1. ARP 过程

  如下图(同一局域网中的主机 A 和主机 B)所示为同一局域网中的主机 A 和主机 BIP 地址分别为 192.168.1.150192.168.1.151。下面是一个 ping 过程的实例,用这个实例来说明 ARP 协议的作用和在实际过程中的位置。

同一局域网中的主机 A 和主机 B

  主机 Aping 命令探测主机 B,命令如下:

$ping B

  其过程如下图(主机 A 对主机 B 进行 ping 的过程)所示,会进行如下过程的步骤,步骤的编号已在下图(主机 A 对主机 B 进行 ping 的过程)中标出。

主机 A 对主机 B 进行 ping 的过程

  █ 步骤 a:应用程序 ping 会判断发送的是主机名还是 IP 地址,调用函数 gethostbyname() 解析主机名 B,将主机名转换成一个 32 位的 IP 地址。这个过程叫做 DNS 域名解析
  █ 步骤 bping 程序向目的 IP 地址发送一个 ICMPECHO 包。
  █ 步骤 c:由于主机 A 和主机 B 在同一个局域网内,必须把目标主机的 IP 地址转换为 48 位的硬件地址,即调用 ARP 协议,在局域网内发送 ARP 请求广播,查找主机 B 的硬件地址。
  █ 步骤 d:主机 BARP 协议层接收到主机 AARP 请求后,将本机的硬件地址填充到合适的位置后,发送 ARP 应答到主机 A
  █ 步骤 e:发送 ICMP 数据包到主机 B
  █ 步骤 f:主机 B 接收到主机 AICMP 包,发送响应包。
  █ 步骤 g:主机 A 接收到主机 BICMP 响应包。

  在 ping 命令之后可以査看 ARP 的高速缓存,用 arp 命令加 -v 选项进行检査,-v 选项是显示详细信息,下面是一个主机的 ARP 高速缓存中的内容:

$arp -v
地址			类型		硬件地址		  标志	Mask	接口
localhost	ether 	00:50:56:f7:88:37	C		eth0
localhost	ether 	00:50:56:e3:84:f0	C		eth0
2. ARP 分组数据格式

  以太网的地址解析协议 ARP 协议分组数据格式如下图(ARP 分组字段格式)所示。ARP 协议的实现方式是在以太网上做广播,查询目的 IP 地址,接收到 ARP 请求的主机响应请求方,将本机的 MAC 地址反馈给请求的主机。

ARP 分组字段格式

  █ 太网头部部分的目的硬件地址和源硬件地址,分别为以太网硬件的地址的发送方和接收方的硬件地址,例如 MAC 地址。当目的硬件地址为全 1(即 0xFF FF FF FF FF FF)的地址时,为广播帧,在以太网上的所有接口都要接收此顿数据。
  █ 帧类型为两个字节长度,表示后面数据的类型。对于 ARP 请求应答,该字段为 0x0806
  █ 硬件类型表示硬件地址的类型,值为 1 表示以太网硬件地址。
  █ 协议类型表示要映射的协议地址类型,值为 0x0800 表示询问 IP 地址。
  █ 硬件地址长度,表示硬件地址以字节为单位的长度,对于 ARP 请求来说,硬件地址为以太网的 MAC 地址,值为 6
  █ 协议地址长度,表示协议地址以字节为单位的长度,对于 ARP 请求来说,协议地址为 IP 地址,为 32 位,值为4
  █ 操作方式字段为本次操作的类型,可选方式如下表(ARP 操作方式)所示,ARP 请求帧和 ARP 应答帧的区别可用此字段的值不同来确定。

含义
1ARP 请求
2ARP 应答
3RARP 请求
4RARP 应答

  █ 余下的 4 个字段分别为发送方的硬件地址、发送方的 IP 地址、接收方的硬件地址、接收方的 IP 地址。

  ARP 请求应答的操作方式很简单,将接受到数据字段的发送方和接收方的值对调,将所有本机的硬件地址和 IP 地址的值填充到合适的发送方位置。

  在 ARP 操作中,有效数据的长度为 28 个字节;不足以太网定义的最小长度 46字节长度,需要填充字节;填充字节最小长度为 18 个字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值