1.TCP和UDP的区别是什么?
-
连接方面:
- TCP 是一种面向连接的协议,它要求先建立连接,再进行数据传输,最后释放连接。
- UDP 是一种无连接的协议,它不需要事先建立连接,而是直接将数据包发送到目标地址。
-
可靠方面:
- TCP 提供数据传输的可靠性,它会确保数据按顺序到达目的地,并且会检查数据是否有丢失或损坏,如果有丢失或损坏的情况,TCP 会重新发送数据。
- UDP 不提供数据传输的可靠性,它不会对数据的顺序、丢失或损坏进行检查和修复,因此在传输过程中可能会出现数据丢失或乱序的情况。
-
数据方面:
- TCP 的数据传输是面向字节的,数据会被分割成 TCP 分组进行传输,并且有流量控制和拥塞控制机制。
- UDP 不会对数据做分割,数据会整个地放入 UDP 数据包中进行传输,因此对于大量数据的传输可能会出现分片的情况。
-
应用场景:
- TCP 通常用于对数据传输可靠性要求较高的应用,比如网页浏览、文件传输、电子邮件等。
- UDP 适用于对实时性要求较高的应用,比如音频、视频流媒体、在线游戏等,因为它能够提供更快速的数据传输,并且对数据丢失的容忍度较高。
2.TCP: 原理 基于TCP的应用协议 场景
TCP是一种面向连接的、可靠的、基于字节流的传输层协议。其原理包括以下几个重要特点:
-
连接和释放:TCP在进行数据传输之前需要建立连接,通过三次握手来确保通信双方的正常连接。一旦连接建立,数据就可以在通信双方之间进行传输。传输完成后,通过四次挥手来释放连接。
-
可靠性:TCP提供了数据传输的可靠性。它采用序号、确认应答和校验和等技术来确保数据的完整性和有序性。如果发现数据有丢失或者损坏,TCP会进行重传,以确保数据传输的完整性。
-
流量控制:TCP通过窗口控制机制来控制数据的流量,避免发送端发送速度过快导致接收端处理不过来的情况,从而确保通信双方交换数据的平衡和稳定。
基于TCP的应用协议包括但不限于以下几种:
-
HTTP(HyperText Transfer Protocol):被广泛用于互联网上传输超文本文档,即网页数据的协议。
-
FTP(File Transfer Protocol):用于在网络上进行文件传输的协议,支持文件存储、上传和下载操作。
-
SMTP(Simple Mail Transfer Protocol):用于发送电子邮件的协议,主要负责邮件的发送过程。
-
POP3(Post Office Protocol version 3)和 IMAP(Internet Message Access Protocol):用于接收邮件的协议。
基于TCP的协议适用于数据传输更为可靠性要求较高的场景,包括但不限于:
- 传输大文件:比如下载文件、通过FTP传输文件等。
- 网络浏览:浏览网页时使用的HTTP协议。
- 电子邮件传输:发送和接收邮件时使用的SMTP、POP3和IMAP等协议。
- 远程登录:在网络上进行远程登录和操作时,通常使用SSH等基于TCP的协议。
3.UDP: 原理 基于UDP的应用协议 场景
UDP(User Datagram Protocol)是一种无连接的、轻量级的传输层协议,与TCP相比,它更加简单,不提供像流量控制和数据完整性校验等可靠性特性,但能够提供更快速的数据传输。其原理包括以下几个重要特点:
-
无连接性:UDP不需要建立连接,数据直接封装在UDP数据包中发送出去,接收端也无需进行连接建立的过程,减少了数据传输的延迟。
-
不可靠性:UDP不提供数据传输的可靠性,它不会进行数据丢失和重传处理,也不保证数据包按序到达。
-
轻量级:UDP头部信息比TCP要小得多,减少了网络开销。UDP更适合对实时性和速度要求较高的应用。
基于UDP的应用协议包括但不限于以下几种:
-
DNS(Domain Name System):用于将域名解析为IP地址的协议,它通常使用UDP来进行域名查询。
-
DHCP(Dynamic Host Configuration Protocol):用于在网络上为设备分配IP地址和其他网络配置参数的协议,其中的DHCP Discover 和DHCP Offer 初始IP地址获取过程默认使用UDP协议。
-
RTP(Real-time Transport Protocol):用于在互联网上传输多媒体数据流的协议,包括音频和视频数据的传输。
-
TFTP(Trivial File Transfer Protocol):用于进行简单的文件传输的协议,它也是基于UDP的。
基于UDP的协议适用于实时性要求较高的场景,包括但不限于:
- 实时音视频传输:比如视频会议、网络直播等,使用RTP协议来传输数据。
- 实时游戏:网络游戏中的实时交互和数据传输,通常会使用UDP来降低延迟。
- 实时监控:监控系统对于实时传输视频和音频数据的场景,也适合使用UDP协议。
4.OSI网络模型
OSI网络模型的七个层次(从下到上):
-
物理层(Physical Layer):这一层负责在物理媒体上传输比特流,定义了物理连接的特性,例如电气特性和机械特性。
-
数据链路层(Data Link Layer):这一层负责通过帧来管理物理层的数据传输,提供了数据传输的可靠性和错误检测的功能。通常包括逻辑链路控制(LLC)和介质访问控制(MAC)两个子层。
-
网络层(Network Layer):这一层负责在不同网络之间传输数据,并处理路由和转发数据的功能。主要目标是确定数据的路径和转发数据。
-
传输层(Transport Layer):这一层负责端到端的通信,提供了数据传输的可靠性和完整性,同时还提供了数据流的控制和错误恢复的功能。主要协议有TCP和UDP。
-
会话层(Session Layer):这一层负责在通信系统中建立、维护和终止通信连接(会话),并提供数据交换的管理。
-
表示层(Presentation Layer):这一层负责数据的格式化和编解码,以确保不同系统之间的互操作性,比如数据的加密、压缩和格式转换等。
-
应用层(Application Layer):这一层是最靠近用户的层次,负责提供用户对网络服务的访问。包括一些常见的应用协议,比如HTTP、SMTP等。
5.TCP/IP网络模型
TCP/IP模型的结构类似于OSI模型,但是更加简单,并且在实际应用中更为广泛。
TCP/IP网络模型包括四个层次(从下到上):
-
网络接口层(Network Interface Layer):这一层负责处理位于第一层和第二层之间的通信问题,处理的对象是与传输媒介(如以太网)相关的数据帧。在TCP/IP模型中,这一层同时包含了OSI模型中的物理层和数据链路层。
-
网络层(Internet Layer):这一层负责在互联网中传输数据,并处理数据包的路由和转发问题。其中的IP,ICMP协议就是在这一层工作。
-
传输层(Transport Layer):在TCP/IP模型中,传输层与OSI模型的传输层对应。它负责端到端的通信,并提供了数据传输的可靠性和完整性。主要的协议包括TCP和UDP。
-
应用层(Application Layer):与OSI模型中的应用层类似,TCP/IP的应用层包括用户可以直接使用的各种应用协议,比如HTTP、SMTP、FTP等等。
6.解释什么是DNS以及它是如何工作的。
DNS(Domain Name System)是互联网上的一种服务,它将域名(如www.example.com)转换为与之相关的IP地址(如192.0.2.1)。
DNS的工作原理如下:
-
当用户在浏览器中输入一个域名时,操作系统会首先检查本地的DNS缓存,如果有对应的IP地址,则直接返回给浏览器,这样可以避免重复的DNS查询。
-
如果本地DNS缓存中没有相应的IP地址,操作系统会将DNS查询发送给本地的DNS服务器,通常这是由网络服务提供商或者网络管理员管理的DNS服务器。
-
如果本地DNS服务器也没有对应的IP地址,它会查询根域名服务器,根域名服务器是DNS层次结构的最顶层,它负责指导查询到达正确的顶级域名服务器(如.com、.net等)。
-
接着,根域名服务器会将查询传递给顶级域名服务器,比如.com域名的顶级域名服务器,然后再将查询传递给次级域名服务器,直到找到负责相应域名的IP地址的域名服务器。
-
返回找到的IP地址链回给用户,同时将IP地址缓存在本地DNS服务器,以加速以后的查询。
7.在浏览器输入一个网址,然后看到网页背后的网络活动的全过程
-
DNS解析:浏览器会首先检查自己的缓存来查找输入的网址对应的IP地址。如果找不到,浏览器会向操作系统发送一个DNS解析请求,操作系统会将该请求发送到本地DNS服务器。
-
建立TCP连接:一旦浏览器获得了目标服务器的IP地址,它会使用HTTP协议向服务器发送请求。如果网站使用HTTPS,还会有SSL/TLS握手用于建立安全连接。
-
发送HTTP请求:浏览器会向服务器发送一个HTTP请求,请求中包含了要访问的网页资源的详细信息,包括请求的方式(GET、POST等)、所需的资源等。
-
服务器处理请求:一旦服务器接收到了浏览器发送的HTTP请求,它会对请求进行处理,并返回相应的网页内容。服务器端可能会与数据库或其他服务器进行交互,获取请求的数据。
-
接收网页内容:浏览器接收到服务器返回的网页内容,包括HTML、CSS、JavaScript文件以及媒体文件等。
-
页面渲染:浏览器开始解析HTML和CSS,构建DOM树和渲染树,然后将这些内容在屏幕上展示出来。同时,浏览器会执行JavaScript代码,以便更新页面内容、处理用户交互等。
-
关闭连接:一旦网页内容加载完成,浏览器和服务器之间的TCP连接会被关闭。如果你在网页中点击了链接或者进行了其他的操作,上述过程会再次重复。
8.套接字:Socket
Socket 实际上是一个信息对象,用来记录连接信息。
Socket 可以实现两台计算机之间的通信,无论这两台计算机是位于同一台设备上还是位于不同的设备上。
在通信模型中,服务端以及客户端都会有一个,并且为绑定关系。
其主要功能包括:
-
建立连接:Socket 提供了建立连接的机制,使得客户端和服务器端程序能够互相通信。客户端和服务器端可以分别创建各自的 Socket,并将它们连接起来,从而建立起通信通道。
-
数据传输:Socket 允许程序在连接上进行数据的发送和接收。通过读取和写入 Socket,程序可以实现数据的传输,比如发送请求、接收响应等。
-
通信协议:Socket 提供了不同的通信协议的实现,如 TCP (传输控制协议)、UDP (用户数据报协议) 等。
通信模型:
C-S 模型:
客户端和服务器通信方式:
-
套接字(Socket)通信:客户端和服务器通过套接字建立TCP或UDP连接进行通信。套接字是一种通信机制,通过它客户端和服务器可以在网络上进行双向通信。
-
HTTP通信:在Web应用程序中,客户端通常通过HTTP协议向服务器发出请求,服务器则返回相应的HTTP响应。是Web浏览器和Web服务器之间最常见的通信方式。
-
远程过程调用(RPC):客户端可以通过远程过程调用协议调用服务器上的函数或过程,并且服务器可以返回相应的结果。这种通信方式通常用于分布式系统中。
-
RESTful通信:基于REST(Representational State Transfer)架构风格的客户端和服务器之间的通信。客户端可以使用HTTP协议进行GET、POST、PUT、DELETE等操作来访问服务器上的资源。
-
数据库通信:客户端可以通过数据库连接向服务器请求数据,服务器则返回所需的数据库查询结果。
-
远程登录(SSH、Telnet):客户端可以通过SSH或Telnet等协议登录到远程服务器上进行交互式的会话。
客户端实现:
//TCPClient
import
java.io.*;
import
java.net.*;
/**
* 最常见的网络通信TCPClient内容
*/
public class TCPClient {
public static void main(String[] args) throws IOException {
String serverHostname = "localhost";
//1. 创建的客户端socket 需要指定服务端的IP地址+端口号 才可以连接服务端
Socket socket = new Socket(serverHostname, 51234);
//2. A 端的 socket 是客户端这边负责与服务端建立连接的
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new
InputStreamReader(socket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);// 发送给服务器
System.out.println("服务器响应: " + in.readLine());// 接收服务器的一条数据
}
out.close();
in.close();
stdIn.close();
socket.close();
}
}
服务端实现:
//TCPServer
import
java.io.*;
import
java.net.*;
/**
* 最常见的网络通信TCPServer内容
*/
public class TCPServer {
public static void main(String[] args) throws IOException {
//1. ServerSocket 服务端套接字 - 主动绑定端口
ServerSocket serverSocket = new ServerSocket(51234);
System.out.println("等待连接...");
//2. 阻塞等待客户端的连接
Socket clientSocket = serverSocket.accept();
System.out.println("连接成功!");
//3. clientSocket 服务端建立与客户端的连接的负责人
BufferedReader in = new BufferedReader(new
InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
//4.读取客户端发送的信息
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("客户端说:" + inputLine);
out.println(inputLine);
}
//5. 关闭io流
in.close();
out.close();
//6.关闭连接
clientSocket.close();
serverSocket.close();
}
}
安全性保障:
-
认证(Authentication):在客户端和服务器之间的通信中,通常需要对双方进行身份认证,以确保客户端和服务器都是合法且可信的。常见的认证方式包括用户名和密码、数字证书、双因素认证等。
-
授权(Authorization):一旦客户端和服务器完成认证,服务器会根据客户端的身份和权限来决定对其请求的授权级别。服务器在收到请求后会检查客户端是否有足够的权限来执行所请求的操作。
-
数据加密(Data Encryption):通过对数据进行加密,可以确保通信中的数据在传输过程中不被未经授权的人员窃取或篡改。常见的加密方式包括SSL/TLS协议、IPSec协议等。
-
安全通信协议:使用安全的通信协议能够确保客户端和服务器之间的通信是受保护的。例如,HTTPS协议在HTTP协议的基础上增加了SSL/TLS加密,用于保护在客户端和服务器之间的数据传输。
-
安全认证协议:通过安全认证协议规范化身份认证和授权,确保客户端和服务器之间的通信是安全的。例如,Kerberos、OAuth等安全认证协议。
-
防火墙和入侵检测系统:这些安全设备可以对网络流量进行监控和过滤,以保护客户端和服务器免受未经授权的访问和攻击。防火墙可以限制网络流量,入侵检测系统可以检测潜在的攻击行为。
拓展:S-S模型:
一个计算机服务器(源服务器)通过网络将数据发送给另一个计算机服务器(目标服务器)。
通信方式:
-
使用标准的网络协议:服务器之间的通信可以使用标准的网络协议,如TCP/IP,HTTP,HTTPS,FTP,SMTP等。这些协议提供了可靠的通信机制,并具有广泛的支持和成熟的实现。
-
RPC(远程过程调用)框架:RPC框架允许服务器之间通过远程调用的方式进行通信。常见的RPC框架包括gRPC、Apache Thrift、CORBA等,它们提供了统一的接口和序列化协议,简化服务器之间的通信。
-
消息队列系统:使用消息队列系统(如RabbitMQ,Apache Kafka,ActiveMQ等)作为通信中介,服务器之间可以通过发布-订阅或点对点的方式进行异步通信,实现解耦和消息传递。
// 源服务器代码
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
public class SourceServer {
public static void main(String[] args) {
try {
// 连接目标服务器
Socket socket = new Socket("目标服务器IP地址", 目标服务器端口号);
// 发送数据到目标服务器
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("要发送的数据");
// 接收目标服务器的响应
// ...
// 关闭连接
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 目标服务器代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TargetServer {
public static void main(String[] args) {
try {
// 监听指定端口
ServerSocket serverSocket = new ServerSocket(目标服务器端口号);
// 接受来自源服务器的连接
Socket socket = serverSocket.accept();
// 接收源服务器发送的数据
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String data = in.readLine();
// 对数据进行处理、分析或响应
// ...
// 发送响应到源服务器
// ...
// 关闭连接
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}