远程通讯协议-tcp/ip及nio的学习笔记
tcp 7层
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
4层网络模型:
其中应用层、表示层、会话层表示应用层,数据链路层、物理层表示网络接口层
ARP协议
复杂的程序都需要分层,软件开发设计必须要做的
tcp负载均衡
二层负载 -> mac地址,vip(虚拟ip) 多个机器IP相同但是mac地址不同
三层负载 ->ip 对外提供虚拟ip,集群中不同机器采用不用的ip,IP请求转发
四层负载 -> 传输层负载,包含ip和端口,修改目标ip和端口地址
七层负载 -> 应用层负载,请求的url,http请求的报文,如http://a/a.html,主机名。
tcp和udp区别
TCP/IP:可靠
- 建立连接机制
- 三次握手建立连接
- client发送请求连接的数据包
- server返回可以进行连接的数据包
- client发送确认请求连接的数据包
- client/server可以进行数据传输了
- SYNC攻击 -> 客户端伪造大量ip和mac地址发送消息给服务器,占用服务器大量资源
- 连接的关闭,四次挥手协议
- client发送请求关闭连接的数据包
- server返回确认收到请求关闭的数据包-此时server可能还处于数据操作的状况
- server数据已经处理完毕,并返回可以关闭的数据包
- client返回最终请求关闭数据包-此时server接收到数据包以后将处于关闭状态,而client可能还处于数据为未接受完的状态,等待2个固定的时间点后进入关闭状态
- TCP是一种全双工的协议
- 长连接,正常连接是超时关闭,但是长连接可以发送心跳包维持连接
UDP/IP:不可靠
在应用中如何去构建一个传输的实例
socket -> 套接字
socket io
file io
通讯过程中的阻塞
accept阻塞(连接阻塞)
流操作的阻塞(read/write)
滑动窗口的协议
流量控制
BIO模型
blocker io 阻塞
优化方案:
可以解决socket io阻塞,但是还是存在file io阻塞问题
1 | ServerSocket server = new ServerSocket(8080); |
NIO
非阻塞
new io / non blocker io
多路复用机制
linux fd:linux系统中一切皆可看成是文件,文件描述符是内核为了高效管理已被打开的文件所创建的索引
serverSocket 向请求内核
先监听socket/fd,再如果发现socket/fd已就绪,就发送数据已经准备好的通知(即可以像该文件进行读写),然后serverSocket再来发送read/write请求
linux提供的io复用机制
select/poll:轮询查询socket/fd是否已经就绪
epoll:事件机制,理解为注册监听机制,如果发现socket/fd就绪直接返回就绪通知,可以进行读写
服务端的机器怎么去标记一个个的连接
四元组:source_ip/source_port/target_ip/target_port
因为目标机器的ip和端口固定,所以最大连接数取决于客户端的数量
source_ip : 2^32
source_port:2^16 因为0不能作为端口,所以是65535个
- 内存大小
- 文件句柄的限制
- ulimit -n 默认是1024
- 带宽的资源