Linux网络管理
Posted 胡子就不刮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux网络管理相关的知识,希望对你有一定的参考价值。
ISO:国际标准化组织
OSI:开发系统互联模型
发送数据时,上层传到下层,再从主机A物理层传到主机B的物理层,有主机B的物理层往上传递
接受数据时,下层往上层,由物理层往应用层传递
上三层为用户提供服务,下四层对实际的数据传递提供服务
TCP/IP协议的四层模型
网络接口层:
网络接入层与OSI参考模型中的物理层和数据链路层相对应。负责监视数据在主机和网络之间的交换。事实上,TCP/IP本身并未定义该层的协议,由参与互连的各网络使用自己的物理层和数据链路层协议,然后与TCP/IP的网络接入层进行连接。
地址解析协议(ARP)工作在此层,即OSI参考模型的数据链路层。把ip地址翻译成物理地址
网际互联层:
网际互联层对应于OSI参考模型的网络层,主要解决主机到主机的通信问题。它所包含的协议设计数据包在整个网络上的逻辑传输。
该层有三个主要协议:网际协议(IP)、互联网组管理协议(IGMP)、互联网控制报文协议(ICMP)
传输层:
传输层对应于OSI参考模型的传输层,为应用层实体提供端到端的通信功能,保证了数据包的顺序传送及数据的完整性。
该层有两个主要协议:传输控制协议(TCP)、用户数据包协议(UDP)
应用层:
应用层对应于OSI参考模型的上三高层,为用户提供所需要的各种服务。例如:FTP、Telnet、DNS、SMTP等
TCP/IP与OSI模型的比较
相同点:
1. 都采用了层次结构的概念
2. 都能够提供面向连接和无连接两种通信服务机制
不同点:
1. 前者四层模型,后者七层
2. 对可靠谱要求不同
3. OSI模型是在协议开发前设计的,具有通用性。TCP/IP是先有协议集然后建立模型,不适用于非TCP/IP网络
IP地址
IP包头的字节数不一定是20字节,它是不固定的,着也就是为什么IP4协议传输没有IP6传输快的原因,IP6包头是固定的,每次传输不需要判断包头的长度
端口
查看本机启用的端口:netstat -an
-a:查看所有连接和监听端口
-n:显示IP地址和端口号,而不显示域名和服务名
端口号用于区分不同的应用程序,范围为0~65535,其中0~1023为系统保留
IP地址和端口号组成了所谓的Scoket(套接字),Scoket是网络上运行的程序之间双向通信链路的终结点,
是TCP(是一种面向连接的、可靠的、基于字节流的传输层通信协议)和UDP(无连接通信,且不对传送数据包进行可靠性保证,适合于一次传输少量数据,UDP传输的可靠性由应用层负责)的基础
Java提供了网络功能四大类:
1 InetAddress: 用于标识网络上的硬件资源,InetAddress类用于标识网络上的硬件资源,标识互联网协议(IP)地址。
1 //获取本机的InetAddress实例 2 InetAddress address = InetAddress.getLocalHost(); 3 address.getHostName();//获取计算机名 4 address.getHostAddress();//获取IP地址 5 byte[] bytes = address.getAddress();//获取字节数组形式的IP地址,以点分隔的四部分 6 //获取其他主机的InetAddress实例 7 InetAddress address2 = InetAddress.getByName("其他主机名"); 8 InetAddress address3 = InetAddress.getByName("IP地址");
2 URL:统一资源定位符,通过URL可以直接读取和写入网络上的数据,表示Internet上某一资源的地址,由协议名称和资源名称两部分组成 如 http://www.taobao.com
1 //创建一个URL的实例 2 URL baidu = new URL("http://www.baidu.com"); 3 URL url = new URL(baidu,"/index.html?username=tom#test");//?表示参数,#表示锚点 4 url.getProtocol();//获取协议 5 url.getHost();//获取主机 6 url.getPort();//如果没有指定端口号,根据协议不同使用默认端口。此时getPort()方法的返回值为 -1 7 url.getPath();//获取文件路径 8 url.getFile();//文件名,包括文件路径+参数 9 url.getRef();//相对路径,就是锚点,即#号后面的内容 10 url.getQuery();//查询字符串,即参数
通过URL对象的openStream()方法可以得到指定资源的输入流,通过流能够读取或访问网页上的资源
1 //使用URL读取网页内容 2 //创建一个URL实例 3 URL url = new URL("http://www.baidu.com"); 4 InputStream is = url.openStream();//通过openStream方法获取资源的字节输入流 5 InputStreamReader isr = new InputStreamReader(is,"UTF-8");//将字节输入流转换为字符输入流,如果不指定编码,中文可能会出现乱码 6 BufferedReader br = new BufferedReader(isr);//为字符输入流添加缓冲,提高读取效率 7 String data = br.readLine();//读取数据 8 while(data != null){ 9 System.out.println(data);//输出数据 10 data = br.readLine(); 11 } 12 br.close(); 13 isr.close(); 14 is.close();
3 Sockets: 使用TCP协议实现网络通信的Socket相关的类 客户端的Socket类 服务器端的ServerSocket类
服务器端
1 import java.io.DataInputStream; 2 import java.io.DataOutputStream; 3 import java.io.IOException; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 import java.net.SocketTimeoutException; 7 8 /** 9 * Created by ht on 2017/8/1. 10 */ 11 public class SocketServer extends Thread{ 12 13 private ServerSocket serverSocket; 14 15 public SocketServer(int port) throws IOException 16 { 17 //创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口 18 serverSocket = new ServerSocket(port); 19 serverSocket.setSoTimeout(10000); 20 } 21 22 public void run() 23 { 24 while(true) 25 { 26 try 27 { 28 System.out.println("Waiting for client on port " + serverSocket.getLocalPort() + "..."); 29 //调用accept()方法开始监听,等待客户端的连接 30 Socket server = serverSocket.accept(); 31 System.out.println("Just connected to " + server.getRemoteSocketAddress()); 32 //获取输入流,并读取客户端信息 33 DataInputStream in = new DataInputStream(server.getInputStream()); 34 System.out.println(in.readUTF()); 35 //获取输出流,响应客户端的请求 36 DataOutputStream out = new DataOutputStream(server.getOutputStream()); 37 out.writeUTF("Thank you for connecting to " + server.getLocalSocketAddress() + "\\nGoodbye!"); 38 //关闭资源 39 server.close(); 40 }catch(SocketTimeoutException s) 41 { 42 System.out.println("Socket timed out!"); 43 break; 44 }catch(IOException e) 45 { 46 e.printStackTrace(); 47 break; 48 } 49 } 50 } 51 public static void main(String [] args) 52 { 53 int port = Integer.parseInt(args[0]); 54 try 55 { 56 //用一个线程跑,跑完直接结束 57 Thread t = new SocketServer(port); 58 t.start(); 59 }catch(IOException e) 60 { 61 e.printStackTrace(); 62 } 63 } 64 }
客户端
1 import java.io.*; 2 import java.net.Socket; 3 4 /** 5 * Created by ht on 2017/8/1. 6 */ 7 public class SocketClient { 8 public static void main(String[] args) { 9 String serverName = args[0]; 10 int port = Integer.parseInt(args[1]); 11 try 12 { 13 System.out.println("Connecting to " + serverName + " on port " + port); 14 //创建客户端Socket,指定服务器地址和端口 15 Socket client = new Socket(serverName, port); 16 System.out.println("Just connected to " + client.getRemoteSocketAddress()); 17 //获取输出流,向服务器端发送信息 18 OutputStream outToServer = client.getOutputStream(); 19 DataOutputStream out = new DataOutputStream(outToServer); 20 out.writeUTF("Hello from " + client.getLocalSocketAddress()); 21 //获取输入流,并读取服务器端的响应信息 22 InputStream inFromServer = client.getInputStream(); 23 DataInputStream in = new DataInputStream(inFromServer); 24 System.out.println("Server says " + in.readUTF()); 25 //关闭资源 26 client.close(); 27 }catch(IOException e) 28 { 29 e.printStackTrace(); 30 } 31 } 32 }
编译两个实现类
分别启动两个命令符,先启动服务端,再启动客户端
4 Datagram: 使用UDP协议,将数据保存在数据报中,通过网络进行通信,进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去
服务器端代码
1 //服务器端,实现基于UDP的用户登录 2 //创建服务器端DatagramSocket,指定端口 3 DatagramSocket socket =new DatagramSocket(10010); 4 //创建数据报,用于接受客户端发送的数据 5 byte[] data = new byte[1024]; 6 DatagramPacket packet =new DatagramPacket(data,data.length); 7 //接受客户端发送的数据 8 socket.receive(packet);//此方法在接受数据报之前会一致阻塞 9 //读取数据 10 String info = newString(data,o,data.length); 11 System.out.println("我是服务器,客户端说"+info); 12 //========================================================= 13 //向客户端响应数据 14 //定义客户端的地址、端口号、数据 15 InetAddress address = packet.getAddress(); 16 int port = packet.getPort(); 17 byte[] data2 = "欢迎您!".getBytes(); 18 //创建数据报,包含响应的数据信息 19 DatagramPacket packet2 = new DatagramPacket(data2,data2.length,address,port); 20 //响应客户端 21 socket.send(packet2); 22 //关闭资源 23 socket.close();
客户端代码
1 //客户端 2 //定义服务器的地址、端口号、数据 3 InetAddress address = InetAddress.getByName("localhost"); 4 int port = 10010; 5 byte[] data = "用户名:admin;密码:123".getBytes(); 6 //创建数据报,包含发送的数据信息 7 DatagramPacket packet = new DatagramPacket(data,data.length,address,port); 8 //创建DatagramSocket对象 9 DatagramSocket socket = new DatagramSocket(); 10 //向服务器发送数据 11 socket.send(packet); 12 //接受服务器端响应数据 13 //====================================== 14 //创建数据报,用于接受服务器端响应数据 15 byte[] data2 = new byte[1024]; 16 DatagramPacket packet2 = new DatagramPacket(data2,data2.length); 17 //接受服务器响应的数据 18 socket.receive(packet2); 19 String raply = new String(data2,0,packet2.getLength()); 20 System.out.println("我是客户端,服务器说:" + raply); 21 //关闭资源 22 socket.close();
DNS作用(域名系统的缩写,也称作名称解析)
在互联网中,通过IP地址来进行通信
IP地址用数字表示,记忆困难,改成域名方便记忆。例如:116.213.123.342 ==> www.baidu.com
网关作用
1. 又称网间连接器,协议转化器
2. 网关在网络层以上实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连
3. 既可以用于广域网互连,也可以用于局域网互连
4. 是一种充当转换重任的服务器或路由器
以上是关于Linux网络管理的主要内容,如果未能解决你的问题,请参考以下文章
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装