在网上看到说http连接是短连接而socket连接是长连接,但是http不是也有长连接吗?另外一个问题,socket既然是应用层和传输层之间的一层api,那么每一次建立http连接不是都会使用到socket吗?那socket连接不就是http连接的一部分?
短连接不总是好的,同样长连接也不总是好的.
HTTP是一种以短连接为主,长连接keep-alive
为辅被广泛使用的协议.
“HTTP协议是构建在TCP协议之上的,HTTP 1.1中对连接状态默认使用keep-alive方式。这样,在客户端多次请求服务端时,可以复用一个TCP连接,避免频繁建立和断开连接,导致服务端一直等待读取下一个请求而不释放连接。 但同样在我们的服务场景(小米网抢购系统)中不存在TCP连接复用的需求。当一个用户完成一个请求后,希望能够尽快关闭连接。 keep-alive方式导致已完成处理的用户连接不能尽快关闭,连接无法释放,导致连接数不断增加,对服务端的内存和带宽都有影响。”
HTTP keep-alive connection timeouts
Firefox: 约115秒(定义在about:config中的network.http.keep-alive.timeout)
Chrome: 约320秒
Opera: 约120秒
MSIE: 约60秒(可以在注册表中自定义)
Nginx: 默认值75秒(keepalive_timeout 75s)
HTTP 1.1默认启用的HTTP持久连接(keep-alive)能够在keepalive_timeout前省去每次传输报文都要建立TCP连接(三次握手)的时间和开销.
keep-alive期间服务端和客户端的TCP连接状态是ESTABLISHED,执行以下命令可见:
date && sudo netstat -antp |grep "127.0.0.1"|egrep "firefox|nginx"|egrep "ESTABLISHED|WAIT"
i表示不区分大小写,在查一次相当于"AND条件","|"表示"OR条件".
sudo netstat -antp|head -n2 && sudo netstat -antp|grep firefox
http协议:处于互联网协议的应用层,角色是规定数据传输的格式
-
socket: socket称之为套接字,这里的socket指的是http socket, 由主机+端口组成
主机:对应了网络层,涉及ip协议,通过ip确定主机所在位置,主机到主机
端口:涉及互联网协议的传输层,涉及TCP(带有确认机制的UDP协议)/UDP协议,通过端口确认对应的进程,端口其实就是进程使用网卡的编号,端口到端口
整个互联网协议从应用层到实体层,从上到下,越上越接近用户,越下越接近硬件;
所以,首先概念不能混淆,要区分http,socket的职责,http是建立在socket(这里的上下文指的是http socket)之上的,如果你明白了这个,你应该就不会提出来这个问题了。
补充:linux系统中还有一种socket称之为unix domain socket,是通过本地文件进行进程间通信的方式。不同于http socket,是建议在网络协议上的进程间通信方式。
连接的长短跟Socket没有关系,Socket只是操作系统提供给应用程序进行网络通信的抽象API。但是需要理解的是Socket API大多数情况下工作在传输层(偶尔可以工作在数据链路层),这意味着,你可以使用Socket开发基于TCP、UDP等的应用。
HTTP是基于TCP的应用层协议,虽然TCP是支持长连接的,但是HTTP并不强制要求长连接,大部分情况下,一次HTTP请求的完成经过了建立TCP链接
->客户端发送报文
->服务端返回报文
->服务端或客户端关闭此连接
这个过程,由于每次都要建立连接,并在完成一次请求响应后关闭连接,所以大家称为“短连接”。HTTP的所谓Keep-Alive,实际上是一种不可控的行为,是为了在一定程度上改善HTTP性能的,即服务端和客户端希望不立刻断开连接,这样下次发送数据时就不需要建立TCP连接了,但是服务端和客户端的任何一方都可以随时断开。
1.HTTP的长连接一般就只能坚持一分钟而已,而且是浏览器决定的,你的页面很难控制这个行为。
Socket连接就可以维持很久,几天、数月都有可能,只要网络不断、程序不结束,而且是可以编程灵活控制的。
2.HTTP连接是建立在Socket连接之上。在实际的网络栈中,Socket连接的确是HTTP连接的一部分。但是从HTTP协议看,它的连接一般是指它本身的那部分。