![]() |
web3有没有搞头? |
比如客户端同时并发发出10个请求, 服务端回了10个包, 怎么知道某个回包对应的是哪个请求
一楼的,7层协议是osi组织制定的标准,但是实际工业界并没采用这个标准啊。工业界用的是tcp/ip 5层协议。
http是应用层协议,它的更低一层是建立在传输层tcp协议之上。(听说最新的http3.0出来了,是改用了udp,但不是主流)
10个同时并发请求会对应并发10个tcp连接。每个请求对应一个独立的tcp连接。在socket传输层就已经很好分清楚请求-响应对了,还要啥编号啊。单个tcp连接内,完全就已经可以根据tcp的seq序列号分清请求-响应信息了
反正这问题对我来说挺生僻的,毕竟 HTTP 这个协议挺简单可靠很少需要关注这种细节。
仔细想了一下,有趣的点是:
- HTTP 设计之初就很简单,就连 TCP 连接都是每次重新建立;通过下面一层 TCP 的端口设计就能一一对应,不存在这个问题
- HTTP/2 开始多路复用学习了流式,肯定是传输考虑了这一点,设计了唯一的标识符来确定(我不知道具体实现,去搜了一下叫做 stream id)
然后麻烦来了,现实生活中用的 HTTP 1.1 这样的协议,是有 keep-alive 头来保持 TCP 连接不断的。这玩意是怎么在不改变协议的情况下,复用了同一个 TCP 连接,还能区分哪个响应对应哪个请求的?
搜了一圈答案是,虽然复用了同一条 TCP,但 HTTP 1.1 的请求还是一个个排队阻塞的,上一个请求响应了下一个才能发出。和 HTTP/2 有本质区别。
过早客微信公众号:guozaoke • 过早客新浪微博:@过早客 • 广告投放合作微信:fullygroup50 鄂ICP备2021016276号-2 • 鄂公网安备42018502001446号