Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How is a TCP "Connection" maintained, and how does HTTP Keep-Alive affect it?

I'm an application developer looking to learn more about the transport layer of my requests that I've been making all these years. I've also been learning more of the backend and am building my own live data service with websockets, which has me curious about how data actually moves around.

As such I've learned about TCP, and I understand how it works, but there's still one term that confuses me-- a "TCP Connection". I have seen it everywhere, and actually there was a thread opened with the exact same question... but as the OP said in the comments, nobody actually answered the question: TCP vs UDP - What is a TCP connection?

"when we say that there is a connection established between two hosts, what does that mean? If I could get a magic microscope and inspect the server or the client, and - a-ha! - find the connection, what would I be looking at? Some variable allocated by the OS code? Some entry in some kind of table? How and when does that gets there, and how and when it is removed from there"

I've been reading to try to figure this out on my own,
Here is a nice resource that details HTTP flow, also mentions "TCP Connection" https://blog.catchpoint.com/2010/09/17/anatomyhttp/

Here is another thread about HTTP Keep-alive, same "TCP Connection": HTTP Keep Alive and TCP keep alive


My understanding:
When a client wants data from server, SYN/ACK handshake happens, this "connection" is established, and both parties agree on the starting sequence number, maximum packet size, etc.

as long as this "connection" is still open, client can request/receive data without doing another handshake. TCP Keep-alive sends a heartbeat to keep this "connection" open

1) Somehow a HTTP Header "Keep-alive" also keeps this TCP "connection" open, even though HTTP headers are part of the packet payload and it doesn't seem to make sense that the TCP layer would parse the HTTP headers?

To me it seems like a "connection" between two machines in the literal sense can never be closed, because a client is always free to hit a server with packets (like the first SYN packet, for example)

2) Is a TCP "connection" just the client and server saving the sequence number from the other's IP address? maybe it's just a flag that's saying "hey this client is cool, accept messages from them without a handshake"? So would closing a connection just be wiping that data out from memory?

like image 542
A O Avatar asked Apr 28 '20 16:04

A O


People also ask

How is TCP connection maintained?

When two hosts are connected over a network via TCP/IP, TCP Keepalive Packets can be used to determine if the connection is still valid, and terminate it if needed. Most hosts that support TCP also support TCP Keepalive. Each host (or peer) periodically sends a TCP packet to its peer which solicits a response.

How does HTTP keep-alive work?

HTTP keep-alive, a.k.a., HTTP persistent connection, is an instruction that allows a single TCP connection to remain open for multiple HTTP requests/responses. By default, HTTP connections close after each request.

Does HTTP reuse TCP connections?

HTTP persistent connections, also called HTTP keep-alive, or HTTP connection reuse, is the idea of using the same TCP connection to send and receive multiple HTTP requests/responses, as opposed to opening a new one for every single request/response pair.

How do I make HTTP keep-alive?

To enable Keep-Alive, you need to explicitly request it via the HTTP header by accessing . htaccess or the main configuration file of your web server. If you turn on Keep-Alive, the HTTP response header will show Connection: keep-alive.


1 Answers

... both parties agree on the starting sequence number

No, they don't "agree" one a number. Each direction has their own sequence numbering. So the client sends in the SYN to the server the initial sequence number (ISN) for the data from client to server, the server sends in its SYN the ISN for the data from server to client.

Somehow a HTTP Header "Keep-alive" also keeps this TCP "connection" open ...

Not really. With HTTP keep-alive the client just asks a server nicely to not close the connection after the HTTP response was sent so that another HTTP request can be sent using the same TCP connection. The server might decide to follow the clients wish or not.

To me it seems like a "connection" between two machines in the literal sense can never be closed,

Each side can send a packet with a FIN flag to signal that it will no longer send any data. If both sides has send the FIN the the connection is considered close since no one will send anything and thus nothing can be received. If one side decides that it does not want to receive any more data it can send a packet with a RST flag.

Is a TCP "connection" just the client and server saving the sequence number from the other's IP address?

Kind of. Each side saves the current state of the connection, i.e. IP's and ports involved, currently expected sequence number for receiving, current sequence number for sending, outstanding bytes which were not ACKed yet ... If no such state is there (for example one site crashed) then there is no connection.

... maybe it's just a flag that's saying "hey this client is cool, accept messages from them without a handshake"

If a packet got received which fits an existing state then it is considered part of the connection, i.e. it will be processed and the state will be updated.

So would closing a connection just be wiping that data out from memory?

Closing is telling the other that no more data will be send (using FIN) and if both side have done it both can basically remove the state and then there is no connection anymore.

like image 137
Steffen Ullrich Avatar answered Oct 14 '22 00:10

Steffen Ullrich