计算机网络核心概念精讲 第 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对比

特性TCPUDP
连接性面向连接无连接
可靠性可靠传输不可靠传输
流量控制有(滑动窗口)
拥塞控制
头部大小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是传输层的两大协议,分别提供可靠和不可靠的传输服务,各自适用于不同的应用场景。

下篇预告

下一篇我们将深入探讨数据通信原理与技术,带你了解数据通信的基本模型、传输介质特性、信号传输机制、调制解调技术以及多路复用技术的原理与应用。