Http、tcp、https、socket、tomcat、长短连接等总结回顾
(1)关于http、tcp的长短连接问题
tcp是没有所谓长连接的概念的。tcp经过三次握手就已经建立了一个连接,这个所谓建立了一个连接就是两边操作系统层面都已经建立了socket,都准备好了相应的缓冲区等。socket是啥呢?socket其实就是操作系统提供tcp连接的接口。比如tcp的可能有第一次握手的方法,是C语言写的,比如就叫syn方法,对应第一次握手,也就是客户端发一个syn位置1的tcp消息嘛;然后有第二次握手的方法,比如叫syn_ack,对应服务端回一个syn和ack(当然这里面,包括之前客户端都有序列号什么的,这里先忽略);再有一个第三次握手的方法,对应服务端的ack消息,当然我们知道最后一次握手一般在tcp消息体中可能已经有负载内容了。那么这个三次握手的过程,需要暴露给上次应用吗?当然不需要,一方面不安全,一方面也不友好,那我就准备一个操作系统的api方法嘛!这个api就是所谓的套接字/socket。通过这个socket,上层应用可以直接建立一个tcp连接,而不用关心所谓三次握手的细节,建立好连接就可以进一步传递消息什么的。
这个tcp连接建立好,如果客户端和服务端没有主动断开连接,默认会保留72小时。
Linux系统默认保活参数为:2小时无活动触发探测(tcp_keepalive_time=7200
),之后每75秒重试(tcp_keepalive_intvl=75
),最多探测9次(tcp_keepalive_probes=9
)。若全部失败,约2小时11分15秒后断开连接。
所以tcp天然是长连接,短连接的话就是上层主动断开。tcp天然就是长连接,这是http长连接的基础,你想啊,如果tcp都是短连接,用一次断开一次,你http作为应用层协议,本来就是建立在tcp连接的基础上的,又何谈长连接?而http的长连接,其实就是只对tcp连接的复用,或者也可以说是对socket的复用,也就是用同一个tcp连接传递多个http请求、响应。
http协议1.0版本默认是短连接,也就是请求头和响应头包含Connection:close
而http1.1默认是长连接,即响应头和响应头包含Connection:keep-alive
tomcat等web容器拿到请求报文,解析得到这个字段,就不会关闭当前socket,而是复用。当然,也有其他一些情况还是会关闭socket,比如maxKeepAliveRequests到了,或者keepAliveTimeout等参数的限制。
(2)关于浏览器发请求浏览器多 Socket 连接与 HTTP 流水线(Pipelining)的关系解析
1. 核心概念定义
-
多 Socket 连接:
浏览器针对同一域名并行建立多个 TCP 连接(HTTP/1.1 默认每个域名允许 6-8 个并发连接),通过多个通道同时发送请求,避免单个连接阻塞整体性能。
典型场景:同时加载页面中的图片、CSS、JS 等多类资源。 -
HTTP 流水线(Pipelining):
在单个 TCP 连接上按顺序连续发送多个 HTTP 请求(无需等待前一个响应返回),减少连接建立开销。
局限性:服务器必须按请求顺序返回响应,若某个请求处理延迟会导致队头阻塞(Head-of-Line Blocking)。
2. 两者的核心差异
维度 | 多 Socket 连接 | HTTP 流水线 |
---|---|---|
连接方式 | 多个独立 TCP 连接 | 单个 TCP 连接复用 |
请求顺序性 | 请求与响应可乱序处理 | 请求必须顺序发送,响应必须顺序返回 |
性能瓶颈 | 受限于浏览器并发连接数上限 | 受队头阻塞影响 |
适用协议 | HTTP/1.1 的默认优化手段 | HTTP/1.1 理论优化(实际少用) |
(3)关于https及非对称加密、对称加密
通俗易懂的TCP,SSL以及HTTPS的连接建立过程详解_tcp ssl-CSDN博客