python发送二层报文_tcp和udp发送接收的细节

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时在接着收。

你可能感兴趣的:(python发送二层报文)