Title

7层模型

7层模型:

 

7层模型,也叫osi参考模型

 

 

 

 

网络模型一般是指 osi 7层参考模型和 tcp/ip 五层参考模型

每一层实现各自的功能和协议,并且都为上一层提供业务功能,为了提供这种业务功能,下一层将上一层的数据并入本层的数据域中,然后通过加入报头

或者报尾来实现该层的业务功能,这个过程叫数据封装。用户的数据要经过一次一次包装,最后转为可以在网络上传输的信号(物理层上的010101),发送到网络上。当到达目标计算机后(对方接受到我发来的010101),

再执行相反的数据拆分过程

比如一个网络聊天室,发出一句 hello 的消息给对面的人,那么消息会经过表示层到物理层的层层包装,

发给对面的物理层,对面再拆分数据, 还原数据

 那,为什么要划分出这么多层?

分层的话,一个大系统被划分成了相对小的易于处理的层次,每一层定义好接口,当那层的技术和实现变化时

,接口保持不变,那么这个层就不会影响别的层(极端情况下,某一层提供的功能不再需要可,可以直接删除此层)

对于网络分层的好处:

1.各层之间相互独立

2.灵活性好,利于实现维护

3.有利于促进标准化工作

分层也是有技巧的,层次太少了,代码就复杂,层次太多了,可能造成层与层之间代码重复,臃肿

计算机网络体系结构是抽象的,而实现是具体的,是真正运行的计算机硬件和软件

不同公司生产的互联设备,由于实现不同,很难互联互通

使用开放系统参考模型(osi),只要遵循 osi标准,就可以与世界上任何一台遵循了osi标准的系统进行通信

在 osi 模型提出之前,TCP/IP协议族已经应用,并逐渐演化为TCP/IP 四层参考模型

 

而 java 企业应用开发,指的就是在和应用层打交道

 

ip地址有5类:

 

  1. A类IP地址: 第一个 8位 表示 网络地址, 剩下3个 8位表示主机地址
  2. B类ip地址: 前 2个 表示网络地址,剩2个表示主机地址
  3. c类ip地址: 前3表示 网络地址,剩1个 8位表示主机地址
  4. d类地址 用于在 ip 网咯组播
  5. e类地址 保留研究来用

 

java 编程中使用 InetAddress 来操作 ip地址

端口号:

用于标识进程的逻辑地址,不同进程的不同标识;

有效端口: 0-65535, 其中 0-1024系统使用或是保留端口

传输协议:

  1. udp( 用户 数据报协议)
  2. TCP (传输控制协议)
  3. UDP:
    1. 将数据及源和目的封装成数据包中,不需要建立连接
    2. 每个数据报的大小限制在 64k内
    3. 因无连接,是不可靠协议
    4. 不需要建立连接,速度快
  4. TCP:
    1. 建立连接,形成传输数据的通道
    2. 在连接中进行大数据量传输
    3. 通过3次握手完成连接,是可靠协议
    4. 建立了连接,效率低

 

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 ,即资源没有准备好,如何响应程序的问题??

  1. 同步io, 你问我,我不响应,直到io资源准备好之后
  2. 非同步io,返回一个标记(让程序和自己知道以后的数据往哪通知),当io资源准备好后,在用事件机制返回给程序

 

 

(nio的话是使用线程一直轮询,直到有io资源准备好了)

 

了解RPC

remote procedure call protocal 远程调用协议,即用户不知道计算机细节的情况下,调用远程计算机

的某个函数就像调用本地的应用程序一样

即通过网络从远程计算机程序上请求服务,而不需要了解底层技术的协议

rpc是协议,因此需要遵循一定的规范, 有一些现成的rpc的实现,比如 Dubbo,Thrift,Hetty,dubbo 还包括

服务管理,访问权限管理等功能

网络协议和网络io模型透明化:调用过程中使用哪种网络io模型,调用者不需要关心

信息格式透明化: 远程调用会传递一些参数,并且返回调用结果,这个信息格式是怎样构成的,调用方无需担心

跨语言: 调用方不需要知道程序是什么语言的,无论什么语言,调用都应该成功且返回调用方

程序语言能理解的形式进行描述

 

posted @ 2020-03-15 00:03  .geek  阅读(494)  评论(0编辑  收藏  举报