You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

学习C语言Socket实现的疑问:TCP监听套接字与握手时机

TCP服务器中TCP握手的时机与套接字角色解析

你的理解方向是对的,这里直接把核心逻辑拆解清楚:

核心结论

TCP三次握手完全是在客户端与服务器的监听套接字之间完成的,握手成功后,服务器才会生成用于后续数据收发的新套接字。

具体流程拆解(结合C语言Socket调用)

我们结合服务器端的关键函数一步步看:

  1. 创建并初始化监听套接字
    服务器先通过socket()创建监听套接字,再用bind()绑定IP和端口,最后调用listen()让这个套接字进入LISTEN状态——此时它唯一的作用就是等待客户端的连接请求,不参与任何数据传输。

  2. TCP三次握手的触发与完成
    当客户端调用connect()发起连接时,会向服务器监听套接字对应的端口发送SYN包。接下来的三次握手过程是由操作系统内核的TCP协议栈自动处理的,完全不需要应用层代码干预:

    • 客户端发SYN → 服务器内核返回SYN+ACK → 客户端发ACK
      握手完成后,这个已建立的连接会被内核放入监听套接字的「已完成连接队列」中。
  3. 生成数据收发用的新套接字
    服务器调用accept()时,会从「已完成连接队列」中取出一个已握手成功的连接,然后生成一个全新的套接字(通常叫conn_fd)。这个新套接字才是真正用来和客户端收发数据的句柄——它继承了监听套接字的IP和端口,但带有唯一的客户端标识(客户端IP+端口),以此区分不同的客户端连接。

容易混淆的误区纠正

  • 不是先创建新套接字再握手,而是握手完成后才会通过accept()拿到新套接字。accept()本身不参与握手,只是从内核的已完成队列中取走现成的已建立连接。
  • 监听套接字自始至终只负责接收连接请求,不会和任何客户端进行数据交互,所有数据传输都通过accept()生成的新套接字完成。

简化代码示例

#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>

int main() {
    // 创建监听套接字
    int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
    
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = INADDR_ANY;
    server_addr.sin_port = htons(8080);
    
    // 绑定地址端口
    bind(listen_fd, (struct sockaddr*)&server_addr, sizeof(server_addr));
    // 启动监听,设置未完成/已完成连接队列长度
    listen(listen_fd, 5);
    
    // 循环处理客户端连接
    while (1) {
        struct sockaddr_in client_addr;
        socklen_t addr_len = sizeof(client_addr);
        // 取出已完成握手的连接,生成新套接字
        int conn_fd = accept(listen_fd, (struct sockaddr*)&client_addr, &addr_len);
        
        // 通过conn_fd与客户端收发数据
        const char* msg = "Hello from server";
        send(conn_fd, msg, strlen(msg), 0);
        
        close(conn_fd);
    }
    
    close(listen_fd);
    return 0;
}

内容的提问来源于stack exchange,提问作者S214ky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:46:13