이 글에서는 주로 컴퓨터 네트워크의 전반적인 아키텍처와 각 계층 효과를 소개합니다.
컴퓨터 네트워크의 개념
OSI 참조 모델
TCP/IP 참조 모델
IP 프로토콜
TCP 프로토콜 및 포트
Java 네트워크 프로그래밍 입문 프로그램
네트워크는 서로 다른 노드들 사이를 연결을 통해 상호 연결하는 것입니다. 비유하자면, 컴퓨터 네트워크는 통신 회선을 통해 서로 다른 지리적 위치에 있는 컴퓨터를 연결하는 강력한 네트워크 시스템입니다. 이 네트워크에서 각 컴퓨터는 노드입니다.
OSI(Open System Interconnection)는 ISO 조직에서 연구하는 네트워크 아키텍처 집합입니다. 이 이름은 잘 선택되었습니다.
각 계층의 이름과 기능은 다음과 같이 이해되어야 합니다.
名称 | 功能 |
---|---|
物理层 | 不要理解错了,这一层不包含什么网线、电缆的物理介质。这里只是规定网线和电缆的接口类型,信号电压等。使用bit传输 |
数据链路层 | 负责两个相邻节点间的路线,以帧为单位传输。典型设备交换机(Switch) |
网络层 | 两台计算机传输数据可能会经过很多数据链路,网络层的作用就是选择最优的路线。典型设备就是路由器 |
传输层 | 提供两个端系统的会话的建立、维护和取消传输连接的功能。使用报文传输 |
会话层 | 管理进程间的会话过程,即建立、管理、终止进程间的会话。使用报文传输 |
表示层 | 对数据的加解密、解压缩和格式转换等。 |
应用层 | 这层就是和用户的具体应用交互。例如:收发E-mail等。 |
OSI 네트워크이기 때문입니다. 구조가 계층화되어 너무 많고 너무 복잡해서 TCP/IP 프로토콜이 탄생했습니다. TCP/IP 프로토콜도 OSI의 계층적 아이디어에 의존하지만 4개의 계층으로만 나누어집니다:
名称 | 功能 |
---|---|
主机网络层 | 为上层提供一个访问接口 |
网络互联层 | 把IP数据包发送到目标主机。这一层使用的是IP协议,IP协议规定了数据包的格式,并且规定了为数据包寻找路由的流程。 |
传输层 | 使源主机和目标主机的进程可以进行会话。这一层定义了两种协议TCP和UDP协议。 |
应用层 | TCP/IP模型将OSI参考模型中的会话层和表现层功能合并到应用层。 |
• FTP: 네트워크에서 파일을 전송할 수 있는 파일 전송 프로토콜입니다.
• TELNET: 호스트 A에서 원격 호스트 B로의 로그인을 허용하는 가상 터미널 프로토콜입니다.
• HTTP: 하이퍼텍스트 전송 프로토콜(Hypertext Transfer Protocol)을 사용하면 네트워크에서 하이퍼텍스트를 전송할 수 있습니다.
• HTTPS: 하이퍼텍스트 전송 프로토콜 보안.
• POP3: 사용자가 Fortune 서버의 메일 및 메일 폴더에 액세스하고 운영할 수 있습니다.
• IMAP4: 메시징 액세스 프로토콜 버전 4를 사용하면 사용자가 Yuanyun 서버의 메일 및 메일 폴더에 액세스하고 작동할 수 있습니다.
• SMTP: 이메일 전송을 위한 프로토콜입니다.
• SNMP: Simple Network Management Protocol은 로컬 및 원격 네트워크 장치를 관리하는 표준화된 방법을 제공하며 분산형 중앙 집중식 관리입니다. 중앙 집중식 환경의 프로토콜.
• DNS: 도메인 이름 시스템 프로토콜, 호스트의 도메인 이름을 해당 IP 주소로 변환합니다.
IP 네트워크(IP 프로토콜을 사용하는 네트워크)의 각 호스트는 고유한 IP 주소를 가지며, IP 주소는 네트워크의 각 호스트를 식별합니다. IP 주소는 32비트 이진수 시퀀스입니다. 예: 192.168.3.4
. 네트워크 주소는 IP 주소와 서브넷 마스크를 AND하여 얻습니다. 서브넷 마스크가 255.255.255.0
인 경우 네트워크 주소는 다음과 같습니다. 192.168.3.0
IP는 패킷 지향 프로토콜입니다. 즉, 데이터를 여러 개의 작은 패킷으로 나누어 별도로 전송합니다. IP 네트워크의 호스트는 로컬 네트워크의 다른 호스트(즉, 유사한 IP 주소를 가진 호스트)에만 직접 데이터 패킷을 보낼 수 있습니다. 호스트에는 실제로 서로 다른 성격의 두 가지 실제 주소가 있습니다. 호스트 A가 동일한 네트워크에 있는 다른 호스트 B에게 패킷을 보내면 ARP(Address Resolution Protocol)를 통해 상대방의 물리적 주소를 얻은 다음 해당 패킷을 상대방에게 전달합니다. ARP 프로토콜의 작동 메커니즘은 호스트 A가 네트워크에서 "주소 192.166.3.5를 가진 호스트를 찾는 중"이라는 ARP 메시지를 브로드캐스트하는 것입니다. 이 IP 주소를 가진 호스트 B는 응답하고 A에게 물리적 주소를 알려줍니다.
호스트 A가 다른 네트워크의 호스트 B로 패킷을 보내는 경우:
호스트 A는 ARP 프로토콜을 사용하여 로컬 네트워크에서 라우터의 물리적 주소를 찾아 패킷을 라우터로 전달합니다. 라우터는 데이터 패킷을 다음과 같이 처리합니다.
데이터 패킷의 수명 주기가 만료된 경우 데이터 패킷은 폐기됩니다.
라우팅 테이블을 검색하여 라우팅 테이블에 있는 호스트를 우선순위로 찾으면 해당 호스트로 데이터 패킷이 전송됩니다.
호스트 매칭에 실패하면 계속해서 라우팅 테이블을 검색해 서브넷의 라우팅 테이블을 매칭하고, 매칭되는 라우팅 테이블이 있으면 해당 라우터로 패킷을 전달한다.
동일한 서브넷의 라우터 일치에 실패하면 계속해서 라우팅 테이블을 검색하여 동일한 네트워크의 라우터를 찾으면 데이터 패킷이 전달됩니다. 라우터에.
위 매칭에 실패할 경우 기본 경로를 검색하여 기본 경로가 존재하면 기본 경로에 따라 데이터 패킷을 전송하고, 그렇지 않으면 데이터 패킷을 폐기합니다.
순서도는 다음과 같습니다.
IP는 숫자의 문자열이며 의미가 없습니다. 도메인 이름은 IP에 해당하는 의미 있는 문자열 또는 숫자입니다. 예: www.google.com
도메인 이름과 IP 간의 통신에는 도메인 이름을 IP로 변환하는 도메인 이름 확인 시스템이 필요합니다. DNS 서버는 이 문제를 해결할 수 있습니다.
URL(Uniform Resource Location)은 네트워크에서 리소스의 위치를 식별하기 위해 특별히 설정된 주소 지정 방법입니다. URL은 일반적으로
应用层协议://主机IP地址或域名/资源所在路径/资源名
세 부분으로 구성됩니다. 예: http://www.php.cn/
여기서 http
는 Hypertext Transfer Protocol을 나타내고, blog.csdn.net
는 웹 서버의 도메인 이름이고, /article/details/
은 웹페이지, 54962975
해당 웹페이지 파일입니다.
IP 프로토콜이 데이터를 전송하면 데이터 전송 과정에서 다양한 문제가 발생합니다. 이로 인해 패킷이 손실되거나 잘못된 패킷 순서가 발생합니다. TCP 프로토콜을 사용하면 두 호스트의 프로세스가 패킷 손실이나 잘못된 패킷에 대한 걱정 없이 원활하게 통신할 수 있습니다. TCP는 패킷의 순서를 추적하고, 패킷이 엉망이면 올바른 순서로 다시 조립합니다. 패킷이 손실되면 TCP는 소스 호스트에게 패킷을 다시 보내도록 요청합니다.
TCP 프로토콜을 사용하면 두 호스트의 프로세스가 원활하게 통신할 수 있지만 호스트에는 둘 이상의 프로세스가 있습니다. TCP는 포트를 사용하여 프로세스를 구별합니다. 포트는 물리적 장치가 아니라 프로세스를 식별하는 데 사용되는 논리적 주소입니다. 컴퓨터의 포트 범위는 0~65535이며, 그 중 포트 0~1023은 일반적으로 일부 서비스에 할당됩니다. 세부 내용은 다음과 같습니다.
服务 | 端口 | 协议 |
---|---|---|
文件传输服务 | 21 | FTP |
远程登录服务 | 23 | TELENET |
邮件传输服务 | 25 | SMTP |
万维网超文本传输服务 | 80 | HTTP |
访问邮件远程邮件服务 | 110 | POP3 |
互联网消息存取服务 | 143 | IMAP4 |
安全的超文本传输服务 | 443 | HTTPS |
安全的远程登录服务 | 992 | TELNETS |
安全互联网消息存取服务 | 993 | IMAPS |
Java网络程序都建立在TCP/IP协议基础上,在应用层实现。传输层向应用层提供了套接字Socket接口,Socket封装了下层的数据传细节,应用层的程序通过Socket来建立与远程主机的连接,以及数据传输,如下图所示:
在Java中,有3种套接字类:java.net.Socket
、java.net.ServerSocket
和 java.net.DatagramSocket
。其中Socket
和 ServerSocket
建立在TCP协议上,DatagramSocket
类建立在UDP协议基础上。我们创建EchoServer和EchoClient两个类,我们通过ServerSocket
和Socket
来编写。
在服务端通过一直监听端口,来接收客户程序的连接请求。在服务器程序中,先创建一个ServerSocket
对象,在构造方法中指定监听的端口:
ServerSocket server = new ServerSocket(8080);
ServerSocket
构造器负责在操作系统中将当前进程注册为服务进程。服务器程序调用ServerSocket
的accept()
方法来监听端口,等待客户端的连接,如果接收到连接,则accept()
方法返回一个Socket
对象,这个Socket
对象与客户端的Socket
对象形成了一条通信线路:
Socket socket = server.accept();
Socket提供了getInputStream()方法和getOutputStream()方法,分别返回输入流InputStream对象和输出流OutputStream对象。程序只需向输出流写入东西,就能向对方发送数据;只需从输入流读取数据,就能接收到数据。如下图: EchoServer
类代码如下:
/** * 服务端 服务端类 * */public class EchoServer { private ServerSocket serverSocket; public EchoServer(int port) { try { this.serverSocket = new ServerSocket(port); System.out.println("start server success,start port:"+port); } catch (IOException e) { e.printStackTrace(); } } /** * 获取BufferedReader包装类 * * @param socket * @return * @throws IOException */ private BufferedReader getReader(Socket socket) throws IOException { return new BufferedReader(new InputStreamReader(socket.getInputStream())); } /** * 获取PrintWriter包装类, * * @param socket * @return * @throws IOException */ private PrintWriter getWriter(Socket socket) throws IOException { // 每写一行自动刷新 return new PrintWriter(socket.getOutputStream(), true); } public void service() { while (true) { Socket socket = null; try { socket = serverSocket.accept(); System.out.println("new connect,address is:" + socket.getInetAddress() + " port is:" + socket.getPort()); BufferedReader reader = getReader(socket); PrintWriter writer = getWriter(socket); String msg = null; while ((msg = reader.readLine()) != null) { // 读取一行 System.out.println("client request msg: " + msg); writer.println(echo(msg)); if ("bye".equalsIgnoreCase(msg)) { break; } } } catch (IOException e) { e.printStackTrace(); }finally{ if(socket!=null){ try { //关闭会话连接 socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } private String echo(String msg) { return "get request msg is '" + msg+"'"; } public static void main(String[] args) { new EchoServer(8080).service(); } }
EchoServer
类的最主要的方法就是service()
方法,它不断登录客户的连接请求。当serverSocket.accept()
返回一个Socket
对象时,表示与一个客户端建立了连接。
EchoClient
类在EchoClient程序中,为了与EchoClient通信,需要先创建一个Socket对象:
String host="localhost";int port = 8080;new Socket(host, port);
host表示Server进程所在服务器的地址,port表示Server进程监听的端口。当参数host为’localhost’时,表示服务端和客户端在同一台机器上。下面是EchoClient
类的源码:
public class EchoClient { private Socket socket; public EchoClient(String host,int port){ try { this.socket = new Socket(host, port); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 获取BufferedReader包装类 * * @param socket * @return * @throws IOException */ private BufferedReader getReader(Socket socket) throws IOException { return new BufferedReader(new InputStreamReader(socket.getInputStream())); } /** * 获取PrintWriter包装类, * * @param socket * @return * @throws IOException */ private PrintWriter getWriter(Socket socket) throws IOException { // 每写一行自动刷新 return new PrintWriter(socket.getOutputStream(), true); } public void talk(){ try { BufferedReader reader = getReader(socket); PrintWriter writer = getWriter(socket); BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in)); String msg = null; while((msg=localReader.readLine())!=null){ writer.println(msg); System.out.println("server response msg:"+reader.readLine()); if("bye".equalsIgnoreCase(msg)){ break; } } } catch (IOException e) { e.printStackTrace(); }finally{ if(socket!=null){ try { socket.close(); System.out.println("has been disconnected"); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) { new EchoClient("localhost", 8080).talk(); } }
在EchoClient类中最重要的是talk()方法,该方法不断读取用户从控制台输入的字符串,然后将它发送到EchoServer,在把EchoServer返回的数据打印在控制台。如果输入’bye’字符串,就会结束与EchoServer的通信,调用socket.close()方法端口连接。
具体运行如下图,一个是服务端一个是客户端的控制台:
简单介绍了一下网络的理论知识和TCP/IP协议。并使用Java实现了一个网络通信程序。
以上就是Java网络编程由浅入深一图文详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!