1. 在程序中,若send频率很高(for循环)时,TCP将会做如下处理:
数据包首先存放在发送缓冲区内,接收到服务端的ack(服务端不会立即发送ack,大概延时40ms)或等待200ms(Nagle算法机制),将数据包发送。若在这段时间内又有send,由于Nagle算法将会进行并包处理(可以用wrieshark抓包查看)。若要避免上述情况,设置TCP选项为TCP_NODELAY(client.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1))。
2. 接收端,收到数据包以流的形式存储在接收缓冲区内,上层取数据时,并不能按一个包一个包的获取数据(面向流的特性),若 要单数据拿取,则需要自定义报文格式。自己设计报头,解析报文。
3. 以上在面向连接时发生的情况,UDP等没这个现象。
4. UDP 。 当发送频率很高时,发送数据大小超过发送缓冲区时,默认情况下数据将会丢失,解决方法:增大发送缓冲区大小
(server.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 10*1024))。接收时,同理。TCP未验证。