下面是在实际后台开发中遇到的一些关于TCP和UDP的问题,这里慢慢积累起来:
UDP连续发送2次数据包,第一次发100字节,第二次发200字节,服务端recvfrom(1000)时收到100、200还是300字节?
*:正常情况下为100字节
*:网络乱序:可能由于网络原因导致数据包乱序到达,则会收到200字节。故可在自定义UDP协议头加一个序列号标识
*:UDP是数据报文协议,每个数据包是独立的,客户端sendto多少个UDP包,服务端就得recvfrom多少次,数据包不会合并
TCP连续send2个数据包,第一次发100字节,第二次发200字节,服务端recv(1000)时收到100、200还是300字节?
*:TCP粘包:如果recv时两个数据包都已经到达,则为300字节
*:如果recv时只有100字节的数据包到达,那当然也只有100字节了
*:TCP是流传输协议,tcp/ip协议栈会自动合并TCP包,保证包的完整性。但这样本来不相关的包也会粘包,这需要用户进程自己来处理
如何处理TCP粘包现象?
* 一种常见的方法就是使用TLV包格式:即Type类型, Length长度,Value值,其中Type和Length长度固定。如当Type为1字节,Length为4字节,则先recv(5)接收5个字节,判断包类型并获取包长度len,然后recv(len)接收包体并按类型解析
时间: 2024-11-10 13:02:36