TCP/IP 网络编程:从入门到实战

1. 引言

TCP/IP 协议族是当今互联网的基石,无论是浏览网页、收发邮件,还是观看视频、远程登录服务器,背后都离不开 TCP/IP 协议栈的支撑。对于开发者而言,掌握 TCP/IP 网络编程不仅是理解网络通信原理的关键,更是构建高性能、高可靠网络应用的基础能力。

本教程将从 TCP/IP 协议栈的基础概念讲起,逐步深入到 Socket 编程的核心 API,并结合实际代码示例,帮助读者系统地掌握 TCP/IP 网络编程的核心技能。无论你是刚接触网络编程的初学者,还是希望巩固基础知识的进阶开发者,本文都能为你提供清晰、实用的指导。

2. TCP/IP 协议栈概述

2.1 什么是 TCP/IP

TCP/IP(Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议)是一个由多个协议组成的协议族,它定义了数据在网络中传输的规则和标准。TCP/IP 协议族采用分层设计,每一层负责不同的功能,层与层之间通过标准接口进行通信。

2.2 四层模型

TCP/IP 协议族通常被划分为四层,从下到上依次是:

  • 网络接口层(Link Layer):负责在物理网络上传输数据帧,包括以太网、Wi-Fi 等底层网络技术。
  • 网际层(Internet Layer):负责数据包的路由和转发,核心协议是 IP(Internet Protocol)。
  • 传输层(Transport Layer):负责端到端的通信,核心协议是 TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)。
  • 应用层(Application Layer):为用户提供各种网络服务,如 HTTP、FTP、SMTP、DNS 等。

#mermaid-svg-wq5AQxyN6IRN5kdC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wq5AQxyN6IRN5kdC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wq5AQxyN6IRN5kdC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wq5AQxyN6IRN5kdC .error-icon{fill:#552222;}#mermaid-svg-wq5AQxyN6IRN5kdC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wq5AQxyN6IRN5kdC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wq5AQxyN6IRN5kdC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wq5AQxyN6IRN5kdC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wq5AQxyN6IRN5kdC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wq5AQxyN6IRN5kdC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wq5AQxyN6IRN5kdC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wq5AQxyN6IRN5kdC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wq5AQxyN6IRN5kdC .marker.cross{stroke:#333333;}#mermaid-svg-wq5AQxyN6IRN5kdC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wq5AQxyN6IRN5kdC p{margin:0;}#mermaid-svg-wq5AQxyN6IRN5kdC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wq5AQxyN6IRN5kdC .cluster-label text{fill:#333;}#mermaid-svg-wq5AQxyN6IRN5kdC .cluster-label span{color:#333;}#mermaid-svg-wq5AQxyN6IRN5kdC .cluster-label span p{background-color:transparent;}#mermaid-svg-wq5AQxyN6IRN5kdC .label text,#mermaid-svg-wq5AQxyN6IRN5kdC span{fill:#333;color:#333;}#mermaid-svg-wq5AQxyN6IRN5kdC .node rect,#mermaid-svg-wq5AQxyN6IRN5kdC .node circle,#mermaid-svg-wq5AQxyN6IRN5kdC .node ellipse,#mermaid-svg-wq5AQxyN6IRN5kdC .node polygon,#mermaid-svg-wq5AQxyN6IRN5kdC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wq5AQxyN6IRN5kdC .rough-node .label text,#mermaid-svg-wq5AQxyN6IRN5kdC .node .label text,#mermaid-svg-wq5AQxyN6IRN5kdC .image-shape .label,#mermaid-svg-wq5AQxyN6IRN5kdC .icon-shape .label{text-anchor:middle;}#mermaid-svg-wq5AQxyN6IRN5kdC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wq5AQxyN6IRN5kdC .rough-node .label,#mermaid-svg-wq5AQxyN6IRN5kdC .node .label,#mermaid-svg-wq5AQxyN6IRN5kdC .image-shape .label,#mermaid-svg-wq5AQxyN6IRN5kdC .icon-shape .label{text-align:center;}#mermaid-svg-wq5AQxyN6IRN5kdC .node.clickable{cursor:pointer;}#mermaid-svg-wq5AQxyN6IRN5kdC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wq5AQxyN6IRN5kdC .arrowheadPath{fill:#333333;}#mermaid-svg-wq5AQxyN6IRN5kdC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wq5AQxyN6IRN5kdC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wq5AQxyN6IRN5kdC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wq5AQxyN6IRN5kdC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wq5AQxyN6IRN5kdC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wq5AQxyN6IRN5kdC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wq5AQxyN6IRN5kdC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wq5AQxyN6IRN5kdC .cluster text{fill:#333;}#mermaid-svg-wq5AQxyN6IRN5kdC .cluster span{color:#333;}#mermaid-svg-wq5AQxyN6IRN5kdC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wq5AQxyN6IRN5kdC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wq5AQxyN6IRN5kdC rect.text{fill:none;stroke-width:0;}#mermaid-svg-wq5AQxyN6IRN5kdC .icon-shape,#mermaid-svg-wq5AQxyN6IRN5kdC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wq5AQxyN6IRN5kdC .icon-shape p,#mermaid-svg-wq5AQxyN6IRN5kdC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wq5AQxyN6IRN5kdC .icon-shape .label rect,#mermaid-svg-wq5AQxyN6IRN5kdC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wq5AQxyN6IRN5kdC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wq5AQxyN6IRN5kdC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wq5AQxyN6IRN5kdC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 应用层:HTTP / FTP / SMTP / DNS
传输层:TCP / UDP
网际层:IP / ICMP / ARP
网络接口层:以太网 / Wi-Fi

2.3 关键协议简介

  • IP(Internet Protocol):负责数据包的寻址和路由,提供无连接、不可靠的传输服务。IP 地址是网络中的设备标识。
  • TCP(Transmission Control Protocol):面向连接的、可靠的传输协议。它通过三次握手建立连接、四次挥手断开连接,并提供流量控制、拥塞控制、数据重传等机制,保证数据按序、无差错地到达对端。
  • UDP(User Datagram Protocol):无连接的传输协议,不保证数据的可靠到达,但传输效率高、开销小,适用于实时性要求高、可容忍少量丢包的应用场景,如视频通话、在线游戏等。

3. Socket 编程基础

3.1 什么是 Socket

Socket(套接字)是应用层与传输层之间的编程接口,它屏蔽了底层协议的复杂性,为开发者提供了一套统一的 API 来发起网络通信。在 TCP/IP 编程中,Socket 是客户端与服务器之间通信的端点。

3.2 Socket 编程模型

TCP Socket 编程遵循经典的 C/S(Client/Server,客户端/服务器)模型,其基本流程如下:

服务器端流程:

  1. 调用 socket() 创建套接字。
  2. 调用 bind() 将套接字绑定到指定的 IP 地址和端口。
  3. 调用 listen() 使套接字进入监听状态,等待客户端连接。
  4. 调用 accept() 接受客户端的连接请求,返回一个新的套接字用于与客户端通信。
  5. 通过新套接字调用 send() / recv() 与客户端收发数据。
  6. 通信结束后调用 close() 关闭套接字。

客户端流程:

  1. 调用 socket() 创建套接字。
  2. 调用 connect() 向服务器发起连接请求。
  3. 连接建立后调用 send() / recv() 与服务器收发数据。
  4. 通信结束后调用 close() 关闭套接字。

服务器 客户端 服务器 客户端 #mermaid-svg-AWug5KLUfVXm6TmB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-AWug5KLUfVXm6TmB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-AWug5KLUfVXm6TmB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-AWug5KLUfVXm6TmB .error-icon{fill:#552222;}#mermaid-svg-AWug5KLUfVXm6TmB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-AWug5KLUfVXm6TmB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-AWug5KLUfVXm6TmB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-AWug5KLUfVXm6TmB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-AWug5KLUfVXm6TmB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-AWug5KLUfVXm6TmB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-AWug5KLUfVXm6TmB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-AWug5KLUfVXm6TmB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-AWug5KLUfVXm6TmB .marker.cross{stroke:#333333;}#mermaid-svg-AWug5KLUfVXm6TmB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-AWug5KLUfVXm6TmB p{margin:0;}#mermaid-svg-AWug5KLUfVXm6TmB .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-AWug5KLUfVXm6TmB text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-AWug5KLUfVXm6TmB .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-AWug5KLUfVXm6TmB .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-AWug5KLUfVXm6TmB .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-AWug5KLUfVXm6TmB .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-AWug5KLUfVXm6TmB #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-AWug5KLUfVXm6TmB .sequenceNumber{fill:white;}#mermaid-svg-AWug5KLUfVXm6TmB #sequencenumber{fill:#333;}#mermaid-svg-AWug5KLUfVXm6TmB #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-AWug5KLUfVXm6TmB .messageText{fill:#333;stroke:none;}#mermaid-svg-AWug5KLUfVXm6TmB .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-AWug5KLUfVXm6TmB .labelText,#mermaid-svg-AWug5KLUfVXm6TmB .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-AWug5KLUfVXm6TmB .loopText,#mermaid-svg-AWug5KLUfVXm6TmB .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-AWug5KLUfVXm6TmB .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-AWug5KLUfVXm6TmB .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-AWug5KLUfVXm6TmB .noteText,#mermaid-svg-AWug5KLUfVXm6TmB .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-AWug5KLUfVXm6TmB .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-AWug5KLUfVXm6TmB .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-AWug5KLUfVXm6TmB .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-AWug5KLUfVXm6TmB .actorPopupMenu{position:absolute;}#mermaid-svg-AWug5KLUfVXm6TmB .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-AWug5KLUfVXm6TmB .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-AWug5KLUfVXm6TmB .actor-man circle,#mermaid-svg-AWug5KLUfVXm6TmB line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-AWug5KLUfVXm6TmB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} socket() 创建套接字bind() 绑定地址listen() 监听socket() 创建套接字connect() 发起连接accept() 接受连接send() / recv() 数据交换send() / recv() 数据交换close() 关闭close() 关闭

3.3 常用 Socket API

函数 作用
socket() 创建套接字
bind() 绑定本地地址和端口
listen() 监听连接请求
accept() 接受客户端连接
connect() 发起连接请求
send() / sendto() 发送数据
recv() / recvfrom() 接收数据
close() 关闭套接字

4. TCP 编程实战

4.1 环境准备

本教程的代码示例使用 Python 语言编写,Python 内置的 socket 模块提供了完整的 Socket 编程接口,无需额外安装第三方库。请确保你的开发环境中已安装 Python 3.6 及以上版本。

4.2 TCP 服务器端实现

下面是一个最简单的 TCP 服务器端代码,它监听本机的 8888 端口,接收客户端连接,并将收到的数据原样返回给客户端(即 Echo 服务器)。

python 复制代码
import socket

def main():
    # 1. 创建 TCP 套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2. 绑定地址和端口
    server_address = ('0.0.0.0', 8888)
    server_socket.bind(server_address)

    # 3. 开始监听
    server_socket.listen(5)
    print(f"服务器已启动,监听端口 {server_address[1]} ...")

    while True:
        # 4. 接受客户端连接
        client_socket, client_address = server_socket.accept()
        print(f"客户端 {client_address} 已连接")

        try:
            # 5. 接收数据并原样返回
            while True:
                data = client_socket.recv(1024)
                if not data:
                    break
                print(f"收到数据: {data.decode('utf-8')}")
                client_socket.sendall(data)
        finally:
            # 6. 关闭客户端套接字
            client_socket.close()
            print(f"客户端 {client_address} 已断开")

if __name__ == '__main__':
    main()

4.3 TCP 客户端实现

对应的客户端代码如下,它连接服务器的 8888 端口,发送一条消息并接收服务器的回显。

python 复制代码
import socket

def main():
    # 1. 创建 TCP 套接字
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 2. 连接服务器
    server_address = ('127.0.0.1', 8888)
    client_socket.connect(server_address)
    print(f"已连接到服务器 {server_address}")

    try:
        # 3. 发送数据
        message = "Hello, TCP Server!"
        client_socket.sendall(message.encode('utf-8'))
        print(f"已发送: {message}")

        # 4. 接收服务器回显
        data = client_socket.recv(1024)
        print(f"收到回显: {data.decode('utf-8')}")
    finally:
        # 5. 关闭套接字
        client_socket.close()

if __name__ == '__main__':
    main()

4.4 运行测试

  1. 先启动服务器端程序,终端会输出「服务器已启动,监听端口 8888 ...」。
  2. 再启动客户端程序,客户端会输出「已连接到服务器」并发送消息,随后收到服务器的回显。
  3. 服务器端终端会同步显示客户端的连接信息和收到的数据。

5. UDP 编程实战

5.1 UDP 与 TCP 的区别

UDP 与 TCP 最大的区别在于:UDP 是无连接的、不可靠的,但传输效率更高。UDP 编程不需要建立连接,直接通过 sendto() 和 recvfrom() 收发数据报。

5.2 UDP 服务器端实现

python 复制代码
import socket

def main():
    # 1. 创建 UDP 套接字
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 2. 绑定地址和端口
    server_address = ('0.0.0.0', 9999)
    server_socket.bind(server_address)
    print(f"UDP 服务器已启动,监听端口 {server_address[1]} ...")

    while True:
        # 3. 接收数据报
        data, client_address = server_socket.recvfrom(1024)
        print(f"收到来自 {client_address} 的数据: {data.decode('utf-8')}")

        # 4. 原样返回数据报
        server_socket.sendto(data, client_address)

if __name__ == '__main__':
    main()

5.3 UDP 客户端实现

python 复制代码
import socket

def main():
    # 1. 创建 UDP 套接字
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # 2. 服务器地址
    server_address = ('127.0.0.1', 9999)

    # 3. 发送数据报
    message = "Hello, UDP Server!"
    client_socket.sendto(message.encode('utf-8'), server_address)
    print(f"已发送: {message}")

    # 4. 接收服务器回显
    data, _ = client_socket.recvfrom(1024)
    print(f"收到回显: {data.decode('utf-8')}")

    # 5. 关闭套接字
    client_socket.close()

if __name__ == '__main__':
    main()

6. 进阶主题

6.1 多线程并发服务器

上面的 TCP 服务器是单线程的,一次只能处理一个客户端连接。在实际应用中,服务器需要同时服务多个客户端,这时可以使用多线程或多进程模型。

python 复制代码
import socket
import threading

def handle_client(client_socket, client_address):
    """处理单个客户端连接的函数"""
    print(f"客户端 {client_address} 已连接")
    try:
        while True:
            data = client_socket.recv(1024)
            if not data:
                break
            print(f"收到来自 {client_address} 的数据: {data.decode('utf-8')}")
            client_socket.sendall(data)
    finally:
        client_socket.close()
        print(f"客户端 {client_address} 已断开")

def main():
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_socket.bind(('0.0.0.0', 8888))
    server_socket.listen(5)
    print("多线程服务器已启动,监听端口 8888 ...")

    while True:
        client_socket, client_address = server_socket.accept()
        # 为每个客户端创建一个新线程
        thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
        thread.start()

if __name__ == '__main__':
    main()

6.2 粘包问题与解决方案

TCP 是面向字节流的协议,它不维护消息的边界。当客户端连续发送多条消息时,服务器端可能一次性收到多条消息(粘包),也可能一条消息被拆分成多次接收(拆包)。解决粘包问题的常用方法有:

  • 固定长度消息:每条消息固定长度,不足时用填充字符补齐。
  • 消息头 + 消息体:在消息头部记录消息体的长度,接收方先读取头部,再按长度读取消息体。
  • 特殊分隔符 :在消息末尾添加特殊分隔符(如 \n),接收方按分隔符切分消息。

6.3 非阻塞 I/O 与 select

对于需要同时处理大量连接的场景,多线程模型会带来较大的资源开销。此时可以使用非阻塞 I/O 配合 select / poll / epoll 等 I/O 多路复用机制,在单线程内同时管理多个套接字。

7. 常见问题与调试技巧

7.1 端口被占用

启动服务器时如果提示「Address already in use」,说明端口已被其他进程占用。可以通过以下命令查看占用端口的进程:

bash 复制代码
# Linux / macOS
lsof -i :8888

# Windows
netstat -ano | findstr 8888

7.2 连接被拒绝

客户端连接服务器时提示「Connection refused」,通常是因为服务器未启动、端口错误或防火墙拦截。请检查服务器是否正常运行、端口是否一致。

7.3 使用抓包工具

当网络通信出现异常时,可以使用 Wireshark 或 tcpdump 抓包分析,查看数据包的实际传输情况,定位问题所在。

8. 总结

本文从 TCP/IP 协议栈的分层模型出发,系统介绍了 Socket 编程的核心概念和 API,并通过完整的代码示例演示了 TCP 与 UDP 服务器的实现方法。在此基础上,还探讨了多线程并发、粘包处理、I/O 多路复用等进阶主题。

掌握 TCP/IP 网络编程需要理论与实践相结合。建议读者在阅读本文后,亲自动手运行代码示例,并尝试修改端口、消息内容、并发模型等参数,加深对网络通信机制的理解。随着经验的积累,你还可以进一步学习 HTTP 协议、WebSocket、gRPC 等更上层的网络编程技术,构建更加复杂的网络应用。

相关推荐
沫璃染墨1 小时前
《Qt从零入门系列(十二):Qt文件操作详解——从QFile读写到QFileInfo与记事本实战》
开发语言·网络·c++·qt·交互·信号处理·文件
梦帮科技3 小时前
推测解码(Speculative Decoding)与 Draft-Target 双核协同:接受率判据、树状验证与两倍吞吐无损加速
网络·人工智能·深度学习·神经网络·线性代数·矩阵·架构
骑着蜗牛撵大象3273 小时前
Agent 打字机是怎么来的:SSE 与 WebSocket 打通实时响应与中间状态
网络·websocket·网络协议·agent·sse·实时通信·流式输出
Frank_refuel3 小时前
分布式RPC框架实战(二):服务端模块划分与底层设计
分布式·网络协议·rpc
吴声子夜歌3 小时前
Nginx应用与运维——Nginx代理服务应用实战(TCP/UDP代理)
运维·tcp/ip·nginx
模拟器连接器曾工3 小时前
一进多出M12分线盒4口8口12口可选 PNP和NPN通用传感器集线器
网络·人工智能·m12分线盒·npn通用传感器集线器·pnp通用传感器集线器
RobinDevNotes3 小时前
大模型3D并行训练怎么配才不浪费算力
网络·人工智能·深度学习·深度优先
Fcy6484 小时前
Linux下 传输层协议TCP详解
linux·网络·tcp/ip
web打印社区4 小时前
C-Lodop 提示未准备好或 WebSocket 没准备好:先让本机服务起来
javascript·网络·websocket·网络协议·pdf·html