V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
httpbin - 协议调试工具
httpstatuses - 协议状态码查询
httpie - cURL-like tool for humans
Fiddler
wsWmsw
V2EX  ›  HTTP

一个 http 请求由多个 tcp 数据包组成,一个 tcp 连接可以发送多个 http 请求,是这样吗?

  •  
  •   wsWmsw · 2022-11-16 08:04:44 +08:00 · 1938 次点击
    这是一个创建于 498 天前的主题,其中的信息可能已经有所发展或是发生改变。

    tcp 连接tcp 数据包的区别

    26 条回复    2022-11-17 11:39:55 +08:00
    admirez
        1
    admirez  
       2022-11-16 08:15:00 +08:00 via iPhone
    tcp 是流不是包啊
    coolzjy
        2
    coolzjy  
       2022-11-16 08:15:08 +08:00 via iPhone
    一个 http 请求由多个 tcp 数据包组成:不确定

    一个 tcp 连接可以发送多个 http 请求:是的
    kop1989smurf
        3
    kop1989smurf  
       2022-11-16 08:16:11 +08:00 via iPhone
    一个 http 请求包含一个完整的 tcp 链接生命周期(从握手到断开)。所以后半句是错的。

    http 请求是一种使用 tcp 实现的通信标准,他不能和 tcp 混在一起讨论。

    类似于寿司和米饭的关系。
    kop1989smurf
        4
    kop1989smurf  
       2022-11-16 08:26:43 +08:00 via iPhone
    当然,就像楼上说的,http 后来也进行了标准的优化,在 http1.1 中引入了 HTTP 持久连接( HTTP keep-alive )的设计,但这就是后话了。
    villivateur
        5
    villivateur  
       2022-11-16 08:27:17 +08:00   ❤️ 1
    @kop1989smurf http2 似乎是复用一个 tcp 连接,同时传输多个 http
    kop1989smurf
        6
    kop1989smurf  
       2022-11-16 08:30:57 +08:00 via iPhone
    @villivateur 感谢指正,我也想到这么说有过度简化导致误导的嫌疑,所以上文也补充了
    strengthen
        7
    strengthen  
       2022-11-16 08:32:21 +08:00
    HTTP 请求
    TCP 请求
    是两个概念。。
    lambdaq
        8
    lambdaq  
       2022-11-16 08:33:43 +08:00   ❤️ 3
    一个 tcp 连接只能收发一个 http/1.0 请求
    一个 tcp 只能依次顺序收发多个 http/1.1 非 pipeline 请求。如果是 pipeline 可以批量收发
    一个 tcp 连接可以乱序收发多个 http/2 请求,一个 http/2 请求可以 demux 到多个 tcp 连接上
    一个或多个 udp 包(无连接)可以收发多个 http/3 请求
    wsWmsw
        9
    wsWmsw  
    OP
       2022-11-16 09:50:49 +08:00
    @coolzjy 为什么 http 请求由多个数据包组成是不确定的?

    @lambdaq
    @coolzjy 有的浏览器有一个 host 最大打开 6 个 tcp 的限制,请问可以确定 1 个 tcp 可以发送多少 http 连接吗?这样我能确定哪些请求被阻塞了
    monkeyWie
        10
    monkeyWie  
       2022-11-16 10:01:17 +08:00
    @wsWmsw #9 一个 tcp 可以发送无限个 http 请求,如果不想被浏览器最大并发 tcp 连接限制,直接上 http2 就行了
    lambdaq
        11
    lambdaq  
       2022-11-16 10:02:14 +08:00
    @wsWmsw 因为 IP 网络是包交换网络。包有大有小,但是系统内核会负责把包裹按顺序组装好给应用使用。
    xtinput
        12
    xtinput  
       2022-11-16 10:03:30 +08:00
    @kop1989smurf 最新的 http 是可复用的,不需要频繁建立连接
    otakustay
        13
    otakustay  
       2022-11-16 10:27:02 +08:00
    @wsWmsw #9 一个包够用了的话,自然就不会由多个数据包组成了
    liuxingdeyu
        14
    liuxingdeyu  
       2022-11-16 10:48:12 +08:00
    tcp 是把数据切成一个包一个包的发,然后收到的那边校验数据完整性并根据序号排序,这样你就可以认为这东西是流。http 是再往上的协议,tcp 负责的是把 http 想要的东西完整的扔过去,所以 http 可以选择一个请求建一个 tcp 链接,也可以拉个长链接一直用。当然,不用 tcp 也不是不行,quic 就是用的 udp ,但是自己做了校验和排序
    tianyou666shen
        15
    tianyou666shen  
       2022-11-16 15:22:05 +08:00
    这个系统的教程看看理解一下呗
    只言片语也没法给你一个整体的脉络层级
    wsWmsw
        16
    wsWmsw  
    OP
       2022-11-16 17:01:50 +08:00
    @tianyou666shen 《网络是怎样连接的》、《图解 HTTP 》、《图解 TCP/IP 》这三本以外有推荐的吗,博文也行
    tianyou666shen
        17
    tianyou666shen  
       2022-11-16 17:16:05 +08:00
    @wsWmsw
    我是看的慕课网
    咚咚呛的计算机基础 讲的比较细
    Jooooooooo
        18
    Jooooooooo  
       2022-11-16 21:11:59 +08:00
    粘包警告
    wsWmsw
        19
    wsWmsw  
    OP
       2022-11-16 21:32:47 +08:00 via Android
    @tianyou666shen ok ,谢谢
    Taojun0714
        20
    Taojun0714  
       2022-11-16 22:25:12 +08:00
    @admirez 粘包警察巴甫洛夫反射前能不能了解下什么是 TCP packet
    wsWmsw
        21
    wsWmsw  
    OP
       2022-11-16 23:26:53 +08:00
    @lambdaq
    @liuxingdeyu 谢谢。那就是包够大、http/1.0 ,1 个 http 请求会建立 1 个 tcp 连接,而且连接中会收发各 1 个包,可以这样理解吗,这里的包没有明确定义,可以说是网络包也可以是 tcp 数据包吧?
    lambdaq
        22
    lambdaq  
       2022-11-17 10:08:37 +08:00
    @wsWmsw 网络包 和 tcp 数据包这种概念你还是多去了解下吧。不要胡猜。。。
    wsWmsw
        23
    wsWmsw  
    OP
       2022-11-17 11:10:32 +08:00
    @lambdaq 😮‍💨嗯,好的
    julyclyde
        24
    julyclyde  
       2022-11-17 11:24:36 +08:00
    @Taojun0714 TCP 没有 packet 。TCP 只有 segment
    julyclyde
        25
    julyclyde  
       2022-11-17 11:25:13 +08:00
    要抱着分层的思想来学习网络知识
    HTTP 使用了 TCP 提供的服务
    TCP 提供的服务是“流”
    TCP 本身由 segment 构成,那是 TCP 自己的事,和 HTTP 没啥关系
    liuxingdeyu
        26
    liuxingdeyu  
       2022-11-17 11:39:55 +08:00   ❤️ 1
    @wsWmsw 建议看看 osi 的七层模型。ip 层就是一个一个的数据包,扔给目标机器,加上端口,目标机器就能知道给哪个监听程序处理这个数据包(这会还跟 tcp 、udp 无关),tcp 收到包之后,校验完整性再发 ack 再排序,这样对于上面的 http 来看,tcp 提供的就是个完整的通道。你可以理解成,tcp 是个物流公司,有一台一台的大卡车,谁先到谁后到无所谓,车上有编号,也有人查货物完整性。http 是个用物流的,每次用的时候找个物流公司可以,找个长期的物流公司也行。quic 就相当于是找了一堆车自己维护货物的顺序自己查货损没损坏
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3168 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 13:04 · PVG 21:04 · LAX 06:04 · JFK 09:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.