我不太确定信息从网络到达计算机应用的过程,是不是这样的。如果有包到达网卡,网卡对包的IP进行解析,如果是本机的IP就收下这个包,放在网卡的缓存里,然后我们调用RECV函数的时候,就从网卡里拿走了这个包,同时将这个包从缓存里清除掉。同步的SEND则是将包发给网卡后就返回了,并不确定是否是真的发出去了(因为这个是网卡的责任,如果这样的话,)。那我还有一个问题,如果RECV是等待网卡里的缓存有信息可以取的时候取,他如何判断现在缓存里的信息是否是完整的(即可能信息并没有完全达到网卡),难道这个是由网卡来做(即当网卡通知RECV有信息可以取的时候,该信息已经确定是完整的了)?

解决方案 »

  1.   

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

  2.   

    本帖最后由 wenxy1 于 2009-03-07 12:29:38 编辑
      

  3.   

    更详细的过程,一言而尽,
    楼主有兴趣的话,可以看linux TCP/IP协议栈的实现,或者看lwIP这个小型的TCP/IP协议栈。
      

  4.   

    更详细的过程,一言而尽,
    楼主有兴趣的话,可以看linux TCP/IP协议栈的实现,或者看lwIP这个小型的TCP/IP协议栈。
      

  5.   

    网卡根据MAC地址等接收本网卡的数据包,接收了,就往上传递,上层再处理IP包等,最终有recv等api处理应用数据等,上层就需要拼接数据等,构成完整的包
      

  6.   

    建议你了解一下网络分层结构和TCP/IP协议。
      

  7.   

    《TCP/IP详解》三卷书,RFC documents, Linux 1.0 内核代码。