摘要
对HTTP、TCP、Socket之间的关系一直懵懵懂懂,特此记录对它们的关系总一个小结,可能有不对的地方,但是目前认为比较正确的理解。
TCP/IP协议族包括但不限于以下内容
- 应用层:HTTP、FTP、DNS 等
- 传输层:TCP、UDP、RTP、SCTP 等
- 网络层:IP 等
- 数据链路层:如以太网、Wi-Fi、MPLS 等
HTTP是什么?
HTTP是一个客户端(用户)和服务端(网站)之间请求和应答的标准,通常使用TCP协议。(尽管TCP/IP协议族是互联网上最流行的应用,但是在HTTP协议中并没有规定它必须使用或它支持的层。事实上HTTP可以在任何互联网协议或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用,所以其在TCP/IP协议族使用TCP作为其传输层。)
总结:
- HTTP通常是基于TCP实现。
Socket是什么?
在网络应用程序设计时,由于TCP/IP协议族的核心内容被封装在操作系统中,如果应用程序要使用TCP/IP协议族,可以通过系统提供的TCP/IP协议族的编程接口来实现。在Windows环境下,网络应用程序编程接口称作Windows Socket。为了支持用户开发面向应用的通信程序,大部分系统都提供了一组基于TCP或者UDP的应用程序编程接口(API),该接口通常以一组函数的形式出现,也称为套接字(Socket)。
总结:
- Socket可基于TCP实现,亦可基于UDP实现;
- 如果Socket是基于TCP实现,那么TCP连接也叫Socket连接。
HTTP与Socket的关系
当HTTP请求基于TCP实现时,我们说,HTTP请求依赖TCP连接,等价于,HTTP请求依赖基于TCP实现的Socket连接。
什么是HTTP连接、HTTP长连接、HTTP短连接?
先了解一下HTTP连接方式进化史:
HTTP/0.9时代:短连接
每个HTTP请求都要经历一次DNS解析、三次握手、传输和四次挥手。反复创建和断开TCP连接的开销巨大。
HTTP/1.0时代:持久连接(即:一个TCP连接服务多次请求)概念提出
支持在请求header中携带Connection: Keep-Alive,即在向服务端请求持久连接。如果服务端接受持久连接,则会在响应header中同样携带Connection: Keep-Alive,这样客户端便会继续使用同一个TCP连接发送接下来的若干请求。(Keep-Alive的默认参数是[timout=5, max=100],即一个TCP连接可以服务至多5秒内的100次请求)
HTTP/1.1时代:持久连接成为默认的连接方式;提出pipelining概念
持久连接下一个连接中的请求仍然是串行的,如果某个请求出现网络阻塞等问题,会导致同一条连接上的后续请求被阻塞。
因此提出了pipelining概念,即客户端可以在一个请求发送完成后不等待响应便直接发起第二个请求,服务端在返回响应时会按请求到达的顺序依次返回,这样就极大地降低了延迟。
在HTTP/2.0时代:提出了multiplexing(即:多路复用)技术
能够让多个请求和响应的传输完全混杂在一起进行,通过streamId来互相区别。这彻底解决了串行阻塞问题,同时还允许给每个请求设置优先级,服务端会先响应优先级高的请求。
定义
HTTP连接:以HTTP协议为通信协议的TCP连接。
HTTP短连接:以HTTP协议为通信协议的,请求一次就断开的TCP连接。
HTTP长连接:以HTTP协议为通信协议的,请求多次才断开的TCP连接。
总结:
- TCP连接没有长短之分,因为使用方式的不同造成了HTTP连接的长短之分;
- 当Socket基于TCP实现时,Socket连接(即:TCP连接)没有长短之分;
- 理想状态下,连接一旦建立,在通信双方中的任何一方主动关闭连接之前,连接都将被一直保持下去,但由于各种环境因素可能会使连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。
连接的通信双方是否都可以随时发送数据?
上面我们提到了好几种连接,分别是HTTP连接,TCP连接、Socket连接,一般情况下,我们认为HTTP连接是以HTTP协议为通信协议的TCP连接,TCP连接也可以叫Socket连接。
本质上,我们认为Socket连接的通信双方发送消息并没有先后的限制,通信双方中的任何一方可以随时向另一方发送消息。
但当以HTTP协议为通信协议时,只有客户端发起请求后服务端才会响应,服务端是无法主动向客户端发消息的。
HTTP/2.0开始,提供了一种新技术—服务器推送(server push),这个功能也是建立在客户端发起请求后服务端才会响应,只是对响应的内容做了优化。