美文网首页Netty学习系列JAVAnetty
netty学习系列一:Java NIO预备知识

netty学习系列一:Java NIO预备知识

作者: 益文的圈 | 来源:发表于2017-03-27 20:35 被阅读454次
图1:socket传输网络数据的过程

一、TCP发送缓冲区/TCP接收缓冲区

在传输层,每个socket对应的TCP连接都拥有自己的接收缓冲区和发送缓冲区。

接收缓冲区:用于存储网络层发往当前TCP连接的分组数据,直到应用层将数据从其中取走。

发送缓冲区:用于存储当前TCP连接即将发送给对端的分组数据,直到收到对端的接收确认。

TCP发送缓冲区和接收缓冲区用于实现TCP协议的“滑动窗口”和“流量控制”功能,保证TCP的可靠传输。

二、socket中read/write的语义

1、SocketChannel.read(ByteBuffer dest)

阻塞模式下:阻塞直到“TCP接收缓冲区”中有数据可读,并且成功将数据读取到了应用进程ByteBuffer中。

非阻塞模式下:尝试从“TCP接收缓冲区”中读取当前可读的数据,不论是否能读取到数据均立即返回。

2、SocketChannel.write(ByteBuffer src)

阻塞模式下:阻塞直到ByteBuffer src中的数据全部成功写入“TCP发送缓冲区”中。

非阻塞模式下:尝试将ByteBuffer src中的数据写入“TCP发送缓冲区”中,不保证数据全部写入(如果“TCP发送缓冲区”中空间不足,也可能写入部分数据),然后立即返回。

三、SelectionKey的operation语义

OP_READ:“TCP接收缓冲区”中有了新的可读数据。

OP_WRITE:“TCP发送缓冲区”中可以写入新的数据了。

OP_CONNECT:“TCP三次握手”完成。

OP_ACCEPT:新的客户端socket连接建立完成,放入了服务端“已完成连接队列”。

四、Direct ByteBuffer和Non-Direct ByteBuffer

1、概述

Non-Direct ByteBuffer的内存是分配在堆上的,可以把它想象成一个字节数组的包装类,直接由JVM负责垃圾收集。

Direct ByteBuffer是通过JNI在JVM外的内存空间分配的,该内存块并不直接由JVM负责垃圾回收,而是在Direct ByteBuffer包装类被回收时,通过Java reference机制来释放该内存块。

2、网络读写

操作系统无法直接操作用户空间的ByteBuffer,socket在调用read/write进行网络读写操作时,会先把用户空间的Non-direct ByteBuffer转换为操作系统内核空间的临时Direct ByteBuffer(这个过程需要进行内存拷贝),然后再进行相关的操作。

如果直接将用户进程的数据存储在Direct ByteBuffer中,则可以节省两次内存拷贝的时间。然后构造和析构临时Direct ByteBuffer的时间和代价比较长,因此一般对Direct ByteBuffer进行池化处理。

相关文章

  • netty学习系列一:Java NIO预备知识

    一、TCP发送缓冲区/TCP接收缓冲区 在传输层,每个socket对应的TCP连接都拥有自己的接收缓冲区和发送缓冲...

  • java-netty

    netty常用API学习 netty简介 Netty是基于Java NIO的网络应用框架. Netty是一个NIO...

  • java NIO详解

    Java NIO系列教程(1):Java NIO 概述 NIO学习系列:缓冲区内部实现机制 Java NIO系列教...

  • NETTY框架核心模块概述

    netty是一个NIO通信框架,但是要用好netty,需要深入理解JAVA IO, NIO以及netty NIO框...

  • Netty 权威指南笔记(二):Java NIO 和 Netty

    Netty 权威指南笔记(二):Java NIO 和 Netty 对比 Netty 是业界流行的 NIO 框架之一...

  • Java NIO 概述

    netty和java nio其实有些千丝万缕的联系,在正式学习netty之前,对java NIO有一定的理解对后续...

  • Netty线程模型相关概念知识

    点击查看 官网[https://netty.io/] 点击查看NIO相关的知识 Java - NIO网络编程[ht...

  • netty

    netty起步 netty简介 1、Netty是基于Java NIO的网络应用框架。2、Netty是一个NIO c...

  • Netty源码解析 —— 序

    阅读此文章前请先了解java nio以及netty的基本使用。可以阅读《Java NIO》以及《Netty实战》这...

  • 一文详解 | Java 中 NIO基础详解

    Netty 是基于Java NIO 封装的网络通讯框架,只有充分理解了 Java NIO 才能理解好Netty的底...

网友评论

  • 60b73207ecc5:太棒了
  • 原水寒:netty源码解析的文章和书籍看了不少,你写的是最好的,希望对于netty源码解析,可以继续做更深层次的分析,例如netty内存池及jemalloc等,还有就是在netty中使用的设计模式及优化点,另外如果能做一些tcp/ip网络方面的分享就更好了

本文标题:netty学习系列一:Java NIO预备知识

本文链接:https://www.haomeiwen.com/subject/nozrottx.html