Socket网络层底层原理问题

致知Fighting 2014-08-28 06:23:08
我映像中好像是数据包先到网卡缓冲区,然后读取的时候是批量的从网卡缓冲区复制到JVM的内存里由流去读
问题1:请相关领域的大神验证一下上述的说法是不是正确。


int firstByte = inputStream.read();
int count = inputStream.available();
if(count != 0){
inputStream.read(count个字节)
}


问题2:由于每个数据包的大小不固定,那么上述代码是不是会出现 inputStream.available();返回的位置将一个数据包切成两半,然后通过流读到的数据是不完整的数据包
...全文
330 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
shmy110 2014-08-29
  • 打赏
  • 举报
回复
当然不正确,最低层的原理当然是0和1
致知Fighting 2014-08-29
  • 打赏
  • 举报
回复
没人研究过么
致知Fighting 2014-08-29
  • 打赏
  • 举报
回复
引用 7 楼 HinanaiTenshi 的回复:
问题1这么理解不算错,实际上过程要复杂得多 问题2,完全不用担心,jvm工作在网络七层协议的五层之上。而数据包是第二层负责的,简单来说就是操作系统的接口已经接管了类似问题,jvm直接认为收到的都是可靠数据。
这个跟我今天研究的结果比较相似,事实上,tcp协议保证的是read到的东西一定是write的东西,所以available读到的一定是完整的数据报文,而通过定长的byte缓冲区读出来的也确实有可能是不完整的报文
whos2002110 2014-08-29
  • 打赏
  • 举报
回复
不懂,顶一下
致知Fighting 2014-08-29
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
问题1: 数据包先到网卡缓冲区,然后读取的时候是批量的从网卡缓冲区复制到JVM的内存里由流去读 我的理解: Socket的确是建立缓冲区,你读取数据包就是接收缓冲区,如果是发送就有发送缓冲区,读取数据包,就是获取Socket缓冲区的输入/输出流,读取数据。 至于有没有复制到JVM,这个我不太清楚。 问题2: 由于每个数据包的大小不固定,那么上述代码是不是会出现 inputStream.available();返回的位置将一个数据包切成两半,然后通过流读到的数据是不完整的数据包 这个不会啊,Socket发送和接收文件都是通过流,inputStream.available();通过这个获取响应字符的大小,读取数据后转换成流... 然后传输,得到的都是完整的,除非你多线程去访问,可能就会出现得到数据包不完整的情况 这是我的理解,.不知道对不对,仅供参考~
HinanaiTenshi 2014-08-29
  • 打赏
  • 举报
回复
问题1这么理解不算错,实际上过程要复杂得多 问题2,完全不用担心,jvm工作在网络七层协议的五层之上。而数据包是第二层负责的,简单来说就是操作系统的接口已经接管了类似问题,jvm直接认为收到的都是可靠数据。
致知Fighting 2014-08-29
  • 打赏
  • 举报
回复
引用 4 楼 shmy110 的回复:
当然不正确,最低层的原理当然是0和1
看清楚问题,不要回答这种莫名其妙的东西
wen2034 2014-08-29
  • 打赏
  • 举报
回复
read 有返回值

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧