1、TCP和UDP概述
TCP(传输控制协议,Transmission Control Protocol)和UDP(用户数据报协议,User Datagram Protocol)都算是最底层的通信协议,它们位于OSI模型的传输层。*传输层的主要职责是确保数据能够在不同设备之间可靠地传输,并提供端到端的通信服务。*TCP和UDP是两种最常见的传输层协议,它们各自有不同的特点和适用场景。
TCP是一种面向连接、可靠的传输协议,适用于需要高可靠性和顺序保证的应用。它提供了流量控制、拥塞控制和重传机制,确保数据的完整性和正确性。然而,TCP的延迟较高,吞吐量也相对较低。
三次握手:(建立连接)
- 第一次握手:客户端发送SYN段给服务端。
- 第二次握手:服务器收到SYN后,发送SYN-ACK段给客户端。
- 第三次握手:客户端收到SYN-ACK后,发送ACK(确认)段。
注意:
为了确保连接创建的准确性,3次握手采用了计时+确认的机制。
即:客户端发出SYN后,会开始计时,在计时内收到服务端的SYN+ACK,那么就算是正常的。同理,服务端返回SYN+ACK时,也会开启计时,在计时内客户端返回ACK,则算是正常,完成连接创建。如果在有一次在计时内没有做出回应,那么连接就失败了,就需要重头来开始3次握手。
四次挥手:(终止连接)
- 第一次挥手:主动关闭方发送FIN段。
- 第二次挥手:被动关闭方发送ACK段。
- 第三次挥手:被动关闭方发送FIN段。
- 第四次挥手:主动关闭方发送ACK段,并进入TIME_WAIT状态。
UDP是一种无连接、不可靠的传输协议,适用于对实时性要求较高的应用。它具有较低的延迟和较高的吞吐量,但不提供可靠性保证。UDP适合用于那些可以容忍少量数据丢失的应用,如视频流、语音通话和在线游戏等。
选择使用TCP还是UDP取决于你的具体需求。如果你的应用需要高可靠性和顺序保证,那么TCP是更好的选择;如果你的应用对实时性要求较高,且可以容忍少量数据丢失,那么UDP更加合适。
2、TCP和UDP的区别
(1)、面向连接vs无连接
TCP是面向连接的协议,这意味着在数据传输之前,发送方和接收方必须先建立一个可靠的连接。这个过程通过三次握手来完成:发送方发送SYN(同步请求),接收方回应SYN-ACK(同步确认),然后发送方再发送ACK(确认)。只有当连接成功建立后,数据传输才能开始。传输结束后,还需要通过四次挥手来终止连接。
UDP则是无连接的协议,它不需要在数据传输之前建立连接。发送方可以直接发送数据报文(Datagram),而接收方也会立即接收。这种方式减少了建立连接的开销,但同时也意味着没有连接状态的维护。
(2)、可靠性
TCP提供了可靠的数据传输。它使用序列号和确认机制来确保每个数据包都能按顺序到达接收方。如果某个数据包丢失或损坏,TCP会自动请求重传该数据包,直到接收方确认收到为止。因此,TCP适合用于需要高可靠性的应用,如文件传输、电子邮件等。
UDP不提供可靠性保证。它只是简单地将数据报文发送出去,而不关心对方是否收到或是否按顺序接收。因此,UDP适合用于对实时性要求较高的应用,如视频流、语音通话等,这些应用即使偶尔丢失一些数据包也不会严重影响用户体验。
(3)、流量控制和拥塞控制
TCP提供了流量控制和拥塞控制机制。流量控制通过滑动窗口机制来限制发送方的发送速率,确保接收方不会因为接收到过多的数据而溢出。拥塞控制则通过慢启动、拥塞避免、快速重传和快速恢复等算法来避免网络拥塞,确保网络资源的有效利用。
UDP不提供流量控制和拥塞控制。发送方可以以任意速率发送数据,而不考虑网络的当前状态。这可能导致网络拥塞,尤其是在网络带宽有限的情况下。
(4)、头部开销
TCP的头部较大,通常为20字节(不含选项字段)。头部中包含了序列号、确认号、窗口大小等重要信息,用于实现可靠传输和流量控制。
UDP的头部较小,通常为8字节。头部中只包含了源端口、目标端口、长度和校验码,没有复杂的控制信息。因此,UDP的头部开销更小,适合对性能要求较高的应用。
(5)、延迟和吞吐量
TCP的延迟较高,因为它需要进行确认、重传等操作,确保数据的可靠传输。此外,TCP的流量控制和拥塞控制也会增加传输时间,因此它的吞吐量相对较低,尤其是在网络拥塞的情况下。但与此相反,TCP能提供可靠性和流量控制。
UDP的延迟较低,因为它没有确认和重传机制,数据可以直接发送和接收。这使得UDP更适合对实时性要求较高的应用,如视频流、语音通话等。由于UDP没有流量控制和拥塞控制,它的吞吐量较高,但在网络拥塞时可能会导致数据包丢失。
(6)、应用场景
TCP适用于需要高可靠性的应用,如:
- HTTP/HTTPS:网页浏览
- FTP:文件传输
- SMTP:电子邮件
- Telnet/SSH:远程登录
- 数据库通信:MySQL、PostgreSQL等
UDP适用于对实时性要求较高的应用,如:
- DNS:域名解析
- VoIP:语音通话(如 Skype、WhatsApp 语音)
- 视频流:在线视频播放(如 YouTube、Netflix)
- 在线游戏:多人游戏中的实时交互
- 实时监控:物联网设备的状态更新
扩展:TCP、Socket和WebSocket的区别
1、TCP (传输控制协议)
TCP是OSI模型中的传输层协议,负责提供可靠的数据传输服务。它确保数据包按顺序到达接收方,并且不会丢失或损坏。TCP通过序列号、确认机制、流量控制和拥塞控制等技术来保证数据的可靠性。
特点:
- 面向连接:在数据传输之前,发送方和接收方必须通过三次握手建立连接,传输结束后再通过四次挥手终止连接。
- 可靠传输:TCP提供了确认机制和重传机制,确保每个数据包都能按顺序到达接收方。
- 流量控制:通过滑动窗口机制限制发送方的发送速率,避免接收方溢出。
- 拥塞控制:通过慢启动、拥塞避免、快速重传和快速恢复等算法避免网络拥塞。
应用场景:
- HTTP/HTTPS:网页浏览
- FTP:文件传输
- SMTP:电子邮件
- Telnet/SSH:远程登录
- 数据库通信:MySQL、PostgreSQL等
TCP是一种底层的传输层协议,提供了可靠的、面向连接的通信服务。它是许多上层应用协议的基础,如HTTP、FTP、SMTP等。
2、Socket (套接字)
Socket是一个编程接口(API),用于实现网络通信。它位于应用层和传输层之间,允许应用程序通过网络与其他应用程序进行通信。Socket可以基于TCP或UDP协议工作,具体取决于应用的需求。
类型:
- 流式套接字(Stream Socket):基于TCP,提供可靠的、面向连接的通信。
- 数据报套接字(Datagram Socket):基于UDP,提供不可靠的、无连接的通信。
工作原理:
- 创建Socket:应用程序首先创建一个Socket对象,指定使用的协议(TCP或UDP)。
- 绑定地址:将Socket绑定到本地的IP地址和端口号。
- 监听连接(仅适用于服务器端):对于TCP Socket,服务器端需要调用listen()方法来等待客户端的连接请求。
- 建立连接(仅适用于TCP Socket):客户端通过connect()方法与服务器建立连接。
- 发送和接收数据:通过send()和recv()方法在客户端和服务器之间传输数据。
- 关闭连接:通信结束后,双方调用close()方法关闭连接。
(1)、基于TCP的Socket的代码示例
服务器端:
import java.io.*;
import java.net.;
public class TCPServer {
public static void main(String[] args) throws IOException {
// 创建服务器Socket,监听8080端口
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("Server is listening on port 8080");
// 等待客户端连接
Socket clientSocket = serverSocket.accept();
System.out.println("Client connected");
// 获取输入输出流
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
// 读取客户端消息并回复
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received: " + inputLine);
out.println("Echo: " + inputLine);
}
// 关闭连接
clientSocket.close();
serverSocket.close();
}
}
客户端:
import java.io.;
import java.net.;
public class TCPClient {
public static void main(String[] args) throws IOException {
// 客户端,用于连接到服务器端
Socket socket = new Socket("localhost", 8080);
System.out.println("Connected to server");
// 获取输入输出流
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("Server response: " + in.readLine());
}
// 关闭连接
socket.close();
}
}
Socket是一个编程接口,允许应用程序通过网络与其他应用程序进行通信。它可以基于TCP或UDP协议工作,具体取决于应用的需求。Socket提供了低级别的网络通信功能,适合开发自定义的网络应用程序。
3、WebSocket
WebSocket是一种应用层协议,旨在提供全双工通信通道,允许客户端和服务器之间保持持久连接,并支持双向数据传输。WebSocket最初是为了改进Web浏览器和服务器之间的通信而设计的,但它也可以用于其他类型的客户端-服务器通信。
特点:
- 全双工通信:WebSocket允许客户端和服务器同时发送和接收数据,而不需要像HTTP那样依赖请求-响应模式。
- 持久连接:一旦连接建立,客户端和服务器可以持续交换数据,直到一方主动关闭连接。
- 低延迟:由于WebSocket使用的是持久连接,减少了每次通信的开销,因此具有较低的延迟。
- 基于HTTP升级:WebSocket连接是通过HTTP协议的Upgrade请求从HTTP协议升级而来,通常使用ws://或wss://(加密)URL方案。
- 支持文本和二进制数据:WebSocket可以传输文本数据(如JSON)和二进制数据(如图像、音频、视频等)。
工作原理:
1、握手阶段:客户端通过HTTP请求发起WebSocket连接,服务器响应并同意升级为WebSocket协议。
2、数据传输阶段:一旦连接建立,客户端和服务器可以自由地发送和接收数据帧。数据帧可以是文本帧或二进制帧。
3、关闭连接:当一方决定关闭连接时,会发送关闭帧,另一方收到后也会关闭连接。
示例代码:
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
import java.net.URISyntaxException;
public class WebSocketExample extends WebSocketClient {
public WebSocketExample(URI serverUri) {
super(serverUri);
}
@Override
public void onOpen(ServerHandshake handshakedata) {
System.out.println("Connected to server");
// 发送消息到服务器
send("Hello, Server!");
}
@Override
public void onMessage(String message) {
System.out.println("Received from server: " + message);
}
@Override
public void onClose(int code, String reason, boolean remote) {
System.out.println("Connection closed: " + reason);
}
@Override
public void onError(Exception ex) {
ex.printStackTrace();
}
public static void main(String[] args) {
try {
// 创建 WebSocket 客户端并连接到服务器
WebSocketExample client = new WebSocketExample(new URI("ws://localhost:8080"));
client.connect();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}
WebSocket是一种应用层协议,旨在提供全双工、低延迟的通信通道,特别适合实时应用,如聊天系统、在线游戏、股票交易平台等。它通过HTTP升级机制建立连接,并允许客户端和服务器之间持续交换数据。
4、三者的区别与联系
联系:
- TCP是Socket的基础,Socket通过TCP或UDP协议实现网络通信。TCP提供了可靠的、面向连接的传输服务,而Socket是应用程序与TCP或UDP交互的接口。
- WebSocket是一种应用层协议,它基于TCP协议工作,实际通过HTTP升级机制建立了更高效的全双工通信通道。WebSocket的底层仍然是基于TCP的,但它提供了比传统HTTP更强大的实时通信能力。
区别:
- TCP是一个传输层协议,专注于数据的可靠传输和连接管理。它是许多上层协议的基础,如HTTP、FTP、SMTP等。
- Socket是一个编程接口,允许应用程序通过网络与其他应用程序通信。它可以基于TCP或UDP协议工作,具体取决于应用的需求。
- WebSocket是一种应用层协议,专门用于实现实时、全双工的通信。它通过HTTP升级机制建立连接,并允许客户端和服务器之间持续交换数据。
5、综述
- TCP是一种传输层协议,提供了可靠的、面向连接的通信服务,是许多上层协议的基础。
- Socket是一个编程接口,允许应用程序通过网络与其他应用程序通信。它可以基于TCP或UDP协议工作,具体取决于应用的需求。
- WebSocket是一种应用层协议,旨在提供全双工、低延迟的通信通道,特别适合实时应用,如聊天系统、在线游戏等。它通过HTTP升级机制建立连接,并基于TCP协议工作。
选择使用哪种技术取决于你的具体需求:
- 如果你需要构建自定义的网络应用程序,并且需要可靠的、面向连接的通信,可以选择TCP Socket。
- 如果你需要实现实时、全双工的通信,特别是基于Web的应用,WebSocket是更好的选择。
- TCP是底层协议,通常由操作系统和网络库处理,开发者通常不需要直接操作TCP,而是通过Socket或WebSocket来实现通信。
乘风破浪!Dare to Be!!!