top | item 5792334

SSH uses four TCP segments for each character you type

100 points| ultimoo | 13 years ago |blog.hyfather.com | reply

41 comments

order
[+] simias|13 years ago|reply
Well, that's just called "remote echo" and it doesn't have much to do with SSH. It's just that the remote is in charge of drawing the character on the screen if needed.

If you change to "local echo" it would cause problems with programs such as vi which will interpret certain characters (such as hjkl) as special commands and won't actually draw them on the screen.

If you start a remote program that just "eats" your input without updating the terminal (like a password prompt) you won't see the 2nd tcp roundtrip.

You'd have the same behaviour with a serial link, rsh, telnet or anything else.

I think I saw a custom SSH client on hn some months ago that would try to compensate high network latencies by echoing the characters locally while waiting for the remote reply. It would then undo the local echo and use the "authoritative" reply instead.

[+] pronoiac|13 years ago|reply
The article isn't as judgmental as the headline makes it sound. It notes that in practice, it only sends three segments across the wire, and that's what I'd expect from telnet, too.
[+] notaddicted|13 years ago|reply
For a high latency situation if you're text editing there is EMACS TRAMP mode, and probably others similar that buffer the file locally, which will also solve the responsiveness problem.
[+] jdonahue|13 years ago|reply
I think it would be neat if SSH provided an API or a set of special characters so that the remote shell could tell SSH to switch back and forth between remote and local echo. For example, bash could tell SSH to begin local echo mode after it finishes printing the prompt, and end local echo mode when the user enters a key sequence that requires remote processing, like Tab or Return. vim could enter local echo mode when the user enters insert mode and leave when the user presses the Esc or Return, etc.

Perhaps this extra complexity would lead to all sorts of strange bugs though.

[+] toki5|13 years ago|reply
SSH is an interesting set of solutions that appear on the surface to be horribly inefficient but after a tiny amount of digging are actually okay.

I had to write an SSH terminal inside a browser, and it was full of "why the heck did they"s followed ten minutes later by "oh, that's why"s.

[+] gcr|13 years ago|reply
Do you have any anecdotes to share, or a blog post or something? I'd be quite interested to read about your thought process.
[+] msmith|13 years ago|reply
One interesting thing about this is how it can lead to timing attacks which leak information about your keystrokes. There's a great paper [1] which gives some examples. One more reason to use pubkey authentication for SSH.

[1] http://users.ece.cmu.edu/~dawnsong/papers/ssh-timing.pdf

[+] betterunix|13 years ago|reply
I believe that passwords are not transmitted like this in SSHv2 because of that very attack (not to say there are not overwhelmingly good reasons to use public key authentication anyway).
[+] M4v3R|13 years ago|reply
Thanks for this link, that was very educating! I had no idea that you could do stuff like this.
[+] Aloha|13 years ago|reply
I'm honestly wondering why this is here.

Specifically, the section on "Why not send whole commands" made me wonder who this is targeted at, its pretty basic UNIX stuff to know how an Async ASCII terminal works.

[+] njharman|13 years ago|reply
Then, obviously, it's targeted at people who don't know "pretty basic UNIX stuff". Which to a few points of precision is everyone. And, guessing, a significant enough portion (to be interesting article) of HN readers.
[+] zobzu|13 years ago|reply
you can also use linemode. it works for telnet and, uhm, it sort of work for ssh through a 3rd party patch. it sends whole commands AND supports everything. That's because its not just a dumb echo, and require terminal support on the server side.

mosh actually does something in between (and thus have display errors sometimes)

[+] ibotty|13 years ago|reply
it's hardly surprising that you send one packet, get one ack and then, when the shell wants to update the display sends a packet and then gets one ack. how should it be different? (leaving aside udp-protocols for similar functionality as mosh)
[+] quackerhacker|13 years ago|reply
Just a question...Doesn't TCP confirm the data sent, UDP doesn't and has a lower overhead, right?
[+] chinpokomon|13 years ago|reply
Correct, UDP doesn't ACK, but you also don't know if the packet reached the server for the same reason. UDP is great for streaming data that may arrive out of order or where packets can be lost and it isn't critical, such as streaming video, but it is awful if you need to be sure the data got to its destination.
[+] antocv|13 years ago|reply
That is correct yes. UDP doesnt have ports either.
[+] inopinatus|13 years ago|reply
I always used to turn off delayed acks when tunnelling X11 over SSH, for substantial improvement in interactive responsiveness.