什么是TCP

简介: 什么是TCP

首先先说说什么是TCP?

TCP(Transmission Control Protocol,传输控制协议)是一种计算机通信协议,用于在互联网上可靠地传输数据。它是互联网协议(IP)的一部分,常用于应用层协议(如HTTP、FTP等)进行数据传输。

TCP为应用程序提供了一种面向连接的、可靠的数据传输服务。在使用TCP协议进行通信时,发送端和接收端先建立一条连接,然后通过这条连接进行数据传输。TCP协议会对传输的数据进行分段并对每个分段进行编号和校验,以确保数据在传输过程中不会丢失或被损坏。如果某个分段未能成功到达接收端,TCP协议会自动重新发送该分段,直到接收端正确地接收了所有数据。

另外,TCP协议还具有流量控制和拥塞控制的功能,可以在网络拥塞时自动减少发送速率以避免网络崩溃。这些功能使得TCP成为一种可靠的数据传输协议,广泛应用于互联网上各种需要可靠传输的应用程序中

 

一、TCP 协议基础

1.1、TCP 协议特点

       TCP 协议最主要的特点如下:

       面向连接:应用程序在使用 TCP 协议之前,必须先建立 TCP 连接。

       可靠性:TCP 提供可靠交付的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复,并且按序到达。如果数据包丢失或出现差错,则 TCP 负责重发数据。

       有序性:TCP 能够把发送的数据划分成一个个数据块,编号后发送,接收方根据编号将这些数据块组装成完整的数据。因此,在接收端可以确保数据块按照发送的顺序进行组装。

       流量控制:TCP 还提供了流量控制的功能,保证发送方的发送速度不会过快,导致接收方处理不及时,从而导致数据丢失。发送方会根据接收方返回的确认信息,调整自己的发送速度。

       拥塞控制:TCP 能够根据网络状况调整传输数据的速率,防止出现拥塞。如果网络出现拥塞,TCP 会通过降低发送方的数据传输速率和进行重传等措施来保证数据的可靠传输。

1.2、TCP 协议数据传输流程

       TCP 协议的数据传输流程包括三个步骤:

       1.连接建立:在数据传输之前,需要先建立连接。TCP 的连接建立采用“三次握手”协议,即由客户端发起连接请求,服务器返回确认信号,客户端再次返回确认信号,连接才算建立成功。

       2.数据传输:当 TCP 连接建立之后,数据就可以进行传输了。对于需要传输的数据,TCP 会将其分成一个个数据包进行传输,并且标记每一个数据包的序号,保证数据按照指定的顺序进行组装。同时,TCP 还会进行数据的可靠性检测,如果发现某个数据包没有被接收方正确接收,则会进行重传。

       3.连接终止:当数据传输完成时,TCP 需要进行连接的释放,以便释放资源。TCP 的连接释放采用“四次挥手”协议,即由客户端向服务器发送连接释放请求,服务器发送确认信号,服务器向客户端发送连接释放请求,客户端发送确认信号,连接才算全部释放。

       

二、TCP协议的工作原理

       TCP协议工作在OSI七层模型的第四层,即传输层。TCP协议通过三次握手建立连接,在连接建立后进行数据传输,并通过四次挥手关闭连接。

2.1、 TCP的三次握手

       TCP连接的建立需要进行三次握手,握手的过程如下:

(1)客户端向服务器发送SYN报文,请求建立连接。

(2)服务器收到SYN请求报文并发回SYN+ACK报文,表示可以建立连接。

(3)客户端收到SYN+ACK报文后再发送ACK报文,表示连接建立成功。

       在三次握手过程中,SYN是同步序列号(Synchronize Sequence Number)的缩写,ACK是确认序列号(Acknowledgment)的缩写。

2.2、 TCP的数据传输

       TCP协议通过标记每个数据包的序列号来保证数据的有序传输。TCP协议还提供了流量控制,确保数据在传输过程中不会被丢弃或超时。

       TCP协议还提供了错误检测和重传机制。如果数据包在传输过程中发生错误,接收方可以通过校验和来检测出这个错误,并要求发送方重新发送这个数据包。

三、TCP 协议的使用

3.1、建立 TCP 连接

       在 Java 中,可以使用 Socket 类来建立 TCP 连接。建立连接的流程如下:

       实例化 Socket 对象:可以使用带有主机名和端口号参数的构造器来新建 Socket 对象。

建立连接:使用 Socket 类中的 connect() 方法来建立连接。

下面是一个简单的TCP代码:

package com.example.tcpdemo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.InetAddress;
import java.net.Socket;
public class TcpClient {
    public static void main(String[] args) {
        String serverHost = "localhost";
        int serverPort = 8080;
        Socket socket = null;
        BufferedReader reader = null;
        Writer writer = null;
        try {
            // 1.实例化 Socket 对象
            InetAddress inetAddress = InetAddress.getByName(serverHost);
            socket = new Socket(inetAddress, serverPort);
            // 2.建立连接
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new OutputStreamWriter(socket.getOutputStream());
            writer.write("Hello World!");
            writer.flush();
            // 3.处理服务器返回的数据
            System.out.println(reader.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null) {
                    socket.close();
                }
                if (reader != null) {
                    reader.close();
                }
                if (writer != null) {
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
3.2、发送数据

       在建立连接成功之后,可以使用 Socket 的 getOutputStream() 方法获取到输出流,通过输出流向服务器发送数据。

// 获取输出流
OutputStream outputStream = socket.getOutputStream();
// 发送数据
String data = "Hello World!";
outputStream.write(data.getBytes());
3.3、接收数据

在建立连接成功之后,可以使用 Socket 的 getInputStream() 方法获取到输入流,通过输入流接收从服务器返回的数据。

// 获取输入流
InputStream inputStream = socket.getInputStream();
// 接收数据
byte[] dataBuffer = new byte[1024];
int len = inputStream.read(dataBuffer);
String data = new String(dataBuffer, 0, len);

其中,dataBuffer 是缓冲区,len 表示读取的字节数,data 表示接收到的数据。

3.4、释放连接

TCP 连接释放需要经过“四次挥手”的步骤。在 Java 中,可以使用 Socket 类的 close() 方法来释放连接。

socket.close();

四、TCP 协议的问题和优化

4.1、TCP 协议的问题

       在网络延迟较大的情况下,TCP 需要等待控制信息的确认才能发送下一个数据包,导致效率较低。

       TCP 中的流控制和拥塞控制需要进行大量的计算,导致协议复杂性较高。

       当网络中出现丢包时,TCP 会尝试重传数据包,但是如果丢失的数据包较多,则重传的时间会变得非常长,影响了协议的效率。

4.2、TCP 协议的优化

使用快速重传机制:在接收方收到一个乱序的数据包时,可以立即向发送方发送一个 ACK 接收确认信息,要求其重新发送丢失的数据包。

使用加速算法:通过预测下一次数据包的到达时间,可以避免 TCP 因等待 ACK 而导致发送速度下降的问题,提高了协议的效率。

采用累积确认机制:TCP 可以将多个数据包合并成一组,一起进行确认,减少了发送的控制信息数量,提高了协议的效率。

五、总结

TCP 协议是互联网中的一种主要的传输协议,它具有面向连接、可靠性、有序性、流量控制和拥塞控制等特点。在使用时,需要先建立连接,进行数据传输,最后释放连接。同时,TCP 协议也存在一些问题,可以通过使用快速重传机制、加速算法和累积确认机制等方法来进行优化。

 

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
消息中间件 存储 Java
最经典的消息中间件:RabbitMQ
最经典的消息中间件:RabbitMQ
746 1
|
存储 API 对象存储
OSS新特性:支持文件上传、复制时,指定Object的存储类型以及修改已有文件的存储类型
用户在上传、复制文件时,可灵活地指定文件的存储类型为Standard、IA、Archive;用户也可以修改实时修改文件的存储类型,比如从低频型(IA)修改为标准型。
5810 0
|
11月前
|
前端开发 开发者
CSS中的长度单位详解
通过合理选择和组合使用不同的长度单位,开发者可以实现高效、灵活和响应式的Web布局设计。以上详解希望能帮助你更好地理解和应用CSS中的长度单位,提高页面的表现力和可维护性。
318 3
|
存储 Kubernetes NoSQL
k8s1.20版本部署Redis集群(三主三从)——2023.05
k8s1.20版本部署Redis集群(三主三从)——2023.05
1276 1
|
人工智能 自然语言处理 PyTorch
Text2Video Huggingface Pipeline 文生视频接口和文生视频论文API
文生视频是AI领域热点,很多文生视频的大模型都是基于 Huggingface的 diffusers的text to video的pipeline来开发。国内外也有非常多的优秀产品如Runway AI、Pika AI 、可灵King AI、通义千问、智谱的文生视频模型等等。为了方便调用,这篇博客也尝试了使用 PyPI的text2video的python库的Wrapper类进行调用,下面会给大家介绍一下Huggingface Text to Video Pipeline的调用方式以及使用通用的text2video的python库调用方式。
|
分布式计算 负载均衡 数据安全/隐私保护
什么是RPC?有哪些RPC框架?
RPC(Remote Procedure Call,远程过程调用)是一种允许运行在一台计算机上的程序调用另一台计算机上子程序的技术。这种技术屏蔽了底层的网络通信细节,使得程序间的远程通信如同本地调用一样简单。RPC机制使得开发者能够构建分布式计算系统,其中不同的组件可以分布在不同的计算机上,但它们之间可以像在同一台机器上一样相互调用。
451 8
|
SQL 安全 测试技术
【数据守护者必备】SQL数据备份与恢复策略全解析:从全量到日志备份,手把手教你确保企业信息万无一失的实战技巧!
【8月更文挑战第31天】数据库是企业核心业务数据的基石,为防止硬件故障、软件错误或人为失误导致的数据丢失,制定可靠的备份与恢复策略至关重要。本文通过一个在线购物平台的案例,详细介绍了使用 SQL Server 进行全量备份、差异备份及事务日志备份的方法,并演示了如何利用 SQL Server Agent 实现自动化备份任务。此外,还提供了数据恢复的具体步骤和测试建议,确保数据安全与业务连续性。
506 0
|
搜索推荐 物联网 应用服务中间件
【Azure 应用服务】Azure SignalR 是否可以同时支持近十万人在线互动
【Azure 应用服务】Azure SignalR 是否可以同时支持近十万人在线互动
115 0
|
缓存 监控 UED
CDN(内容分发网络):加速网站加载与优化用户体验
CDN(内容分发网络):加速网站加载与优化用户体验

热门文章

最新文章