偶尔丢包的解释:
TCP是基于流传输的,假设你的发送包的大小为6k,你的一个文件大小为42k,(一共7个包)我们把接收文件的缓冲区设置为42k以上,现在如果你采用TCP协议,那么一次就可以把所有的包都传输到了接受文件一端,这个时候很多人都只解析了第一个包,忽略了其他6个包,于是就认为是丢包现象。但是如果你的接收文件的缓冲区设置为40的话,那么貌似没有丢包现象,事实上,你只解析了第一个和第七个包,你丢掉了中间的2~6号包。
你的丢包现象偶尔出现与你的文件大小以及你的接收文件的缓冲区的大小设置有关。为什
陷入阻塞的解释:
socket有两种套接字模式:锁定和非锁定。当使用锁定套接字的时候,使用的很多函数,例如accpet、send、receive等等,如果没有数据需要处理,这些函数都不会返回,也就是说,你的应用程序山阻塞在那些函数的调用处。而如果使用非阻塞模式,调用这些函数,不管你有没有数据到达,他都会返回。所以有可能我们在非阻塞模式里,调用这些函数大部分的情况下会返回失败。就上面的例子来说,你的7个包都已经一次性的发出去了,你只解析了第一个包,而第二个(可能已经是n个了)包已经发送到你那里,你却没有解析。所以你会陷入阻塞。这时候只有只有你的接收缓存区小于42k的时候才可以收到ACK。
TCP是基于流传输的,假设你的发送包的大小为6k,你的一个文件大小为42k,(一共7个包)我们把接收文件的缓冲区设置为42k以上,现在如果你采用TCP协议,那么一次就可以把所有的包都传输到了接受文件一端,这个时候很多人都只解析了第一个包,忽略了其他6个包,于是就认为是丢包现象。但是如果你的接收文件的缓冲区设置为40的话,那么貌似没有丢包现象,事实上,你只解析了第一个和第七个包,你丢掉了中间的2~6号包。
你的丢包现象偶尔出现与你的文件大小以及你的接收文件的缓冲区的大小设置有关。为什
陷入阻塞的解释:
socket有两种套接字模式:锁定和非锁定。当使用锁定套接字的时候,使用的很多函数,例如accpet、send、receive等等,如果没有数据需要处理,这些函数都不会返回,也就是说,你的应用程序山阻塞在那些函数的调用处。而如果使用非阻塞模式,调用这些函数,不管你有没有数据到达,他都会返回。所以有可能我们在非阻塞模式里,调用这些函数大部分的情况下会返回失败。就上面的例子来说,你的7个包都已经一次性的发出去了,你只解析了第一个包,而第二个(可能已经是n个了)包已经发送到你那里,你却没有解析。所以你会陷入阻塞。这时候只有只有你的接收缓存区小于42k的时候才可以收到ACK。