Hacker News new | past | comments | ask | show | jobs | submit login

> If I send() a message, I have no guarantees that the other machine will recv() it if it is suddenly disconnected from the network. Again, this may be obvious to an experienced network programmer, but to an absolute beginner like me it was not.

Uhh, that's 100% obvious. That's why it's not taught.

Of course, I've also goofed on things that are obvious to other people. But, com'on, TCP isn't magic.




It's not 100% obvious. The mental model where send() blocks until recv() on the other side confirms it is coherent: the receiver sends ACKs with bumped ack numbers to acknowledge the bytes it's received, and could delay those ACKs until the application has taken the bytes out of the socket buffer. It doesn't work that way, of course, and shouldn't, but it could.


> Uhh, that's 100% obvious. That's why it's not taught.

Is it? You probably feel that way from knowing how TCP works. But it would be quite straightforward to make it true with a slightly modified version of TCP (that acknowledges all packets, rather than every second one) by having send() block until it receives back the ACK from the receiver. (Yeah this would kill transmission rates, but it would function!) And furthermore, while it would be a terrible idea, the ACK could even be delayed until the end application makes the recv() call for the packet.

To somebody not familiar with the details (and why this would be a terrible tradeoff), something along those lines would be entirely plausible.


Especially since TCP is often introduced like "TCP provides reliable, ordered, and error-checked delivery of a stream of octets (bytes) between applications running on hosts communicating via an IP network" or similar formulations (this one comes from Wikipedia). "Reliable" does seem to imply that all data sent is also received. It's of course impossible to guarantee that.

Actually I think it's even a mistake to call TCP reliable. It's best-effort, and allows you to detect disconnects. That's all it does because that's all it can do.


> Is it? You probably feel that way from knowing how TCP works

No, I knew that from yanking out a network cable long before I even knew what TCP was.


It could be obvious, but no need to be condescending about it.

There are many statements that fit into the category of "obvious once stated, but not obvious if you didn't consider the distinction to begin with".


If it were so obvious we wouldn’t have so many concurrency bugs that appear time and again in new programs. If it’s not network flush it’s file system flush.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: