首页 > http和socket之间的关系和区别

http和socket之间的关系和区别

在网上看到说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的职责,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协议看,它的连接一般是指它本身的那部分。

【热门文章】
【热门文章】