【计算机网络】TCP通信的细节及TCP连接对HTTP事务处理性能影响

简介: 从三次握手的细节说起 刚开始尝试使用java等后端语言写IO流,或用套接字(socket)实现简单C/S通信的同学们,常常会接触到的一个概念:就是所谓的“三次握手”,socket作为一个API接口,封装了TCP/IP通信的细节,使我们只需要调用简单的接口而无需关心具体的实现,那么 Socket三...

从三次握手的细节说起

刚开始尝试使用java等后端语言写IO流,或用套接字(socket)实现简单C/S通信的同学们,常常会接触到的一个概念:就是所谓的“三次握手”,socket作为一个API接口,封装了TCP/IP通信的细节,使我们只需要调用简单的接口而无需关心具体的实现,那么

Socket三次握手的细节是如何实现的?

三次握手的过程实际上就是相互抛/接(3次)包的过程

三次握手的过程:

  1. 客户端抛 --> SYN包(建立连接包) --> 服务器接收
  2. 服务器抛 --> ACK包(确认应答包)和SYN包 --> 客户端接收
  3. 客户端抛 --> ACK包(确认应答包) --> 服务器接收

 

建立连接后客户端便可从服务器接收数据包进行通信

注意三次握手时抛/接的包和连接建立后收发的数据包是不同的!前者是只携带有TCP报文和IP报文头部的包,不携带具体的数据内容,而后者除了TCP和IP报文头部还携带了具体的数据

建立连接后的通信过程:

l  发送端  -->   数据包  -->  接收端

l  接收端  -->  ACK确认应答  --> 发送端

TCP是全双工通信:

这里的发送端/接收端可以是客户端/服务器,也可以是服务器/客户端,因为TCP通信是全双工通信,所以建立连接后可以同时进行以下两个过程:

A.   客户端 --> 数据包 --> 服务器 --> ACK应答 --> 客户端

B.   服务器 --> 数据包 --> 客户端 --> ACK应答 --> 服务器

 

ACK包/FIN包/SYN包的具体组成:

如下图三次握手时交换包的具体组成:TCP首部+IP首部(无具体数据内容!)

 

 

建立连接后收发数据包的具体组成:

(TCP首部+IP首部+具体数据)

 

 

TCP通信的单位——段

TCP通信以段为单位,段由TCP数据和TCP首部组成

 

如果再将网络层的IP协议考虑进去的话,TCP/IP通信以IP分组为单位

 

 

IP分组=TCP段+IP首部=(TCP数据+TCP首部)+IP首部

注:TCP首部也算是IP数据包的一部分

TCP的"串行式"连接和"管道式"连接

A.TCP“串行式”连接

建立连接后,最简单的TCP通行是串行进行的,单次通信发送端只能发送一个段。只有在接收到接收端发来的ACK应答包前,才能将第二个段发出去,这段时间内发送端只能空等待

 

 

B.TCP“管道式”连接

很显然,串行通信效率很低,所以我们想,能不能在第一个段发送出去后,无需等待ACK应答的返回就发送第二个段呢?这样效率不就提高了吗?基于这个理念人们提出了窗口的概念:

窗口:无需等待ACK应答的返回就可以连续发送的段的数量的最大值

 

 

上图中,窗口大小为4,段的发送就好像管道一般,窗口大小就好比是“管道”的流量

TCP连接对HTTP事务处理性能的影响

HTTP作为一种应用层协议,其事务处理要依赖于传输层的TCP协议机制的运作,所以HTTP事务处理的性能瓶颈很大程度上来源于TCP连接,体现在下面几点:

  • TCP连接时间的消耗
  • TCP的慢启动机制
  • TCP采用的Nagle算法

每次TCP连接带来的时延是HTTP时延的重要来源

 

 

解决方法:采用HTTP持久连接技术消除多次连接的时延

 

 TCP的慢启动机制

TCP慢启动机制体现在两方面:

a.限制初次启动时发送的段的数量:

上面提到了TCP窗口的概念,但TCP能不能一开始就发送窗口上限的段呢?答案是不能的,因为这会造成网络拥塞,为了避免这个问题,TCP采用了慢启动机制,一开始发送的段数为1,抛接完成后将段数上升为2,然后是4,再然后是8,段数将以指数形式递增,直到窗口大小的上限

 

 

b.设置慢启动阀值

由上图可以看到,当达到拥堵窗口的大小时,将导致超时重发,这时初次发送的段数又从1开始指数递增,不同的地方是:这时候设置了慢启动阀值(拥堵窗口的一半),发送的段数达到慢启动阀值时,将不再以指数形式上升,而是按一定的比例缓慢得直线上升

 

 解决方法:正是因为单次TCP连接的时延和TCP的慢启动机制,HTTP的持久连接才显得尤为重要

Nagle算法

TCP协议本身并没有有规定发送单个段的数据包大小的最小值,那让我们想想,如果我们试图在单个段中发送几个字节的数据包会怎样呢?如果这样,TCP将通过Nagle算法的机制来提高网络利用率,很显然,将包含数据量极小的段都单独发出去将会极大降低网络利用率,所以通过Nagle算法,不直接派发小数据量的段,而是选择将它们绑定在一起,当达到要求尺寸后才派发出去,这造成了时间上的延迟。Nagle算法是一把双刃剑,它提高了网络利用率,但同时造成了TCP的时延

解决方法:Nagle是可以选择关闭的,当然,前提是你得在TCP通信中写入大块的数据

 

参考资料:

《HTTP权威指南》作者古尔利

《图解TCP/IP》作者竹下隆史

 

其实啊,我只是把你们喝咖啡的时间,都用来喝啤酒而已
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
4月前
|
存储 消息中间件 弹性计算
阿里云服务器ECS计算型c7和通用算力型u1在适用场景、计算性能、网络与存储性能等方面的对比
阿里云ECS服务器u1和c7实例在适用场景、性能、处理器特性等方面存在显著差异。u1为通用算力型,性价比高,适合中小企业及对性能要求不高的场景;c7为企业级计算型,采用最新Intel处理器,性能稳定且强大,适用于高性能计算需求。u1支持多种CPU内存配比,但性能一致性可能受底层平台影响;c7固定调度模式,确保高性能与稳定性。选择时可根据预算与性能需求决定。
247 23
|
5月前
|
传感器 存储 算法
基于ECC簇内分组密钥管理算法的无线传感器网络matlab性能仿真
本程序基于ECC(椭圆曲线密码学)簇内分组密钥管理算法,对无线传感器网络(WSN)进行MATLAB性能仿真。通过对比网络通信开销、存活节点数量、网络能耗及数据通信量四个关键指标,验证算法的高效性和安全性。程序在MATLAB 2022A版本下运行,结果无水印展示。算法通过将WSN划分为多个簇,利用ECC生成和分发密钥,降低计算与通信成本,适用于资源受限的传感器网络场景,确保数据保密性和完整性。
|
数据采集
Haskell爬虫:连接管理与HTTP请求性能
Haskell爬虫:连接管理与HTTP请求性能
|
9月前
|
数据采集 网络协议 JavaScript
网络爬虫性能提升:requests.Session的会话持久化策略
网络爬虫性能提升:requests.Session的会话持久化策略
|
9月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
877 7
|
11月前
|
机器学习/深度学习
YOLOv10优改系列一:YOLOv10融合C2f_Ghost网络,让YoloV10实现性能的均衡
本文介绍了YOLOv10的性能优化,通过融合Ghost模块和C2f结构,实现了网络性能的均衡。GhostNet通过GhostModule和GhostBottleNeck减少参数量,适用于资源有限的场景。YOLOv10-C2f_Ghost在减少参数和计算量的同时,保持了与原始网络相当或更好的性能。文章还提供了详细的代码修改步骤和可能遇到的问题解决方案。
1356 1
YOLOv10优改系列一:YOLOv10融合C2f_Ghost网络,让YoloV10实现性能的均衡
|
10月前
|
网络协议 安全 Go
Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
【10月更文挑战第28天】Go语言进行网络编程可以通过**使用TCP/IP协议栈、并发模型、HTTP协议等**方式
182 13
|
10月前
|
网络协议 算法 网络性能优化
计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议
计算机网络常见面试题(一):TCP/IP五层模型、应用层常见的协议、TCP与UDP的区别,TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议、ARP协议
|
11月前
|
缓存 监控 前端开发
优化网络应用的性能
【10月更文挑战第21天】优化网络应用的性能
111 2
|
11月前
|
测试技术
评测 AlibabaCloud 阿里云国际版 香港轻量云服务器的性能和网络怎么样
评测 AlibabaCloud 阿里云国际版 香港轻量云服务器的性能和网络怎么样