菩提网络 - 网络技术分享的网站 - 考研408
408计算机网络背诵宝典：从基础到高阶全梳理
第一章：计算机网络体系结构**计算机网络基础概念计算机网络是利用通信设备和线路将功能独立的多个计算机互联起来，通过功能完善的管理软件实现网络中资源共享和信息交互。其功能涵盖数据通信（实现计算机与终端、计算机与计算机之间的信息快速传送 ，像日常的文件传输、网页浏览等）、资源共享（共享网络中的软件、硬件和数据资源，例如共享打印机、数据库资源等）、分布式处理（多台计算机分工处理同一个任务的不同部分，如 Hadoop 平台用于大规模数据处理）、提高可靠性（当一台计算机出现故障，其他计算机可替代工作）以及负载均衡（多台计算机分担工作任务，避免单台计算机负载过重）。计算机网络依据分布范围，可分为广域网（WAN ）、城域网（MAN ）、局域网（LAN ）和个人区域网（PAN ）。广域网覆盖范围通常是直径为几十千米到几千千米的区域，是因特网的核心部分，用于远程数据传输和大规模的网络通信，如跨国公司的数据交换；城域网覆盖范围可以跨越几个街区甚至是整个城市，直径范围是 5 - 50 千米，大多采用以太网技术；局域网一般用微机或工作站通过高速线路相连，覆盖范围较小，通常是直径几十米到几千米的区域 ，在计算机配置数量上无太多限制，传统上使用广播技术；个人区域网是指在个人工作的地方将消费电子设备用无线技术连接起来的网络，覆盖区域直径约为 10 米。按使用者分类，可分为公用网（如中国电信、移动、联通等向公众开放的网络）和专用网（像军队、政府、银行、铁路、公安等仅供特定组织内部使用的网络 ）。常见的基本拓扑结构包括总线形、星形、环形、树形和网状形。总线形结构采用广播式传输方式，所有设备通过一个共同的通信线路连接，数据在总线上 “广播” 传输，可能会存在总线争用问题，典型代表是集线器连接的网络；星形结构中所有数据流都经过中央设备（如交换机或集线器），每个节点通过独立的连接与中央设备相连，实现 “点到点” 的通信，不存在 “总线争用” 问题，以太网交换机是典型代表；环形结构中数据通过 “令牌” 依次传递，每个设备都需要获得令牌才能发送数据，避免了总线争用的问题，令牌环网是这种结构的典型代表，曾广泛应用于 2000 年以前的局域网技术；树形结构结合了星型和总线型拓扑的特点，有一个主干链路，从主干上分出多个星型子网，形成层次结构，易于扩展和管理，故障隔离相对容易 ，常用于大型企业网络和校园网络；网状形结构中每个设备（节点）与其他设备直接连接，数据通过中间节点逐一存储并转发，属于 “点到点” 传输，由众多路由器构建的广域网是网状结构的典型代表，具有高冗余性和可靠性，但成本高、管理复杂。从逻辑功能上，计算机网络可分为资源子网和通信子网，资源子网负责实现资源共享和数据处理，通信子网负责实现数据通信。性能指标详解带宽是指在一定时间内（通常是 1 秒）能够通过网络从一个点传送到另一个点的最大数据量 ，单位是比特 / 秒（bit/s ），常见单位还有千比特每秒（Kbps）、兆比特每秒（Mbps ）、吉比特每秒（Gbps）等 ，它反映了网络连接的能力。比如，我们常说的 100M 宽带，这里的 100M 指的是 100Mbps ，即理论上每秒能传输 100,000,000 比特的数据。时延是指一个数据块从网络的一端传送到另一端所需要的时间，单位是秒（s） ，由发送时延、传播时延、处理时延和排队时延组成。发送时延是主机或路由器发送数据帧所需要的时间，计算公式为发送时延 = 数据帧长度（比特）/ 信道带宽（比特 / 秒） ，数据帧越长、信道带宽越低，发送时延越大；传播时延是电磁波在信道中传播一定距离需要花费的时间 ，计算公式为传播时延 = 信道长度（米）/ 电磁波在信道上的传播速率（米 / 秒） ，信道越长、传播速率越低，传播时延越大；处理时延是主机或路由器在收到分组时进行处理（如分析分组首部、提取数据、差错校验、查找路由等）所花费的时间，其大小取决于主机或路由器的性能以及分组的大小和复杂性；排队时延是分组在经过网络传输时，在路由器输入队列和输出队列中排队等待处理和转发所花费的时间，其大小取决于网络拥塞程度、路由器的处理能力和队列的大小等因素。吞吐量是指单位时间内通过某个网络（或信道、接口）的数据量，受网络带宽和网络拓扑结构等因素影响 。速率即数据率、比特率，指的是单位时间内传输的数据量，单位为 bit/s。信道利用率是指某信道有百分之几的时间是被利用的（有数据通过），信道利用率并非越高越好，因为当信道利用率过高时，会产生较大的时延。体系结构与参考模型网络体系结构是计算机网络的各个层次及其相关协议的集合，是对计算机网络所完成功能的精确定义 。在网络体系结构中，涉及到接口数据单元（IDU）、服务数据单元（SDU）、协议数据单元（PDU） 。IDU 是在相邻层之间传输的数据单元；SDU 是为完成用户所要求的功能而应传送的数据；PDU 是对等层次之间传送的数据单位，每一层的 PDU 都有特定名称，如物理层的 PDU 是数据位（Bit），数据链路层是数据帧（Frame），网络层是数据包 / 分组（Packet），传输层是数据段（Segment），更高层级为报文（Message） ，它们之间存在着包含和转换的关系。网络协议是为主机与主机之间、主机与通信子网之间或子网中各通信节点之间的通信而使用的，是通信双方必须遵守的，事先约定好的规则、标准或约定 。其包含三要素：语法，即数据与控制信息的结构或格式，比如规定了数据包的首部和数据部分的格式；语义，即需要发出何种控制信息，完成何种动作以及做出何种响应，例如规定了不同类型的数据包所代表的含义；时序（同步），即事件实现顺序的详细说明，如规定了数据发送和接收的先后顺序。网络协议采用分层方式具有诸多优点，各层之间相互独立，某一层的变化不会影响其他层 ；灵活性好，当某一层的功能需要改变时，只需修改该层，不影响整体；结构上可分隔开，便于实现和维护；有利于标准化工作，不同厂商可以按照标准开发相应层次的产品 。协议族，也叫协议栈，是许多成员协议的集合。接口是相邻实体间的通信边界，每一层都定义了向它的相邻高层提供的一组服务，服务由服务访问点（SAP）提供上层使用，某一层的 SAP 就是上一层可以访问本层服务的地方，每个 SAP 都有一个唯一属于它的地址 ，它是同一系统中相邻两层的实体进行交互的地方 。第二章：通信基础数据通信基本概念数据通信系统模型由源系统（信源和发送器）、传输系统（传输网络）、目的系统（接收器和信宿）组成。信源产生数据，如计算机产生的文本、图像等；发送器将信源产生的数据转换为适合在传输系统中传输的信号，例如调制解调器将数字数据转换为模拟信号；传输系统负责传输信号，可以是有线或无线的传输介质，像双绞线、光纤、无线电波等；接收器从传输系统中接收信号，并将其转换为目的系统能够处理的形式；信宿是数据的最终接收者，比如计算机、手机等设备 。数据是运送消息的实体，信号是数据的电气表现或电磁表现，是数据的传送形式 。信号分为模拟信号和数字信号，模拟信号代表消息的参数取值是连续的，像电话线上传输的语音信号；数字信号代表消息的参数取值是离散的，如计算机内部传输的数据信号 。信道是信号的传输载体，按传输信号的类型可分为模拟信道（传输模拟信号，如传统的电话线路）和数字信道（传输数字信号，如以太网线路），按传输方向可分为单向通信（单工通信，如广播电视，只能从发射端到接收端，没有反方向的通信）、双向交替通信（半双工通信，如对讲机，通信双方可以发送信息，但不能同时收发）、双向同时通信（全双工通信，如打电话，双方可以同时进行收发）。编码与调制数字数据编码为数字信号有多种方式，归零码（RZ）用正脉冲代表 1，负脉冲代表 0，每个码元传输完毕后会回到零电平 ，常用于低速数字信号传输；非归零码（NRZ）用正电平代表 1，负电平代表 0 ，没有时钟信号，不能自我同步，在实际应用中很少单独使用；曼彻斯特编码将一个码元分成两个相等的间隔，前一个间隔为高电平后一个为低电平表示码元 1 ，码元 0 则相反，也可采用相反规定，常用于局域网，解决了时钟提取问题；差分曼彻斯特编码若码元为 1 ，则前半个码元的电平与上一个码元的后半个码元的电平相同，若为 0 则相反，抗干扰性强于曼彻斯特编码。数字数据调制为模拟信号主要有调幅（AM） ，载波的振幅随基带数字信号而变化，如早期的广播电台；调频（FM） ，载波的频率随基带数字信号而变化，抗干扰能力强，常用于广播和电视广播；调相（PM） ，载波的初始相位随基带数字信号而变化 ，常用于数字通信。模拟数据编码为数字信号以脉冲编码调制（PCM）为例，包括采样（每隔一定时间间隔对模拟信号进行取值，采样频率需大于等于模拟信号最高频率的 2 倍，以保证能完整恢复原始信号，如音频信号采样频率常为 44.1kHz ）、量化（将采样得到的模拟信号幅度值映射到有限个离散值上，如 8 位量化可以将模拟信号分为 256 个量化级）、编码（将量化后的离散值用二进制代码表示，如将量化后的信号转换为二进制数字序列 ）三个过程。传输介质双绞线是由两根具有绝缘保护层的铜导线按一定密度互相绞在一起形成的传输介质，分为屏蔽双绞线（STP）和非屏蔽双绞线（UTP） 。UTP 成本低、安装方便，被广泛应用于局域网中，传输距离通常在 100 米以内，传输速度可达 100Mbps ；STP 具有良好的抗干扰性，适合在电磁干扰较强的环境中使用。同轴电缆由内导体、绝缘层、屏蔽层和外导体组成，传输带宽较双绞线宽，传输距离也更远，可达 500 米 ，分为粗同轴电缆和细同轴电缆，粗同轴电缆主要用于早期的电视和宽带网络，细同轴电缆则广泛应用于有线电视和无线电视中。光纤是一种由玻璃或塑料制成的纤维，利用光的全反射原理进行信号传输，传输速度最快、传输距离最远，传输带宽可达到几 Gbps 甚至几十 Gbps，传输距离可达几十公里 ，抗干扰性强，信号衰减小，传输质量高，分为单模光纤和多模光纤，单模光纤传输距离更远，传输带宽更大，但成本较高。无线传输介质利用无线电波、微波、红外线等进行传输。无线电波覆盖范围广，可用于长距离通信，如手机通信；微波在空间主要是直线传播，地面微波接力通信常用于长途通信，卫星通信利用人造卫星作为中继站，实现远距离通信，如全球定位系统（GPS）；红外线传输距离较短，常用于短距离无线通信，如电视遥控器。信道复用技术频分复用（FDM）是将传输媒体的总频带划分成多个子频带，每个子频带作为一个通信子信道，每对用户使用其中一个子信道进行通信，各子信道之间需留出隔离频带以免造成子信道间的干扰，所有用户在同样时间占用不同的带宽资源，例如广播电视通过将不同频率的音频和视频信号合并在一起，然后通过一个发射机发送出去。时分复用（TDM）是将时间划分为一段段等长的时隙，每一个时分复用的用户在其相应时隙内独占传输媒体的资源进行通信，所有用户在不同时间占用同样的频带宽度，比如电话系统通过将多个电话用户的语音信号在不同的时隙中轮流发送，提高了电话系统的利用率 。统计时分复用（STDM）是改进的时分复用，能够根据用户实际需求动态分配时隙，明显提高信道的利用率，适用于计算机网络这种具有突发性数据传输的场景。波分复用（WDM）是光的频分复用，根据频分复用的设计思想，可在一根光纤上同时传输多个频率（波长）相近的光载波信号，实现基于光纤的频分复用技术，目前可以在一根光纤上复用 80 路或更多路的光载波信号，也称为密集波分复用（DWDM） ，常用于光纤通信系统中，实现大容量数据传输。码分复用（CDM）常称为码分多址（CDMA） ，是在扩频通信技术基础上发展起来的无线通信技术。每个用户可以在相同时间、使用相同频带进行通信，将每个比特时间划分为 m 个更短的时间片，称为码片（Chip），m 的取值通常为 64 或 128 。每个站被指派一个唯一的 m 比特码片序列，若发送比特 1，则发送自己的 m 比特码片序列；若发送比特 0，则发送该码片序列的二进制反码 ，常用于无线通信系统，如 3G、4G 移动通信网络。第三章：数据链路层数据链路层功能概述数据链路层作为 OSI 参考模型的第二层，位于物理层之上、网络层之下，主要负责将网络层传来的数据封装成帧，并在物理链路上进行传输，同时处理与物理链路相关的控制信息 。其功能众多，链路管理用于建立、维护和释放数据链路连接，确保通信双方在数据传输前准备就绪，例如在电话通信中，双方拿起电话后建立连接，通话结束后挂断电话释放连接 。帧同步要让接收方从收到的比特流中准确判断出一帧的开始和结束位，保证数据接收的准确性，就像在阅读文章时，需要通过标点符号来区分句子的开始和结束 。流量控制负责调节发送方的数据发送速度，使接收方能够及时接收，避免数据拥塞，比如在下载文件时，如果发送方发送数据过快，接收方可能会因为来不及处理而导致数据丢失 。差错控制用于发现和纠正传输中出现的错误，确保数据的完整性，常见的如奇偶校验码、循环冗余校验码（CRC）等检错方法 。透明传输是采取适当措施，使接收方不会将数据误认为控制信息，保证数据的正常传输，比如当数据中出现与控制字符相同的字节时，通过特殊的转义处理来避免误解 。寻址则使收发双方明确对方的身份，确保数据能够准确送达目标，就像寄信时需要填写收件人和寄件人的地址 。组帧方式字符计数法是在帧首部设置一个计数字段，用它来标明帧内字符数 。比如，若计数字段值为 10 ，则表示该帧包含 10 个字符（包括首部的计数字段本身） ，这种方法实现简单，但计数字段一旦出错，后续帧的定界都会受到影响，就像多米诺骨牌一样，一个错误会引发连锁反应 。字符填充的首尾定界符法通过约定特殊字符，如用 SOH（Start of Header ，首部起始）和 EOT（End of Transmission ，传输结束）分别标记帧的起始和结束位置 。当数据部分出现与这些定界符相同的字符时，会在其前面插入转义字符 ESC（Escape character ，转义字符），接收方收到数据后，若检测到 ESC 字符，就会将其后面的字符当作普通数据处理，从而避免误判帧的边界 。比特填充的首尾标志法以特定的比特模式作为帧的首尾标志，如常见的 01111110 。在发送数据时，若数据部分出现连续 5 个 1 ，则在其后插入一个 0 ；接收方收到数据后，会对数据进行扫描，若发现连续 5 个 1 后面紧跟一个 0 ，则将这个 0 删除，以此保证数据的透明传输，防止标志位被误判 。违规编码法利用物理层编码规则中禁用的编码组合来定界帧的起始和终止 ，这种方法不需要额外的同步字符或比特填充，效率较高，但它依赖于特定的物理层编码方案，通用性较差 。差错控制检错编码主要用于检测数据传输过程中是否出现错误，奇偶校验码是一种简单的检错方法，分为奇校验和偶校验 。奇校验是使整个校验码（包括数据位和校验位）中 “1” 的个数为奇数，偶校验则是使 “1” 的个数为偶数 。例如，对于数据 1010 ，若采用偶校验，校验位为 1 ，使得 10101 中 “1” 的个数为偶数；若采用奇校验，校验位为 0 ，10100 中 “1” 的个数为奇数 ，奇偶校验码只能检测出奇数个比特错误，对于偶数个比特错误则无法检测 。循环冗余校验码（CRC）是一种广泛应用的检错编码，它将数据比特序列看作一个多项式 f (x) 的系数 。在发送端，用收发双方预先约定的生成多项式 G (x) 去除 f (x) ，得到余数多项式 ，将余数多项式加到数据多项式后发送到接收端；接收端用同样的 G (x) 去除收到的多项式，若得到的余数与接收到的余数相同，则表示传输无错，否则表示传输出现错误 ，CRC 能够检测出大部分的比特错误，具有较高的检错能力 。纠错编码不仅能检测错误，还能纠正错误，海明码是一种常见的纠错编码 。它通过在数据中插入多个校验位，将数据分成若干组，每组安排一个校验位进行校验 。在接收端，通过异或运算判断各组校验结果是否正确，若出现错误，可根据出错的校验组或多个出错校验组的共同校验位，确定出错的比特位，并对其取反来纠正错误 ，海明码常用于信道特性较好的环境，如以太局域网 。介质访问控制 MAC信道划分介质访问控制是将信道的时域和频域资源合理分配给网络上的设备，实现多个设备共享信道 。频分复用（FDM）将传输媒体的总频带划分成多个子频带，每个子频带作为一个通信子信道，各子信道之间需留出隔离频带以免造成干扰，不同用户在相同时间占用不同的带宽资源，就像广播电台通过不同频率传输不同节目 。时分复用（TDM）把时间划分为等长的时隙，每个用户在其相应时隙内独占传输媒体资源进行通信，所有用户在不同时间占用同样的频带宽度，例如电话系统中多个用户通过不同时隙轮流发送语音信号 。波分复用（WDM）是光的频分复用，在一根光纤上同时传输多个频率（波长）相近的光载波信号，实现基于光纤的频分复用技术，常用于光纤通信系统中，实现大容量数据传输 。码分复用（CDM）常称为码分多址（CDMA） ，每个用户可以在相同时间、使用相同频带进行通信，通过独特的码片序列来区分不同用户的数据，常用于无线通信系统，如 3G、4G 移动通信网络 。随机介质访问控制中，ALOHA 协议允许节点在有数据要发送时直接发送，不考虑信道状态 。若发生冲突，节点随机等待一段时间后重发 ，这种协议简单，但信道利用率较低，适用于通信负荷较轻的场景 。CSMA 协议要求节点在发送数据前先监听信道，若信道空闲则发送，否则等待 ，相比于 ALOHA 协议，它减少了冲突的发生概率 。CSMA/CD（载波监听多点接入 / 碰撞检测）协议在 CSMA 的基础上，增加了冲突检测功能 。节点在发送数据的同时进行冲突检测，一旦检测到冲突，立即停止发送，并发送一个阻塞信号通知其他节点，然后随机等待一段时间后重发 ，它常用于有线局域网，如早期的以太网 。CSMA/CA（载波监听多点接入 / 冲突避免）协议用于无线局域网，由于无线信道存在隐蔽站和暴露站问题，无法像有线网络那样直接检测冲突 。它采用预约信道、ACK 帧确认等机制来避免冲突，在发送数据前，先发送一个请求发送（RTS）帧，若收到接收方回复的清除发送（CTS）帧，则表示可以发送数据 。局域网与广域网以太网是目前应用最广泛的局域网技术，MAC 地址是以太网中每个设备的唯一硬件地址，长度为 48 位 ，通常用十六进制表示，如 00-16-3E-23-45-67 ，它用于在局域网中唯一标识一个设备 。以太网帧格式包含目的 MAC 地址、源 MAC 地址、类型 / 长度字段、数据字段和帧校验序列（FCS）等 ，目的 MAC 地址和源 MAC 地址用于标识帧的接收方和发送方；类型 / 长度字段用于指明数据字段的类型或长度；数据字段承载上层传递下来的数据；FCS 用于检测帧在传输过程中是否出现错误 。以太网工作原理基于 CSMA/CD 协议，多个节点共享同一传输介质，通过竞争方式使用信道 。无线局域网以 IEEE 802.11 标准为基础，采用 CSMA/CA 机制来避免冲突 。在发送数据前，节点先监听信道，若信道空闲，还要等待一个分布式协调功能帧间间隔（DIFS） ，然后发送数据 。为进一步避免冲突，还引入了请求发送（RTS）和清除发送（CTS）帧 。无线局域网帧格式包括帧控制字段、持续时间 / ID 字段、地址字段、帧体字段和帧校验序列（FCS）等 ，帧控制字段包含帧类型、版本等信息；持续时间 / ID 字段用于指示帧的持续时间或关联标识符；地址字段包括源地址、目的地址、接收地址和发送地址等；帧体字段承载数据；FCS 用于差错检测 。广域网中，PPP 协议（Point-to-Point Protocol ，点对点协议）是一种广泛应用的链路层协议，它用于在不同网络设备之间建立、配置和测试数据链路连接 。PPP 协议支持多种网络层协议，如 IP、IPX 等，适用于各种类型的链路，包括串行链路、并行链路、同步链路和异步链路等 。其帧格式包含标志字段、地址字段、控制字段、协议字段、信息字段和帧校验序列（FCS）等 ，标志字段用于标识帧的开始和结束；地址字段通常为广播地址；控制字段用于控制链路的建立和释放等；协议字段指明信息字段中承载的网络层协议类型；信息字段承载网络层数据；FCS 用于检测帧的错误 。HDLC 协议（High-Level Data Link Control ，高级数据链路控制协议）也是一种广域网链路层协议，它采用比特填充的首尾标志法组帧，以 01111110 作为帧的起始和结束标志 ，支持全双工通信，常用于早期的广域网连接中，在通信线路质量较差的情况下能保证数据的可靠传输 。第四章：网络层网络层功能网络层是 OSI 参考模型的第三层，主要负责将分组从源端传输到目的端，为传输层提供服务 。其关键功能包括路由选择，这是网络层的核心功能，它根据一定的路由算法，为分组选择从源节点到目的节点的最佳传输路径，就像在地图上规划从出发地到目的地的最佳路线 。拥塞控制用于防止网络出现拥塞，当网络中的流量过大时，通过调整发送方的发送速率等方式，避免网络性能下降，确保网络的正常运行 。网际互连使得不同类型的网络能够相互连接和通信，实现更大范围内的资源共享和信息交互 。网络层还提供面向连接的虚电路服务和无连接的数据报服务 。虚电路服务在通信前需建立一条逻辑连接，通信过程中所有分组都沿着这条虚电路传输，就像打电话前先拨号建立连接，通话过程中双方通过这条连接进行交流 ；数据报服务则每个分组独立选择路由，不依赖于之前的连接，如同寄信，每封信都独立投递，可能走不同的路径 。路由算法路由算法是网络层中确定数据包传输路径的关键机制，主要分为静态路由和动态路由 。静态路由由网络管理员手动配置，在网络拓扑结构相对稳定、规模较小的情况下使用，它的优点是简单、可靠，不需要路由器之间交换路由信息，保密性强 。例如，在一个小型企业网络中，网络管理员可以根据网络的布局和需求，手动配置每个路由器的路由表，指定数据包的转发路径 。动态路由则让路由器根据网络的实时状态自动调整路由表，能适应网络拓扑和流量的变化 。距离 - 向量路由算法是常见的动态路由算法之一，每个路由器定期向相邻路由器发送自己的路由表，其中包含到达各个目的网络的距离（通常用跳数衡量）和下一跳信息 。路由器根据收到的相邻路由器的路由表来更新自己的路由表 。例如，RIP（Routing Information Protocol，路由信息协议）就是基于距离 - 向量路由算法，它以跳数作为度量值，最大跳数为 15，16 表示不可达 。链路 - 状态路由算法中，每个路由器通过洪泛法向本自治系统中的所有其他路由器发送自己与相邻路由器的链路状态信息，从而使每个路由器都能拥有整个自治系统的拓扑结构信息 。然后，路由器利用 Dijkstra 算法计算出到各个目的网络的最短路径，并生成路由表 。OSPF（Open Shortest Path First，开放最短路径优先）协议就是基于链路 - 状态路由算法，它使用带宽作为度量值，收敛速度快，适用于大型网络 。网际协议 IPIP 地址是 IP 协议的核心概念，在 IPv4 中，IP 地址是 32 位的二进制数，通常采用点分十进制表示，如 192.168.1.1 。最初采用分类编址，将 IP 地址分为 A、B、C、D、E 五类 。A 类地址的第一个比特位为 0，网络号占 1 个字节，主机号占 3 个字节，适用于大型网络；B 类地址的前两个比特位为 10，网络号占 2 个字节，主机号占 2 个字节，适用于中等规模网络；C 类地址的前三个比特位为 110，网络号占 3 个字节，主机号占 1 个字节，适用于小型网络；D 类地址用于组播，前四个比特位为 1110；E 类地址保留，前四个比特位为 1111 。子网划分是将一个大的网络划分成多个小的子网，以提高 IP 地址的利用率和网络的安全性 。通过子网掩码来确定子网的范围，子网掩码也是 32 位的二进制数，与 IP 地址相对应，其中为 1 的位表示网络位，为 0 的位表示主机位 。例如，对于 C 类地址 192.168.1.0，子网掩码为 255.255.255.192（即 11111111.11111111.11111111.11000000），表示将该网络划分为 4 个子网，每个子网有 62 个可用主机地址 。无分类编址 CIDR（Classless Inter-Domain Routing）则取消了传统的 A、B、C 类地址划分，采用 “斜线记法”，如 192.168.1.0/24，表示前 24 位是网络前缀，后 8 位是主机位 。CIDR 可以更灵活地分配 IP 地址，实现路由聚合，减少路由表的条目 。IP 数据报是 IP 协议的基本传输单元，其格式包含首部和数据部分 。首部的固定部分为 20 字节，包含版本（标识 IP 协议的版本，IPv4 为 4）、首部长度（以 4 字节为单位，最小值为 5，表示首部长度为 20 字节）、区分服务（用于指示期望获得的服务类型）、总长度（首部和数据部分的总长度，单位为字节）、标识（用于标识一个数据报，当数据报分片时，每个分片都具有相同的标识）、标志（包括 DF 位，即 Don't Fragment，表示是否允许分片；MF 位，即 More Fragments，表示后面是否还有分片）、片偏移（表示分片在原数据报中的相对位置，以 8 字节为单位）、生存时间（TTL，每经过一个路由器，TTL 减 1，当 TTL 为 0 时，数据报被丢弃，防止数据报在网络中无限循环）、协议（标识数据部分所使用的传输层协议，如 TCP 为 6，UDP 为 17）、首部校验和（用于校验首部的正确性，不校验数据部分）、源地址和目的地址 。当 IP 数据报的长度超过链路的最大传输单元（MTU）时，需要进行分片 。分片后的每个数据报片都有自己的首部，首部中的标识、标志和片偏移等字段用于在目的端进行重组 。例如，一个 MTU 为 1500 字节的链路，若要传输一个长度为 3000 字节的数据报（首部 20 字节，数据 2980 字节），则需要将其分为两个数据报片，第一个数据报片包含 1480 字节的数据和 20 字节的首部，第二个数据报片包含 1500 字节的数据和 20 字节的首部 。网际控制报文协议 ICMPICMP（Internet Control Message Protocol）是网络层的一个重要协议，用于在 IP 主机、路由器之间传递控制消息，这些消息主要用于报告差错、提供网络诊断信息以及进行网络控制 。ICMP 报文类型主要分为差错报告报文和询问报文 。差错报告报文有 5 种：终点不可达，当路由器或主机不能交付数据报时，向源点发送该报文，比如目的主机不可达、目的网络不可达、目的端口不可达等情况；源点抑制，当路由器或主机由于拥塞而丢弃数据报时，向源点发送此报文，让源点降低发送速率；时间超过，当路由器收到生存时间为零的数据报时，除丢弃该数据报外，还要向源点发送时间超过报文，另外，当终点在预先规定的时间内不能收到一个数据报的全部数据报片时，也会向源点发送该报文；参数问题，当路由器或目的主机收到的数据报首部中有的字段值不正确时，丢弃该数据报，并向源点发送参数问题报文；改变路由（重定向），路由器把改变路由报文发送给主机，告知主机下次应将数据报发送给另外的路由器，以获得更好的路由 。询问报文有 4 种：回送请求和回答报文，主机或路由器向特定目的主机发出询问，收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文，常用于测试目的站是否可达以及了解其相关状态，ping 命令就是基于此报文来测试两个主机之间的连通性；时间戳请求和回答报文，请某个主机或路由器回答当前的日期和时间，可用于时钟同步和测量时间；掩码地址请求和回答报文，用于获取子网掩码信息；路由器询问和通告报文，主机可以通过发送路由器询问报文来查询本网段内的路由器，路由器则通过发送路由器通告报文来宣告自己的存在以及相关信息 。路由协议路由协议是网络层中用于实现路由选择功能的协议，可分为内部网关协议（IGP）和外部网关协议（EGP） 。内部网关协议用于在一个自治系统（AS）内部交换路由信息 。RIP（Routing Information Protocol，路由信息协议）是一种基于距离 - 向量算法的内部网关协议，它以跳数作为度量值，最大跳数为 15，16 表示不可达 。RIP 通过周期性地向相邻路由器广播自己的路由表来更新路由信息，更新周期通常为 30 秒 。由于 RIP 的度量值单一且收敛速度较慢，适用于小型网络 。OSPF（Open Shortest Path First，开放最短路径优先）是一种基于链路 - 状态算法的内部网关协议 。它使用洪泛法向本自治系统中的所有路由器发送链路状态信息，每个路由器根据这些信息构建出整个自治系统的拓扑结构，并利用 Dijkstra 算法计算出到各个目的网络的最短路径 。OSPF 支持区域划分，将一个自治系统划分为多个区域，每个区域有自己的链路状态数据库，减少了链路状态信息的传播范围，提高了网络的可扩展性和稳定性 。OSPF 收敛速度快，适用于大型网络 。外部网关协议用于在不同自治系统之间交换路由信息 。BGP（Border Gateway Protocol，边界网关协议）是目前互联网上使用最广泛的外部网关协议 。BGP 通过建立 TCP 连接来交换路由信息，它采用路径向量算法，每个 BGP 发言人都维护一个路由表，其中包含到达各个目的网络的路径信息，包括经过的自治系统序列等 。BGP 主要用于不同自治系统之间的路由选择，考虑的因素不仅有路径长度，还包括策略、安全等因素，适用于大规模的网络互联 。IP 组播IP 组播是一种允许一台或多台主机（组播源）发送单一数据包到多台主机（组播组成员）的技术，实现了一对多的通信 。在 IP 组播中，组播源只需要发送一份数据，由路由器根据需要将数据复制并转发到多个组播组成员，大大节省了网络带宽和资源 。IP 组播地址是 D 类 IP 地址，范围是 224.0.0.0 到 239.255.255.255 。其中，224.0.0.0 到 224.0.0.255 是保留地址，用于本地网络的组播，如 224.0.0.1 表示本地网络中的所有主机，224.0.0.2 表示本地网络中的所有路由器；224.0.1.0 到 238.255.255.255 是全球范围的组播地址，可用于 Internet 上的组播通信；239.0.0.0 到 239.255.255.255 是本地管理组播地址，用于在特定的本地网络或组织内部进行组播通信 。组播路由协议用于建立和维护组播转发树，确保组播数据能够正确地从组播源传输到组播组成员 。常见的组播路由协议有距离向量组播路由协议（DVMRP）、开放最短路径优先的组播扩展（MOSPF）、协议无关组播 - 密集模式（PIM - DM）、协议无关组播 - 稀疏模式（PIM - SM）等 。DVMRP 基于 RIP 协议，采用反向路径转发（RPF）机制来避免组播数据的环路；MOSPF 基于 OSPF 协议，通过扩展 OSPF 的链路状态数据库来支持组播路由；PIM - DM 适用于组播组成员相对集中的环境，采用洪泛和剪枝的方式来构建组播转发树；PIM - SM 适用于组播组成员分布较分散的环境，通过共享树和源树相结合的方式来实现组播数据的转发 。IPv6IPv6 是互联网协议的第六版，旨在解决 IPv4 地址耗尽等问题 。与 IPv4 相比，IPv6 具有诸多特点 。其地址长度从 32 位扩展到 128 位，提供了几乎无限的地址空间，能够满足未来网络发展的需求 。IPv6 采用冒号十六进制表示法，例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334 ，为了简化表示，连续的 0 可以用 “::” 表示，但在一个地址中只能出现一次 “::” 。IPv6 的地址类型主要有单播地址（标识单个接口，数据包会被发送到该接口）、组播地址（标识一组接口，数据包会被发送到组内的所有接口）和任播地址（标识一组接口，数据包会被发送到其中距离最近的一个接口） 。与 IPv4 不同，IPv6 没有广播地址，而是用组播地址来替代广播功能 。IPv6 对首部进行了优化，简化了固定首部的格式，将一些可选字段移到了扩展首部，提高了路由器的处理效率 。IPv6 支持自动配置，主机可以通过无状态自动配置或有状态自动配置（如 DHCPv6）来获取 IPv6 地址和相关配置信息，实现了即插即用 。此外，IPv6 在安全性、移动性等方面也有更好的支持，例如，IPv6 集成了 IPsec（IP Security）协议，提供了数据的保密性、完整性和认证等安全功能 。从 IPv4 向 IPv6 过渡，主要采用双协议栈、隧道技术和网络地址转换 - 协议转换（NAT - PT）等技术 。双协议栈是指在同一台设备上同时运行 IPv4 和 IPv6 协议栈，使设备能够同时处理 IPv4 和 IPv6 的数据包；隧道技术是将 IPv6 数据包封装在 IPv4 数据包中，通过 IPv4 网络进行传输，到达目的地后再解封出 IPv6 数据包；NAT - PT 则是实现 IPv4 和 IPv6 地址之间的转换，以及协议的转换 。第五章：传输层传输层功能传输层在计算机网络体系结构中占据关键地位，是网络层与应用层之间的桥梁，负责为应用进程提供端到端的逻辑通信 。网络层实现的是主机到主机的通信，而传输层进一步细化，实现了进程到进程的通信，让不同主机上的应用程序能够相互交流 。例如，当我们在电脑上使用浏览器访问网页时，浏览器进程与 Web 服务器进程之间的通信就是由传输层来保障的 。复用和分用是传输层的重要功能。复用指的是发送方不同的应用进程可以使用同一个传输层协议来传输数据 。比如，在一台电脑上，我们同时打开浏览器浏览网页、使用 QQ 进行即时通讯，浏览器进程和 QQ 进程都可以通过传输层的 TCP 或 UDP 协议来发送数据 。分用则是接收方的传输层在收到数据后，能够依据端口号等信息，将数据准确无误地交付给相应的应用进程 。就像快递员将包裹送到小区后，根据收件人的门牌号等信息，将包裹准确地送到收件人手中 。传输层还负责传输连接管理，对于面向连接的传输服务，如 TCP，在数据传输前需要建立连接，在传输过程中维护连接的稳定性，传输结束后释放连接 。以打电话为例，在通话前需要拨号建立连接，通话过程中要保持连接畅通，通话结束后挂断电话释放连接 。同时，传输层具备差错检测功能，通过校验和等方式对收到的报文进行差错检测，保证数据的完整性 。例如，在数据传输过程中，可能会因为干扰等原因导致数据出错，传输层的差错检测机制就能够发现这些错误，并采取相应的措施，如要求重发数据 。用户数据报协议 UDPUDP（User Datagram Protocol）是一种无连接的传输层协议，具有独特的特点 。它在数据传输前不需要像 TCP 那样建立连接，发送数据结束也没有连接释放的过程，因此减少了开销和发送数据前的时延 ，就像寄信一样，写好信装入信封贴上邮票就可以直接投递，不需要事先和收件人打招呼 。UDP 采用尽最大努力交付，不保证可靠交付，也没有复杂的拥塞控制机制 ，这意味着它可能会出现数据丢失、重复或乱序到达的情况 。但它也有优势，即 UDP 是面向报文的，应用层交给 UDP 多长的报文，UDP 就原封不动地将其作为一个数据报发送出去，既不合并也不拆分，保留了报文的边界 。假设应用层要发送一段简短的文本消息，UDP 会将整个文本消息作为一个报文直接发送 。UDP 的首部开销非常小，只有 8 个字节，由源端口号、目的端口号、长度和校验和四个字段组成 。源端口号标识发送方的端口，目的端口号标识接收方的端口，这两个端口号用于在接收方进行分用，将数据准确地交付给相应的应用进程 。长度字段表示整个 UDP 数据报的长度，包括首部和数据部分 。校验和用于检测数据报在传输过程中是否出现错误，发送方在计算校验和时，会在 UDP 数据报之前增加 12 字节的伪首部（伪首部并不是真正的首部，只是在计算校验和时临时添加，既不向下传送也不向上递交 ），若数据部分不是偶数个字节，还会在末尾添加一个全 0 字节 ，然后利用二进制反码求这些 16 位字的和，将此和的二进制反码写入校验和字段；接收方收到数据后，会进行同样的计算，若结果为全 1，则表示无差错，否则丢弃该数据报 。由于 UDP 的这些特点，它适用于对实时性要求较高、能容忍一定数据丢失的场景，如实时视频会议、在线游戏、IP 电话等 。在实时视频会议中，偶尔丢失一些数据帧可能只会导致画面出现短暂的卡顿，但不会影响整体的会议进行 ；在线游戏中，玩家的操作指令需要及时传输到服务器，UDP 的低时延特性能够满足这一需求，即使有少量指令丢失，也不会对游戏体验造成太大影响 。传输控制协议 TCPTCP（Transmission Control Protocol）是一种面向连接的、可靠的传输层协议，与 UDP 有着明显的区别 。它的连接只能有两个端点，即点对点连接，就像打电话时，只能是两个用户之间进行通话 。TCP 提供可靠服务，确保数据无差错、不丢失、不重复且按序到达 。为了实现这一目标，TCP 采用了序列号和确认应答机制，发送方为每个发送的数据字节都分配一个序列号，接收方通过确认号来告知发送方哪些数据已经正确接收 。假设发送方发送了一段数据，序列号从 100 开始，接收方正确接收后，会返回一个确认号，比如 150，表示期望收到下一个报文段的第一个数据字节的序号为 150，即前面 100 - 149 的数据都已经正确收到 。TCP 提供全双工通信，通信双方的应用进程在任何时候都能发送数据 。为此，TCP 连接的两端都设有发送缓存和接收缓存 。发送缓存用于暂时存放发送应用程序给发送方 TCP 准备发送的数据，以及 TCP 已经发送但没有被确认的数据 ；接收缓存用于暂时存放按序到达但尚未被应用程序读取的数据，以及不按序到达的数据 。在文件传输过程中，发送方将文件数据先存入发送缓存，然后逐步发送，接收方收到数据后先存入接收缓存，再由应用程序读取 。TCP 面向字节流，将应用程序交付的数据视为一段无结构的字节流 。它的报文段格式较为复杂，首部长度通常为 20 字节，包含源端口和目的端口（各占 2 字节，用于标识发送方和接收方的端口号 ）、序号（占 4 字节，本报文段发送数据的第一个字节的序号 ）、确认号（占 4 字节，期望收到对方下一个报文段的第一个数据字节的序号 ）、数据偏移（占 4 位，以 4 字节为单位，表示 TCP 报文段的数据部分距离 TCP 报文段起始处的距离，即首部长度 ）、保留（占 6 位，暂时保留，以备后用 ）、窗口（占 2 字节，从本报文段首部的确认号算起，接收方目前允许对方发送的数据量 ）、校验和（和 UDP 一样，在计算时要在 TCP 报文段前面加上 12 字节的伪首部 ）等字段 。此外，还有一些控制位，如紧急位 URG（当 URG = 1 时，说明报文段中的数据是紧急数据，需要从发送方缓存中优先发送，不需要在缓存中排队 ）、确认位 ACK（当 ACK = 1 时，确认号有效，建立连接后，所有报文的 ACK 都必须为 1 ）、推送位 PSH（当 PSH = 1 时，说明该报文需要尽快从接收方缓存中交付应用层 ）、复位 RST（当 RST = 1 时，表明 TCP 连接中出现严重差错，必须释放连接，然后重新建立连接 ）、同步位 SYN（当 SYN = 1 时，表明是连接请求 / 连接接受报文 ）、终止位 FIN（当 FIN = 1 时，表明发送方数据已发送完，要求释放连接 ） 。TCP 连接管理包括连接建立和连接释放两个重要过程 。连接建立采用三次握手，客户端首先发送连接请求报文段，此时 SYN = 1，同时随机选择一个初始序号 seq = x，客户端进入 SYN - SENT 状态 ；服务器收到连接请求报文段后，如果同意连接，则向客户端发回确认报文，在确认报文段中 SYN 和 ACK 都置 1，确认号 ack = x + 1，同时服务器也选择一个初始序号 seq = y，服务器进入 SYN - RCVD 状态 ；客户端收到确认报文后，再向服务器给出确认，此时 ACK = 1，确认号 ack = y + 1，自己的序号 seq = x + 1，客户端进入 ESTABLISHED 状态 ，当服务器接收到客户端的确认后，也进入 ESTABLISHED 状态 ，至此，连接建立完成 。连接释放采用四次挥手，假设客户端主动关闭连接，客户端首先发送连接释放报文段，FIN = 1，seq = u，进入 FIN - WAIT - 1 状态 ；服务器收到连接释放报文段后，立即发出确认，ACK = 1，ack = u + 1，seq = v，服务器进入 CLOSE - WAIT 状态 ，此时客户端到服务器的单向连接释放，处于半关闭状态，客户端不能发数据，但服务器可以 ；客户端收到服务器的确认后，进入 FIN - WAIT - 2 状态，等待服务器发出的连接释放报文段 ；若服务器已经没有数据要发送，其应用进程会通知 TCP 释放连接，服务器发出的连接释放报文段 FIN = 1，ack = u + 1，seq = w，服务器进入 LAST - ACK 状态 ；客户端收到服务器的连接释放报文段后，发出确认，ACK = 1，ack = w + 1，seq = u + 1，经过时间等待计时器（TIME - WAIT）设置的时间 2MSL（最长报文段寿命）后，客户端进入 CLOSED 状态 ，当服务器收到客户端的确认后，也进入 CLOSED 状态 ，连接彻底释放 。TCP 的可靠传输通过多种机制实现，包括停止 - 等待协议、连续 ARQ 协议、滑动窗口协议 。停止 - 等待协议是一种简单的可靠传输协议，发送方每发送一个分组，就停止等待，直到收到接收方的确认（ACK） ，若超时未收到确认，则重发该分组 。连续 ARQ 协议允许发送方连续发送多个分组，而不需要等待每个分组的确认 ，接收方对按序到达的分组进行确认，发送方根据接收方的确认信息，知道哪些分组已经被正确接收，哪些需要重发 。滑动窗口协议是在连续 ARQ 协议的基础上，引入了发送窗口和接收窗口 。发送窗口用来控制发送方可以连续发送的分组数量，接收窗口用来控制接收方可以接收的分组范围 。发送方在发送窗口内的分组可以连续发送，当收到接收方的确认后，发送窗口向前滑动 ；接收方只接收落在接收窗口内的分组，对于不在窗口内的分组则丢弃 。TCP 流量控制通过滑动窗口机制来实现，接收方通过窗口字段告知发送方自己的接收能力，即接收窗口的大小 。发送方根据接收方的接收窗口大小来调整自己的发送速率，避免发送数据过快导致接收方缓冲区溢出 。在文件传输过程中，如果接收方的缓冲区剩余空间较小，它会通过窗口字段告知发送方减少发送数据量 。TCP 拥塞控制用于防止网络出现拥塞，确保网络资源的有效利用 。它通过慢启动、拥塞避免、快速重传和快速恢复等机制来实现 。慢启动阶段，发送方初始时将拥塞窗口大小设置为一个最大报文段（MSS），每收到一个确认，拥塞窗口就增加一个 MSS，使拥塞窗口呈指数增长 。当拥塞窗口增长到慢启动门限（ssthresh）时，进入拥塞避免阶段，此时拥塞窗口每经过一个往返时间（RTT），就增加一个 MSS，呈线性增长 。当网络出现拥塞（超时或收到三个冗余 ACK）时，将慢启动门限设置为当前拥塞窗口的一半，并且将拥塞窗口重新设置为一个 MSS，再次进入慢启动阶段 。如果收到三个冗余 ACK，说明有分组丢失，但网络可能还没有拥塞，此时执行快速重传和快速恢复机制 。快速重传是指发送方在收到三个冗余 ACK 后，立即重传丢失的分组 ；快速恢复是指在快速重传之后，将慢启动门限设置为当前拥塞窗口的一半，并且将拥塞窗口设置为慢启动门限加上三个 MSS，然后进入拥塞避免阶段 。第六章：应用层应用层协议原理应用层是计算机网络体系结构的最高层，直接面向用户，为用户提供各种网络应用服务 。在应用层中，常见的通信模型有客户 - 服务器模型和对等连接模型 。客户 - 服务器模型（C/S 模型）中，客户是服务的请求方，服务器是服务的提供方 。服务器通常具有固定的 IP 地址，时刻处于运行状态，等待客户的请求 。当客户有服务需求时，向服务器发送请求，服务器接收请求后进行处理，并将结果返回给客户 。例如，我们在浏览器中访问网页，浏览器就是客户端，Web 服务器就是服务器端 。客户端发起 HTTP 请求，服务器端响应请求，返回网页内容 。这种模型的优点是便于集中管理，服务器可以统一存储和管理数据，提供稳定的服务 ；缺点是服务器的负载较重，一旦服务器出现故障，所有依赖它的客户端都无法正常工作 。对等连接模型（P2P 模型）中，每个节点既可以作为客户端请求服务，也可以作为服务器提供服务，节点之间地位平等，没有固定的中心服务器 。这种模型的优势在于去中心化，网络的健壮性高，单个节点的退出不会影响整个网络的运行 ，并且资源共享更加灵活，每个节点都可以贡献自己的资源 。像文件共享软件 BitTorrent 就采用了 P2P 模型，用户可以直接从其他用户的计算机上下载文件，而不需要通过中央服务器 。但 P2P 模型也存在一些问题，如搜索效率较低，因为需要遍历整个网络来查找特定资源 ；管理难度较大，由于节点的动态性和匿名性，难以对网络进行有效的监管 。应用层协议就是在这些模型的基础上，规定了应用进程之间通信和交互的规则 。不同的应用层协议用于实现不同的网络应用，如 HTTP 用于网页传输，FTP 用于文件传输，SMTP 用于电子邮件发送等 。这些协议定义了数据的格式、交互的过程以及错误处理等方面的内容，确保应用进程之间能够准确、高效地进行通信 。域名系统 DNS域名系统（DNS，Domain Name System）是互联网使用的命名系统，用于将便于人们记忆和使用的域名转换为计算机能够识别的 IP 地址 。在互联网早期，主机数量较少，通过一个名为 hosts 的文件来记录主机名字和对应的 IP 地址 。但随着互联网的发展，主机数量急剧增加，这种方式变得难以管理，于是 DNS 应运而生 。DNS 采用层次树状结构的命名方式，域名由多个标号组成，各标号之间用点隔开，例如www.example.com 。其中，com 是顶级域名，代表商业机构；example 是二级域名，由用户注册购买；www 是主机名或子域名，通常表示这是一个 Web 服务器 。顶级域名又分为多种类型，如国家顶级域名（如 cn 代表中国，us 代表美国）、通用顶级域名（如 com、net、org 等）以及基础结构域名（如 arpa，用于反向域名解析） 。域名服务器是 DNS 系统的重要组成部分，按照层级结构可分为根域名服务器、顶级域名服务器、权限域名服务器和本地域名服务器 。根域名服务器是最高层次的域名服务器，知道所有顶级域名服务器的域名和 IP 地址，当本地域名服务器无法解析域名时，首先会求助于根域名服务器 。顶级域名服务器负责管理在该顶级域名下注册的所有二级域名 。权限域名服务器则负责特定域名的解析，当它不能给出最后的查询回答时，会告知下一步应找的权限域名服务器 。本地域名服务器离用户较近，通常由互联网服务提供商（ISP）提供，当用户发起 DNS 查询请求时，首先会将请求发送给本地域名服务器 。域名解析过程就是将域名转换为 IP 地址的过程 。当一个应用进程需要把主机名解析为 IP 地址时，它会调用解析程序，成为 DNS 的一个客户，将待解析的域名放在 DNS 请求报文中，以 UDP 用户数据报方式发送给本地域名服务器 。本地域名服务器在查找域名后，把对应的 IP 地址放在回答报文中返回 。如果本地域名服务器无法解析，它会向根域名服务器发送查询请求，根域名服务器会告诉本地域名服务器下一步应向哪个顶级域名服务器查询，以此类推，直到找到对应的 IP 地址 。域名解析方式主要有递归查询和迭代查询 。递归查询中，若本地域名服务器不知道被查询域名的 IP 地址，它会以 DNS 客户的身份，向其他域名服务器继续发出查询请求，直到返回结果或报错 。迭代查询中，根域名服务器收到本地域名服务器的查询请求后，要么给出所要查询的 IP 地址，要么告诉本地域名服务器下一步应向哪个服务器进行查询，由本地域名服务器进行后续查询 。为了提高 DNS 查询效率，域名服务器中广泛使用了高速缓存，用于存放最近查询过的域名以及从何处获得域名映射信息的记录 。文件传输协议 FTP文件传输协议（FTP，File Transfer Protocol）用于在不同计算机之间实现文件的上传和下载，是一种广泛应用的应用层协议 。FTP 采用客户 - 服务器模型，客户端和服务器之间通过 TCP 连接进行通信 。它的工作原理涉及两个重要的连接：控制连接和数据连接 。控制连接使用 TCP 的 21 端口，用于在客户端和服务器之间传输控制信息，如用户的登录信息、文件操作命令（如列出目录、上传文件、下载文件等） 。数据连接则用于实际的数据传输，在主动模式下，数据连接使用 TCP 的 20 端口，由服务器主动连接客户端的数据端口；在被动模式下，服务器会随机打开一个高端端口（大于 1024），客户端连接该端口进行数据传输 。当客户端想要上传文件时，首先通过控制连接向服务器发送登录请求，服务器验证用户身份后，客户端发送上传文件的命令 。对于主动模式，客户端在控制连接上发送 PORT 命令，告知服务器自己用于接收数据的端口号，服务器通过 TCP 20 端口连接至客户端指定端口，开始上传文件 。对于被动模式，客户端发送 PASV 命令，服务器收到后随机打开一个高端端口，并将该端口号通知客户端，客户端连接服务器此端口进行文件上传 。下载文件的过程类似，只是数据传输方向相反 。FTP 支持两种传输模式：ASCII 传输模式和二进制数据传输模式 。ASCII 传输模式适用于传输文本文件，它会根据目标系统的文本格式进行适当调整 。二进制数据传输模式则用于传输非文本文件，如程序、图像、音频等，它逐位拷贝文件，确保原始文件和拷贝文件逐位一一对应 。在传输非文本文件时，应使用二进制传输模式，否则可能会损坏数据 。远程登录协议 TELNET远程登录协议（TELNET）是一种基于 TCP/IP 协议的远程登录服务标准协议，它允许用户在本地计算机上通过网络登录到远程主机，并像直接在远程主机的控制台一样进行操作 。TELNET 使用客户端 - 服务器模型，默认情况下，使用 TCP 的 23 端口建立连接 。当用户在本地计算机上执行 TELNET 命令并指定远程主机的 IP 地址或域名时，本地计算机（客户端）会尝试与远程主机（服务器）建立 TCP 连接 。这个连接建立过程遵循 TCP 的三次握手机制：客户端首先向服务器发送一个 SYN 数据包请求连接；服务器收到后回应一个 SYN - ACK 数据包，表示已接收到连接请求并同意建立连接；客户端再发送一个 ACK 数据包进行确认，至此 TCP 连接建立成功 。一旦 TCP 连接成功建立，TELNET 会话随即启动，客户端和服务器之间形成一个即时的数据传输通道 。在会话过程中，用户在本地输入的命令会以明文形式发送到远程主机执行，远程主机的输出结果则返回并显示在本地客户端 。TELNET 使用网络虚拟终端（NVT，Network Virtual Terminal）作为标准中间格式，屏蔽了不同操作系统终端的差异 。客户端和服务器需要将本地终端特性转换为 NVT 格式，以便进行通信 。例如，不同操作系统的换行符表示可能不同，通过 NVT 可以统一处理 。然而，TELNET 存在严重的安全问题，由于它以明文形式传输数据，包括用户名和密码等敏感信息，容易被网络攻击者截获，导致信息泄露 。在现代网络环境中，TELNET 逐渐被更安全的协议如 SSH（Secure Shell）所取代 。不过，TELNET 仍常用于测试网络连接、登录远程设备（在安全性要求不高的场景下）以及调试应用程序等网络相关任务 。在 Linux 系统中，TELNET 客户端一般默认安装，用户可以通过命令 “telnet [远程主机 IP 地址或域名] [端口号]” 进行连接；在 Windows 系统中，需要先确认 TELNET 客户端功能是否已开启，可在 “控制面板” 中找到 “程序”，点击 “启用或关闭 Windows 功能”，勾选 “Telnet 客户端” 进行安装，安装后通过 “Win + R” 组合键打开 “运行” 对话框，输入 “cmd” 打开命令提示符窗口，再输入 “telnet [远程主机 IP 地址或域名] [端口号]” 进行连接 。超文本传输协议 HTTP超文本传输协议（HTTP，Hypertext Transfer Protocol）是一种基于 B/S 架构（Browser/Server，浏览器 / 服务器模式）的应用层协议，用于实现网页的传输和交互，是目前应用最为广泛的应用层协议之一 。HTTP 基于 TCP 协议实现，工作过程分为四个阶段：首先是三次握手建立 TCP 连接，客户端向服务器发送 SYN 请求，服务器回应 SYN - ACK，客户端再发送 ACK 确认，完成连接建立 ；接着客户端发送 HTTP 请求，请求中包含请求方法（如 GET、POST 等）、URL、请求头（包含各种属性，如 User - Agent 用于标识客户端类型，Host 用于指定服务器域名等）以及请求正文（GET 请求一般没有正文，POST 请求用于传输数据，正文包含数据内容） ；服务器接收到请求后，进行处理并发送 HTTP 响应，响应包括响应状态码（如 200 表示成功，404 表示未找到页面，500 表示服务器内部错误等）、响应头（包含各种属性，如 Content - Type 用于指定响应内容的类型，如 text/html 表示网页，image/jpeg 表示图片等）以及响应正文（即返回的网页内容，可能是 HTML、CSS、JavaScript 等） ；最后是四次挥手关闭 TCP 连接 。HTTP 请求方法有多种，常见的 GET 方法用于获取资源，如在浏览器中输入网址访问网页，就是通过 GET 方法请求服务器返回网页内容 ；POST 方法常用于提交数据，如用户在网页上登录、注册时，将用户名、密码等数据通过 POST 方法发送到服务器 。还有 PUT 用于上传文件，DELETE 用于删除资源等 。HTTP 报文格式分为请求报文和响应报文 。请求报文首行包含请求方法、URL 和 HTTP 版本号；请求头是一系列键值对，用于传递请求的附加信息；空行用于分隔请求头和请求正文；请求正文包含请求的数据 。响应报文首行包含 HTTP 版本号、状态码和状态码描述；响应头也是一系列键值对，提供响应的相关信息；空行分隔响应头和响应正文；响应正文包含服务器返回的数据 。HTTP 的发展经历了多个版本，目前常用的是 HTTP/1.1 和 HTTP/2 。HTTP/2 在 HTTP/1.1 的基础上进行了优化，如支持多路复用，允许在一个 TCP 连接上同时传输多个请求和响应，提高了传输效率；采用二进制分帧，将数据分割成更小的帧进行传输，增强了数据传输的灵活性和可靠性；还支持头部压缩，减少了数据传输量 。电子邮件协议电子邮件系统是一种通过网络实现邮件发送和接收的应用系统，它主要由用户代理（UA，User Agent）、邮件服务器和邮件协议组成 。用户代理是用户与电子邮件系统交互的界面，如常见的 Outlook、Foxmail 等，用户通过它撰写、发送、接收和管理邮件 。邮件服务器负责邮件的存储和转发，是电子邮件系统的核心 。在电子邮件协议中，SMTP（Simple Mail Transfer Protocol，简单邮件传输协议）用于发送邮件 。当用户在客户端撰写好邮件并点击发送时，客户端首先通过 SMTP 与发送方邮件服务器建立 TCP 连接，通常使用 TCP 的 25 端口 。连接建立后，客户端向服务器发送 HELO 命令进行身份识别，然后发送 MAIL FROM 命令，表明发件人的地址 。接着发送 RCPT TO 命令，指定收件人的地址 。如果有多个收件人，需多次发送 RCPT TO 命令 。之后，发送 DATA 命令，表示即将发送邮件内容 。邮件内容包括邮件头部（包含发件人、收件人、主题等信息）和邮件正文 。最后，发送 QUIT 命令关闭连接 。发送方邮件服务器会根据收件人的地址，通过 SMTP 将邮件转发到接收方邮件服务器 。接收邮件主要使用 POP3（Post Office Protocol - Version 3，邮局协议版本 3）和 IMAP（Internet Message Access Protocol，互联网邮件访问协议） 。POP3 使用 TCP 的 110 端口，它的工作过程是：用户通过客户端向接收方邮件服务器发起 POP3 连接请求 。连接建立后，用户通过 USER 命令和 PASS 命令进行身份验证 。验证成功后，客户端可以使用 LIST 命令列出邮件列表，使用 RETR 命令下载指定邮件，使用 DELE 命令删除邮件等 。POP3 的特点是将邮件从服务器下载到本地客户端，下载后服务器上的邮件通常会被删除 。IMAP 使用 TCP 的 143 端口，与 POP3 不同，IMAP 允许用户在服务器上管理邮件，如创建文件夹、移动邮件、标记邮件状态等 。用户可以在本地客户端看到邮件的摘要信息，只有在需要查看邮件内容时才从服务器下载，并且对邮件的操作会同步到服务器上 。例如，在本地客户端将一封邮件标记为已读，服务器上该邮件的状态也会更新为已读 。IMAP 更适合在多个设备上同步管理邮件 。
#include "stdio.h" #include "stdlib.h" typedef int E; struct Stack{ E * array; int capacity; int top; }; typedef struct Stack * ArrayStack; int initStack(ArrayStack stack){ stack->array = (E*)malloc(sizeof(E) * 10); if(stack->array == NULL) return 0; stack->capacity = 10; stack->top = -1; return 1; } int pushStack(ArrayStack stack,E element){ if(stack->top+1==stack->capacity){ int newCapacity = stack->capacity+(stack->capacity >> 1); E * newArray = (E*)realloc(stack->array,newCapacity*sizeof(E)); if(newArray == NULL) return 0; stack->array = newArray; stack->capacity = newCapacity; } stack->array[stack->top+1] = element; stack->top++; return 1; } void printStack(ArrayStack stack){ printf("| "); for (int i = 0; i < stack->top + 1; ++i) { printf("%d, ", stack->array[i]); } printf("\n"); } int isEmpty(ArrayStack stack){ return stack->top == -1; } int popStack(ArrayStack stack){ return stack->array[stack->top--]; } int main(){ struct Stack stack; initStack(&stack); for (int i = 0; i < 3; ++i) { pushStack(&stack, i*100); } printStack(&stack); while (!isEmpty(&stack)) { printf("%d ", popStack(&stack)); //将栈中所有元素依次出栈 } }
数据结构线性表完整代码#include "stdio.h" #include "stdlib.h" typedef int E; struct List{ E * array; int capacity; int size; }; typedef struct List *ArrayList; int initList(ArrayList list){ list->array = (E*)malloc(sizeof(E) * 10); if(list->array == NULL) return 0; list->capacity = 10; list->size = 0; return 1; } int insertList(ArrayList list,E element,E index){ if(index < 1|| index > list->size+1) return 0; for(int i = list->size;i>=index;--i){ list->array[i] = list->array[i-1]; } list->array[index - 1] = element; list->size++; return 1; } int delectList(ArrayList list,E index){ if(index<1||index>list->size+1) return 0; for(int i = index;i<=list->size-1;++i){ list->array[i] = list->array[i+1]; } list->size--; } int modify(ArrayList list,E element,E index){ if(index<1||index>list->size+1) return 0; list->array[index] = element; return 1; } int printList(ArrayList list){ for(int i = 0;i<list->size;i++){ printf("%d ",list->array[i]); } printf("\n"); } int getList(ArrayList list,E index){ printf("%d",list->array[index]); } int main(){ struct List list; if(initList(&list)){ insertList(&list, 666, 1); //每次插入操作后都打印一下表，看看当前的情况 printList(&list); insertList(&list, 777, 1); printList(&list); insertList(&list, 888, 1); printList(&list); delectList(&list,1); printList(&list); modify(&list,222,1); printList(&list); getList(&list,1); free(list.array); } else{ printf("插入失败"); } }