Traditional socket I/O model: read/write operations block the calling thread until the OS buffer has space (write) or data (read). Buffering in both directions hides network-card scheduling latency but means a naive proxy needs at least one thread per direction, scaling poorly in MRI Ruby.