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() + "
Goodbye!");
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. 是一种充当转换重任的服务器或路由器

原文地址:https://www.cnblogs.com/hzzjj/p/6817403.html