网络基础
跳到导航
跳到搜索
关于
通过调用套接字接口来实现进程间通信的程序设计就是网络编程。
网络编程三要素:
- IP:IP地址
- Port:端口号
- Protocol:网络通信协议
IP
IP:“Internet Protocol”,网际互联协议,是TCP/IP体系中的网络层协议,为计算机网路互连通信而设计,IP地址具有唯一性。
IP地址根据网络通讯协议的不同,分为两种:
- IPv4:网际协议版本4(全称 Internet Protocol version 4,简称IPv4),如:“192.168.0.7”;
- IPv6:互联网协议第6版(全称 Internet Protocol Version 6,简称IPv6),如:“1080:0:0:0:8:800:200C:417A”;
IP地址编址方案:
- A、B、C是基本类,D、E类作为多播和保留使用;
- 本机IP地址:Localhost:127.0.0.1
- A类:10.0.0.0 -- 10.255.255.255
- B类:172.16.0.0 -- 172.31.255.255
- C类:192.168.0.0 -- 192.168.255.255
- D类:224.0.0.0 -- 239.255.255.255(组播地址,这个范围内的每个IP地址,都代表一组特定的主机)
Java 中的IP
“InetAddress”类来表示IP地址:“Inet4Address”类(IPv4)和“Inet6Address”类(IPv6)。
使用:
public class InetAddressDemo {
public static void main(String[] args) throws Exception {
InetAddress ip = InetAddress.getLocalHost();
System.out.println("ip: " + ip.toString());
System.out.println("hostName: " + ip.getHostName());
System.out.println("hostAddress: " + ip.getHostAddress());
System.out.println("localHost: " + InetAddress.getLocalHost());
System.out.println("isReachable: " + InetAddress.getLocalHost().isReachable(1000));
}
}
输出:
ip: SHISAN-WIN10/192.168.44.1
hostName: SHISAN-WIN10
hostAddress: 192.168.44.1
localHost: SHISAN-WIN10/192.168.44.1
isReachable: true
Port
端口:设备与外界通讯交流的出口。
- 虚拟端口:计算机内部或交换机路由器内的端口,常用端口如:80、21、23等;
- 物理端口:设备的硬件端口,常见如:交换机、路由器、集线器等的RJ45端口,电话的RJ11插口等。
- 一个IP地址的端口可以有:“2^16 = 65536”个(范围:“0 — 65535”);
Protocol
协议:即“网络协议”,是要通信的计算机双方必须共同遵从的一组约定。
- 只有双方都按照通信规则建立连接,通信才能完成。
协议的三要素:
- 语法:协议中数据和要传输的信息的结构或格式;
- 语义:发出何种控制信息,可以完成何种动作,又会做出何种响应;
- 时序(同步):即事件实现顺序的详细说明。
常见的网络协议:
- 在网络模型中各层有不同的协议;
- http:超文本传输协议资源,基本所有面向用户的网络应用都是使用http协议进行通信的;
- https:用安全套接字层传送的超文本传输协议;
- ftp:文件传输协议;
- mailto:电子邮件地址;
- file:当地电脑或网上分享的文件,当我们用浏览器打开本地文件时便会看到这个协议;
Socket
网络套接字:源IP地址、目的IP地址、源端口号、目的端口号的组合,用于标识客户端请求的服务器和服务。
- 应用程序可以通过套接字打开、读写、关闭数据,允许应用程序在网络中加入I/O,与网络中的其他应用程序进行通信。
- 每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。
根据RFC793的定义:IP地址和端口号组合起来就构成了套接字。 套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号, 展现形式是点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开, 即:“主机IP地址:端口号”,如“113.301.151.231:23”。
两个应用程序之间的数据传输要通过套接字来完成: 当两个网络应用程序进行通信时,其中的一个网络应用程序将要传输的信息写入它所在主机的Socket中, 然后该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到其他程序中。 TCP/IP的核心内容被封装在操作系统中,并向外提供了编程接口,如果应用程序要使用TCP/IP,可以通过系统提供的TCP/IP的编程接口来实现: 在Windows环境下,网络应用程序编程接口称作Windows Socket, 在Linux环境下,Linux socket API存在头文件sys/socket.h中。
TCP 与 UDP
TCP、UDP,是传输层中的常用协议:
- TCP :面向连接(经历三次握手)、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。
- 工作模式在服务端和客户端之间进行。
- UDP:面向非连接、传输不可靠(容易发生丢包,导致数据丢失)、用于传输少量数据(数据报包模式)、速度快。
- 工作模式在发送端和接收端客户端之间进行。
Java:TCP
服务端:
public class Server {
public static void main(String[] args) throws Exception {
String data = "我是tcp的服务端";
// 创建TCP服务端,指定端口为8888
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务端已就绪!");
// 允许客户端建立连接
boolean accept = true;
while (accept) {
Socket client = serverSocket.accept();
System.out.println("客户端 :" + client.getInetAddress() + " 已连接。");
// 通过客户端的输出流,给客户端输出数据
PrintStream print = new PrintStream(client.getOutputStream());
print.println(data);
print.close();
}
serverSocket.close();
}
}
客户端:
public class Client {
public static void main(String[] args) throws Exception {
// 创建客户端,与服务端建立连接
Socket client = new Socket("localhost", 8888);
// 输出服务端输入的数据
Scanner scanner = new Scanner(client.getInputStream());
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
scanner.close();
client.close();
}
}
Java:UDP
发送端:
public class Send {
public static void main(String[] args) throws Exception {
String data = "我是udp的发送端";
// 创建发送端
DatagramSocket sender = new DatagramSocket(13000);
// 发送数据
DatagramPacket dp = new DatagramPacket(
data.getBytes(), // 发送的数据
data.getBytes().length, // 发送的数据的长度
InetAddress.getLocalHost(), // 接收端的ip
14000); // 接收端的端口
sender.send(dp);
sender.close();
}
}
接收端:
public class Receive {
public static void main(String[] args) throws Exception {
// 创建接收端
DatagramSocket receiver = new DatagramSocket(14000);
byte[] buffer = new byte[1024];
// 接收数据
DatagramPacket dp = new DatagramPacket(buffer, 1024);
receiver.receive(dp);
// 打印接收到的数据
String msg = new String(dp.getData(), 0, dp.getLength());
System.out.println("接收到的数据:" + msg);
}
}
URI、URL、URI
URI:统一资源标识符(Uniform Resource Identifier,简称URI),是一个用于标识联网资源名称的字符串,能够在世界范围内唯一标识某一资源。
- URI有两种形式,即“URL”和“URN”。
URL:统一资源定位符,用于定位某一互联网上的资源,是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示。
- 是资源标识符最常见的形式,使用URL可以明确说明如何从一个精确、固定的位置获取资源。
- 互联网上的每个资源都有一个唯一的URL,指定文件的位置以及客户端的处理方式;
大部分的URL,都是由三部分组成:
- “scheme”:这里通常是协议头,如:“http”,“https”;
- 服务器地址:域名或IP地址,如:“baidu.com”;
- 资源位置:跟在服务器地址之后的部分,比如:“/index”,其指定了服务器上的某个资源;
URN:统一资源名,作为特定内容的唯一名称使用,而与资源所在的位置无关。
- 使用URN,就不必担心因资源迁移而导致无法访问的问题。
- 还可以使用同一个名称通过多种网络协议来访问资源。
如:“urn:ietf:rfc:2141”可以用来命名“RFC 2141”文档,而不必担心其位于何处。
MIME
MIME编码:“Multipurpose Internet Mail Extension”,即多用途因特网邮件扩展,用于在 HTTP协议中,使用其来标记资源文件类型;
- (最初的设计是为了解决在不同的电子邮件系统之间来回搬移报文时存在的问题)
- MIME 由一种主要的资源类型和一个子类型组成,并用“/”分隔;
常见的MIME类型:
- “text/html”:表示html格式的文本文档;
- “text/plain”:表示ASCII格式的文本文档;
- “image/jpeg”:表示jpeg格式的图片;
- “image/gif”:表示gif格式的图片;
- “video/quicktime”:表示apple的QuickTime电影类型;
- “application/vnd.ms-powerpoint”:表示微软的ppt文档;
网络模型
- OSI七层模型:应用层(Application)、表示层(Presentation)、会话层(Session)、传输层(Transport)、网络层(Network)、数据链路层(Data Link)、物理层(Physical)。
- 五层体系结构:应用层、运输层、网络层、数据链路层、物理层。
- 五层协议只是OSI和TCP/IP的综合,实际应用还是TCP/IP的四层结构;
- TCP/IP模型:应用层、运输层、网际层、网络接口层。
- TCP/IP 参考了OSI模型,将 最上的3层(应用层、表示层、会话层)视为应用层,将最下的2层(数据链路层、物理层)视为网络接口层;
三种模型结构:
各层协议
应用层 |
|
传输层 |
|
网络层 |
|
数据链路层 | 802.11 * 802.16 * Wi-Fi * WiMAX * ATM * DTM * 令牌环 * 以太网 * FDDI * 帧中继 * GPRS * EVDO * HSPA * HDLC * PPP * L2TP * ISDN |
物理层 | 以太网物理层 * 调制解调器 * PLC * SONET/SDH * G.709 * 光导纤维 * 同轴电缆 * 双绞线 |