7层模型:
7层模型,也叫osi参考模型
网络模型一般是指 osi 7层参考模型和 tcp/ip 五层参考模型
每一层实现各自的功能和协议,并且都为上一层提供业务功能,为了提供这种业务功能,下一层将上一层的数据并入本层的数据域中,然后通过加入报头
或者报尾来实现该层的业务功能,这个过程叫数据封装。用户的数据要经过一次一次包装,最后转为可以在网络上传输的信号(物理层上的010101),发送到网络上。当到达目标计算机后(对方接受到我发来的010101),
再执行相反的数据拆分过程
比如一个网络聊天室,发出一句 hello 的消息给对面的人,那么消息会经过表示层到物理层的层层包装,
发给对面的物理层,对面再拆分数据, 还原数据
那,为什么要划分出这么多层?
分层的话,一个大系统被划分成了相对小的易于处理的层次,每一层定义好接口,当那层的技术和实现变化时
,接口保持不变,那么这个层就不会影响别的层(极端情况下,某一层提供的功能不再需要可,可以直接删除此层)
对于网络分层的好处:
1.各层之间相互独立
2.灵活性好,利于实现维护
3.有利于促进标准化工作
分层也是有技巧的,层次太少了,代码就复杂,层次太多了,可能造成层与层之间代码重复,臃肿
计算机网络体系结构是抽象的,而实现是具体的,是真正运行的计算机硬件和软件
不同公司生产的互联设备,由于实现不同,很难互联互通
使用开放系统参考模型(osi),只要遵循 osi标准,就可以与世界上任何一台遵循了osi标准的系统进行通信
在 osi 模型提出之前,TCP/IP协议族已经应用,并逐渐演化为TCP/IP 四层参考模型
而 java 企业应用开发,指的就是在和应用层打交道
ip地址有5类:
-
A类IP地址: 第一个 8位 表示 网络地址, 剩下3个 8位表示主机地址
-
B类ip地址: 前 2个 表示网络地址,剩2个表示主机地址
-
c类ip地址: 前3表示 网络地址,剩1个 8位表示主机地址
-
d类地址 用于在 ip 网咯组播
-
e类地址 保留研究来用
java 编程中使用 InetAddress 来操作 ip地址
端口号:
用于标识进程的逻辑地址,不同进程的不同标识;
有效端口: 0-65535, 其中 0-1024系统使用或是保留端口
传输协议:
- udp( 用户 数据报协议)
- TCP (传输控制协议)
-
UDP:
- 将数据及源和目的封装成数据包中,不需要建立连接
- 每个数据报的大小限制在 64k内
- 因无连接,是不可靠协议
- 不需要建立连接,速度快
-
TCP:
- 建立连接,形成传输数据的通道
- 在连接中进行大数据量传输
- 通过3次握手完成连接,是可靠协议
- 建立了连接,效率低
Socket:
socket 又称套接字,用于描述 ip地址和端口。 应用程序通常通过 socket 向网络发出请求或者应答网络请求。 Socket就是
为网络编程提供一种机制
通信两端都有 socket, 网络通信其实就是 socket之间的通信。
然后数据再两个socket 之间通过 io传输
网络编程也称socket编程为套接字编程
socket 通信是 Client/Server模型
基于 UDP协议的socket通信
发送使用DatagramSocket, 和InetAddress
DatagramSocket client = new DatagramSocket();
//对数据进行打包
DatagramPacket packet = new DatagramPacket(message… , IndetAddress.getxxHost() …. , port….)
//发送打包的数据
client.send(packet);
client.close();
接收端对数据包解析,然后释放资源
DatagramSocket server = new DatagramSocket( 8080); //监听 8080端口
DatagramPacket packet = new DatagramPacket(new byte[1024],1024); //数据接收的容器
server.receive(packet); //阻塞,接收数据包,并且将接收的存入 packet中
packet.getData() --à 获取发送来的 byte数组
server.close ();
TCP:
发送端:
//创建socket,指定 传输的ip端口
Socket client = new Socket("127.0.0.1",8080);
OutPutStream s = client.getOutputStream();
s.write("hello".getBytes());
client.close();
接收端
//接收端 ,监听请求,然后建立连接
ServerSocket s = new ServerSocket(8080);
Socket s =s.accept(); //监听连接,如果有请求就会返回一个 socket来处理这个连接
stream = s.getInputStream();//读取 inputStream 的bytes数组
byte[] container = new byte[1024]; //创建容器
stream.read(container);//将 io流读取到的 byte写入容器
JDK 1.4 使用的 是阻塞式IO
服务器的 accept 和 read的操作都是阻塞的,只能用 开多个线程来处理多个请求
NIO 3大核心: 通道,缓冲区,选择器
缓冲区作为容器,数据读取写入通过通道,通道是双向的,不同于 io流,可读可写
channel不直接处理 buffer 中的数据,而是通过buffer 对象来处理数据
选择器(多路复用技术):选择就绪的通道(管家一般)
需要重点掌握的概念:
同步IO 和 非同步 io ,即资源没有准备好,如何响应程序的问题??
- 同步io, 你问我,我不响应,直到io资源准备好之后
- 非同步io,返回一个标记(让程序和自己知道以后的数据往哪通知),当io资源准备好后,在用事件机制返回给程序
(nio的话是使用线程一直轮询,直到有io资源准备好了)
了解RPC
remote procedure call protocal 远程调用协议,即用户不知道计算机细节的情况下,调用远程计算机
的某个函数,就像调用本地的应用程序一样
即通过网络从远程计算机程序上请求服务,而不需要了解底层技术的协议
rpc是协议,因此需要遵循一定的规范, 有一些现成的rpc的实现,比如 Dubbo,Thrift,Hetty,dubbo 还包括
服务管理,访问权限管理等功能
网络协议和网络io模型透明化:调用过程中使用哪种网络io模型,调用者不需要关心
信息格式透明化: 远程调用会传递一些参数,并且返回调用结果,这个信息格式是怎样构成的,调用方无需担心
跨语言: 调用方不需要知道程序是什么语言的,无论什么语言,调用都应该成功且返回调用方
程序语言能理解的形式进行描述