最近工作需要搞网络相关的内容,由于之前对网络了解比较少,因此开始重点学习一下网络相关的各种知识。博文中的有些内容来自于在学习过程中对于一些互联网上我认为的重点知识的记录,如果侵权请联系删除!

  在之前的博文 Network 之一 国际标准组织介绍、互联网/因特网、以太网概念区分、协议标准 中,曾经学习了互联通信的参考模型:OSI 参考模型和 TCP/IP 参考模型,以及相关的标准。但是受制于篇幅,没有详细介绍各种规约的细节,这篇博文就重点学习协议的细节。

协议战争

  在 20 世纪 70 年代到 90 年代之间,计算机科学领域发生了一场名为 “协议战争”(Protocol Wars) 的长期争论。当时,工程师、组织和国家在哪种通信协议能产生最好、最强大的计算机网络的问题上出现了两极分化。这场辩论在 80 年代末和 90 年代初的 Internet - OSI 标准之战中达到了顶峰,最终在 90 年代中期由 Internet 获胜。

Internet 标准最终形成了互联网协议套件,由于互联网协议套件是从 TCP/IP 协议一步步发展来的,因此也被称为 TCP/IP 协议族。

  在互联网发展的这个阶段中,最先出现的是一些专有网络标准及协议。例如,最早的高级研究计划局网络(ARPANET) 中的 Network Control Program (NCP) ,欧洲邮政、电报和电话服务(PTT)于 1976 年开发了 X.25 标准。OSI 在 20 世纪 80 年代后期开发了其网络标准,完整的互联网协议套件在1989 年开发完成。

  随着完整的互联网协议套件的开发,以及与电信和计算机行业的合作,将 TCP/IP 软件整合到各种操作系统中,为广泛采用 TCP/IP 作为综合协议套件奠定了基础。虽然 OSI 在 20 世纪 80 年代后期开发了其网络标准,但 TCP/IP 在众多供应商网络上被广泛应用,并最终称为了互联网的核心组件。很多协议基本都直接消失或者间接投靠了 TCP/IP 协议。

TCP/IP 协议族

  TCP/IP 协议族,也称为互联网协议套件(Internet Protocol Suite,IPS)是一组实现支持因特网和大多数商业网络运行的协议栈的网络传输协议。这个名称来源于其中两个最重要的协议:传输控制协议(TCP)和因特网协议(IP),它们也是最先定义的两个协议。

  由于在网络通讯协议普遍采用分层的结构,当多个层次的协议共同工作时,类似计算机科学中的堆栈,因此又称为 TCP/IP 协议栈(TCP/IP Protocol Stack),也被简称为 TCP/IP 协议。

  目前,TCP/IP 协议族的相关标准由 IEFT 负责指定,所有这些协议都在相应的 RFC 文档中讨论及标准化。其中有个问题我们需要知道,TCP/IP 协议栈的众多协议并没有严格的按照分层的理念来进行设计,它更多的是处于实用的目的。尽管在很多文献中将 TCP/IP 协议栈中的各种协议划分到各层,但没有对应的标准来说明这一点,IEFT 也不负责处理分层的相关标准。

TCP/IP 数据流

  在 TCP/IP 协议工作流程中(TCP/IP 数据流过程),应用层数据通过协议栈发送到网络上时,每一层协议都会添加一个自己的头部,这个过程称为封装(Encapsulation)。

  数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理。上图仅仅是两台计算机在同一网段的简单情况,如果两台计算机在不同网段,则还需要经过一个或多个路由器(也可能是广域网节点交换机)。

  每个协议层都有自己的名称来标识数据单元。TCP 将数据单元称为(Segment),UDP 将数据单元称为数据报,IP 将数据单元称为数据包(Packet),数据链路层和物理层或网络接口层将其称为(Frame)。

以太网帧

  以太网(Ethernet)是一种计算机局域网技术。IEEE 制定的 IEEE 802.3 标准定义了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问控制的内容。以太网是目前应用最普遍的局域网技术,取代了其他局域网标准如令牌环、FDDI 和 ARCNET。各种以太网类型参见博文 Network 之三 Ethernet(以太网)物理介质(10Base、100Base-T、100Base-TX等)介绍。

  IEEE 802 的相关标准主要规定了以太网数据链路层和物理层,且将数据链路层又分为了介质访问控制 (MAC) 层 和逻辑链路控制 (LLC) 层 这两层。其中,前者负责控制网络中的设备如何获得对介质的访问权限和传输数据的权限,后者负责识别和封装网络层协议,并控制错误检查和帧同步。

  以太网的雏型是施乐以太网(Xerox Ethernet),在 1982 年,Xerox 与 DEC 及 Intel 组成 DIX 联盟,并共同发表了 Ethernet Version 2(EV2)的规格,并将它投入商场市场,且被普遍使用。后来,DIX 将其递交到了 IEEE 802 工作组,1983 IEEE 802 工作组发布 IEEE 802.3 以太网标准,开始负责制定后续以太网标准。

  以太网帧有多种类型,Ethernet Version 2 和 IEEE 802.3 是目前最常见的以太网帧(Ethernet II 格式相对使用广泛),其他如子网接入协议(SNAP)帧、Novell raw 802.3 帧等我们基本接触不到。Ethernet Version 2(EV2)帧格式与 IEEE 802.3 帧格式有些不一样,但是,一般认为他们是兼容的,并且可以同时出现在以太网链路上。

Ethernet Version 2

  1982 年,DIX 联盟发表了 Ethernet Version 2(EV2)。以太帧起始部分由前同步码和帧开始定界符组成,后面紧跟着一个以太网报头,以 MAC 地址说明目的地址和源地址。以太帧的中部是该帧负载的包含其他协议报头的数据包。以太帧由一个 32 位冗余校验码结尾,用于检验数据传输是否出现损坏。

  • 前导码:同于帧同步

  • 目的 MAC:指定要将数据帧发送到哪个适配器,标识帧的接收者

  • 源 MAC:消息源自哪个适配器,标识帧的发送者

  • 类型:用于标识数据字段种包含的高层协议。由 IEEE 注册机构分配,下图是一些常见协议分配情况

  • 数据:网络层数据。如果不足 46 字节时,会填充到最小长度。最大值也叫最大传输单元(MTU)。加上帧头、帧尾以太网帧最长是 1500 + 6 + 6 + 2 + 4 = 1518 字节。

    通常我们说的以太网帧不包含 8 字节的前导码

  • FCS:循环冗余校验码。

  Ethernet Version 2 帧格式是目前使用最多的以太网帧,以太网帧的整体大小必须在 64(46 + 6 + 6 + 2 + 4)~1518(1500 + 6 + 6 + 2 + 4) 字节之间。有些系统支持更大的帧,最大可以支持 9000 字节。

  1. MAC 地址的前三个字节由 IEEE 分配给适配器的供应商,并且特定于供应商。
  2. 使用 Wireshark 抓包是抓不到前导码和校验和的,因为数据到达抓包驱动层时,前导码和校验和已经被过滤掉了

  以太网帧最小的 64 是由以太网底层调制技术 CSMA/CD 决定的,而最大值为何是 1518 其实并没有一个明确的原因。普遍认为,在 CSMA/CD 技术下,为了保证发送的公平性(不能长时间占用信道)以及效率,才选择了 1518。具体参见网友讨论:https://www.zhihu.com/question/21524257

IEEE 802.3 帧

  IEEE 802.3 帧是在 Ethernet Version 2 帧基础上制定出来的。在 IEEE 802.3 初期,IEEE 802.3 帧与 Ethernet Version 2 帧并不相同, IEEE 802.3 对其进行了扩展。然而随着 Ethernet Version 2 的流行,后续的 IEEE 802.3 标准也在不断改变,下面是最新的 IEEE 802.3-2018 标准中给出的帧格式:

  • 前导码: IEEE 802.3 对原来 Ethernet Version 2 帧的前导码进行了扩展

    • 前同步码:7 字节固定数字 0xAA
    • 帧界定符:1 字节固定数字 0xAB
  • 目的 MAC:指定要将数据帧发送到哪个适配器,标识帧的接收者

  • 源 MAC:消息源自哪个适配器,标识帧的发送者

  • 长度/类型:IEEE 802 规定所有以太网类型的值都要大于十六进制 0x05DC,由于以太网中的最大帧大小为 1518 字节,因此以太网类型和长度之间没有重叠的意义。如果源地址后面的字段大于 0x05DC,则该帧为 Ethernet Version 2,否则为 IEEE 802.3。这里的类型就是 Ethernet Version 2 中的类型,由 IEEE 注册机构分配。

  • 数据:上层协议数据或者填充到最小 46 字节。最大值也叫最大传输单元(MTU)。加上帧头、帧尾以太网帧最长是 1500 + 6 + 6 + 2 + 4 = 1518 字节。

    通常我们说的以太网帧不包含 8 字节的前导码

  • FCS:循环冗余校验码

IEEE 802.3 规定发送帧的时候,每个字节的低位在前高位在后

  从上面的帧格式可以看出,最新的 IEEE 802.3 帧与 Ethernet Version 2 基本是一致的。但是早期的 IEEE 802.3 帧格式分为 IEEE 802.3/802.2 LLC 和 IEEE 802.3/802.2 SNAP 这两种,但实际并没有流行开来。大部分 TCP/IP 协议栈也没有实现 IEEE 802.2 所定义的 LLC 层。

关于 IEEE802
  IEEE 802 是电气和电子工程师协会 (IEEE) 的局域网 (LAN)、个人局域网 (PAN) 和城域网 (MAN) 标准家族。IEEE 802 LAN/MAN 标准委员会 (LMSC) 维护这些标准。官网是:https://www.ieee802.org/NADots.shtml。委员会下设了很多工作小组,负责不同的标准维护工作。随着发展,有些小组已经解散或者冬眠,如下是各小组负责的内容及活动状态。

IEEE 802.3/802.2 LLC

  这是 IEEE 802.3 发布初期定义的 802.3 以太帧,它由 Ethernet V2 发展而来。它将 Ethernet V2 帧头的协议类型字段替换为帧长度字段(取值为 0x0000 ~ 0x05DC),并加入 802.2 LLC 头用以标志上层协议。

  • DSAP Destination Service Access Point,目标服务接入点
  • SSAP Source Service Access Point 来源服务接入点
  • Control 控制字段,8 或16bits。为了便于区分,有三种 LLC PDU 控制字段,分别叫做 U,I,S 帧。
    • U(Unnumbered)帧,8 位的控制字段,特别用于无连接的应用
    • I(Information)帧,16 位的控制和帧编号字段,用于面向连接的应用
    • S(Supervisory)帧,16 位的控制字段,用于在 LLC 层中进行管理监督。

在这三种格式中,只有 U 帧在广泛使用。用第一个字节的最后两位来区分这三种 PDU 帧格式。

IEEE 802.3/802.2 SNAP

这是 IEEE 为保证在 802.2 LLC 上支持更多的上层协议同时更好的支持 IP 协议而发布的标准。

Novell raw 802.3

  这是 1983 年 Novell 发布其划时代的 Netware/86 网络套件时采用的私有以太网帧格式,该格式以当时尚未正式发布的802.3标准为基础;但是当两年以后 IEEE 正式发布 802.3 标准时,IEEE 在 802.3 帧头中又加入了 802.2 LLC(Logical Link Control)头,这使得Novell 的 RAW 802.3 格式跟正式的 IEEE 802.3 标准互不兼容。

VLAN

  虚拟局域网(Virtual Local Area Network,VLAN)是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制,可以根据功能、部门及应用等因素将它们组织起来,相互之间的通信就好像它们在同一个网段中一样,由此得名虚拟局域网。

  IEEE 802.1 Q 标准规定允许将一个标识符或 tag 插入到以太网帧中,以标识此帧属于 VLAN 帧。它允许帧根据位置分配到本地组中,这提供了多种便利,如方便网络管理,允许组成工作组,增进网络安全,限制广播域等。

  • TPID:标记协议标识符(Tag Protocol Identifier,TPID)用来判断本数据帧是否带有 VLAN Tag。
  • TCI:标记控制信息 (Tag Control Info,TCI) 包含以下信息:
    • Priority:用 3 个位用于设定以太网帧的优先级别,又称为服务类别 (Class of Service,CoS)
    • CFI:规范格式标识符(Canonical Format Indicator,CFI)标识 MAC 地址在不同的传输介质中是否以标准格式进行封装,取值为 0 表示 MAC 地址以标准格式进行封装,为 1 时表示以非标准格式封装。
    • VLAN ID:用以唯一标识该帧属于哪一个 VLAN

IP

  网际协议(Internet Protocol,IP),又称互联网协议,是用于分组交换数据网络的协议。IP 是 TCP/IP 协议族中网络层的最主要协议之一,任务是根据源主机和目的主机的地址来传送数据。

  IP 是一种无连接协议,它以尽力而为的交付模式运行,因为它不保证交付,也不保证正确的顺序或避免重复交付。这些方面(包括数据完整性)由上层传输协议(如传输控制协议 (TCP))解决。

  IP 的第一个主要版本是互联网协议版本 4(IPv4),它的继任者是互联网协议版本 6(IPv6)。IPv4 使用地址解析协议(ARP)将 IP 地址解析成相应的数据链路地址(MAC 地址),而 IPv6 则采用邻居发现协议(NDP)。目前仍然是广泛使用的是 IPv4。

  • 版本: 标识正在使用的 IP 版本。当前版本为 4,此版本称为 IPv4。

  • 头长度(IHL): Internet Header Length (IHL)指示 IP 头的长度,单位是 4 字节。这个字段的最小值是 5,最大十进制值是 15。

  • 服务类型/DS Field: 在 RFC 791 中被定义为服务类型,实际上并未使用。1998 年被 IETF 在 RFC 2474 中重定义为 Differentiated Services Field(DS Field)。

    • IP 优先级:用于标识数据包在网络中收到的服务级别。
    • DSCP: 差分服务代码点 (Differentiated Services Code Point,DSCP)用于标识数据包在网络中接收的服务级别。
    • ECN:显式拥塞通知(Explicit Congestion Notification,ECN)在 RFC 3168 中定义,允许在不丢弃报文的同时通知对方网络拥塞的发生。

      ECN 是一种可选的功能,仅当两端都支持并希望使用,且底层网络支持时才被使用。

  • 总长度IP 头 + 数据 的长度。因此,该字段的最小值是 20(20 字节头 + 0 字节数据),最大为 65535 字节(20 字节标头 + 65515 字节数据)。

  • 标识符: 用来唯一地标识一个报文的分片。因为分片不一定按顺序到达,所以在重组时需要知道分片所属的报文。

  • 标志: 用于控制和识别分片。下面是它们可能的配置

    • Bit 0: 保留的,必须设置为零
    • Bit 1: 禁止分片(Don’t Fragment,DF),当 DF = 0 时才允许分片
    • Bit 2: 更多分片(More Fragment,MF),MF = 1 代表后面还有分片,MF = 0 代表已经是最后一个分片。
  • 片段偏移量: 指明了每个分片相对于原始报文开头的偏移量,以 8 字节作单位。

  • 生存时间(TTL): 避免报文在互联网中永远存在。以秒为单位,小于一秒的时间均向上取整到一秒。实际使用中,TTL 最初设置为一个数字,并由通过的每个路由器递减,当 TTL 达到 0 时,数据包将被丢弃。

  • 协议: 在分层协议模型中,用于指示该报文的数据区使用的协议。IANA 维护着一份协议列表(最初由 RFC 790 定义),详细参见 IP协议号列表

  • 头校验和: 只对首部查错,不包括数据部分。具体方法参见 RFC 1071。在计算时,先将校验和字段置为 0,计算之后填实际值,下面是 Wireshark 的一个示例:

      TCP 报文中经常出现校验和错误(其他报文貌似好一些),关于为何 Wireshark 抓取的 TCP 报文为何出现大量校验和错误,参见 Wireshark 官网解释。

  • 源 IP 地址: IPv4 地址,指出报文的发送端。

  • 目标 IP 地址: IPv4 地址,指出报文的接收端。

  • 选项和填充: 以 4 字节为单位,从1 到 40个字节不等,一般不用。如果选项值不是 4 的倍数,则填充 0 以确保 4 字节对齐。如果 IHL 大于 5,那么选项字段必然存在并必须被考虑。

  • 数据: 数据字段不是首部的一部分,因此并不被包含在首部检验和中。数据的格式在协议首部字段中被指明,并可以是任意的传输层协议

TCP/UDP

  TCP 和 UDP 是 TCP/IP 协议中最具有代表性的传输层协议。其中,TCP 协议全称是传输控制协议(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由 IETF 的 RFC 793 定义;UDP 协议全称是用户数据报协议(User Datagram Protocol)是一种无连接的协议,由 IETF 的 RFC 768 定义。下面是两个的简单对比:

类型 TCP UDP
服务类型 TCP 是一种面向连接的协议。连接定向是指通信设备在传输数据之前要建立连接,在传输数据之后要关闭连接。 UDP 是面向数据报的协议。它没有打开连接、维护连接和终止连接的开销。UDP 对于广播和组播类型的网络传输十分有效。
可靠性 可靠的,因为 TCP 保证将数据的传输到目标路由器。 不可靠,因为 UDP 无法保证将数据传送到目的地。
错误检查机制 提供了广泛的错误检查机制。因为它提供了流控制和数据确认。 UDP 只有使用校验和的基本错误检查机制。
确认 有确认 无确认
时序 数据的排序是 TCP 的一个特性。数据包按顺序到达接收器。 在 UDP 中没有数据排序。如果需要顺序,则必须由应用层管理。
速度 比 UDP 慢 比 TCP 更快、更简单、更高效
重发 可以重传丢失的数据包 不能重发
报头长度 20 - 60 字节的可变长度头 8 字节的固定长度头
量级 重量级 轻量级
握手技术 使用 SYN、ACK、SYN-ACK 等握手方式 没有握手
广播 不支持 支持
协议 用于 HTTP、HTTPs、FTP、SMTP 和 Telnet 用于 DNS、DHCP、TFTP、SNMP、RIP、VoIP 等协议
流类型 字节流 消息流
开销 低但高于 UDP 非常低

TCP

  • 源端口号: 标识发送端口

  • 目的端口号: 标识接收端口

  • 序列号: 主要有两个作用

    • 如果 SYN 位被置 1,则此为最初的序列号。实际的第一个数据字节的序列号和相应的 ACK 中确认的序列号是这个序列号加上 1。
    • 如果 SYN 位被清 0,那么这是当前会话的这个段的第一个数据字节的累积序列号。
  • 确认号: 如果设置了 ACK 标志,那么该字段的值就是 ACK 发送方期望的下一个序列号。

  • 数据偏移: 以 4 字节为单位计算出的数据段开始地址的偏移量。TCP 头的最小大小为 20 个字节,最大大小为 60 个字节,因此该值最小值为 5,最大值为 15。当该值大于 5 时,就需要在 选项 字段中添加内容。

  • 保留: 留将来使用,必须置 0

  • 标志符

    • NS: 显式拥塞通知(Explicit Congestion Notification,ECN)是对 TCP 的扩展,定义于 RFC 3540(2003)。ECN 允许拥塞控制的端对端通知而避免丢包。ECN 为一项可选功能,如果底层网络设施支持,则可能被启用 ECN 的两个端点使用。
    • CWR: Congestion Window Reduced,定义于 RFC 3168(2001)。
    • ECE: ECN-Echo 有两种意思,取决于 SYN 标志的值,定义于 RFC 3168(2001)。
    • URG: 为 1 表示高优先级数据包,紧急指针字段有效。
    • ACK: 为 1 表示确认号字段有效
    • PSH: 为 1 表示是带有 PUSH 标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
    • RST: 为 1 表示出现严重差错。可能需要重新创建 TCP 连接。还可以用于拒绝非法的报文段和拒绝连接请求。
    • SYN: 为 1 表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步
    • FIN: 为 1 表示发送方没有数据要传输了,要求释放连接。
  • 窗口大小: 接收窗口的大小,它指定了这个段的发送者目前愿意接收的窗口大小单位(默认是以字节为单位)的数量。

  • 校验和: TCP 头 + 数据 + IP 伪报头计算的校验和。IP 伪报头由源 IP 地址、目的 IP 地址、TCP 协议的协议号组成。完整的计算内容如下所示:

    IP 伪报头仅用于计算校验和,不传输。伪头中的 TCP 长度(字节为单位)不含伪头本身。 下面在来看个实例:

    关于为何 Wireshark 抓取的 TCP 报文为何出现大量校验和错误,参见 Wireshark 官网解释。

  • 紧急指针: 如果设置了 URG 标志,那么该字段是表示最后一个紧急数据字节的序号的偏移量,否则,该字段固定为 0。

  • 选项: 以 4 字节为单位,最多 40 个字节。该字段的长度和数据偏移字段的值相关。该部分又由三个字段组成:

    • Option-Kind: 固定占 1 字节,表示选项的类型,该字段是必须的。根据 Option-Kind 值,后面两个字段内容可变。Option-Kind 的分配由 IANA 维护。
    • Option-Length: 如果存在该字段,则固定占 1 字节,表示该选项的总长度(Option-Kind + Option-Length + Option-Data)。
    • Option-Data: 包含与该选项相关的数据(如果有数据的话),长度根据 Option-Kind 不同而变化。

    注意,这里其实是个列表,可以包含上面多个 Option-Kind + Option-Length + Option-Data 的组合。 如下图是 Wireshark 抓取一个报文示例:

  • 填充: 如果 TCP 头长度不是 32 对齐的,则需要在头尾部用 0 进行填充。

UDP

  • 源端口号: 标识发送者使用的端口号,如果(IPv4 和 IPv6 中)不使用,则应为零。
  • 目标端口号: 标识接收者使用的端口号,并且是必需的。
  • 报文长度: 指定 UDP 标头和 UDP 数据的长度(以字节为单位)。最小长度为 8 个字节,即头的长度。字段大小将 UDP 数据报的理论限制设置为 65535 字节(8 字节标头 + 65527 字节数据)。但是,受制于底层 IPv4 协议对数据长度的限制,实际最大只能为 65507 字节(65535 字节 − 8 字节 UDP 标头 − 20 字节 IP 标头)。
  • 校验和: 这里的校验和是 UDP 头 + 数据 + IP 伪报头 计算的校验和。该字段在 IPv4 中是可选的,在 IPv6 中是必需的。如果未使用,该字段将全为零。用于计算校验和的方法在 RFC 768 中定义,而 RFC 1071 给出了一个更高效的计算方法。要计算的整个内容如下图所示:
    IP 伪报头仅用于计算校验和,不传输。伪头中的 UDP 长度(字节为单位)不含伪头本身。 下面在看个示例:

ARP

  地址解析协议 (ARP) 用于发现与给定的互联网层地址(通常是 IPv4 地址)关联的链路层地址(如 MAC 地址)。于 1982 年由 RFC 826 定义。IPv4 使用地址解析协议(ARP)将 IP 地址解析成相应的数据链路地址(MAC 地址),而 IPv6 则采用邻居发现协议(NDP)。

  • 协议地址: 就是 IP 地址。
  • 目标硬件地址:在不知道目标硬件地址时,通常这里全部填写 00,Ethernet II 帧中 MAC 为全 FF。

  在每台安装有 TCP/IP 协议的电脑或路由器里都有一个 ARP 缓存表,表里的 IP 地址与 MAC 地址是一对应的。当首次不知道目标硬件地址时,就需要发送 ARP 广播(Ethernet II 帧中 MAC 为全 FF),所有设备都会收到有 ARP 广播,但是只有符合条件(协议地址一致的)的设备就会进行应答:

  地址解析协议是一种请求-响应协议。ARP 请求是广播的,ARP 回复是单播,且它在单个网络的边界内进行通信,从不跨互联节点进行路由。下面是 Wireshark 抓取的 ARP 请求-响应帧:

ICMP

  互联网控制消息协议(Internet Control Message Protocol,ICMP)是互联网协议族的核心协议之一。它用于网际协议(IP)中发送控制消息,提供可能发生在通信环境中的各种问题反馈。IPv4 中的 ICMP被称作 ICMPv4(RFC 792),IPv6 中的 ICMP 则被称作 ICMPv6(RFC 4443)。

  • 类型和代码: 类型标识生成的错误报文,代码进一步划分 ICMP 的类型,用来查找产生错误的原因。类型及代码的定义见下表(部分):
  • 校验和: 用于进行错误检查,该校验和是从 ICMP 头和以该字段替换为 0 的数据计算得出的。
  • 剩余部分: 以 4 字节为单位,理论值是 0 ~ 65507(IP 长度限制),但实际内容根据 ICMP 类型和代码而有所不同。

  ICMP 主要被用于网络设备之间(如两台路由器)进行消息传递,除了 traceroute 和 ping(其实就是 traceroute 的简化版)之外,计算机用户一般不会直接使用到该协议。

  在互联网层上运行的 IP 协议是一种无连接协议。 因此,如果 IP 数据包传输失败,则无法检测到失败,ICMP 就负责跟踪 IP。ICMP 通常被认为是 IP 的一部分(分担了 IP 纠错功能),虽然与其他上层协议一样,ICMP 消息也包含在标准 IP 数据包中,但 ICMP 消息通常作为特殊情况进行处理。

Ping

  Ping 命令通过指定目标 IP 地址发送 Ping 请求,如果可以到达该目标,则向源返回 Ping 响应。它是 ICMP 的一个典型应用,使用就是 ICMP 的 Echo Request (Type 8) 和 Echo Reply (Type 0)。

  其中数据可以填充任意内容,一般都是 4 的整数倍。且 Reply 的内容与 Request 是一样的。下面是 Windows 的 Ping 和 Ubuntu 的 Ping 对比情况:

参考

  1. https://en.wikipedia.org/wiki/Protocol_Wars
  2. https://www.geeksforgeeks.org/differences-between-tcp-and-udp/
  3. https://en.wikipedia.org/wiki/Internet_protocol_suite
  4. https://codeburst.io/understanding-tcp-internals-step-by-step-for-software-engineers-system-designers-part-1-df0c10b86449
  5. https://en.wikipedia.org/wiki/Ethernet_frame
  6. https://www.cnblogs.com/feitian629/archive/2012/11/16/2774065.html
  7. https://www.cnblogs.com/smartjourneys/articles/8124490.html
  8. https://www.ibm.com/support/pages/ethernet-version-2-versus-ieee-8023-ethernet
  9. https://www.cnblogs.com/smartjourneys/articles/8124490.html
  10. https://www.cnblogs.com/qishui/p/5437301.html
  11. https://en.wikipedia.org/wiki/EtherType
  12. https://zh.wikipedia.org/wiki/IPv4
  13. https://www.techtarget.com/searchnetworking/tutorial/Routing-First-Step-IP-header-format
  14. https://en.wikipedia.org/wiki/Transmission_Control_Protocol
  15. https://www.tspweb.com/key/%E4%BA%92%E8%81%94%E7%BD%91%E5%8D%8F%E8%AE%AE%E5%9C%B0%E5%9D%80%E5%AE%9A%E4%BD%8D.html
  16. https://www.practicalnetworking.net/series/arp/traditional-arp/
  17. https://fasionchan.com/network/icmp/icmp/
  18. https://blog.51cto.com/ccieh3c/4886604

Network 之五 TCP/IP 协议族、工作流程、(TCP、IP、MAC、VLAN)常用协议格式详解相关推荐

  1. Python常见面试题:TCP 协议中的三次握手与四次挥手相关概念详解

    今天来聊聊Python常见面试题中面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手. 涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详 ...

  2. TCP数据包协议格式详解

    出一个专栏把通信协议搞一下吧,万物互联的根本呀. IP 版本4位:4(二进制0100)表示IPv4,6(二进制0110)表示IPv6 报头长度(单位4byte):因为选项长度不确定,取值范围是5-15 ...

  3. 4-4:TCP协议之TCP头部格式详解

    文章目录 一:TCP头部格式详解 (1)4位首部长度 (2)序列号和确认应答号 A:可靠性问题 B:32位序号和确认号 (3)窗口大小 (4)标志位 (5)紧急指针 A:带外数据(out_of _ba ...

  4. UDP数据包协议格式详解

    源端口目的端口:是0-65535任何数字,在收到请求时系统会为客户端动态分配,0-1023为知名端口号 报文长度(单位4byte):表示udp报头+udp数据总长度,有别于tcp,也没有选项 UDP报 ...

  5. COAP数据包协议格式详解

    Ver:版本编号,占2bit,固定01 T:报文类型,占2bit,CON=00,NON=01,ACK=10,RST=11 CON--需要被确认的请求,如果CON请求被发送,那么对方必须做出响应. NO ...

  6. HTTP响应协议格式详解

    文章目录 响应协议格式 1. 首行 状态码详解 2. 响应头header 响应协议格式 HTTP请求协议由首行.响应头(header).空行.正文(body)组成.通过空行来区别header和body ...

  7. 海康、大华IP摄像机RTSP地址及格式详解

    海康.大华IP摄像机RTSP地址及格式详解 在现代社会中,IP摄像机已经成为了安防行业中不可或缺的一部分.而对于信息技术人员来说,掌握摄像机RTSP地址及格式也显得尤为重要.本文将为大家详细介绍海康和 ...

  8. [转]纯真IP数据库格式详解

    纯真IP数据库格式详解 摘要 网络上的IP数据库以纯真版的最为流行,LumaQQ也采用了纯真版IP数据库做为IP查询功能的基础.不过关于其格式的文档却非常之少,后来终于在网上找到了一份文档,得以了解其 ...

  9. FTP协议的工作流程

    FTP 与大多数 Internet 服务一样,使用的也是"客户端/服务器"模式. 用户通过一个支持 FTP 协议的客户机程序,连接在远程主机上的 FTP 服务器程序.通过在客户端向 ...

  10. DCHP协议的工作流程简述

    DHCP:全称是 Dynamic Host Configuration Protocol﹐中文名为动态主机配置协议,它的前身是 BOOTP,它工作在OSI的应用层,是一种帮助计算机从指定的DHCP服务 ...

最新文章

  1. 一文看尽10篇目标检测最新论文(SpineNet/AugFPN/LRF-Net/SABL/DSFPN等)
  2. 安装Android模拟器Genymotion【Android学习入门】
  3. linux操作系统颜色,Linux小技巧之man pages设置高亮颜色
  4. 第二次Soring冲刺计划第一天(团队)
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的民宿客栈系统
  6. Suse11开启SSH密码登录
  7. Linux基础命令---accept打印机控制
  8. 华为p40pro如何升级鸿蒙,可以升级到鸿蒙OS的四款华为手机,相信都没有后悔入手!...
  9. 物联网博客推荐:网昱多媒体
  10. LinuxCNC学习-HAL库介绍
  11. 【颜纠日记】PS批量裁剪不同图片-告别重复性操作
  12. 人工智能(7)---一文读懂人脸识别技术:商业应用、产品落地、核心技术、市场规模
  13. STM32F103_study49_The punctual atoms(STM32 Bit operation and logical operation in C language )
  14. shiro学习详解(开篇)
  15. FutureTask实现超时任务
  16. 锐捷服务器系统安全,更安全 锐捷网络发布RG-ESS易安全系统
  17. maptalk地图以及自定义标点的引入
  18. c++ opencv (学习笔记)inRange函数
  19. 微信公众号的基本排版设置
  20. 计算机基本原理 学习笔记(八)

热门文章

  1. RadiAnt DICOM Viewer 2021 绿色版
  2. GUI 自动测试工具[2021清单]
  3. 在你学习计算机的路上,哪些书籍对你的帮助最大?
  4. 向weka 中添加DBSCAN算法
  5. Spark机器学习环境搭建
  6. VS2017社区版+Qt5.12.2+VTK8.2环境搭建
  7. Intellij idea 2018.3热部署 jrebel 激活
  8. 个人收藏的一些实用网站整理
  9. Python画图显示中文
  10. 判断字符串是否为空方法