关于TCP协议。

我们知道当程序对一个tcp连接调用一个send操作时, 首先发生的事情是数据从用户缓冲区拷贝到内核。之后发生的事情会依赖与连接的状态,就是说TCP会根据现在的连接状态来决定发送多少数据。可能全部发送,也能部分发送,或者什么也不发送。TCP会尽可能的发送它能发送的数据,然后立即返回n。 我们很自然的认为每次发送的消息都是作为一个独立的实体,但是实际上TCP的一个流协议,假设hostA向hostB发送两个消息

实际的消息打包方式可能有很多种,如:

     在HOSTB上的任何应用程序的任何给定的recv操作都会假定TCP会获取多少数据, 可能数据还没为读准备好, 也可能获取了M1部分的数据,也有可能获取了M1+M2部分的数据。

     所以,我们必须在应用程序级别来保证消息的边界。

    通常的做法有3种:

1.    在消息的开头末尾 加特殊字符来作为边界。

2.    所有消息以定长发送

3.    在消息的开发加上一个字段来表示这个消息的长度,应用程序根据此字段来判断应该读取多少数据

你可能感兴趣的:(tcp)