详解TCP

news2024/12/23 13:16:14

目录

1.TCP概论

1.1.什么是TCP

1.2.TCP连接的建立过程

1.3.TCP的传输过程

1.4.TCP连接的释放过程

2.JAVA中的TCP

3.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可以保持长时间的打开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/713734.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用java.lang.Record类删除样板代码

样板是一个源自钢铁制造业的术语,其中形成模具以铸造类似的物体。在编程世界中,样板代码是代码的一部分,项目里面使用的地方很多,但是通常创建完成之后就很少或者就不会更改了。在Java中,不可变的数据载体类用于与数据…

SpringBoot第13讲:SpringBoot接口如何参数校验国际化

SpringBoot第13讲:SpringBoot接口 - 如何参数校验国际化 本文是SpringBoot第13讲,上文我们学习了如何对SpringBoot接口进行参数校验,但是如果需要有国际化的信息(比如返回校验结果有中英文),应该如何优雅处…

【C++】vector介绍及使用

🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C 🛹Linux 📕 学习格言:博观而约取&#xff0…

【智能座舱系列| 域控制器】——座舱域控制器

传统多芯片架构 原来的座舱里面的控制器基本上是分开的,导航主机是一家,液晶仪表是一家,同时还有一个AVM全景一家,还有TBOX等,这里线束连接就非常复杂,而且不同供应商直接的协调调试也非常复杂。 上图是IMX6 的多芯片方案,液晶仪表、中控导航、后排娱乐都使用了IMX6最小…

axure可视化大屏模板200例 •axure模板 大屏可视化 •axure数据可视化原型 •axure可视化组件 •axure

可视化axure原型可视化大屏模板200例,带动画效果,可直接复用 axure可视化大屏模板200例 axure可视化大屏模板200例数据可视化原型可视化组件下载—无极低码 axure模板 大屏可视化axure数据可视化原型axure可视化组件axure原型演示axure绘制界面原型图…

AI日报|哈佛“AI教授”即将上线;首个生成式AI技能专业证书来了;电话推销员很烦?AI帮你“制裁”他

今日值得关注的人工智能新动态: 将GPT-4用在课程设计中 哈佛大学“AI教授”即将上线 微软推出首个生成式AI技能专业证书 纽约州议会:伤害或羞辱他人的deepfake是非法的 阿诺德施瓦辛格:《终结者》中的AI已成现实 AI诊断“老年痴呆”&…

大数据分析案例-基于决策树算法构建信用卡欺诈识别模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

数字IC验证的学习路径,新人必备!

优秀的验证工程师,需要掌握的技能有很多,兼备硬件和软件,可以说是更加触类旁通。所以还是需要循序渐进,从最基础的内容开始逐步掌握。 文内所有的学习资料,面试题目(文末可全领) 1.数电和veri…

VS2015 修复失败

Repair/Modify operation did not finish successfully. “Setup error – repair/modify operation did not finish successfully.” message shown when starting Visual Studio 2015 Problem: When starting Visual Studio 2015, the following message is shown “Setu…

企业实施CIS控制

什么是CIS控件 CIS 关键安全控制由互联网安全中心开发,是一套规范性的、优先的网络安全最佳实践和防御措施,可以帮助防止最普遍和最危险的攻击,并支持多框架时代的合规性。 这些可操作的网络防御最佳实践由一组 IT 专家使用从实际攻击及其有…

Elasticsearch:映射(mapping)的实用实践指南

动态映射适用于开发环境,但对于生产级集群禁用它。 将动态配置为 “strict” 以对索引的字段值实施严格模式。有关动态映射的详细描述,请阅读文章 “Elasticsearch:Dynamic mapping”。 PUT /twitter {"mappings": {"dynamic…

Python——对文件的操作

一、 文件的读写 读文件:从磁盘打开 写文件:将文件存入磁盘 使用内置函数open()创建文件对象。 格式为: file open(filename [,mode,encoding])其中 file ——被创建的文件对象 open ——创建文件对象的函数 filename ——要创建或要打开…

全新特征融合模块AFPN,完胜PAFPN

直接看图说话 论文地址:https://arxiv.org/abs/2306.15988v1 代码地址: GitHub - gyyang23/AFPN 多尺度特征在目标检测任务中对具有尺度方差的目标进行编码时具有重要意义。多尺度特征提取的一种常见策略是采用经典的自上而下和自下而上的特征金字塔网络…

【线程】线程概念及相关函数实现

目录 0. 线程的概念 1. 线程的基本操作 1.1 线程的创建:pthread_create函数 1.2 线程等待:pthread_join函数 1.3 线程的分离:pthread_detach函数 1.4 线程退出:pthread_exit函数 1.5 线程的取消:pthread_cancel…

了解Spring

目录 什么是Spring? DI Spring 存与取 spring 的存操作 spring的取操作 更快速的进行 Spring 存 与 读 三大注入方式 Autowired set 注入 构造方法注入 Spring 容器中有多个相同的类时 Bean 作用域 设置作用域 Spring 执行流程 Bean 生命周期 什么是Spring? Sp…

【密码学基础】半/全同态加密算法基础学习笔记

文章目录 1 半同态加密Pailliar加法同态加密Paillier加解密过程Paillier的同态性Paillier的安全性 El Gamal乘法同态加密RSA乘法同态加密 2 全同态加密BFV全同态加密BFV的编码方式BFV加解密过程BFV的安全性BFV的同态性自举Bootstrapping 3 同态加密应用场景场景1:安…

【maven】安装、使用和常用命令

安装 windows 下载Maven二进制文件 前往Apache Maven官方网站 (https://maven.apache.org) ,找到最新的稳定版本,然后下载对应的二进制压缩包(如apache-maven-3.8.2-bin.zip)。解压缩文件 将下载的压缩包解压到你选择的目录&…

QCC51XX---chain修改

QCC51XX---系统学习目录_嵌入式学习_force的博客-CSDN博客 如何去修改音频chain链路,就是那种想多加几条输入源或输出,又或者把当前的输入输出换到别的地方的那种应用。例如一个自带mic的dongle,或者模拟输入的LE dongle。 如果要改某个状态下的音频链路,那就需要先找出默认…

修复常见 Android 问题的 9 款顶级 Android 手机维修软件

许多人发现Android手机或平板电脑上的Android操作系统一开始运行得很好,但随着时间的推移,可能会出现各种Android系统问题。您可能会遇到一些问题,例如系统速度变慢、启动无响应、挂起错误、界面冻结、短信停滞、应用程序崩溃等。那么&#x…