计算机网络核心概念精讲 第 2 篇:网络协议体系与传输机制
摘要
本文将带你深入理解网络协议的分层架构和传输层的工作机制,帮助你掌握网络通信的核心原理。你将学到OSI七层参考模型的设计思想、TCP/IP协议栈的实际结构、TCP可靠传输的实现细节以及UDP的应用场景选择。这些知识是理解现代互联网工作原理的关键。
学习目标
阅读完本文后,你将能够:
- 理解分层设计:掌握网络协议分层的原理和好处
- 熟悉OSI模型:了解OSI七层模型各层的功能和协议
- 掌握TCP/IP栈:理解TCP/IP协议栈的实际结构和工作机制
- 深入TCP协议:掌握TCP连接管理、流量控制和拥塞控制
- 应用UDP协议:了解UDP的特点和应用场景选择
本文由”51学通信”(公众号:51学通信,站长:爱卫生)原创分享。深入理解网络协议体系是通信工程师的核心能力,51学通信致力于为行业从业者提供实用的技术知识。如需深入交流或获取更多通信技术资料,欢迎添加微信:gprshome201101。
一、网络协议的分层设计
1.1 为什么需要分层
网络通信是一个复杂的过程,涉及硬件信号传输、数据格式转换、路径选择、错误恢复等多个方面。如果将所有功能集中在一个协议中,会带来难以实现、难以维护、难以升级等问题。
分层的核心思想是将复杂的通信过程分解为多个相对独立的层次,每层专注于解决特定的问题,通过层间接口协同工作。
flowchart TD A["分层设计的优势"] --> B["简化复杂性"] A --> C["促进标准化"] A --> D["便于实现"] A --> E["便于维护"] B --> B1["每层独立解决特定问题"] B --> B2["降低设计复杂度"] B --> B3["模块化设计"] C --> C1["定义清晰的层间接口"] C --> C2["不同厂商可独立实现"] C --> C3["促进互操作性"] D --> D1["可以逐层实现"] D --> D2["易于调试和测试"] D --> D3["复用成熟技术"] E --> E1["修改某层不影响其他层"] E --> E2["便于技术升级"] E --> E3["提高系统灵活性"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px
图表讲解:这个图表总结了分层设计的四大优势。
简化复杂性是分层最直接的收益。每个层次只需要关注自己的职责,不需要了解其他层次的实现细节。例如,应用层不需要知道数据是如何通过光纤传输的,物理层也不需要理解应用程序的协议。
促进标准化是分层带来的重要价值。清晰的层间接口定义使得不同厂商可以独立实现各层的功能,只要符合接口规范,就能保证互操作性。这是互联网能够由全球多个厂商协同建设的基础。
便于实现和维护是工程实践中的重要考虑。分层使得开发人员可以专注于某一层的实现,降低了技术门槛。当某一层需要升级或修复时,只需要修改该层的实现,不需要改动其他层次。
51学通信提示:分层模型是理论上的理想化框架,在实际实现中往往会有所变通。TCP/IP协议栈并没有严格遵循OSI七层模型,而是合并了某些层次。理解分层的思想比记忆具体的模型更重要。
1.2 服务、接口与协议
分层模型中,每个层次向上一层提供服务,并通过层间接口与相邻层次交互。
flowchart TD A["层次N+1"] -->|"请求服务"| B["层次N"] B -->|"提供服务"| A B -->|"请求服务"| C["层次N-1"] C -->|"提供服务"| B B --> D["协议: 与对等层通信的规则"] D --> D1["语法: 数据格式"] D --> D2["语义: 控制信息"] D --> D3["时序: 事件顺序"] B --> E["接口: 与相邻层的交互规范"] E --> E1["原语操作"] E --> E2["参数传递"] E --> E3["数据格式"] style A fill:#e1f5ff,stroke:#01579b style B fill:#fff9c4,stroke:#f57f17,stroke-width:2px style C fill:#e1f5ff,stroke:#01579b
图表讲解:这个图表展示了层次之间的交互关系,以及协议和接口的区别。
服务是指某一层向上一层提供的功能。例如,网络层向传输层提供数据包转发服务,传输层向应用层提供端到端数据传输服务。服务是通过接口定义的,接口规定了服务调用方式和参数。
协议是指同一层次的对等层之间通信的规则。当两台计算机进行通信时,实际上是每层的对等层之间按照协议交换信息。例如,两台计算机的网络层按照IP协议进行通信。
协议包括三个要素:语法(数据格式)、语义(控制信息含义)和时序(事件顺序)。语法规定数据如何编码和格式化,语义规定各种控制信息的含义,时序规定事件的执行顺序。
接口和协议是不同的概念。接口是垂直方向上的概念,定义相邻层之间的交互;协议是水平方向上的概念,定义对等层之间的通信规则。
二、OSI七层参考模型
2.1 OSI模型概述
开放系统互连(OSI)参考模型是由国际标准化组织(ISO)制定的网络通信分层模型,将网络通信过程分为七个层次。
flowchart TD A["应用层<br>Application"] -->|"为应用程序提供网络服务"| B["表示层<br>Presentation"] B -->|"数据格式转换"| C["会话层<br>Session"] C -->|"会话管理"| D["传输层<br>Transport"] D -->|"端到端传输"| E["网络层<br>Network"] E -->|"路径选择和路由"| F["数据链路层<br>Data Link"] F -->|"可靠的数据传输"| G["物理层<br>Physical"] G -->|"比特传输"| H["物理介质"] A --> A1["应用协议: HTTP, FTP, SMTP"] B --> B1["数据编码, 加密压缩"] C --> C1["会话建立, 同步, 管理"] D --> D1["TCP, UDP<br>端口寻址"] E --> E1["IP, ICMP, 路由协议"] F --> F1["以太网, PPP, 帧同步"] G --> G1["电信号, 光信号, 接口规范"] style A fill:#ffcdd2,stroke:#c62828 style B fill:#ffebee,stroke:#c62828 style C fill:#fff3e0,stroke:#e65100 style D fill:#fff9c4,stroke:#f57f17 style E fill:#e1f5ff,stroke:#01579b style F fill:#e8f5e9,stroke:#2e7d32 style G fill:#c8e6c9,stroke:#2e7d32
图表讲解:这个图表展示了OSI七层模型的完整结构和各层的主要功能。
OSI模型从上到下依次是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。
应用层是唯一直接面向用户的层次,为各种网络应用提供协议支持。HTTP、FTP、SMTP、DNS等都是应用层协议。
表示层负责数据的格式转换和编码。不同系统可能使用不同的数据表示方式(如字符编码、数字格式),表示层确保通信双方能够正确理解数据。加密、压缩等功能也在表示层实现。
会话层负责建立、管理和终止会话。会话是指两个应用程序之间的通信会话,会话层提供会话的建立、同步、恢复等功能。在实际的TCP/IP协议栈中,会话层的功能被合并到了应用层。
传输层负责端到端的通信,即从源主机的进程到目的主机的进程。传输层通过端口号(Port)寻址不同的进程,提供可靠或不可靠的数据传输服务。TCP和UDP是传输层的主要协议。
网络层负责数据包在网络中的路由选择,从源主机到目的主机。网络层使用IP地址进行寻址,通过路由器转发数据包。IP协议是网络层的核心协议。
数据链路层负责在直连的两个节点之间可靠地传输数据帧。数据链路层通过MAC地址寻址,提供差错检测、流量控制等功能。以太网、PPP是数据链路层的典型协议。
物理层负责实际的比特传输,将数据帧转换为信号在物理介质上传输。物理层定义了电气规范(电压、编码)、机械规范(接口形状、针脚定义)和规程规范(通信方式)。
2.2 数据封装过程
当数据从上层向下层传递时,每层都会添加自己的头部(和尾部),这个过程称为封装。
sequenceDiagram participant App as 应用层 participant Trans as 传输层 participant Net as 网络层 participant Link as 数据链路层 participant Phy as 物理层 Note over App: 应用数据 App->>Trans: 添加TCP/UDP头部<br>形成段或数据报 Note over Trans: 传输层数据单元 Trans->>Net: 添加IP头部<br>形成数据包 Note over Net: 网络层数据单元 Net->>Link: 添加帧头和帧尾<br>形成帧 Note over Link: 数据链路层数据单元 Link->>Phy: 转换为比特<br>发送到物理介质 Note over Phy: 物理层信号 Phy->>Phy: 传输到目的地 Phy-->>Link: 接收比特 Link-->>Net: 移除帧头帧尾 Net-->>Trans: 移除IP头部 Trans-->>App: 移除TCP/UDP头部 Note over App: 恢复应用数据
图表讲解:这个序列图展示了数据封装和传输的完整过程。
应用层产生应用数据(如HTTP请求、电子邮件内容)。数据向下传递到传输层后,传输层添加TCP或UDP头部,包含源端口和目的端口等信息,形成传输层协议数据单元(TCP段或UDP数据报)。
传输层数据单元传递到网络层后,网络层添加IP头部,包含源IP地址和目的IP地址等信息,形成网络层协议数据单元(IP数据包)。
网络层数据包传递到数据链路层后,数据链路层添加帧头和帧尾,包含MAC地址、校验和等信息,形成数据链路层协议数据单元(帧)。
最后,物理层将帧转换为比特信号,通过物理介质传输。到达目的地后,逐层移除头部,最终恢复出应用数据。
封装过程类似于寄信:应用数据是信的内容,传输层头部是信封上的寄信人和收信人姓名,网络层头部是详细地址,数据链路层头部是邮局的分拣信息。
2.3 各层关键协议
| 层次 | 协议示例 | 主要功能 |
|---|---|---|
| 应用层 | HTTP, FTP, SMTP, DNS, SSH | 网络应用 |
| 表示层 | SSL/TLS, JPEG, MPEG | 数据格式、加密 |
| 会话层 | NetBIOS, RPC | 会话管理 |
| 传输层 | TCP, UDP | 端到端传输 |
| 网络层 | IP, ICMP, IGMP, OSPF, BGP | 路由和转发 |
| 数据链路层 | 以太网, PPP, HDLC, ARP | 帧传输 |
| 物理层 | RS-232, V.35, RJ-45 | 比特传输 |
三、TCP/IP协议栈
3.1 TCP/IP概述
TCP/IP协议栈是互联网实际使用的协议体系,由美国国防部高级研究计划局(DARPA)开发。与OSI七层模型不同,TCP/IP采用四层架构。
flowchart TD A["TCP/IP四层模型"] --> BOSI["OSI七层模型"] A1["应用层<br>HTTP, FTP, DNS<br>Telnet, SMTP"] -->|"对应"| B1["应用层<br>表示层<br>会话层"] A2["传输层<br>TCP, UDP"] -->|"对应"| B2["传输层"] A3["网际层<br>IP, ICMP, IGMP"] -->|"对应"| B3["网络层"] A4["网络接口层<br>以太网, Wi-Fi, PPP"] -->|"对应"| B4["数据链路层<br>物理层"] style A1 fill:#ffcdd2,stroke:#c62828 style A2 fill:#fff9c4,stroke:#f57f17 style A3 fill:#e1f5ff,stroke:#01579b style A4 fill:#c8e6c9,stroke:#2e7d32
图表讲解:这个对比图展示了TCP/IP四层模型与OSI七层模型的对应关系。
TCP/IP应用层对应OSI的应用层、表示层和会话层。TCP/IP将这三层合并为一层,因为从实现角度看,这些功能往往紧密耦合,难以明确划分。
TCP/IP传输层对应OSI传输层,提供端到端的通信服务。TCP提供可靠的字节流服务,UDP提供不可靠的数据报服务。
TCP/IP网际层对应OSI网络层,负责数据包的路由和转发。IP协议是网际层的核心,提供无连接的、不可靠的数据包传输服务。
TCP/IP网络接口层对应OSI的数据链路层和物理层。TCP/IP没有详细规定这一层的实现,而是兼容各种现有的网络技术(如以太网、Wi-Fi、PPP等)。
51学通信站长爱卫生的经验:OSI模型是理论框架,TCP/IP是工程实践。理解OSI模型有助于建立完整的知识体系,但实际工作中更多接触TCP/IP协议栈。学习时要将两者对照理解,既要建立理想化的分层概念,又要了解实际实现的变通。
3.2 IP协议简介
IP协议是网际层的核心协议,提供无连接的、不可靠的数据包传输服务。
flowchart TD A["IP协议"] --> B["IPv4"] A --> C["IPv6"] B --> B1["32位地址<br>约43亿个地址"] B --> B2["地址短缺问题"] B --> B3["NAT缓解方案"] C --> C1["128位地址<br>近乎无限地址"] C --> C2["简化头部格式"] C --> C3["内置安全支持"] A --> D["IP服务特点"] D --> D1["无连接: 不预先建立连接"] D --> D2["不可靠: 不保证送达"] D --> D3["尽力而为: Best Effort"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px style B fill:#fff9c4,stroke:#f57f17 style C fill:#c8e6c9,stroke:#2e7d32
图表讲解:这个图表对比了IPv4和IPv6,并说明了IP协议的服务特点。
IPv4使用32位地址,理论上可以提供约43亿个地址。但随着互联网的飞速发展,IPv4地址已经分配殆尽,导致地址短缺问题。网络地址转换(NAT)技术通过使用私有地址缓解了IPv4地址短缺,但NAT破坏了端到端通信模型。
IPv6使用128位地址,地址空间是IPv4的2^96倍,号称可以为地球上的每粒沙子分配一个IP地址。除了巨大的地址空间,IPv6还简化了头部格式,提高了转发效率,并内置了安全支持(IPsec)。
IP协议提供的是无连接服务——发送数据前不需要建立连接,每个数据包独立路由。IP服务也是不可靠的——不保证数据包一定送达,不保证按序送达,甚至不保证数据包不被损坏。这种”尽力而为”的服务模式将可靠性保障交给了上层协议(如TCP)。
四、传输控制协议(TCP)
4.1 TCP概述
传输控制协议(TCP)是传输层的主要协议之一,提供面向连接的、可靠的字节流传输服务。
flowchart TD A["TCP协议"] --> B["面向连接"] A --> C["可靠传输"] A --> D["字节流服务"] A --> E["流量控制"] A --> F["拥塞控制"] B --> B1["需要建立和释放连接<br>三次握手、四次挥手"] C --> C1["确认应答机制"] C --> C2["超时重传机制"] C --> C3["校验和检验"] D --> D1["数据视为连续字节流<br>不保留消息边界"] E --> E1["滑动窗口机制<br>防止发送方淹没接收方"] F --> F1["慢启动"] F --> F2["拥塞避免"] F --> F3["快重传"] F --> F4["快恢复"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px style B fill:#ffcdd2,stroke:#c62828 style C fill:#fff9c4,stroke:#f57f17 style D fill:#e8f5e9,stroke:#2e7d32 style E fill:#f3e5f5,stroke:#7b1fa2 style F fill:#fff3e0,stroke:#e65100
图表讲解:这个图表总结了TCP协议的五大核心特性。
面向连接意味着TCP在传输数据前需要先建立连接,传输结束后需要释放连接。建立连接的三次握手确保双方都准备好通信,释放连接的四次挥手确保双方都能完整传输数据。
可靠传输通过三种机制实现:确认应答让接收方告知发送方哪些数据已收到;超时重传让发送方在未收到确认时重传数据;校验和检验可以检测传输过程中的数据损坏。
字节流服务意味着TCP不关心应用数据的边界,将数据视为连续的字节流。应用需要自己定义消息边界(如使用长度字段、分隔符等)。
流量控制通过滑动窗口实现,接收方在确认中通告窗口大小,告诉发送方自己还能接收多少数据,防止发送方发送过快淹没接收方。
拥塞控制是为了避免网络拥塞,包括慢启动(指数增长探测网络容量)、拥塞避免(线性增长谨慎探测)、快重传(收到3个重复ACK立即重传)和快恢复(快速恢复拥塞窗口)四个算法。
4.2 TCP连接管理
TCP连接建立通过三次握手实现。
sequenceDiagram participant Client as 客户端 participant Server as 服务器 Note over Client: CLOSED状态 Client->>Server: 1. SYN<br>Seq=x<br>客户端请求建立连接 Note over Client: SYN_SENT状态 Note over Server: 收到SYN Server->>Client: 2. SYN+ACK<br>Seq=y, ACK=x+1<br>服务器确认并发送自己的SYN Note over Server: SYN_RCVD状态 Note over Client: 收到SYN+ACK Client->>Server: 3. ACK<br>Seq=x+1, ACK=y+1<br>客户端确认 Note over Client: ESTABLISHED状态 Note over Server: 收到ACK Note over Server: ESTABLISHED状态 Note over Client,Server: 连接建立完成<br>可以传输数据
图表讲解:这个序列图详细展示了TCP三次握手建立连接的过程。
第一次握手,客户端发送SYN(同步)报文段,请求建立连接。SYN报文段中包含客户端的初始序列号x。客户端进入SYN_SENT状态,等待服务器的响应。
第二次握手,服务器收到SYN后,发送SYN+ACK报文段。ACK字段确认收到的客户端SYN(ACK=x+1),同时发送自己的SYN请求,包含服务器的初始序列号y。服务器进入SYN_RCVD状态。
第三次握手,客户端收到SYN+ACK后,发送ACK报文段确认服务器的SYN(ACK=y+1)。客户端进入ESTABLISHED(已建立连接)状态。服务器收到这个ACK后,也进入ESTABLISHED状态。
三次握手确保了双方的发送和接收能力都正常,并且协商了初始序列号。为什么需要三次而不是两次?如果只有两次,服务器无法确认客户端的接收能力是否正常,可能导致连接建立失败但资源被占用的问题。
TCP连接释放通过四次挥手实现。
sequenceDiagram participant Client as 客户端 participant Server as 服务器 Note over Client,Server: ESTABLISHED状态 Client->>Server: 1. FIN<br>Seq=u<br>客户端请求关闭连接 Note over Client: FIN_WAIT_1状态 Server->>Client: 2. ACK<br>Seq=v, ACK=u+1<br>服务器确认 Note over Server: CLOSE_WAIT状态 Note over Client: FIN_WAIT_2状态 Note over Server: 继续传输剩余数据 Server->>Client: 3. FIN<br>Seq=w, ACK=u+1<br>服务器请求关闭 Note over Server: LAST_ACK状态 Client->>Server: 4. ACK<br>Seq=u+1, ACK=w+1<br>客户端确认 Note over Client: TIME_WAIT状态<br>等待2MSL Note over Server: 收到ACK,关闭 Note over Server: CLOSED状态 Note over Client: 等待2MSL后关闭 Note over Client: CLOSED状态
图表讲解:这个序列图展示了TCP四次挥手释放连接的完整过程。
第一次挥手,客户端发送FIN报文段,请求关闭连接。客户端不再发送数据,但仍可以接收数据。客户端进入FIN_WAIT_1状态。
第二次挥手,服务器发送ACK确认。此时服务器可能还有数据要发送给客户端,进入CLOSE_WAIT状态。客户端收到ACK后进入FIN_WAIT_2状态,等待服务器的关闭请求。
第三次挥手,服务器完成数据传输后,发送FIN报文段,请求关闭连接。服务器进入LAST_ACK状态,等待客户端的确认。
第四次挥手,客户端发送ACK确认。客户端进入TIME_WAIT状态,等待2MSL(最大报文生存时间)后进入CLOSED状态。服务器收到ACK后直接进入CLOSED状态。
TIME_WAIT状态的目的是确保最后的ACK能够到达服务器,并让网络中的旧报文段全部消失,避免影响新连接。2MSL的时间足以保证这一点。
4.3 TCP流量控制与拥塞控制
TCP通过滑动窗口实现流量控制。
flowchart LR subgraph Sender["发送方"] S1["已发送已确认"] S2["已发送未确认<br>窗口边界"] S3["可用窗口<br>可发送"] S4["不可用<br>超过窗口"] end subgraph Receiver["接收方"] R1["接收缓冲区"] R2["可用空间<br>rwnd"] end S2 -->|"收到ACK后<br>窗口右移"| S3 R2 -.->|"在ACK中通告"| S2 style S2 fill:#ffcdd2,stroke:#c62828 style S3 fill:#c8e6c9,stroke:#2e7d32 style R2 fill:#fff9c4,stroke:#f57f17
图表讲解:这个图表展示了TCP滑动窗口流量控制的基本原理。
发送方维护发送窗口,窗口内的数据可以发送,窗口外的数据暂时不能发送。窗口分为四个部分:已发送已确认、已发送未确认(红色,窗口右边界)、可用窗口(绿色,可发送)、不可用(超出窗口)。
接收方维护接收缓冲区和可用空间(rwnd,接收窗口)。接收方在每个ACK中通告rwnd值,告诉发送方自己还能接收多少数据。
当发送方收到ACK后,窗口向右滑动,可以发送新的数据。如果接收方的缓冲区快满,通告的rwnd会变小,限制发送方的发送速率。如果rwnd=0,发送方停止发送,等待窗口重新打开。
TCP拥塞控制包含四个算法。
stateDiagram-v2 [*] --> 慢启动: 连接建立 慢启动 --> 拥塞避免: cwnd达到阈值 拥塞避免 --> 快重传/快恢复: 收到3个重复ACK 拥塞避免 --> 慢启动: 超时发生 快重传/快恢复 --> 拥塞避免: 快恢复完成 note right of 慢启动 cwnd指数增长 每RTT翻倍 探测网络容量 end note note right of 拥塞避免 cwnd线性增长 每RTT增加1 谨慎探测 end note note right of 快重传/快恢复 收到3个重复ACK 立即重传丢失报文 cwnd减半后继续 end note
图表讲解:这个状态图展示了TCP拥塞控制的状态转移。
慢启动阶段,拥塞窗口(cwnd)从1开始,每收到一个ACK就增加1(实际上是每RTT翻倍),指数增长。慢启动快速探测网络的可用容量。
当cwnd达到慢启动阈值(ssthresh)后,进入拥塞避免阶段。拥塞避免阶段,cwnd每RTT增加1,线性增长,谨慎地探测网络容量。
如果检测到拥塞(超时),cwnd重置为1,ssthresh减半,重新进入慢启动。这是严重拥塞的处理,反应剧烈。
如果收到3个重复ACK(轻度拥塞),执行快重传和快恢复。立即重传丢失的报文,ssthresh减半,cwnd设为ssthresh,然后直接进入拥塞避免。这是温和的反应,可以保持较高的吞吐量。
五、用户数据报协议(UDP)
5.1 UDP概述
用户数据报协议(UDP)是传输层的另一个主要协议,提供无连接的、不可靠的数据报传输服务。
flowchart TD A["UDP协议"] --> B["无连接"] A --> C["不可靠"] A --> D["数据报服务"] A --> E["简单高效"] A --> F["无拥塞控制"] B --> B1["不需要建立连接<br>直接发送数据"] C --> C1["不保证送达"] C --> C2["不保证按序"] C --> C3["不重传丢失数据"] D --> D1["保留消息边界<br>应用数据独立传输"] E --> E1["头部简单仅8字节"] E --> E2["处理开销小"] F --> F1["发送速率不受限<br>可能导致拥塞"] style A fill:#e1f5ff,stroke:#01579b,stroke-width:3px style B fill:#fff9c4,stroke:#f57f17 style C fill:#ffcdd2,stroke:#c62828 style D fill:#c8e6c9,stroke:#2e7d32 style E fill:#e8f5e9,stroke:#2e7d32 style F fill:#f3e5f5,stroke:#7b1fa2
图表讲解:这个图表总结了UDP协议的主要特性。
UDP是面向无连接的,发送数据前不需要建立连接,直接发送数据报。这使得UDP的开销小,发送延迟低。
UDP提供的是不可靠服务,不保证数据报一定送达,不保证按序送达,也不重传丢失的数据。可靠性保障需要由应用层实现(如果需要的话)。
UDP保留消息边界,应用层的每个数据报作为独立的UDP数据报发送。这不同于TCP的字节流服务,TCP中应用层的多个写操作可能被合并为一个TCP段发送。
UDP头部仅8字节(源端口、目的端口、长度、校验和),远小于TCP的20-60字节头部。UDP的处理开销也小,不需要维护连接状态、拥塞窗口等复杂机制。
UDP没有拥塞控制,发送速率不受网络状态限制。这使得UDP可以以恒定速率发送数据(如实时流媒体),但也可能加重网络拥塞。
5.2 TCP与UDP对比
| 特性 | TCP | UDP |
|---|---|---|
| 连接性 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输 | 不可靠传输 |
| 流量控制 | 有(滑动窗口) | 无 |
| 拥塞控制 | 有 | 无 |
| 头部大小 | 20-60字节 | 8字节 |
| 传输方式 | 字节流 | 数据报 |
| 传输效率 | 较低 | 较高 |
| 实时性 | 较差 | 较好 |
| 应用场景 | 文件传输、邮件、网页 | 视频流、游戏、DNS |
5.3 应用场景选择
flowchart TD A["选择传输层协议"] --> B{"需要可靠传输?"} B -->|是| C["使用TCP"] B -->|否| D{"对延迟敏感?"} D -->|是| E["使用UDP"] D -->|否| F{"数据量小?"} F -->|是| E F -->|否| G["考虑TCP"] C --> H["应用: HTTP/FTP/SMTP/SSH"] E --> I["应用: 视频会议/在线游戏/DNS"] style C fill:#c8e6c9,stroke:#2e7d32 style E fill:#fff9c4,stroke:#f57f17
图表讲解:这个决策图帮助应用选择合适的传输层协议。
如果应用需要可靠传输,不能容忍数据丢失或乱序,应该选择TCP。文件传输(FTP)、邮件传输(SMTP)、网页浏览(HTTP)、远程登录(SSH)都使用TCP。
如果应用不需要可靠传输,或者对实时性要求高,应该选择UDP。实时多媒体(视频会议、IP电话)可以容忍少量丢包,但不能容忍延迟;在线游戏也是如此;DNS查询简单快速,使用UDP开销更小。
51学通信建议:在大多数情况下,TCP是更好的选择——它提供了可靠的传输服务,应用层不需要处理可靠性问题。只有在对实时性要求高或对开销非常敏感的场景,才考虑使用UDP。使用UDP时,应用层需要自行实现必要的可靠性机制(如序列号、确认、重传等)。
六、核心概念总结
核心概念总结
| 概念 | 定义 | 应用场景 | 注意事项 |
|---|---|---|---|
| 分层模型 | 将通信过程分解为多个层次 | 网络协议设计 | 理论模型 vs 实际实现 |
| OSI模型 | 七层参考模型 | 网络学习、设计 | 理论框架 |
| TCP/IP | 四层协议栈 | 互联网实际使用 | 合并了OSI某些层 |
| 封装 | 层次间添加头部 | 数据传输 | 每层添加自己的头部 |
| TCP | 面向连接、可靠传输 | 需要可靠性的应用 | 开销较大 |
| UDP | 无连接、不可靠传输 | 实时应用 | 简单高效 |
| 三次握手 | TCP连接建立 | TCP连接管理 | 确保双方准备好 |
| 滑动窗口 | TCP流量控制 | 防止接收方淹没 | 接收方通告窗口大小 |
| 拥塞控制 | TCP调节发送速率 | 避免网络拥塞 | 慢启动、拥塞避免等 |
常见问题解答
Q1:为什么OSI七层模型没有在实际中广泛使用?
答:OSI七层模型是理论上的理想化框架,没有在实际中广泛使用有多方面原因。
首先,OSI模型制定时过于复杂和官僚化。制定标准的委员会包含了来自各国政府、 academia 和产业的代表,各方利益难以协调,导致标准制定进程缓慢且过度复杂。
其次,当OSI模型还在制定时,TCP/IP协议栈已经在美国国防部的资助下迅速发展并投入使用。大学和研究机构率先采用TCP/IP,培养了大量熟悉该协议栈的人才。当产品开始商业化时,TCP/IP已经形成了先发优势。
再者,OSI模型过于层次化,某些层次的划分不够实用。会话层和表示层的功能在实际应用中往往与应用层紧密耦合,难以明确分离。TCP/IP将这些层次合并,更符合工程实践。
最后,TCP/IP采用了开放的开发模式,协议规范公开,任何人都可以实现。OSI的某些协议需要授权且实现复杂,阻碍了广泛采用。
历史的经验告诉我们,技术成功不仅取决于技术本身的质量,还取决于时机、生态、产业支持等多种因素。TCP/IP的成功是这些因素综合作用的结果。
Q2:TCP的可靠性保证会不会影响性能?
答:TCP的可靠性保证确实会带来一定的性能开销,但这种开销是为了提供可靠传输服务所必需的,而且TCP通过多种机制来尽量降低这种开销的影响。
TCP的可靠性机制包括:每个数据包都需要确认、超时重传丢失的数据、维护复杂的连接状态、执行流量控制和拥塞控制。这些都会增加CPU使用、内存占用和网络流量。
然而,TCP通过多种优化来降低性能影响。快速重传机制在收到3个重复ACK时立即重传,而不是等待超时,大大减少了重传延迟。选择性确认(SACK)让接收方告诉发送方哪些数据已收到,避免重传已收到的数据。窗口缩放选项支持更大的窗口,提高高延迟网络的性能。
对于不需要可靠性的应用,这些开销确实是浪费。UDP不提供可靠性保证,因此没有这些开销,更适合实时应用。但对于需要可靠性的应用,TCP的开销是必要的——如果使用UDP,应用层需要自己实现类似的机制,开销可能更大。
51学通信站长爱卫生的经验:在选择传输协议时,要权衡可靠性和性能。对于文件传输、邮件等场景,数据的完整性至关重要,TCP的性能开销是值得的。对于视频会议、游戏等场景,实时性比可靠性更重要,UDP的低延迟优势更有价值。
Q3:为什么TCP需要三次握手,两次不够吗?
答:TCP连接建立需要三次握手而不是两次,是为了确保双方的发送和接收能力都正常,并防止旧的重复连接请求引起问题。
如果只有两次握手,客户端发送SYN,服务器返回SYN+ACK,连接就建立了。但这里有问题:服务器不知道客户端是否收到了SYN+ACK——如果SYN+ACK在网络中丢失,客户端认为连接未建立,服务器认为连接已建立,双方状态不一致。
三次握手解决了这个问题。客户端收到SYN+ACK后发送ACK,服务器收到这个ACK后才确认连接建立。此时双方都确认了对方的发送和接收能力正常。
三次握手还防止了旧的重复连接请求干扰。假设客户端发送了一个SYN,这个SYN在网络中滞留很长时间,客户端超时重发了新的SYN并建立了连接。如果旧的SYN终于到达服务器,服务器发送SYN+ACK。如果是两次握手,服务器认为连接建立了,但客户端认为这是旧请求,不会理会。如果是三次握手,服务器需要收到客户端的ACK才建立连接,客户端不会对旧SYN发送ACK,连接不会建立。
Q4:UDP既然不可靠,为什么还被广泛使用?
答:UDP虽然不提供可靠性保证,但它的简单和高效使其在很多场景下成为更好的选择。
首先,UDP的简单性带来了低延迟。UDP不需要建立连接,直接发送数据;UDP头部只有8字节,处理开销小;UDP没有流量控制和拥塞控制,发送不受限制。这对于实时应用(如视频会议、在线游戏)至关重要——这些应用可以容忍少量丢包,但不能容忍高延迟。
其次,有些应用需要的可靠性模型与TCP提供的不同。TCP提供的是严格的有序可靠传输,但对于组播、实时流媒体等应用,可能需要的是部分可靠、有序无关的传输。UDP让应用层可以实现定制的可靠性机制。
再者,对于简单的查询-响应协议(如DNS),UDP更合适。DNS查询和响应都很小,可以在一个UDP数据报中完成。使用TCP需要建立连接、传输数据、释放连接,开销过大。
还有,UDP支持组播和广播。一个UDP数据报可以同时发送给多个接收者,TCP是一对一通信,不支持组播。
51学通信提示:UDP的”不可靠”并不意味着用它传输的数据一定会丢失。在网络条件良好的局域网环境中,UDP数据报的丢失率极低。只有在拥塞的互联网或不可靠的无线网络中,UDP丢失率才显著增加。根据应用场景选择协议,不要因为UDP”不可靠”就回避使用它。
Q5:TCP的TIME_WAIT状态有什么作用,为什么要等待2MSL?
答:TIME_WAIT状态是TCP连接关闭时主动关闭方进入的状态,需要等待2MSL(最大报文生存时间)才能完全关闭。这个设计有两个重要作用。
第一个作用是确保最后的ACK能够到达对方。TCP连接关闭时,被动关闭方发送最后一个FIN,主动关闭方回复ACK。如果这个ACK丢失,被动关闭方会重传FIN。如果主动关闭方不等待直接关闭,就无法回应这个重传的FIN,导致被动关闭方无法正常关闭。等待2MSL足以让ACK到达或让重传的FIN到达。
第二个作用是让网络中旧连接的报文段全部消失。TCP报文段在网络中的生存时间是有限制的(由TTL字段限制),2MSL的时间足以让网络中所有属于旧连接的报文段要么到达目的地,要么被路由器丢弃。这防止了旧连接的报文段被误认为是新连接的报文段。
2MSL是MSL的两倍。MSL(Maximum Segment Lifetime)是报文段在网络中能够存活的最长时间,通常设为2分钟。2MSL即4分钟,这个时间足够长,可以保证上述两个作用。
TIME_WAIT状态的一个副作用是,如果短时间内有大量连接建立和关闭,可能会有很多连接处于TIME_WAIT状态,占用系统资源(端口、内存)。可以通过调整系统参数(如减少TIME_WAIT时间、启用端口复用)来缓解这个问题,但要注意可能带来的风险。
总结
本文深入讲解了网络协议的分层设计、OSI七层模型、TCP/IP协议栈以及传输层的TCP和UDP协议。
通过学习,你应当理解了网络协议分层的原理和好处,掌握了OSI七层模型各层的功能和协议,了解了TCP/IP协议栈的实际结构,深入理解了TCP的连接管理、流量控制和拥塞控制机制,以及UDP的特点和应用场景选择。
协议分层是网络通信的核心设计思想,它将复杂的通信过程分解为多个层次,每层专注于解决特定问题。TCP和UDP是传输层的两大协议,分别提供可靠和不可靠的传输服务,各自适用于不同的应用场景。
下篇预告
下一篇我们将深入探讨数据通信原理与技术,带你了解数据通信的基本模型、传输介质特性、信号传输机制、调制解调技术以及多路复用技术的原理与应用。