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

关于 socket 的一些问题

  •  
  •   liu1996 · 2021-11-22 09:00:20 +08:00 · 3529 次点击
    这是一个创建于 1097 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学习计算机网络,看到 socket 时产生了一个问题。socket 是 tcp/udp 等的一个抽象接口,那么是不是几乎所有使用 tcp/udp 来建立连接的都需要通过 socket 来调用 tcp/udp ?比如 http 协议等。 网络传输的报文是在传输层来寻找对应端口号,这个是不是就是通过 socket 来完成的? socket 在客户端与服务端建立连接时会生成一个新的 socket ,在客户端或者服务端调用 close 方法时断开这个连接,那么 http 协议每次请求是不是都会创建一个 socket?在服务端响应完毕后关闭这个 socket 连接?

    第 1 条附言  ·  2021-11-22 11:43:24 +08:00
    我上面的问法有点问题,其实我想描述的是 http 请求客户端与服务端需要进行 tcp3 次握手建立连接,这个 3 次握手应该是通过 socket 来完成的吧
    21 条回复    2021-11-24 00:06:28 +08:00
    mangoDB
        1
    mangoDB  
       2021-11-22 09:09:13 +08:00
    如果使用 Python 的话,可以自己编写一段通过 Requests 库发起 HTTP 请求的代码,然后在 Debug 模式下一步一步的走下去,你就能找到答案。
    mazyi
        2
    mazyi  
       2021-11-22 09:11:23 +08:00 via iPhone
    你是问 http 还是问 socket 还是问所有的应用层协议,你需要搞清楚
    aladdinding
        3
    aladdinding  
       2021-11-22 09:25:07 +08:00
    http 有 keep-alive ,可以多个请求走一个连接
    LLaMA2
        4
    LLaMA2  
       2021-11-22 09:48:05 +08:00
    tcp/udp 是协议,是概念上是学术上的一套称呼,他提供了一整套方法论。
    socket 是给你一种实现,也就是程序,库,完整的实现。
    你构建的程序无非是使用 socket 库,如果你懂硬件,手里有网卡驱动,或者干脆网卡都是你自己生产的,且符合标准,那你完全可以自己在驱动层自己完成网络交互,网卡无非就是把数据变成一种信号,对端再把这个信号解码成数据而已嘛!
    BigMountain
        5
    BigMountain  
       2021-11-22 09:55:12 +08:00
    你就理解 socket 是 tcp/udp 协议的抽象就行了 它工作在 tcp/udp 协议这层。
    其他的例如 http resp 等等协议都是基于 tcp 协议。 如果你需要实现一个 http 协议( http 基于 tcp ) 那么就通过 socket 进行编解码转换来实现 http 。
    sujin190
        6
    sujin190  
       2021-11-22 10:09:36 +08:00
    你想的是对的,这就是分层抽象的逻辑
    misaka19000
        7
    misaka19000  
       2021-11-22 10:10:36 +08:00
    额。。。多看书吧

    《 HTTP 权威指南》、《 Unix 环境高级编程》、《 Unix 网络编程》
    lesismal
        8
    lesismal  
       2021-11-22 10:11:21 +08:00   ❤️ 3
    楼主需要:《图解 tcp/ip 》+《 tcp/ip 详解》+ wireshark
    1. 入门阶段,如果不看图解这本、直接啃详解或者其他数很吃力要花费很久;
    2. 没有详解这本,图解又太简单了,了解不到深入细致;
    3. 没有 wireshark ,看再多也难记得住,实践出真知。另外 tcp 是大头,把 tcp 11 种状态转换图放在桌面上,配合抓包看 tcp 各种流程,tcp 搞熟悉了其他的多看看就容易得多了
    cweijan
        9
    cweijan  
       2021-11-22 10:35:35 +08:00
    楼上的扔一堆书好像有点毛病, 楼主已经理解的差不多了, 有两个误区
    1. Socket 是由操作系统实现的, 所以说是由操作操作寻找端口比较合理
    2. 不是每个 HTTP 请求都会创建一个新的 Socket(即 TCP 连接), 例如浏览器对 HTTP 实现了 Keep-Alive 机制, 间隔时长较短的 HTTP 请求会复用 TCP 连接, 不会重新创建
    CRVV
        10
    CRVV  
       2021-11-22 10:45:22 +08:00
    socket 指的是 https://en.wikipedia.org/wiki/Berkeley_sockets
    它是一个接口( API, interface )而不是实现( implementation )。

    > 是不是几乎所有使用 tcp/udp 来建立连接的都需要通过 socket 来调用 tcp/udp ?
    TCP/UDP 也可以用其它的接口,比如 https://www.nongnu.org/lwip/2_0_x/raw_api.html
    但是在通常的操作系统上( Windows/Linux/BSD/macOS )用的接口都是 socket

    > 网络传输的报文是在传输层来寻找对应端口号,这个是不是就是通过 socket 来完成的?
    端口号这些属于网络协议的实现,和接口没关系。

    其它和 HTTP 相关的问题,那是 HTTP 协议的实现,和 socket 更没关系了。
    ysc3839
        11
    ysc3839  
       2021-11-22 11:34:08 +08:00
    是。如果你指的 socket 是 socket API ,不是。HTTP/1.x 没有开启 Keep-Alive 的情况下,是。是。
    liu1996
        12
    liu1996  
    OP
       2021-11-22 11:38:02 +08:00
    @cweijan 感谢回复。
    liu1996
        13
    liu1996  
    OP
       2021-11-22 11:40:49 +08:00
    @CRVV 感谢回复。我上面的关于 http 的问法不对,其实我想表达的是 http 请求建立 tcp 连接的话需要 3 次握手,这个是不是通过 socket 来实现的
    liu1996
        14
    liu1996  
    OP
       2021-11-22 11:41:14 +08:00
    @BigMountain 感谢回复
    unixeno
        15
    unixeno  
       2021-11-22 12:34:42 +08:00 via Android
    @liu1996 是,也不是,要看你说的 socket 具体指代的啥。TCP 握手是操作系统帮你处理的。
    对于客户端来说,你 connect 时就会进行握手,完成之后才会返回你 fd 。
    对于服务端,你 accept 的时候系统会帮你处理握手
    advancejar
        16
    advancejar  
       2021-11-22 13:28:54 +08:00
    @liu1996 学个 django 开头的来说说,python 就是用 socket 来实现 http 的
    ohwind
        17
    ohwind  
       2021-11-22 14:45:29 +08:00
    TCP/IP 是协议,而 Socket 是抽象出来的接口(API),一般系统的 socket 函数、Socket 类则是接口的实现。
    git00ll
        18
    git00ll  
       2021-11-22 18:39:33 +08:00
    楼主,java 里面,apache httpclient 发送 http 请求,就是通过创建 java 里面的 socket ,将报文发送过去的。
    只不过用完后 socket 连接会放到池里复用。

    ungrown
        19
    ungrown  
       2021-11-23 10:13:23 +08:00
    一个基础概念的问题,炸出来一堆平时只顾干活却从来没把基本原理整明白的水货
    ungrown
        20
    ungrown  
       2021-11-23 10:45:57 +08:00
    @CRVV #10
    咱非得这么咬文嚼字吗?就算要嚼,就不能先放宽对语义的要求,把关联性讲完了,再补充说明“问题中各概念间的不对等性”吗?

    套接字是接口,HTTP 是协议,这俩是两个“象限”的东西没错,但真就一句“更没关系了”这也太不负责任了。
    HTTP 算是应用层协议,TCP 是位于更底层的传输层协议。实现 TCP 的库提供了套接字的调用接口,实现 HTTP 的库大多数也依赖于这些接口。楼主想问的不就是这方面的信息吗?
    CRVV
        21
    CRVV  
       2021-11-24 00:06:28 +08:00 via Android
    @ungrown
    因为很多人都不知道 socket 只是一个接口(从其它回复就能看出来),所以强调一下这件事情。

    我承认我的回答对楼主其实不太有帮助。不过,真正对楼主有帮助的东西是教科书,上面也已经有人告诉了楼主到底要看什么书。
    我反对到论坛问一个课本上就有答案的问题,这种东西没有速成的方法,真想学就直接看课本。而且这几个东西都不属于同一门课。TCP/UDP/HTTP 协议属于计算机网络课,socket 是操作系统课程的内容。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2629 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 05:09 · PVG 13:09 · LAX 21:09 · JFK 00:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.