关于 socket 的一些问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
liu1996
V2EX    程序员

关于 socket 的一些问题

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

    最近在学习计算机网络,看到 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  
    PRO
       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
    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     Solana     1276 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 17:14 PVG 01:14 LAX 09:14 JFK 12:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86