详解TCP

简介: 详解TCP

1.TCP概论

1.1.什么是TCP

为了保证所有设备能相互通信,从而建立了一张互联互通的计算机网络,在这张大网里,两台计算机之间想进行通信就像寄快递,整个快递一定要有固定且通用的格式,这样在传递过程中才能进行一层一层的识别和传递,比如包裹上有信封、信封上有邮编、发送人信息、接收人信息,包裹里面的纸箱上会有商品的相关信息,然后最里面是商品。


这些层层固定的格式就是网络协议,有的协议保证数据不丢失、不乱序、有的层处理网络异常等等等等,所有层一起联合起来一起保证通信的可靠与通畅。


TCP协议属于这些分层里面的传输层,主要负责的职责是保证通信的可靠性。TCP协议规定了一些校验字段,通信双方以报文中固定的这些字段来进行可靠的通信,从而保证了数据的可靠性、不会乱序等。TCP协议建立起来这种两点间可靠的、面向连接的通信通道,在逻辑上给人一种像直接连接在一起一样进行通信的感觉。


所以TCP常常被总结为,面向连接的,点对点通信。建立这条逻辑连接则是TCP的核心。

1.2.TCP连接的建立过程

TCP是通过三次握手,即三次报文交换来建立连接的。

第一次:发送同步请求,SYN置1,随机生成一个序列号a。

第二次:回复,ACK(值为前一个包的序列号a+1),已经收到数据包。同时生成自己的序列号b,发送SYN=1,收到请回复。(SYN位只会出现两次,因为三次握手,只需要两次应答。)

第三次:序列号a+1,生成ACK(b+1)。

1.3.TCP的传输过程

TCP连接建立过程中生成的那个序列号会在后续的传输过程中被继续使用,基于该序列号来控制通信的有序性。

在TCP连接建立后,数据发送方会将要发送的数据划分为较小的报文段,并为每个报文段分配一个序列号,序列号单调递增。数据接收方通过检查序列号来确定接收到的数据的顺序。TCP协议要求数据接收方必须按照序列号的顺序将数据重新组装成完整的数据流。


同时,TCP协议还使用确认机制来确保数据的完整性。数据接收方会发送确认报文段(ACK)给数据发送方,其中包含确认号(Acknowledgment Number),表示已成功接收到的数据的最高有效序列号。数据发送方会根据收到的确认号来确定哪些数据已经被成功接收,从而维护数据的有序性和完整性。


如果数据发送方没有收到确认报文段,或者接收方检测到数据包的丢失、损坏等情况,TCP协议会进行重传,确保数据的可靠传输。

1.4.TCP连接的释放过程

TCP是通过两次握手来释放连接的,也就是A对B拆一次线,B对A拆一次线。

  1. 发送关闭请求: 当一方决定关闭连接时,它会发送一个TCP报文段,其中包含一个标志位FIN(Finish)设置为1,表示希望关闭连接。这个报文段被发送给对方,进入FIN_WAIT_1状态。
  2. 确认关闭请求: 接收到关闭请求的一方会发送一个确认报文段,其中ACK(Acknowledgment)标志位被设置为1,同时将确认序号设置为收到的序号加1。这个报文段被发送给对方,进入CLOSE_WAIT状态。
  3. 发送关闭确认: 接收到关闭请求的一方会继续处理未完成的数据传输,直到完成后发送一个关闭请求。该关闭请求的报文段中的FIN标志位被设置为1,并附带一个确认号,表示已经确认了对方发送的关闭请求。这个报文段被发送给对方,进入LAST_ACK状态。
  4. 确认关闭确认: 接收到关闭确认的一方会发送一个确认报文段,其中ACK标志位被设置为1,同时将确认序号设置为收到的序号加1。这个报文段被发送给对方,进入TIME_WAIT状态。

2.JAVA中的TCP

JDK中有专门支持网络通信的模块,Socket是对TCP/IP通信过程的一个抽象,它将TCP/IP协议里面复杂的通信逻辑进行 封装,对用户来说,只要通过一组简单的API就可以实现网络的连接和通信。

博主有一篇博文详细介绍了JDK中的网络通信,可以异步看一下:

JAVA BIO__BugMan的博客-CSDN博客

3.TCP带来的一些性能问题

1.无法准确知道数据包什么时候接收完

很显然TCP虽然提供了序列号来控制数据的有序性,但是我们无法知道数据什么时候能接收完整。比如请求一次后端的接口,随着传参的不同,数据的大小肯定是不固定的,到底要多少个数据段才会收完,接收方是不确定的。所以接收方只能一直去读IO,直到读完为止。


accept的socket并不知道其数据包是否已经收完,很可能出现因为数据包没有收完,还需要阻塞在原地等待IO继续收数据包的情况,本来分过来的CPU时间片是希望当前线程向下执行代码,结果用去继续IO收数据包去了,IO操作对于CPU而言很慢,时间片的利用率会很低,耗时会很严重。


这也就促成了后面NIO以事件响应的方式来启现场处理请求的模式。

2.连接过程过于耗时

一条TCP连接的建立需要客户端和服务器来回三次报文交换,很明显这是一个很耗时,很重的过程,为了避免来回建立TCP造成的性能损耗,很多对性能有要求的场景纷纷都开始支持“长连接”。HTTP2开始HTTP协议标准中开始支持长连接,在HTTP头部设置Connection: keep-alive,服务器和客户端会协商保持连接的状态。这样,在同一个TCP连接上可以进行多次请求和响应,实现长连接的效果。


Web服务器,诸如tomcat之类的,会用线程去托管每个socket,使得socket可以保持长时间的打开。


3.单台机器TCP连接具有有限性


TCP 连接的信息一般存储在服务器的内核空间中。那么所谓的TCP连接有限,其实就是指的IO缓冲区有限导致的并发的TCP有限,另一个维度是说内核段存储空间有限,有两个维度。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
存储 缓存 算法
【计算机网络】数据链路层
【计算机网络】数据链路层
1921 0
【计算机网络】数据链路层
|
3月前
|
机器学习/深度学习 人工智能 编解码
大模型应用:CLIP 模型全维度解析:理解理论基础强化基础范例.16
CLIP是OpenAI提出的跨模态模型,通过对比学习将图像与文本映射至统一语义空间,实现零样本图文对齐。无需微调即可完成图像分类、图文检索等任务,显著降低标注成本,成为多模态AI的核心基础。
2031 21
|
8月前
|
存储 机器学习/深度学习 人工智能
阿里云环境下 Runway 深度部署:从技术原理到 AIGC 视频生成落地
Runway作为AI视频生成标杆,融合扩散模型与多模态技术,依托潜空间优化与时空注意力机制,实现高效高质视频生成。结合阿里云算力与API生态,支持版权合规、运镜控制与多模态联动,广泛应用于影视、广告与游戏领域,推动内容创作智能化升级。
1189 0
|
Java 数据库连接 Maven
最新版 | SpringBoot3如何自定义starter(面试常考)
在Spring Boot中,starter是一种特殊的依赖,帮助开发人员快速引入和配置特定功能模块。自定义starter可以封装一组特定功能的依赖和配置,简化项目中的功能引入。其主要优点包括模块化、简化配置、提高代码复用性和实现特定功能。常见的应用场景有短信发送模块、AOP日志切面、分布式ID生成等。通过创建autoconfigure和starter两个Maven工程,并编写自动配置类及必要的配置文件,可以实现一个自定义starter。最后在测试项目中验证其有效性。这种方式使开发者能够更便捷地管理和维护代码,提升开发效率。
2141 1
最新版 | SpringBoot3如何自定义starter(面试常考)
|
网络协议 Java 数据安全/隐私保护
tcp 可以建立多个连接吗?
【10月更文挑战第25天】TCP(传输控制协议)是一种面向连接的、可靠的传输层协议,它在网络通信中起着重要的作用。在 TCP 中,可以建立多个连接,这种特性被称为TCP 连接复用。
|
移动开发 小程序 前端开发
|
SQL 缓存 数据库连接
SqlAlchemy 2.0 中文文档(五十五)(1)
SqlAlchemy 2.0 中文文档(五十五)
297 1
|
关系型数据库 MySQL 数据库
Windows 安装 MySQL 5.7 x64 位
Windows 安装 MySQL 5.7 x64 位
1600 0
|
存储 安全 Java
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
607 3
|
机器学习/深度学习 计算机视觉
【YOLOv8改进】EMA(Efficient Multi-Scale Attention):基于跨空间学习的高效多尺度注意力 (论文笔记+引入代码)
YOLO目标检测专栏介绍了创新的多尺度注意力模块EMA,它强化通道和空间信息处理,同时降低计算负担。EMA模块通过通道重塑和并行子网络优化特征表示,增强长距离依赖建模,在保持效率的同时提升模型性能。适用于图像分类和目标检测任务,尤其在YOLOv8中表现出色。代码实现和详细配置可在文中链接找到。