今天翻译一篇关于HTTP
和WebSocket
的文章,同时也是为Go Web编程接下来Socket
部分的文章作铺垫。web
HTTP
和WebSocket
都是客户端-服务器通讯中使用的通讯协议。文章用几个例子解释了二者的不一样以及分别适用在什么应用场景。有些容易混淆的概念(好比说HTTP
长链接)和待补充的概念我用斜体字注解到了文章中。编程
HTTP
是单向的,客户端发送请求,服务器发送响应。举例来讲,当客户端向服务器发送请求时,该请求以HTTP
或HTTPS
的形式发送,在接收到请求后,服务器会将响应发送给客户端。每一个请求都与一个对应的响应相关联,在发送响应后客户端与服务器的链接会被关闭。每一个HTTP
或HTTPS
请求每次都会新建与服务器的链接,而且在得到响应后,链接将自行终止。HTTP
是在TCP
之上运行的无状态协议,TCP
是一种面向链接的协议,它使用三向握手方法保证数据包传输的传递并从新传输丢失的数据包。后端
HTTP
能够运行在任何可靠的面向链接的协议(例如TCP
,SCTP
)的上层。当客户端将HTTP
请求发送到服务器时,客户端和服务器之间将打开TCP
链接,而且在收到响应后,TCP
链接将终止,每一个HTTP
请求都会创建单独的TCP
链接到服务器,例如若是客户端向服务器发送10个请求,则将打开10个单独的HTTP
链接。并在得到响应后关闭。服务器
理解上面这段关于 HTTP
的描述时我以为还要了解一下HTTP
长链接的概念,以及HTTP
与TCP
的关系,简单归纳一下就是:websocket
HTTP
协议的长链接和短链接,实质上是TCP
协议的长链接和短链接。HTTP
链接完成后,其对应的TCP
链接并非每次都会关闭。从 HTTP/1.1
起,默认使用长链接,用以保持链接特性。使用长链接的HTTP
协议,会在响应头有加入这个头部字段:Connection:keep-alive
HTTP
数据的TCP
链接不会关闭,若是客户端再次访问这个服务器上的网页,会继续使用这一条已经创建的链接。Keep-Alive
不会永久保持链接,它有一个保持时间,能够在不一样的服务器软件(如Apache
,Nginx
,Nginx
中这个默认时间是 75s)中设定这个时间。实现长链接要客户端和服务端都支持长链接。HTTP
属于应用层协议,在传输层使用TCP
协议,在网络层使用IP
协议。IP
协议主要解决网络路由和寻址问题,TCP
协议主要解决如何在IP
层之上可靠的传递数据包,使在网络上的另外一端收到发端发出的全部包,而且顺序与发出顺序一致。TCP
有可靠,面向链接的特色。HTTP消息信息是用ASCII
编码的,每一个HTTP
请求消息均包含HTTP
协议版本(HTTP/1.1
,HTTP/2
),HTTP
方法(GET
/POST
等),HTTP
标头(Content-Type
,Content-Length
),主机信息等。以及包含要传输到服务器的实际消息的正文(请求主体)。HTTP
标头的大小从200字节到2KB
不等,HTTP
标头的常见大小是700-800字节。当Web
应用程序在客户端使用更多cookie
和其余工具扩展代理的存储功能时,它将减小HTTP
标头的荷载。cookie
WebSocket
是双向的,在客户端-服务器通讯的场景中使用的全双工协议,与HTTP
不一样,它以ws://
或wss://
开头。它是一个有状态协议,这意味着客户端和服务器之间的链接将保持活动状态,直到被任何一方(客户端或服务器)终止。在经过客户端和服务器中的任何一方关闭链接以后,链接将从两端终止。网络
让咱们以客户端-服务器通讯为例,每当咱们启动客户端和服务器之间的链接时,客户端-服务器进行握手随后建立一个新的链接,该链接将保持活动状态,直到被他们中的任何一方终止。创建链接并保持活动状态后,客户端和服务器将使用相同的链接通道进行通讯,直到链接终止。socket
新建的链接被称为WebSocket
。一旦通讯连接创建和链接打开后,消息交换将以双向模式进行,客户端-服务器之间的链接会持续存在。若是其中任何一方(客户端服务器)宕掉或主动关闭链接,则双方均将关闭链接。套接字的工做方式与HTTP
的工做方式略有不一样,状态代码101
表示WebSocket
中的交换协议。工具
Web
应用程序:即时Web
应用程序使用一个Web
套接字在客户端显示数据,这些数据由后端服务器连续发送。在WebSocke
t中,数据被连续推送/传输到已经打开的同一链接中,这就是为何WebSocket
更快并提升了应用程序性能的缘由。WebSocket
游戏应用程序中很是有帮助。WebSocket
创建一次链接,便能在订阅户之间交换,发布和广播消息。它重复使用相同的WebSocket
链接,用于发送和接收消息以及一对一的消息传输。若是咱们须要经过网络传输的任何实时更新或连续数据流,则可使用WebSocket
。若是咱们要获取旧数据,或者只想获取一次数据供应用程序使用,则应该使用HTTP
协议,不须要很频繁或仅获取一次的数据能够经过简单的HTTP
请求查询,所以在这种状况下最好不要使用WebSocket
。性能
注意:若是仅加载一次数据,则RESTful
Web
服务足以从服务器获取数据。
WEBSOCKET | HTTP |
---|---|
WebSocket 是一种双向通讯协议,能够经过重用已创建的链接通道将数据从客户端发送到服务器,或者从服务器发送到客户端。链接保持活动状态,直到被客户端或服务器终止。 |
HTTP 协议是TCP 协议之上的单向协议,TCP 是面向链接的传输层协议,咱们能够在得到响应HTTP链接关闭后再使用HTTP请求方法来建立链接。 |
几乎全部的实时应用程序(如(交易,监视,通知)服务)都使用WebSocket 在单个通讯通道上接收数据。 |
简单的RESTful 应用程序使用无状态的HTTP 协议。 |
全部常常更新的应用程序都应该使用WebSocket ,它比HTTP 链接更快。 |
当咱们不想在特定时间内保留链接或不重复使用单个链接来传输数据时使用HTTP ,HTTP 链接的速度比WebSocket 慢。 |
来源:GeeksforGeeks
原文连接: https://www.geeksforgeeks.org...