网络知识
1. 网络协议为什么都要分层
- 简化设计复杂性:将庞大复杂的网络通信任务分解为多个相对简单的子任务,每个子任务由一层来完成,便于设计、实现和维护。
- 独立性与可扩展性:各层相互独立,一层的变化通常不会影响其他层,有利于技术的更新和功能的扩展。
- 促进标准化:每一层的功能和服务都有明确规范,便于不同厂商的设备和软件遵循统一标准,实现互联互通。
- 便于故障排查:分层结构使得网络故障的定位和排查更加容易,可快速确定问题所在的层次。
2. 什么是网络协议
网络协议是指为计算机网络中进行数据交换而建立的规则、标准或约定的集合。它规定了通信双方在数据传输、交换和处理等过程中的格式、顺序、动作和响应等,确保不同设备和系统之间能够准确、可靠地进行通信。
3. 常见的协议
- 应用层:HTTP(超文本传输协议)用于网页数据传输;FTP(文件传输协议)用于文件的上传和下载;SMTP(简单邮件传输协议)用于发送邮件;POP3(邮局协议版本3)用于接收邮件;DNS(域名解析协议)用于将域名转换为IP地址。
- 传输层:TCP(传输控制协议)提供可靠的面向连接的传输服务;UDP(用户数据报协议)提供无连接的不可靠传输服务。
- 网络层:IP(网际协议)负责网络中数据的寻址和路由;ARP(地址解析协议)用于将IP地址转换为物理地址。
- 数据链路层:PPP(点对点协议)常用于拨号上网等场景;Ethernet(以太网协议)用于局域网通信。
4. OSI七层参考模型
- 应用层:为用户提供访问网络的接口,提供如HTTP、FTP等应用程序服务。
- 表示层:负责数据的格式化、加密、解密、压缩、解压缩等,确保不同系统间数据格式的兼容性。
- 会话层:建立、维护和管理会话连接,如会话的建立、拆除和同步等。
- 传输层:为用户提供可靠的端到端服务,处理数据包错误、顺序等问题,常见协议有TCP和UDP。
- 网络层:实现节点间数据传输的逻辑链路创建、路由选择、拥塞控制和网络互联等,主要协议是IP。
- 数据链路层:实现网卡接口的网络驱动,处理数据在物理媒介上的传输,通过“帧”传输,进行差错控制和流量控制。
- 物理层:是网络通信的数据传输介质,负责处理数据传输和监控数据错误率,实现数据流的透明传输。
5. TCP/IP参考模型
- 应用层:提供用户访问网络的接口和常用应用程序服务,与OSI应用层功能类似。
- 传输层:提供可靠或不可靠的端到端数据传输服务,屏蔽下层通信细节,主要有TCP和UDP协议。
- 网络层:负责数据的寻址、路由选择和网络互联等,核心协议是IP。
- 数据链路层:实现数据在物理链路中的传输,进行差错检测和纠正等。
6. 什么是TCP协议
TCP(传输控制协议)是一种可靠的、面向连接的、基于字节流的传输层通信协议。通信双方在传输数据前需先建立TCP连接,在通信过程中,通过超时重传、数据确认、数据校验等机制保证数据传输的可靠性,通信结束后通过四次挥手关闭连接。
7. 什么是UDP协议
UDP(用户数据报协议)是一种无连接的、不可靠的数据报协议。在通信前无需与对方建立连接,直接在数据包中加入接收方的IP地址及端口号就可发送数据,发送方不关心接收方是否能收到数据,具有效率高但不保证可靠性的特点,且发送的数据报有大小限制,超出限制需分包发送。
8. 电脑上有多少个端口号
电脑上TCP和UDP的端口号都有65536个,端口号范围是0 - 65535。其中,0 - 1023为知名端口,通常被一些特定的系统服务占用;1024 - 49151为注册端口,一般由应用程序使用;49152 - 65535为动态或私有端口,可由应用程序动态分配使用。
9. TCP的三次握手是怎么进行的
- 第一次握手:客户端发送一个带有“SYN=1,ACK=0”标志的数据包给服务器端,请求建立连接。
- 第二次握手:服务器端收到请求后,若允许连接,则发送一个包含“SYN=1,ACK=1”标志的数据包给客户端,告知客户端可以通讯,并让客户端发送一个确认数据包。
- 第三次握手:客户端再发送一个包含“SYN=0,ACK=1”的数据包给服务器端,告诉服务器端连接已被确认,此时TCP连接建立完成。
10. TCP的四次挥手关闭连接
- 第一次挥手:主动关闭方发送关闭请求指令“FIN”,然后进入“等待关闭状态”,不再向对方发送数据。
- 第二次挥手:接收方收到关闭请求后,因可能有数据正在发送,不会马上关闭,而是发送“ACK”给主动关闭方,告知已收到关闭请求并同意关闭,但需等待数据传输完毕。
- 第三次挥手:接收方数据传输完毕后,向主动关闭方发送“FIN”,告知可以关闭连接。
- 第四次挥手:主动关闭方再次向接收方发送“ACK”确认指令,双方达成一致,连接关闭。
11. 什么是HTTP协议?什么是HTTPS协议
- HTTP协议:超文本传输协议,是用于从万维网服务器传输超文本到本地浏览器的传送协议,它规定了客户端和服务器之间请求和响应的格式与规则,以实现网页等资源的获取和展示。
- HTTPS协议:安全超文本传输协议,它是在HTTP的基础上加入了SSL/TLS加密层,对数据进行加密传输,确保数据的保密性、完整性和身份验证,提高了网络通信的安全性。
12. 如何使用HTTPS协议
- 获取SSL/TLS证书:从权威的证书颁发机构(CA)申请或购买SSL/TLS证书,也可使用免费的证书,如Let’s Encrypt提供的证书。
- 配置服务器:将证书安装到Web服务器上,并进行相关配置,如在Apache、Nginx等服务器中设置证书路径等参数。
- 更新网站链接:将网站的所有链接从HTTP改为HTTPS,确保客户端与服务器之间的通信都通过加密的连接进行。
- 浏览器支持:用户无需进行额外操作,现代浏览器都支持HTTPS协议,会自动验证证书的有效性并进行加密通信。
13. Java如何实现网络编程
Java通过java.net
包下的类来实现网络编程:
- 基于TCP:使用
ServerSocket
类创建服务器端,监听指定端口,等待客户端连接;使用Socket
类创建客户端,与服务器端建立连接,然后通过输入输出流进行数据的读写。 - 基于UDP:使用
DatagramSocket
类既可以作为发送方也可以作为接收方,通过DatagramPacket
类来封装要发送或接收的数据报,实现数据的发送和接收。
14. 基于TCP的Socket的实现(服务端代码示例)
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) {
try {
// 创建ServerSocket,监听指定端口
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器已启动,正在监听端口8888...");
// 等待客户端连接
Socket socket = serverSocket.accept();
System.out.println("客户端已连接:" + socket.getInetAddress().getHostAddress());
// 获取输入流,读取客户端发送的数据
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int length;
StringBuilder message = new StringBuilder();
while ((length = inputStream.read(buffer))!= -1) {
message.append(new String(buffer, 0, length));
}
System.out.println("收到客户端消息:" + message.toString());
// 获取输出流,向客户端发送数据
OutputStream outputStream = socket.getOutputStream();
String response = "收到你的消息啦!";
outputStream.write(response.getBytes());
// 关闭连接
inputStream.close();
outputStream.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}