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

三次握手和欢迎套接字的问题?

  •  
  •   amiwrong123 · 2021-02-06 21:49:58 +08:00 · 2478 次点击
    这是一个创建于 1386 天前的主题,其中的信息可能已经有所发展或是发生改变。

    正在看计算机网络自低向上。看到欢迎套接字这里有两个问题。

    1. 三次握手的第一次和第三次都是发送给服务器,而且都是发送给了服务器的欢迎套接字?因为从第二个图中,看起来是这个意思。

    2. 三次握手以后,客户端再向服务器发送什么数据时,来自客户端的数据到达目的地主机的运输层之后,会发现两个 socket 都满足目的地的端口号(欢迎套接字和连接套接字),那它怎么知道该传给 欢迎套接字 还是 连接套接字呢? ( https://www.zhihu.com/question/54182420/answer/138476746 ,从知乎这个回答里,说了欢迎套接字和连接套接字是具有相同端口的。)

    3. 欢迎套接字和连接套接字是处于 运行在服务器主机上的两个进程吗?

    本人网络太菜,各位大佬求解答

    18 条回复    2021-02-07 15:02:38 +08:00
    misaka19000
        1
    misaka19000  
       2021-02-06 22:09:48 +08:00
    欢迎套接字和连接套接字是啥?完全看不懂
    misaka19000
        2
    misaka19000  
       2021-02-06 22:11:26 +08:00
    TCP 连接在建立前(即三次握手)是客户端主动发起第一个 syn,之后服务端回复 ack 以及顺便向客户端发送 syn,随后客户端向服务端发送 ack,到此连接建立

    连接建立后就不存在客户端和服务端的区别了,双方发送数据都是对等的
    lujie2012
        3
    lujie2012  
       2021-02-06 22:21:05 +08:00
    看书没有用,都是死的。你自己去抓包,看代码,运行一下,实践才是靠谱的。
    qakito
        4
    qakito  
       2021-02-06 22:29:59 +08:00   ❤️ 1
    listen socket 只用来接收客户端的 TCP 连接
    1.完成握手后,该 client 连接信息(IP:PORT + SERVER:PORT)加入 listen socket 的连接完成队列,同时 accept 函数返回
    2.accept 函数从 listen socket 的连接完成队列中取队列元素,并生成新的 socket 与其关联
    3.server 可以通过新的 socket 与 client 通信

    代码中,listen socket 只需要完成
    fd = socket(AF_INET, SOCK_STREAM, 0);
    bind(fd, 相应的 TCP 端口)
    listen(fd)
    new_conn = accept(fd)
    当新 TCP 连接完成,new_conn 即可用于实际数据通信

    至于 new_conn 的实际交互流程,可以放在子进程(or 线程),也可以在同一个进程里完成

    你要的答案 TCP/IP 详解卷 2 里有 socket 的相关实现
    qakito
        5
    qakito  
       2021-02-06 22:31:54 +08:00
    另,关于 TCP server 在 unix 网络编程中也有相关章节介绍
    无论是子进程的方式,还是 select 复用
    oaix
        6
    oaix  
       2021-02-06 22:39:57 +08:00   ❤️ 1
    > 三次握手的第一次和第三次都是发送给服务器,而且都是发送给了服务器的“欢迎套接字”?
    是的
    > 那它怎么知道该传给 欢迎套接字 还是 连接套接字呢?
    根据来 src 来区分,如果已经建立连接了,就发送到“连接套接字”
    > 欢迎套接字和连接套接字是处于 运行在服务器主机上的两个进程吗?
    不是,“连接套接字”是通过在“欢迎套接字”上调用 accept 调用返回的。
    hxndg
        7
    hxndg  
       2021-02-06 23:11:18 +08:00
    坦白讲,我也不知道欢迎套接字是啥。。。。

    我主要好奇的是 《计算机网络自底向上》是个啥书?
    我只知道《计算机网络自顶向下》特别好。
    amiwrong123
        8
    amiwrong123  
    OP
       2021-02-06 23:50:15 +08:00
    @qakito #4
    谢谢回答啦。那比如下面这个 tcp server 的简单 py 实现:

    红框里那一句得到的数据 sentence,就是第一个图里客户端的第三次握手顺带发过来的 http 请求报文吗?(我没理解错吧,第三次握手时,客户端会顺便发送 http 请求报文)
    amiwrong123
        9
    amiwrong123  
    OP
       2021-02-06 23:54:12 +08:00
    @qakito #4
    @oaix #6
    对了,还有个问题,就是因为 TCP 相对 UDP 是面向连接的协议,所以 TCP 实现上才搞了个 欢迎套接字,来方便快速处理 这些 TCP 连接请求呗?

    UDP 就根本不需要这玩意,因为 UDP 是无连接的。
    amiwrong123
        10
    amiwrong123  
    OP
       2021-02-06 23:54:41 +08:00
    @hxndg #7
    见笑了,手滑打错了
    anthow
        11
    anthow  
       2021-02-07 09:16:17 +08:00
    欢迎套接字,还是第一次听说。
    dongtingyue
        12
    dongtingyue  
       2021-02-07 09:51:02 +08:00
    这书看起来好古老
    zhangsanfeng2012
        13
    zhangsanfeng2012  
       2021-02-07 09:56:22 +08:00
    监听 socket 和 已连接 socket 的意思吗?
    newmlp
        14
    newmlp  
       2021-02-07 10:53:29 +08:00
    tcp 协议那么复杂,够写一本书了,你用两张图就能搞清啦?
    ooxiaoming
        15
    ooxiaoming  
       2021-02-07 11:31:58 +08:00
    看 tcp/ip 详解...
    yamasa
        16
    yamasa  
       2021-02-07 12:24:11 +08:00
    > 看 tcp/ip illustrated 或者 computer network: A top down approach, 要看原版, 绕过垃圾翻译成本。
    > 边看的时候自己用 wireshark 抓包玩起来,只看书都是务虚的,很多细节看完没几天忘光。
    togou
        17
    togou  
       2021-02-07 12:27:15 +08:00
    1,2 :欢迎套接字 欢迎之后 也就是 accept 完成了 为给你生成一个新的 fd 那个 fd 所对应的 ip 端口 就是欢迎套接字监听的端口
    对端的套接字连接 connect 之后 那个 fd 与服务端 ip:port <=> ip:port 这个四元组 就是一个 tcp 连接
    3.套接字编程实现是 文件描述符 欢迎套接字 与 连接的套接字是两个不同的 fd
    julyclyde
        18
    julyclyde  
       2021-02-07 15:02:38 +08:00
    listen socket
    connection socket
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   992 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 20:02 · PVG 04:02 · LAX 12:02 · JFK 15:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.