网络-OSI模型和TCP/IP模型
什么是计算机网路:
计算机网络是通过传输介质,通信设施和通信协议,将分散在不同点的计算机设备互联起来实现资源共享和数据传输的系统。
什么是网络编程:
网络编程就是编写程序是联网的两个或者多个设备直接进行传输。
网络分层模型:
- OSI: 应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。
- TCP/IP: 应用层,传输层,网络层,网络接口层。
OSI(Open System Interconnection,开放系统互联模型):
OSI七层网络模型 称为开放系统互联模型,是由国际标准化组织提出的,是一个逻辑意义上得定义,一个规范,它把网络从逻辑上分成了7层。每一层都有相关,相对应的设备,比如路由器,交换机。 OSI七层网络模型是一种框架性的设计方法,建立七层模型的主要目的是为解决异种网络互连时的兼容性问题 ,其最主要功能是 帮助不同类型的主机实现数据传输。最大优点 是将服务 ,接口 和协议这三个概念明确的区分开来,通过七个层次化的结构模型使不同的网路之间实现了可靠的通信。
模型优点:
建立七层模型的主要目的是为解决异种网络互联时所遇到的兼容性问题。它的最大优点是将服务,接口,协议 这三个概念明确区分开: 服务表示本层能为上一层提供什么功能,接口说明上一层如何使用下一层服务,协议涉及本层如何实现本层的服务 。这样各层之间具有很强的独立性,互联网络中各实体采用什么样的协议也是没有限制的,只要向上提供相同的服务并且不改变邻层的接口 就可以。 网络七层的划分也是为了使网络的不同功能模板(不同层次)分担不同的职责,从而带来以下好处:
- 减轻问题的复杂程度,一旦网络发生网络故障,可以迅速定位故障所处层次,便于查找和纠错。
- 在各层分别定义标准接口,使具备相同对等层的不同网络设备能实现互操作,各层之间则相对独立,一种高层协议可放在多种低层协议上运行。
- 能有效刺激网络技术革新,因为每次更新都是小范围进行,不需要对整个网络动大手术。
分层介绍:
- 应用层: 为用户的应用程序提供网络服务。 协议:ftp\http\smtp ==>后文有具体协议介绍。
- 表示层: 可确保一个系统的应用层所发送的信息可以被另一个系统的应用层读取。例如:pc程序与另一台计算机进行通信,其中一台计算机使用扩展21进制交换码(EBCDIC),而另一台则使用美国信息交换标准码(ASCII)来表示相同的字符。如有必要,表示层会通过使用一种通格式来实现多种数据格式之间的转换。
- 会话层: 通过传输层(端口号:传输接口和接受端口)建立数据传输的通路。主要在你的系统之间发起会话请求(设备之间需要互相认识,可以是IP也可以是MAC地址或者是主机名)。
- 传输层: 定义了一些传输数据的协议和端口号。如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据) UDP(用户数据报协议,与TCP的特性整好相反,传输效率高,可靠性不强,用于传输可靠性要求不高,数据量小的数据。如qq聊天就是用这种方式进行传输,视频播放也是采用这种,因为视频是一帧一帧的图片组成,丢失几帧并不影响观看效果) 。 主要是将上层接收的数据进行分段和传输,到达目的地址后在进行重组。常常把这层数据叫段。
- 网络层: 为位于不同地理位置的网络中的两个主机系统之间提供连接和路径选择。Internet的发展使得从全世界各站点访问信息的用户数大大增加,而网络层正是管理这种连接的层。
- 数据链路层: 定义了如何让格式化的数据进行传输,以及如何控制对物理介质的访问。这一层通常提供错误检测和纠正,以确保数据的可靠传输。
- 物理层: 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它主要作用是传输bit流(就是将0,1转换为电流强弱来进行传输,到达目的地后在转换为0,1 这就是我们常说的数模转换和模数转换)。
OSI模型 | |
---|---|
应用层 | FTP、HTTP、SMTP |
表示层 | 对应用层的数据进行封装,校验,加密等操作 |
会话层 | 在于对通信开始,结束,异常中断进行处理 |
传输层 | 保持通信双方端对端的联系(端口) |
网络层 | 在于通信双方主机与主机的联系(IP) |
数据链路层 | 保证网络中相邻节点的可靠通信,物理地址(Mac地址--网卡 -->arp,rarp) A->网关(路由器)->基站->网关->B |
物理层 | 数据以bit流的形式在通信介质上传输 |
端口数量:
65536(2^32)个端口,端口1-1024为系统端口,1024以后为可以自由使用的端口。
分层的好处:
任意一层修改都不会影响其他层。
TCP/IP模型:五层/四层协议
ISO制定的OSI参考模型过于庞大、复杂招致了很多批评。由技术人员自己开发的TCP/IP协议栈获得了更为广泛的应用。
OSI模型 | TCP/IP模型 | 数据形式 |
---|---|---|
应用层 | 应用层 | |
表示层 | ||
会话层 | ||
传输层 | 传输层 | 数据段 |
网络层 | 网络层(网络互联层) | 数据包 |
数据链路层 | 网络接口层(主机到网络层) | 帧 |
物理层 | bit |
TCP/IP分层介绍:
应用层:
- 应用: 各种应用程序、App
- 协议: FTP、SMTP、HTTP
- FTP(File transfer protocol): 文件传输协议,< 端口:21> 。作用: 减少或者消除不同操作系统下处理文件的不兼容性性。
- HTTP(HyperText transfer protocol): 超文本传输协议,< 端口: 80>
- SMTP(Simple Mail transfer protocol): 简单邮件传输协议 < 端口: 25> 用于发送文件。
传输层:
- 数据单元: 数据段
- 协议:TCP 、UDP
- TCP(Transmission Control Protocol): 传输控制协议,提供可靠的连接服务,进行数据传输之前需要建立连接三次握手 ,建立连接后才能通信,通信结束断开连接四次挥手 。
- UDP(User Datagram Protocol): 用户数据报协议,发送数据前不需要进行连接。
网络层:
- 应用: 路由器,交换机。
- 数据单元:数据包。
- 协议:
- IP(IPv4/IPv6) (Internet Protocol): 网络互联协议
- ARP(Address Resolution Protocol): 地址解析协议,实现通过IP地址得到物理地址。
- RARP(Reverse Address Resolution Protocol): 逆地址解析协议,实现通过物理地址得到IP地址。
- ICMP(Internet Control Message Protocol): 网络控制报文协议,TCP/IP协议族的一个子协议,用于在IP主机,路由器之间传递控制消息。
功能:
把分组发往目标网络或者主机。同时,为了尽快地发送分组,可能需要沿不同地路径同时进行分组传递。因此,分组到达顺序和发送顺序可能不同加粗样式,这就需要上层对分组进行排序。网络层除了需要完成路由功能外,也可以完成将不同类型的网络(异构网)互联的任务。除此之外,网络互联层还需要完成拥塞控制的功能。
(数据链路层 数据单元:帧)
物理层:
- 应用:网线
- 数据单元:bit
网络基于C/S模型在TCP中的交互步骤
服务端(Server) | 客户端(Client) |
---|---|
bind(端口) | |
connnect(连接 IP+端口) | |
listen(监听状态) | |
accept(返回和客户端连接的实例) | |
read/write(读写) | read/write(读写) |
close(关闭资源) | close(关闭资源) |
注意:客户端连接服务端时,服务端必须先启动。
服务端代码:
package Internet;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
//创建一个服务器端口实例
ServerSocket serverSocket=new ServerSocket();
//绑定端口
serverSocket.bind(new InetSocketAddress(8888));
//监听并获得socket实例,该方法会阻塞
Socket socket=serverSocket.accept();
System.out.println(socket.getRemoteSocketAddress()+" 客户端连接上");
//字符缓冲读取流,用来接收客户端消息
BufferedReader buffer=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//输出流,用来向客户端发送
OutputStream outputStream=socket.getOutputStream();
while(true){
String s=null;
while((s=buffer.readLine())!=null){ //因为服务器端调用的是readLine,他看到换行符才会读取结束。
System.out.println("客户端信息________ " +s);
//将接收到的消息返回给客户端
outputStream.write((s+"\n").getBytes());
outputStream.flush();
}
}
//关闭资源:后开的先关,因为异常抛出,所以下面几个方法报错
//outputStream.close();
//buffer.close();
//socket.close();
//serverSocket.close();
}
}
客户端代码:
package Internet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
public class TCPClient {
public static void main(String[] args) throws IOException {
//ipconfig dos命令 查找本机ip
//创建Socket实例
Socket socket=new Socket();
//连接服务器
socket.connect(new InetSocketAddress("127.0.0.1",8888));
Scanner scanner=new Scanner(System.in);
//得到输出流实例
OutputStream outputStream=socket.getOutputStream();
//得到输入流实例
BufferedReader reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true){
String s=scanner.nextLine();//读取标准输入
outputStream.write((s+"\n").getBytes()); //向服务器发送消息
outputStream.flush();
String s1=reader.readLine(); //读取服务器返回的消息
System.out.println("服务器返回消息---》"+s1);
if(s.equals(s1)){ //比对服务器返回的消息
System.out.println("服务端成功接收");
continue;
}
System.out.println("数据丢失请重新发送");
}
//关闭资源
// outputStream.close();
// reader.close();
// socket.close();
}
}