python tcp和udp编程时,有一些发送和接收数据方面的细节,需要好好研究一下。
UDP(package)
udp的sendto接口,最大一次大概发就是65000左右个字节,在大就会有raise,说数据太大了。
而udp的recvfrom接口,要给一个缓冲区大小,这个缓冲区大小不能太小,如果小于对方发送的数据,直接数据丢失。udp的recvfrom,只有一次机会,下一次在recvfrom,就直接阻塞了。
udp报文很大的时候,IP层会对齐进行分片处理,接收侧合并所有分片后,在同时udp层处理。失败就失败了,udp传输没有确认机制。
如果udp发送端在接收端两次recvfrom之间,连续sendto了好几次数据,假设缓冲区足够大,recvfrom每一次还是只能够获得一个udp的数据报文,要连续好几次才能收完数据。udp通信以报文为单位,每一次收一个报文。
UDP报文头
网络上又说UDP头的校验是可选的,不是很确定?
TCP(stream)
tcp的send接口,就可以一下子发送超大的数据,我测试过一次发10万个字节,不会raise。
tcp 的recv接口,不管你设置多大的缓冲区都没关系,只要数据还没有收完,下一次recv接着收。
python系统默认给tcp接收最大缓冲区是65536字节,发送一个10万字节的消息,接收端会先收65536字节,下一次recv时在接着收。