2.1.1 TCP/UDP协议
1、TCP:传输控制协议
是Internet一个重要的传输层协议
tcp提供面向连接、可靠、有序、字节流传输服务
应用程序在使用TCP之前,必须先建立TCP连接
TCP和UDP比较
TCP:面向连接、可靠、慢、资源占用多、字节流有序传输
UDP:无连接、不可靠、快、资源占用少、数据报尽力传输
开发人员用UDP关注4个点:
1、应用进程更容易控制发送什么数据、何时发送
2、无需建立连接
3、无连接状态
4、首部开销小
2、什么情况下用UDP?
视频、音频聊天
共享单车定位
3、socket编程调用过程:
创建套接字、端点绑定、发送数据、接收数据、释放套接字
4、OSI网络七层模型:
5、Tcp协议的数据报文
6、TCP握手机制
2.1.2 BIO阻塞式网络编程
1、BIO:阻塞IO(blocking IO),处理网络I/O时,一个线程只能处理一个网络连接(serverSocket.accept、Socket)
阻塞和非阻塞是获取资源的方式,同步/异步是程序如何处理资源的逻辑设计
2、Http协议-请求数据包:
第一部分:请求行(请求类型 /资源路径 HTTP版本)
GET /localhost/index HTTP/1.1
第二部分:请求头(用来说明服务器要使用的附加信息【第一行之后到空行之前的所有内容】)
第三部分:空行(请求头部与数据主体之间必须有换行)
第四部分:请求数据(主体【可以是任意数据,也可以为空】)
3、Http协议-响应数据包:
第一部分:状态行(HTTP版本 状态码 状态消息)
HTTP/1.1 200 OK
第二部分:响应报头部(用来说明服务器要使用的附加信息【第一行之后到空行之前的所有内容】)
第三部分:空行(头部与数据主体之间必须有换行)
第四部分:响应正文(可以是任意数据,也可以为空)
Http协议-请求数据包解析
Http协议-响应数据包解析
4、HTTP协议-响应状态码
2.1.3 NIO非阻塞网络编程三大核心理念
1、NIO:叫非阻塞IO(non-blocking IO)
2、NIO三大核心组件:
Buffer缓存区(类似数组):
写读4个步骤:
将数据写入缓冲区
调用buffer.flip(),将缓冲区转换为读取模式
缓冲区读取数据
调用buffer.clear()或buffer.compact()清除缓冲区
【clear清除整个缓冲区,compact仅清除已阅读的数据】
Buffer三个重要属性:
capacity(容量)、position(位置)、limit(限制,写入时等于容量,读取时等于数据长度)
Channel通道:非阻塞的(SocketChannel[与BIO的Socket类似]、ServerSocketChannel)
Selector选择器:事件驱动机制(单线程可以管理多个通道,从而管理多个网络连接)
SelectionKey的4个事件:
OP_CONNECT:连接
OP_ACCEPT:准备就绪
OP_READ:读取
OP_WRITE:写入
3、ByteBuffer的两种实现(都用了数组):
直接内存(direct堆外):堆外内存不受GC控制
获取方式:ByteBuffer.allocateDirect(int)
直接内存的垃圾回收:DirectByteBuffer是收GC管理的,GC回收DirectByteBuffer对象时会触发DirectByteBuffer中的Deallocator去调用Cleaner.clean()方法,从而达到回收直接内存【DirectByteBuffer有一个Cleaner对象】
非直接内存(heap堆):由于GC会移动对象内存,所以在写file或socket的过程中,JVM会先把数据复制到堆外,再进行写入
所以直接内存比堆内存性能更好一些
获取方式:ByteBuffer.allocate(int)
直接内存使用场景:大数据处理
设置虚拟机参数MaxDirectMemorySize限制大小,防止耗尽整个机器的内存
4、Channel通道
通道可以创建网络连接,还可以传输数据
Channel的API涵盖了UDP/TCP网络和文件IO:
FileChannel
DatagramChannel
SocketChannel
ServerSocketChannel
5、NIO与BIO对比
利用通道进行读取、写入时,需要在循环中调用,因为它是非阻塞的
操作系统中,所有的Socket操作默认都是阻塞的,如果需要非阻塞的,需要手动设置
serverSocketChannel.configureBlocking(false); // 设置为非阻塞模式
Thread.yield();//暂停当前正在执行的线程对象,并执行其他线程
6、NIO与多线程结合的改进方案
E:\meWork\study\java高级\专题一\Scalable-IO-in-Java.pdf