V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yezheyu
V2EX  ›  程序员

socket 有点小疑问,想请教下

  •  
  •   yezheyu · 2021-12-07 19:32:47 +08:00 · 1422 次点击
    这是一个创建于 841 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 TCP 编程中,服务器先创建一个监听 socket 然后 bind ,listen 客户端请求进来,经过 3 次握手放到已连接队列中 accept 从队列中取出,创建一个连接 用户检查连接的 IO 事件,处理

    为什么很多 C 博客会把连接叫做已连接 socket,一个 socket 不是只由 IP 和端口决定 而连接是由客户端的 socket 和服务器的 socket 共同决定,根本不是一个概念

    已连接 socket 和监听 socket 有啥区别,总不能再给已连接 socket 重新分配一个新的端口? 又或者说已连接 socket 就是一个每个连接独有的一份监听 socket 拷贝? 毕竟数据收发要通过 socket 的

    在多个客户端的连接,服务器响应它们的时候,怎么处理的? 是共用一个监听 socket 回复吗? 还是使用各自连接里的已连接 socket ? 那不同客户端连接的已连接 socket 服务器是怎么区分? 为每个已连接 socket 分配不同端口?

    还有 http1.1 中一个客户端和服务器之间可以建立多个 tcp 连接是怎么回事? 多个 tcp 连接之间怎么区分?毕竟它们的源 IP 端口和目的 IP 端口都一样

    3 条回复    2021-12-08 11:56:36 +08:00
    lesismal
        1
    lesismal  
       2021-12-07 19:42:30 +08:00
    socket 四元组是指协议层面的

    对于程序,你可以当成是五元组: 四元组 + fd ( accept/connect 返回的文件描述符)
    wangyu17455
        2
    wangyu17455  
       2021-12-07 19:52:32 +08:00 via Android
    你可以像 java 一样理解,把 socket 分为 socket (已经建立的 tcp 连接)和 serversocket (用来监听端口的 socket )
    liu1996
        3
    liu1996  
       2021-12-08 11:56:36 +08:00
    服务端 socket 监听对象不变,客户端连接时生成一个新的 socket ,新的 socket 中服务器 ip 和端口号不变、另加上客户端 ip 和客户端端口号。通信的时候是根据四元组(服务器 ip 和端口号,客户端 ip 和客户端端口号)来确定一个 socket 。
    一个客户端和服务器之间可以建立多个 tcp 连接是怎么回事?这里每一个 socket 端口号都不一样,所以是多个 socket 连接
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5432 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:34 · PVG 16:34 · LAX 01:34 · JFK 04:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.