06_网络编程-基础篇
本文最后更新于 2025-06-25,学习久了要注意休息哟
第一章 网络体系结构
1.1 计算机网络分类
1.1.1 按范围
个人局域网 (PAN)
范围:通常是几米到十几米。
用途:连接个人设备,如手机、平板、笔记本电脑、智能手表等。
示例:蓝牙(Bluetooth)、红外线通信(Infrared Communication)。
局域网 (LAN)
范围:通常覆盖一个建筑物、办公室或校园。
用途:在小范围内实现高速数据传输和资源共享。
示例:以太网(Ethernet)、Wi-Fi(Wireless Fidelity)。
城域网 (MAN)
范围:覆盖一个城市或多个相邻的城市。
用途:连接多个局域网,提供城域范围内的数据传输服务。
示例:光纤网络(Fiber Optic Network)、有线电视和DSL(Digital Subscriber Line)连接。
广域网 (WAN)
范围:覆盖国家、洲际甚至全球范围。
用途:连接多个局域网和城域网,实现长距离数据传输。
示例:互联网(Internet)、企业专用网(Enterprise Private Network)。
1.1.2 按网络拓扑
总线型拓扑 (Bus Topology)
所有设备共享一条通信介质(总线)。
优点:布线简单,成本低。
缺点:总线故障会导致整个网络瘫痪。
星型拓扑 (Star Topology)
所有设备通过单独的通信链路连接到一个中央节点(如交换机)。
优点:易于管理和扩展,单个设备故障不会影响整个网络。
缺点:中央节点故障会导致整个网络瘫痪。
网状拓扑 (Mesh Topology)
每个设备都有多个连接点,与多个其他设备直接相连。
优点:高度冗余,可靠性强,任意节点或链路故障不影响整体通信。
缺点:布线复杂,成本高。
1.1.3 按网络用途
互联网 (Internet)
全球范围内连接各种网络的集合。
用途:提供全球范围的通信和信息共享。
企业内部网 (Intranet)
仅限于企业或组织内部使用的网络。
用途:提供内部资源共享和通信。
外联网 (Extranet)
连接企业内部网与外部合作伙伴或客户的网络。
用途:在安全受控的环境下,与外部实体进行通信和协作。
1.1.4 按交换技术
电路交换网络 (Circuit-Switched Network)
通信路径在传输前建立,并在通信期间保持不变。
示例:传统电话网络(Traditional Telephone Network) 串口。
分组交换网络 (Packet-Switched Network)
数据分成小包(分组)传输,每个分组可以通过不同的路径到达目的地。
示例:互联网(Internet)。
报文交换网络 (Message-Switched Network)
整个消息作为一个单元传输,通过节点存储并转发。
示例:早期的电报网络(Early Telegraph Networks)。
1.1.5 按网通信方式
广播网络 (Broadcast Network)
一个节点发送的数据包可以被网络中所有节点接收到。
示例:以太网(Ethernet)、Wi-Fi(Wireless Fidelity)。
点对点网络 (Point-to-Point Network)
数据包从一个节点直接发送到目标节点。
示例:点对点协议(PPP - Point-to-Point Protocol)、专用线路(Leased Line)。
1.2 计算机网络专业术语
1.2.1 分层
分层 是计算机网络的一种设计原则,将复杂的网络功能划分为多个层次,每一层负责特定的功能。每一层向其上一层提供服务,同时利用其下一层提供的服务。最常见的分层模型是OSI七层模型和TCP/IP四层模型,它们分别将网络通信划分为七层和四层,目的是简化网络设计和实现,使各层的功能模块独立、可互换,便于开发、管理和维护。
1.2.2 实体
实体 是计算机网络中具有可识别的功能单元,可以是硬件(如网络适配器、路由器)或软件(如应用程序、协议栈)。在网络分层模型中,每一层都有其相应的实体,这些实体执行该层定义的功能。不同层的实体通过协议进行通信,确保数据从一个系统成功传输到另一个系统。
1.2.3 协议
协议 是计算机网络中通信双方约定的一套规则和标准,规定了如何进行数据的格式化、传输、接收和处理。每一层都有其特定的协议,如传输层的TCP和UDP协议,网络层的IP协议等。协议确保不同系统之间的数据交换是有序、可靠的,并且能够正确解读和处理对方发送的数据。
1.2.4 接口
接口 是分层模型中相邻两层之间的连接点,通过接口定义每一层如何调用其下一层提供的服务。接口规定了层与层之间的交互方式和数据传输方式,而不涉及具体的实现细节。接口的存在使得每一层的实现可以独立进行修改和优化,而不影响其他层的工作。
1.2.5 服务
服务 是指一层向其上一层提供的功能和能力。例如,在网络分层模型中,数据链路层向网络层提供数据帧的传输服务,网络层向传输层提供数据报的路由服务。每一层通过提供特定的服务,实现上层功能的需求,同时隐藏下层实现的复杂性。
1.3 OSI 七层模型
OSI(开放系统互连)七层模型是由国际标准化组织(ISO)提出的一个用于网络通信的分层架构,旨在规范网络设备和系统之间的通信过程。该模型将网络通信的各个功能划分为七个不同的层次,每一层各司其职,提供特定的网络服务。以下是OSI七层模型的详细介绍:
1.3.1 结构
物理层(Physical Layer)
物理层是OSI模型的最低层,负责在网络设备之间的物理连接上进行比特流的传输。它定义了硬件设备的电气、机械和功能规范,如电缆类型、信号类型、电压等级和传输速度。常见的物理层设备包括网卡、集线器、光纤等。数据链路层(Data Link Layer)
数据链路层负责建立节点到节点之间的可靠数据传输。它将数据分为帧并提供错误检测和纠正,确保数据的完整性。该层的协议包括以太网(Ethernet)、PPP、HDLC等。常见的设备有交换机和桥接器。网络层(Network Layer)
网络层负责在不同的网络之间进行数据包的路由和转发,选择最佳的路径传输数据。它提供逻辑地址(如IP地址),并负责网络间的寻址和分组转发。主要协议有IP(Internet Protocol)、ICMP、IGMP等。常见设备为路由器。传输层(Transport Layer)
传输层负责建立端到端的通信,并确保数据的可靠传输。它提供错误校验、流量控制和数据重传功能,常见的协议有TCP(传输控制协议)和UDP(用户数据报协议)。该层确保数据在发送方和接收方之间完整无误地传送。会话层(Session Layer)
会话层负责在通信的两个设备之间建立、管理和终止会话。它确保数据交换的有序性,提供会话恢复和检查点等功能。常见协议包括NetBIOS、RPC等。表示层(Presentation Layer)
表示层负责数据的格式化、加密和解密、压缩和解压缩,确保发送方和接收方能够理解和解释数据。它提供不同数据格式之间的转换,如文本、图片、视频等。常见的格式有JPEG、MPEG、TLS等。应用层(Application Layer)
应用层是OSI模型的最高层,直接为用户和应用程序提供网络服务。它定义了通信中双方如何与应用程序交互的规则,如HTTP、FTP、SMTP、DNS等。常见的应用层设备和软件有浏览器、邮件客户端、文件传输工具等。
1.3.2 特点
- 标准化:提供了一个全球通用的通信模型,规范了网络设备和系统之间的通信方式。
- 模块化设计:每一层都有明确的功能定义,各层之间相互独立,可以独立开发和改进。
- 互操作性:不同厂商的设备和协议能够兼容和互操作,提高了网络通信的灵活性和扩展性。
- 故障诊断:通过分层,可以更容易定位和诊断网络中的问题。
OSI七层模型提供了一个清晰的框架,使得网络通信变得更加高效和可管理,同时为不同网络设备和协议之间的互联互通提供了一个标准化的指导。
成本高
1.4 TCP/IP 五层模型
TCP/IP 五层模型是计算机网络的一个通用模型,它基于OSI七层模型进行了简化和优化,将网络通信过程分为五个层次:物理层、数据链路层、网络层、传输层和应用层。TCP/IP五层模型更贴近实际网络通信应用,广泛应用于现代网络设计和实现。以下是TCP/IP五层模型的详细解释:
1.4.1 结构
物理层(Physical Layer)
物理层负责通过网络介质(如铜线、电缆、光纤或无线电波)传输比特流(0和1的序列)。它定义了硬件设备的物理接口标准,包括连接器、传输介质类型、电气特性、调制解调、信号编码和传输速度等。常见的物理层设备包括网卡、集线器、调制解调器和光纤设备等。
数据链路层(Data Link Layer)
数据链路层负责在相邻节点之间可靠地传输数据帧。它将上层数据打包成帧,提供错误检测与纠正、帧同步和流量控制等功能。数据链路层确保数据在物理层上被正确传输,并解决物理层可能出现的错误。常见的协议包括以太网(Ethernet)、Wi-Fi、PPP(点对点协议)等,常见设备有交换机和网桥。
网络层(Network Layer)
网络层负责<span style="font-size: 18px; color: red;">数据包的路由选择</span>和<span style="font-size: 18px; color: red;">转发</span>,实现不同网络之间的互联互通。它使用逻辑地址(如 IP 地址)来识别网络中的设备,选择最佳路径传输数据包。网络层的核心协议是 IP(Internet Protocol),支持数据包的分组和重组,以及提供数据包传输的路由功能。常见的设备有<span style="font-size: 18px; color: red;">路由器</span>。
传输层(Transport Layer)
传输层负责建立端到端的通信连接,并确保数据的可靠或不可靠传输。它提供错误检测、数据流量控制和数据重传等功能,保证数据在发送方和接收方之间的完整性和顺序性。传输层主要有两种协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP 提供可靠的、有序的数据传输,而 UDP 提供快速但不可靠的数据传输。
应用层(Application Layer)
应用层直接为用户和应用程序提供网络服务接口。它定义了各种网络应用的协议和服务,如HTTP(超文本传输协议)用于网页浏览,FTP(文件传输协议)用于文件传输,SMTP(简单邮件传输协议)用于电子邮件发送,DNS(域名系统)用于域名解析等。应用层协议负责处理数据的最终格式、内容和用户需求。
1.4.2 特点
- 简化结构:将复杂的通信过程简化为五个层次,易于理解和实现。
- 灵活性强:不同的协议可以在相应层次替换和组合,以适应不同的应用需求。
- 高效性:减少了不必要的复杂性,更适合实际网络中的实现。
- 互操作性:不同设备和系统之间可以兼容和互通,促进了互联网的发展和普及。
TCP/IP五层模型提供了一个实际可操作的网络协议架构,使得网络通信更加高效和灵活,广泛应用于现代互联网和各种局域网、广域网的设计和实现。
1.5 数据单元
1.5.1 PDU 协议数据单元
协议数据单元 (PDU, Protocol Data Unit)是指在计算机网络中,每一层协议栈用于传输数据的基本单位。PDU 包含了协议层之间交换信息所需要的所有数据和控制信息,它不仅包含需要传输的实际数据,还包含用于传输控制的协议头部信息(如源地址、目的地址、序列号、错误校验码等)。PDU 的定义和内容会根据所处的网络协议层而有所不同。
PDU 在各协议层的不同表现
物理层 (Physical Layer)
PDU 类型: 比特 (Bit)
作用: 在物理层,PDU 表现为比特流,即一系列的电信号或光信号。这些比特是最低级的数据单位,用于在网络物理介质上传输信息。
数据链路层 (Data Link Layer)
PDU 类型: 帧 (Frame)
作用: 在数据链路层,PDU 称为帧。帧用于在同一网络链路的两个节点之间传输数据。帧的头部包含了源 MAC 地址、目标 MAC 地址、帧类型和帧校验序列 (FCS) 等信息,以确保在本地网络传输数据的完整性和正确性。
网络层 (Network Layer)
PDU 类型: 数据包 (Packet)
作用: 在网络层,PDU 被称为数据包。数据包用于在不同网络之间进行路由和转发,确保数据可以从一个网络传输到另一个网络。数据包的头部通常包含源 IP 地址、目的 IP 地址、协议类型(如 TCP 或 UDP)和生存时间 (TTL) 等信息。
传输层 (Transport Layer)
PDU 类型: 报文段 (Segment) 或 数据报 (Datagram)
作用:
报文段 (Segment): 在传输层,TCP 协议使用报文段来进行数据传输,提供可靠的、面向连接的通信服务。报文段的头部包含源端口号、目的端口号、序列号、确认号、窗口大小和校验和等信息,以确保数据的可靠传输和正确排序。
数据报 (Datagram): UDP 协议使用数据报进行数据传输,提供无连接的通信服务。数据报头部较简单,只包含源端口号、目的端口号、数据长度和校验和等基本信息,用于快速传输数据。
会话层 (Session Layer)
PDU 类型: 会话数据单元
作用: 会话层负责管理通信会话的建立、维护和终止。PDU 代表在会话期间交换的数据单元。
表示层 (Presentation Layer)
PDU 类型: 表示数据单元
作用: 表示层负责数据的格式化、加密和解密。PDU 代表经过转换和编码的应用数据。
应用层 (Application Layer)
PDU 类型: 应用数据单元
作用: 应用层直接面向用户,提供各种网络应用服务。PDU 表示应用程序数据的封装形式,例如 HTTP 请求或 FTP 文件传输数据。
PDU 的结构
PDU 的结构通常包括两部分:
协议头部 (Protocol Header)
包含控制信息,例如地址、序列号、确认号、错误校验码等。这些信息用于数据的寻址、控制流量、错误检测和恢复。
数据部分 (Payload)
包含实际需要传输的数据信息,通常是上层协议传递下来的服务数据单元 (SDU)。
PDU 的传输过程
数据封装 应用层产生的数据(SDU)在每一层协议中被封装为 PDU。每一层协议为其添加特定的协议头部 (PCI),形成一个完整的 PDU。
传输和转发: PDU 在各层之间传输和转发,直到到达目标节点。在传输过程中,网络设备根据 PDU 中的控制信息(如地址、协议类型等)进行相应的路由、转发和错误处理。
数据解封装: 在接收方,每一层协议去除相应的协议头部 (PCI),直到恢复出上层协议传递下来的原始数据(SDU)。
1.5.2 SDU 服务数据单元
服务数据单元 (SDU, Service Data Unit) 是指在计算机网络协议栈中,每一层协议实体之间传递的数据内容。SDU 是协议层之间交换的实际数据,不包含任何协议的控制信息。SDU 是上层协议希望通过下层协议传输的内容。
SDU 的作用
- 传递数据内容: SDU 作为高层协议产生的原始数据载荷,从高层协议向低层协议传递,并等待被封装和传输。
- 数据封装的基础: SDU 是构成 PDU 的核心数据部分。每当 SDU 被传递给下一层协议时,协议层会为其添加特定的协议控制信息 (PCI),形成完整的 PDU。
- 数据交换: SDU 是数据交换的基本单位,用于在不同层的协议之间传输实际数据,实现协议层之间的交互和数据传输。
SDU 的传输过程
数据生成: 应用层或高层协议生成数据,这些数据作为 SDU,被传递到下一层协议进行进一步处理。
数据传递: SDU 被传递到下一层协议进行封装处理。下层协议会为 SDU 添加协议控制信息(PCI),形成新的 PDU。
封装和解封装: 在数据传输过程中,SDU 被逐层封装和解封装。发送方将 SDU 封装成 PDU,接收方解封装 PDU 以恢复原始的 SDU。
最终传递: 接收方逐层解封装 PDU,直到到达目标协议层并恢复出最初的 SDU。
SDU 与 PDU 的区别
- SDU (Service Data Unit): 服务数据单元,表示由上一层协议传递给下一层协议的实际数据内容,不包含任何控制信息。
- PDU (Protocol Data Unit): 协议数据单元,包含实际传输的数据(SDU)和用于控制数据传输的协议控制信息 (PCI)。
SDU 的重要性
- 提供数据传输的基础: SDU 是数据传输过程中最基本的数据单位,所有的数据封装和传输操作都是基于 SDU 进行的。
- 支持协议分层设计: SDU 的传输过程体现了网络协议的分层设计思想,使每一层协议可以独立实现和优化。
- 保证数据的完整性: 通过 SDU 的封装和解封装过程,数据的完整性和正确性得到保证,确保通信的可靠性和有效性。
服务数据单元 (SDU) 是计算机网络中每一层协议之间传递的实际数据内容。理解 SDU 的概念和传输过程有助于掌握协议之间如何交互和数据如何在网络中进行传输。SDU 的传递、封装和解封装过程体现了网络协议的分层设计和数据交换机制,确保了网络通信的有效性和可靠性。
1.5.3 PCI 协议控制信息
协议控制信息 (PCI, Protocol Control Information) 是计算机网络中用于控制和管理数据传输的附加信息,位于协议数据单元(PDU)的头部部分。PCI 包含了数据在传输过程中需要的所有控制信息,例如地址、序列号、错误校验码等。它是确保数据能够正确传输、路由和处理的关键元素。
PCI 的作用
地址信息: 包含源地址和目的地址,用于定位数据的发送方和接收方。网络设备依赖这些地址信息进行数据的路由和转发。
错误检测和校验: 包含错误检测码(如 CRC 校验码),用于检测在传输过程中发生的错误,确保数据的完整性。
流量控制: 包含与流量控制相关的信息(如窗口大小),用于协调数据的发送速度,防止网络拥塞。
序列控制: 包含序列号和确认号等信息,用于确保数据包按正确的顺序到达目标,并对已接收的数据进行确认。
其他控制信息: 包括协议版本、数据长度、优先级等,用于指示如何处理数据包和提供其他必要的控制信息。
PCI 的结构
PCI 的具体结构会根据所处的协议层和具体的协议类型而有所不同。一般来说,PCI 包含以下部分:
源地址和目的地址: 指示数据的来源和目的地。
序列号和确认号: 用于数据包的排序和确认,确保可靠传输。
协议类型和版本: 标识数据包使用的协议类型(如 TCP、UDP)和协议版本。
控制位: 包含数据传输控制的信息,例如 SYN、ACK 等标志位,用于管理连接的建立、数据传输和连接的关闭。
校验和: 用于错误检测,确保数据在传输过程中的完整性。
PCI 的传输过程
添加控制信息: 在数据封装过程中,每层协议都会为其数据部分(SDU)添加特定的协议控制信息(PCI),形成一个完整的协议数据单元(PDU)。
传输和处理: 网络设备(如路由器和交换机)在数据传输过程中读取 PCI 中的控制信息(如源地址、目的地址、协议类型等),根据这些信息进行数据的路由、转发和错误检测等处理。
解封装和去除控制信息: 在数据到达目标节点后,每一层协议将 PCI 从 PDU 中移除,保留数据部分(SDU),并将其传递给上层协议进行进一步处理。
PCI 的重要性
确保数据的正确传输: PCI 提供了数据传输所需的所有控制信息,确保数据能够被正确地路由、传输和处理。
实现数据的可靠传输: 通过 PCI 中的序列号、确认号和错误检测码等信息,实现数据的可靠传输,防止数据丢失和重复。
支持网络设备的路由和转发: PCI 中的地址信息和协议类型信息使得网络设备能够正确地识别数据的来源和目的地,并进行相应的路由和转发操作。
优化网络性能: 通过流量控制信息,PCI 可以帮助调节数据的传输速度,防止网络拥塞,优化网络性能。
协议控制信息 (PCI) 是网络通信中不可或缺的一部分,它提供了数据传输过程所需的所有控制信息。PCI 的存在确保了数据在传输过程中能够被正确地路由、转发和处理,确保通信的可靠性和有效性。通过理解 PCI 的结构和作用,我们可以更好地掌握数据在网络中的传输过程及其控制机制。
1.5.4 三者的关系
- PDU 是用于传输的完整数据单元,包含了 SDU(实际数据)和 PCI(控制信息)。
- SDU 是上层协议交给下层协议传输的实际数据内容,不包含任何控制信息。
- PCI 是每一层协议在封装数据时添加的控制信息,确保数据在网络中的正确传输、路由和处理。
三者通过封装和解封装过程相互配合,保证了网络通信中的数据传输效率和可靠性。通过理解这三者的关系,可以更好地掌握数据在网络中如何进行传输、解析和控制。
PCI 的结构
1.8 传输过程
在计算机网络中,数据的传输过程涉及到多个协议层之间的相互协作。每一层协议在发送数据时都会对数据进行封装,而在接收数据时进行解封装。以下是从浏览器到服务器的数据传输过程以及服务器接收到数据后的处理过程。
数据封装过程(从浏览器到服务器)
1. 应用层
步骤: 应用层将生成的应用数据(如 HTTP 请求)作为 服务数据单元 (SDU) 传递给传输层。
封装: 应用层为数据添加 HTTP 头部 (H4),形成一个应用层 协议数据单元 (PDU)。
2. 传输层
步骤: 传输层接收来自应用层的 PDU(包括 HTTP 头部和数据),并将其作为新的 SDU。
封装: 传输层为 SDU 添加 TCP 头部 (H3)(若使用 TCP 协议),形成新的 PDU。这个 PDU 包括传输层控制信息,如端口号、序列号、确认号等,以确保数据的可靠传输。
3. 网络层
步骤: 网络层接收传输层的 PDU,将其作为 SDU 处理。
封装: 网络层为 SDU 添加 IP 头部 (H2),形成新的 PDU。IP 头部包括源 IP 地址、目标 IP 地址、TTL(生存时间)等信息,用于在网络中路由数据包。
4. 数据链路层
步骤: 数据链路层接收网络层的 PDU,将其作为 SDU 处理。
封装: 数据链路层为 SDU 添加 帧头部 (H1) 和 帧校验序列 (T1),形成完整的帧。帧头部包含源 MAC 地址、目标 MAC 地址等信息,用于在本地网络链路上传输数据。帧校验序列用于数据的错误检测。
5. 物理层
步骤: 数据链路层的帧被转换为物理层的比特流,通过物理介质(如电缆、光纤)进行传输。
数据解封装过程(从服务器接收数据)
1. 数据链路层
步骤: 服务器的物理层接收到比特流,转换为帧并传递给数据链路层。
解封装: 数据链路层移除 帧头部 (H1) 和 帧校验序列 (T1),将剩余部分传递给网络层。
2. 网络层
步骤: 网络层接收到数据链路层传递的数据包,将其作为 PDU 处理。
解封装: 网络层移除 IP 头部 (H2),并将剩余部分传递给传输层。
3. 传输层
步骤: 传输层接收到网络层传递的数据包,将其作为 PDU 处理。
解封装: 传输层移除 TCP 头部 (H3),将数据部分传递给应用层。
4. 应用层
步骤: 应用层接收传输层传递的数据,将其作为 PDU 处理。
解封装: 应用层移除 HTTP 头部 (H4),恢复出原始的应用数据,完成数据的传输过程。
通过上述封装和解封装的过程,数据从浏览器发送到服务器,经过多个协议层的处理,每一层协议为数据添加或移除相应的控制信息,确保数据在传输过程中的可靠性、完整性和准确性。这种分层的传输机制体现了网络协议栈的设计思想,使得不同类型的数据都可以通过相同的网络基础设施进行有效的传输。
1.5 网络层协议概述
网络层协议是计算机网络通信的基础,这些协议负责数据包的传输、寻址、错误处理和管理等功能。以下是 DHCP、ARP、ICMP 和 DNS 协议的简介。
1.5.1 DHCP协议
定义:
DHCP (Dynamic Host Configuration Protocol),动态主机配置协议,是一种用于自动分配 IP 地址及其他网络配置参数(如网关地址和 DNS 服务器)的网络协议,能够简化网络管理。
工作原理:
当新设备接入网络时,它会向 DHCP 服务器发送一个广播请求,询问可用的 IP 地址。DHCP 服务器根据可用 IP 地址池分配一个 IP 地址,并返回包含 IP 地址、子网掩码、网关和 DNS 等配置的响应报文。设备接收到后,将这些配置应用于自身以加入网络。
动态IP
用途:
主要用于动态分配网络设备的 IP 地址,常见于家庭和企业网络环境,尤其适合需要频繁变化网络环境的场景,如无线网络。
1.5.2 ARP协议
定义:
ARP (Address Resolution Protocol),地址解析协议,是用于将 IP 地址解析为 MAC 地址的网络协议,使设备能够在局域网 (LAN) 中通信。
工作原理:
ARP 通过广播请求来询问目标 IP 地址的设备,并请求其 MAC 地址。目标设备接收到请求后,会以自己的 MAC 地址进行响应,从而在发送方的 ARP 缓存中建立 IP 地址到 MAC 地址的映射关系。
用途:
用于局域网中设备之间的通信,通过将 IP 地址转换为 MAC 地址,实现以太网通信。
1.5.3 ICMP协议
定义:
ICMP (Internet Control Message Protocol),互联网控制消息协议,是一种用于在 IP 网络中传递控制消息和错误报告的协议,用于检测网络状态和诊断网络问题。
工作原理:
ICMP 消息通过 IP 数据包传递,包含网络错误报告(如目标不可达、时间超过等)或网络测试信息(如 ping
命令)。ICMP 帮助网络设备之间进行诊断和维护网络连通性。
用途:
用于网络诊断、监控和故障检测,通常用于 ping
和 traceroute
等网络工具。
1.5.4 DNS协议
定义:
DNS (Domain Name System),域名系统协议,是用于将人类可读的域名(如 www.baidu.com)解析为 IP 地址(如 192.0.2.1)的系统和协议,使得用户能够通过域名访问网络资源。
ip -> 网址 对应
工作原理:
当用户在浏览器中输入一个域名时,DNS 客户端(如操作系统的 DNS 解析器)会向 DNS 服务器发送查询请求。DNS 服务器查找相应的 IP 地址并将结果返回给客户端。客户端使用这个 IP 地址来与目标服务器建立连接。
用途:
用于域名解析和 IP 地址转换,是互联网运作的核心协议之一,确保用户能够通过易记的域名访问各种网络服务。
1.6 TCP和UDP
在 TCP/IP 协议中有两种传输协议。
TCP/IP 协议中的基本协议使得这些协议在不同网络层面都能良好地合作,它们为网络中的多主机提供通信服务,也为信息的质量和安全层面提供的传输保障。
在主流的传输层协议中,最常见的为 TCP 和 UDP。
在此主要介绍在网络编程中涉及的 TCP 和 UDP。
tcp 可靠传输 但是消耗资源
建立链接: 三次握手
取消链接:四次挥手
每次发送数据的时候 都会发送 ack 序号包 还需要接收 接收方 确认包
udp 不可靠传输 消耗资源少
只管发 接收方是否可以接收到 不管
1.6.2 UDP
概述
UDP 是用户数据报协议,是一种面向无连接的传输协议,具有数据报传输、处理速度快等特点。由于 UDP 协议不需要建立一个连接,因此 UDP 协议更加简单,固定 UDP 协议头更加简短。UDP 比 TCP 更为高效,但相应地不提供数据的完整性和可靠性保证。目前为止,电信网络的内网部分多使用 UDP。
UDP 数据包格式
源端口:16 位,标识发送端的源端口号。
目的端口:16 位,标识接收端的目的端口号。
长度:16 位,表示 UDP 报文的总长度。
校验和:16 位,确保 UDP 数据的有效性。
1.6.3 比较
- 对数据传输的可靠性:与可靠的传输协议 TCP 不同,UDP 没有流量控制和差错控制,适用于适度传输数据量的应用。
- TCP 的特点是高可靠性,能进行流量控制和差错控制。UDP 的特点是速度快,但是不可靠。
第二章 网络基础
2.1 IP地址
2.1.1 IP地址的概念
IP 地址用来标识网络中的一台主机。根据不同的协议版本,分为 IPv4(32 位)和 IPv6(128 位),本书主要讨论基于 IPv4 协议的网络通信。一个 IP 地址包含两部分:网络号和主机号。其中,网络号标志出与主机相同的网络区域,主机号标识网络内的设备或终端。简单地说,有了网络号和主机号,数据包就能在不同的主机之间传递而无需经过多余的中转。
2.1.2 IP地址格式转换
IP 地址有两种不同格式:十进制点分形式 和 32 位二进制形式。前者是用户所熟悉的形式,而后者则是计算机用于地址传输的格式。
API介绍
IPv4 地址的格式转换包括 inet_addr
inet_aton() 将IPv4地址从点分十进制字符串格式转换为二进制格式。
inet_addr() 将IPv4地址从点分十进制字符串格式转换为 网络字节序 的整数。
inet_ntoa() 将IPv4地址从网络字节序的二进制格式转换为点分十进制字符串格式。
IPv4 和 IPv6 都兼容
inet_pton() 将IP地址(IPv4或IPv6)从文本字符串格式转换为二进制格式。
inet_ntop() 将IP地址(IPv4或IPv6)从二进制格式转换为文本字符串格式。
2.1.3 相关函数
inet_aton
函数 十进制点分 -> 二进制
头文件:
#include <arpa/inet.h>
函数原型:
int inet_aton(const char *cp, struct in_addr *inp);
功能:
将表示 IPv4 地址的十进制点分字符串转换为网络字节序的二进制形式。
参数:
cp: 指向要转换的 IP 地址的字符串。
inp: 存储转换后的二进制 IP 地址的结构体指针。
返回值:
成功:返回非零值。
失败:返回 0,并设置相应的错误码。
inet_addr
函数 十进制点分 -> 网络字节序整数
头文件:
#include <arpa/inet.h>
函数原型:
in_addr_t inet_addr(const char * strptr );
功能:
将表示 IPv4 地址的十进制点分字符串转换为网络字节序的整数。
参数:
strptr: 要转换的 IP 地址字符串。
返回值:
成功:返回 32 位的网络字节序整数形式的 IP 地址。
失败:返回 INADDR_NONE(通常是 -1)。
inet_ntoa
函数 二进制 -> 十进制点分
头文件:
#include <arpa/inet.h>
函数原型:
char *inet_ntoa(struct in_addr in);
功能:
将网络字节序的二进制 IPv4 地址转换为十进制点分字符串形式。
参数:
in: 包含要转换的二进制 IP 地址的 `in_addr` 结构体。
返回值:
成功:返回一个指向静态缓冲区的字符串指针,该缓冲区包含转换后的 IP 地址。
注意:该函数不是线程安全的,多次调用会覆盖缓冲区内容。
2.2 端口
端口(Port)是计算机网络中的一个逻辑概念,用于区分同一网络中多个不同的应用程序或服务。在网络通信中,端口的主要作用是识别不同的进程和服务,使得多个程序可以同时使用网络进行通信而不会互相干扰。端口是传输层协议(如TCP和UDP)的重要组成部分。
2.2.1 端口的基本概念
端口号(Port Number)
端口号是一个16位的整数,取值范围从 0 到 65535。端口号用于区分同一台计算机上的不同网络应用程序或服务。每个端口号对应一个特定的网络服务或应用程序。
端口的类型
TCP端口:基于TCP(传输控制协议)的端口,提供面向连接的、可靠的数据传输。常用于需要确保数据完整性和顺序的应用场景,如网页浏览(HTTP)、电子邮件(SMTP)、文件传输(FTP)。
UDP端口:基于UDP(用户数据报协议)的端口,提供无连接的、快速的数据传输。适用于对实时性要求高但不需要保证数据完整性的应用场景,如视频流传输、在线游戏、DNS查询。
端口的工作原理
当一台设备需要与另一台设备通信时,源设备会通过一个源端口号发送数据到目标设备的目标端口号。目标设备根据目标端口号将数据转发到相应的应用程序或服务,从而实现网络通信。
2.2.2 端口的分类
公认端口(Well-known Ports):
- 端口号范围:0 到 1023
- 这些端口由IANA(互联网号码分配机构)管理并分配给常见的网络服务。例如:
- 21: FTP(文件传输协议)
- 22: SSH(安全外壳协议)
- 23: Telnet(远程登录)
- 25: SMTP(简单邮件传输协议)
- 53: DNS(域名系统)
- 80: HTTP(超文本传输协议)
- 443: HTTPS(安全超文本传输协议)
注册端口(Registered Ports):
- 端口号范围:1024 到 49151
- 这些端口通常用于非标准的应用程序或服务,但也可以向IANA注册。它们常用于需要网络通信的较小应用程序或公司专有服务。
动态或私有端口(Dynamic or Private Ports):
- 端口号范围:49152 到 65535
- 这些端口不需要注册,通常用于客户端程序的临时或动态通信。客户端应用程序通常从这些端口发起网络请求,例如浏览器访问网页时使用的临时端口。
2.2.3 常见端口
20/21: FTP(文件传输协议) - 用于文件传输。
22: SSH(安全外壳协议) - 用于安全的远程登录和命令执行。
23: Telnet - 用于不安全的远程登录。
25: SMTP(简单邮件传输协议) - 用于发送电子邮件。
53: DNS(域名系统) - 用于域名解析。
80: HTTP(超文本传输协议) - 用于网页浏览。
110: POP3(邮局协议第3版) - 用于接收电子邮件。
143: IMAP(互联网邮件访问协议) - 用于在线邮件读取。
443: HTTPS(安全超文本传输协议) - 用于加密的网页浏览。
2.3 字节序
字节序是指多字节数据在内存中存储的顺序。字节序有两种主要类型:
- 大端序(Big-Endian):高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。大端序通常用于==网络传输数据==的字节顺序。
- 小端序(Little-Endian):低位字节存储在内存的低地址处,高位字节存储在内存的高地址处。小端序通常用于大多数==个人计算机==的字节顺序。
12 34 56 78
INT 地址 首地址 78
2.3.1 相关函数
在函数名 htons
、htonl
、ntohs
、ntohl
中,各个字母代表的含义如下:
h: Host(主机)
表示主机字节序(Host Byte Order)。在这些函数中,h
用于指代在主机上使用的字节序。
n: Network(网络)
表示网络字节序(Network Byte Order),也就是大端字节序(Big-Endian)。n
用于指代用于网络传输的字节序。
s: Short(短整数)
表示一个 16 位(2 字节)的无符号短整数(short
)。在函数名中,s
指的是数据类型为短整数。
l: Long(长整数)
表示一个 32 位(4 字节)的无符号长整数(long
)。在函数名中,l
指的是数据类型为长整数。
htons
:Host to Network Short,表示将主机字节序的短整数转换为网络字节序的短整数。
htonl
:Host to Network Long,表示将主机字节序的长整数转换为网络字节序的长整数。
ntohs
:Network to Host Short,表示将网络字节序的短整数转换为主机字节序的短整数。
ntohl
:Network to Host Long,表示将网络字节序的长整数转换为主机字节序的长整数。
htons
用于将 16 位无符号短整数从主机字节序转换为网络字节序。
头文件:
#include <arpa/inet.h>
函数名:
uint16_t htons(uint16_t hostshort);
功能:
将主机字节序的 16 位无符号短整数转换为网络字节序(大端序)。
参数:
hostshort: 主机字节序的 16 位无符号短整数。
返回值:
返回网络字节序的 16 位无符号短整数。
htonl
用于将 32 位无符号长整数从主机字节序转换为网络字节序。
头文件:
#include <arpa/inet.h>
函数名:
uint32_t htonl(uint32_t hostlong);
功能:
将主机字节序的 32 位无符号长整数转换为网络字节序(大端序)。
参数:
hostlong: 主机字节序的 32 位无符号长整数。
返回值:
返回网络字节序的 32 位无符号长整数。
ntohs
用于将 16 位无符号短整数从网络字节序转换为主机字节序。
头文件:
#include <arpa/inet.h>
函数名:
uint16_t ntohs(uint16_t netshort);
功能:
将网络字节序的 16 位无符号短整数转换为主机字节序。
参数:
netshort: 网络字节序的 16 位无符号短整数。
返回值:
返回主机字节序的 16 位无符号短整数。
ntohl
用于将 32 位无符号长整数从网络字节序转换为主机字节序。
头文件:
#include <arpa/inet.h>
函数名:
uint32_t ntohl(uint32_t netlong);
功能:
将网络字节序的 32 位无符号长整数转换为主机字节序。
参数:
netlong: 网络字节序的 32 位无符号长整数。
返回值:
返回主机字节序的 32 位无符号长整数。
判断大小端字节序
只能判断本机是大端字节序 还是小端字节序
#include <stdio.h>
int main() {
unsigned int x = 0x12345678; // 定义一个32位的整数
unsigned char *c = (unsigned char *)&x; // 使用字符指针指向整数的地址
// 检查第一个字节的值
if (*c == 0x12) {
printf("大端字节序 (Big-Endian)\n");
} else if (*c == 0x78) {
printf("小端字节序 (Little-Endian)\n");
} else {
printf("无法判断字节序\n");
}
return 0;
}
2.4 套接字
2.4.1 套接字定义
套接字(Socket)最早是由 BSD(伯克利软件分发版)在1983年引入的一种通信机制,目前已被广泛移植到各种主流操作系统中。对于应用开发人员来说,套接字是一种特殊的 I/O 接口,作为文件描述符的一种,提供了应用程序与操作系统网络栈之间的接口。Socket 是一种常用的进程间通信机制,不仅能实现本地不同进程之间的通信,而且可以通过网络在不同主机的进程之间进行通信。
在网络通信中,每一个 Socket 都由协议(如 TCP 或 UDP)、本地地址(IP 地址)和本地端口来唯一标识。Socket 通过系统调用函数(如 socket()
)创建,并返回一个整型的 Socket 描述符。随后的各种操作(如连接、发送、接收等)都通过这个 Socket 描述符来实现。
2.4.2 套接字的组成
套接字(Socket)是网络通信的基础,简单来说,它由以下几个部分组成:
IP地址:设备在网络中的地址,类似一个唯一的“家”地址,确保数据可以找到设备。
端口号:设备上具体应用程序的“门号”,比如 HTTP 服务常用端口号是 80,表示设备上的哪个应用接收数据。
协议:
- TCP:一种可靠的、面向连接的协议,确保数据完整有序地传输。
- UDP:一种快速的、无连接的协议,不保证数据的可靠性,但传输速度更快。
2.4.2 套接字类型
常见的 Socket 类型有以下三种:
流式套接字(SOCK_STREAM)
流式套接字提供一种可靠的、面向连接的字节流通信方式,保证数据的完整性和按序传输。TCP 协议使用流式套接字。
数据报套接字(SOCK_DGRAM)
数据报套接字提供一种不可靠的、无连接的服务,数据以独立的报文形式传输,可能无序且不保证可靠传输。UDP 协议使用数据报套接字。
原始套接字(SOCK_RAW)
原始套接字允许直接访问底层协议(如 IP 或 ICMP),通常用于开发新的协议或实现特定的低层网络操作。原始套接字提供强大的功能,但通常需要更高的权限并且使用起来更复杂。
2.5 网络工具和命令
2.5.1 网络配置和管理命令
- ifconfig: 用于查看和配置网络接口的工具。可以用于显示接口的 IP 地址、MAC 地址、子网掩码等信息。
- ip: 用于显示和管理网络设备、路由、策略路由和隧道的现代工具,是
ifconfig
的替代工具。 - route: 显示和操作路由表的命令。
- netstat: 显示网络连接、路由表、接口统计、伪装连接和多播成员的工具。
- ss: 更现代化的网络统计工具,用于显示套接字信息,取代
netstat
。 - nmcli: NetworkManager 的命令行接口,用于管理网络连接和设备。
- ethtool: 用于显示和更改网卡的参数,如速率、双工模式和自协商。
2.5.2 网络诊断和监控命令
- ping: 用于测试网络连接性,发送 ICMP 回显请求来检测目标主机是否可达。
- traceroute: 用于跟踪数据包从源主机到目标主机之间的路由路径。
- mtr: 结合了
ping
和traceroute
功能的工具,用于诊断网络问题。 - dig: 域名查询工具,用于获取 DNS 解析信息。
- nslookup: 另一种域名查询工具,用于获取 DNS 解析信息。
- tcpdump: 网络流量抓包工具,用于捕获和分析网络数据包。
- wireshark: 图形界面的网络数据包分析工具(需要在图形界面环境下运行)。
2.5.3 网络测试和扫描工具
- nmap: 网络扫描工具,用于发现主机和服务,进行安全审计。
- netcat (nc): 网络调试和探测工具,用于创建任意的 TCP/UDP 连接和监听器。
- iperf: 网络带宽测试工具,用于测试网络带宽性能。
2.5.4 文件传输和远程登录工具
- ssh: 安全外壳协议,用于远程登录和命令执行。
- scp: 基于 SSH 的安全文件复制工具。
- rsync: 快速、灵活的文件同步工具,支持本地和远程文件同步。
- ftp: 文件传输协议工具,用于从 FTP 服务器上传和下载文件。
- wget: 命令行工具,用于从 web 服务器下载文件。
- curl: 命令行工具,用于发送和接收数据,支持多种协议(HTTP, FTP, SMTP 等)。
2.5.5 网络服务管理工具
- systemctl: 用于启动、停止、重启和管理网络服务。
- firewalld: 动态防火墙管理工具,用于管理网络防火墙规则。
- 感谢你赐予我前进的力量