当发送端应用程序连续多次写操作时,TCP模块先将这些数据放入TCP发送缓冲区。当TCP模块真正开始发送数据时,发送缓冲区中这些等待发送的数据可能被封装成一个或者多个TCP报文段发出。因此TCP模块发送出的TCP报文段的个数和应用程序执行的写操作次数之间没有固定的数量关系。
当接收端收到一个或者多个TCP报文段后,TCP模块将它们携带的应用程序数据按照TCP报文段的序号依次放入TCP接收缓冲区中,并通知应用程序读取数据,这取决于用户指定的应用程序缓冲区的大小。因此,应用程序执行的读操作次数和TCP模块接收到的TCP报文段的个数也没有固定的数量上的关系。
综上所述,发送端执行的写操作的次数和接收端执行的读操作的次数之间没有任何的数量关系。这就是字节流的概念:应用程序对数据的发送和接收是没有边界限制的。UDP则不然。发送端每次执行一次写操作,UDP模块就将其封装成UDP数据包进行发送。接收端必须及时针对每一个UDP数据包执行读操作。否则就会造成丢包。并且,用户没有指定足够的应用程序缓冲区来读取UDP数据,则UDP数据将被截断。