zoukankan      html  css  js  c++  java
  • http长链接处理不当引发的问题

    最近项目中遇到了问题,会偶然出现服务端返回不是客户端请求报文的情况

    经过排查后发现,是客户端的http长链接网络库,在第一次发送超时的情况下,没有断开连接,而是用此长链接继续发送,

    A包发送但超时未响应,然后发送B包,这时收到了A包的响应,则就会认为A包的响应为B包的响应内容,这就导致了此后的http请求和响应都不对应的情况。

    关于http长链接,也是很有学问的

    只有上一次的请求的回应数据完全接收后(根据 Content-Length 头部),才能进行下一次的请求。 也就是说,连接实际上是一个阻塞 loop,所以才需要有“连接池”的存在,不断的创建新的 TCP 链接,来实现请求的并发

    服务端使用“队首阻塞”的概念,确实解决了请求排队等待的问题!

    由这个问题,也想到了为什么网络上有那么多“TCP 粘包”的问题了。
    因为 HTTP 1.0/1.1 协议使用了简单的纯文本来通信,而不是二进制,导致了很多人就认为 HTTP 就是 "TCP + 纯文本",进而想到需要如何解决边界定位问题,也就是所谓的“粘包”

    由此可见,HTTP 2.0 才是正常的 ISO 七层协议的实现,增加了第六层表示层
    如果一开始就接触 HTTP 2.0,也就不会有所谓的“粘包”问题了,因为TCP发送数据时,数据本身就是结构化数据,实现了自我的边界定位!

    http 1.1的长链接,除增加连接池技术,服务端多次接收请求FIFO技术外,还可以使用报文头部加rrid技术,来标识请求和对应的关系

  • 相关阅读:
    230 Kth Smallest Element in a BST 二叉搜索树中第K小的元素
    229 Majority Element II 求众数 II
    bzoj1112: [POI2008]砖块Klo
    bzoj2958: 序列染色&&3269: 序列染色
    bzoj2743: [HEOI2012]采花
    bzoj4247: 挂饰
    bzoj3613: [Heoi2014]南园满地堆轻絮
    bzoj3280: 小R的烦恼
    bzoj1221: [HNOI2001] 软件开发
    bzoj4320: ShangHai2006 Homework
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/12662557.html
Copyright © 2011-2022 走看看