1、TCP三次握手等面试题
2、SOCKET通信的面试题
3、TCP状态切换的面试题
4、长连接、短连接、有无状态通信、会话等面试题
5、OIO/BIO/NIO/AIO/DIO等IO模型面试题
6、多路复用器EPOLL的面试题
7、NettyIO框架的常见面试题
8、粘包、拆包、粘包、半包、编解码面试题
9、HttpClient、连接池等面试题
10、redis、nginx、tomcat常见通用面试题
文件系统
有界数据:有数据,历史,可寻址的数据
网络数据: 无界数据
old IO flush() 空实现,断电会丢数据。但是vi会看见数据?vi和javaAPP会和内核交互。
移动硬盘自带电容,防止突然断电。
NIO
force调用内核,刷写数据。
OSI
程序: 应用层,会话层,表示层
内核: 传输控制层,网络层,链路层,物理层
其实网络io是程序自己对着自己系统内核的过程。
传输控制层:TCP/UDP-
TCP:面向连接的可靠的传输控制协议
三次握手
三次握手:连接就是开辟资源的过程,数据包的交互过程。
都确认自己的输入输出没问题,收到并且开辟资源。
三次握手可以创建一个资源,一个socket
资源创建了状态 ESTABLISHED
资源是个啥? Socket(套接字,插板)
四元组: ip:port + ip:port
为什么是四元组
是双方的,且在双方是唯一的。
端口号: 0~65535
IPA:0 IPB:80 存在
IPA:0 IPB:90 还可以创建
抓包
三次握手 和 四次分手
P
: 不要缓冲,立刻push
S
:请求连接
S.
:
.
: 有ack就会有个店
BIO
java里每一个连接都有一个线程
有两个阻塞。
BIO: 等待数据,阻塞,每个线程对应一个socket,浪费资源,
cpu: 缓存,保护,恢复,
NIO: 可能会返回空,掉一次会立即返回,一个线程遍历各个连接。
NIO: nonblock
N: java nio new
linux nonblock 非阻塞,一个线程可以处理多个连接
弊端: 一万个连接在一个线程里,while循环的方式, 循环一次代价O(10000),成本—一万次的尝试去调用内核的读取,O(1)有数据.9999调用是浪费的。浪费的是系统调用。用户态–》内核态
于是就有了多路复用器
多路复用器
减少了无用的系统调用次数。第一代: select,poll
select和poll的区别在于存储socket的数据结构的差异 一个是数组 一个是链表
epoll也属于多路复用器,是调优版本
IO模型:异步,同步
异步io模型: 内核级线程。
app面对 队列读取。
man查看系统调用
总结
1.BIO模型
每一条路对应一个线程
2.NIO模型
3.多路复用器 select poll
跑一次有意义的。
与内核交互,问内核的socket的状态,
然后针对这些状态读取数据
4. 多路复用器 epoll
给内核开辟一个空间,准备一个记事本。
线程中每来一个连接(内核的socket的状态),将这个连接记录到该空间里。
kafka使用多线程如何保证分区有序
kafka分区有序,而且批次提交。
redix单线程处理一堆连接的数据,每个连接里的数据是能保证有序的
但是kafka是多线程处理所有连接的消息,io模型应该是基于epoll的方式。
都是IO线程,一堆的reactor。
多线程处理 channel中的数据,可能会导致数据乱序
静音操作。
当一个客户端连接 向socket channel发送一个数据后,会静音。在所有的客户端连接发来的数据 一轮处理完之后,再处理下一个。
在性能方面:
因为是多任务的情况下,每次处理的每个任务都是一样的。
03:10:00