我不太确定信息从网络到达计算机应用的过程,是不是这样的。如果有包到达网卡,网卡对包的IP进行解析,如果是本机的IP就收下这个包,放在网卡的缓存里,然后我们调用RECV函数的时候,就从网卡里拿走了这个包,同时将这个包从缓存里清除掉。同步的SEND则是将包发给网卡后就返回了,并不确定是否是真的发出去了(因为这个是网卡的责任,如果这样的话,)。那我还有一个问题,如果RECV是等待网卡里的缓存有信息可以取的时候取,他如何判断现在缓存里的信息是否是完整的(即可能信息并没有完全达到网卡),难道这个是由网卡来做(即当网卡通知RECV有信息可以取的时候,该信息已经确定是完整的了)?
我不太确定信息从网络到达计算机应用的过程,是不是这样的。如果有包到达网卡,网卡对包的IP进行解析,如果是本机的IP就收下这个包,放在网卡的缓存里,然后我们调用RECV函数的时候,就从网卡里拿走了这个包,同时将这个包从缓存里清除掉。同步的SEND则是将包发给网卡后就返回了,并不确定是否是真的发出去了(因为这个是网卡的责任,如果这样的话,按照计算机的速度,应该很快就可以将数据写到缓存里,SEND应该不存在阻塞的问题吧?难道是缓存不够大?需要多次发送到缓存)。那我还有一个问题,如果RECV是等待网卡里的缓存有信息可以取的时候取,他如何判断现在缓存里的信息是否是完整的(即可能信息并没有完全达到网卡),难道这个是由网卡来做(即当网卡通知RECV有信息可以取的时候,该信息已经确定是完整的了)?
楼主有兴趣的话,可以看linux TCP/IP协议栈的实现,或者看lwIP这个小型的TCP/IP协议栈。
楼主有兴趣的话,可以看linux TCP/IP协议栈的实现,或者看lwIP这个小型的TCP/IP协议栈。