Short answer: message borders and connections.
Using a stream socket, you can write two messages with five bytes and end reading a ten byte message. This is due to the fact that the data that you write is simply placed in one stream, without boundaries between the recorded data. This is just like writing a word at a time in a file. As a file reader, how do you know if the author wrote one character at a time, one word at a time, one sentence at a time, one paragraph at a time, or wrote the whole file right away? Basically, if the file is already written, you do not. With a stream, how do you know if the source sent two messages with five bytes or one ten-byte message if the sending was done in quick succession? You must have some length or separator to indicate the boundaries of the messages. Sometimes you do not need messages or their boundaries.In other cases, you add application level data (e.g., headers, separators, predefined message lengths, etc.). It also allows you to use a stream socket, since you yourself handle the messaging (i.e. at the application level).
, , , , 1:1 ( , ..), .
, 1:1, () (), / .