HTTP --tcp

TCP

TCP连接

tcp/ip是全球计算机以及网络设备都在使用的一种常见的分组交换网络分层协议集,客户端可以打开一条tcp/ip连接,连接到可能运行在世界各地的服务器应用程序,一旦连接建立起来了,在客户端和服务器的计算机之间交换的报文就永远不会丢失,受损或者失序。

TCP的可靠数据管道

HTTP连接实际上就是TCP连接以及使用规则,TCP连接是互联网上的可靠连接。
TCP为HTTP提供了一条比较靠谱的比特传输管道,从TCP连接一段填入字节会从另一端以原有的顺序,正确的表达出来。
在这里插入图片描述

TCP会按序,无差错的承载HTTP数据。

TCP流是分段的,由IP分组传送

TCP的数据是通过名为IP分组或者IP数据报的小数据块来发送的,安全版本就是在HTTP和TCP之间插入了一个TLS或者SSL密码加密层
HTTP要传送一个报文的时候,会以流的形式讲报文数据的内容通过一条打开的tcp连接按照时序传输。tcp收到数据流之后,会将数据流砍成叫做段的小数据块,所有的这些工作都是由tcp ip软件来处理的。程序员不会参与。
每个tcp段都是由ip分组承载,从一个ip地址发送到另一个ip地址的,每个ip分组包括

  • 一个ip分组首部
  • 一个TCP段首部
  • 一个TCP数据块
    ip首部包含了源和目的ip地址,长度和其他一些标记。tcp段的首部包含了tcp端口号,tcp控制标记,用于将数据排序和完整性检查的一些数字值。

保持tcp连接持续不断的运行

在任意时间计算机都可以由几条tcp连接处于被打开状态,tcp是通过端口号来保持所有这些连接持续不断的运行
tcp连接是通过4个值来识别的<源ip地址, 源端口号, 目的ip地址, 目的端口号>
两条不同的tcp连接不能拥有4个完全相同的地址组件值。但是不同的部分组件可以有相同的值。
在这里插入图片描述

用tcp套接字编程

在这里插入图片描述

套接字api允许用户创建tcp的端口数据结构,将这些端点与远程服务器的tcp端点进行连接,对数据流进行读写。
tcp的api隐藏了所有网络协议的握手细节,以及tcp数据流和ip分组的分段和重装细节
在这里插入图片描述

一旦建立了连接,客户端就会发送HTTP请求,服务器就会读取请求,一旦服务器获取了整条报文请求,就会对请求进行处理,执行所请求的动作,并将数据写回客户端,客户端读取数据,并对响应的数据进行处理

对tcp性能的考虑

HTTP紧挨着TCP,位于上层,所以HTTP事务的性能很大程序取决于底层tcp通道的性能。

HTTP事务的时延

在这里插入图片描述

建立TCP连接,以及传输请求和响应报文的时间相比,事务时间可能是很短的。除非客户端和服务器超载,或者正在处理复杂的动态资源。狗则http就是由tcp网络时延构成的。
HTTP事务的时延由以下几种原因

  1. 客户端首先需要根据URI确定出web服务器的ip地址和端口号,如果没有对URI中的主机名进行访问,通过DNS解析系统会将URI的主机名转换为一个ip地址,这个可能需要花费数10s的时间。
  2. 接下来,客户端会向服务器发送一条tcp连接请求,并等待服务器回送一个请求接受应答,每条tcp连接都会有连接建立时延,最多只有一二秒钟,但是如果是数百个HTTP事务的话,会叠加上去。
  3. 一旦建立起来了连接,客户端就会通过新建立的tcp管道来发送http请求,数据到达的时候,web服务器就会从tcp连接中读取报文,对请求进行处理。
  4. web服务器回送回HTTP响应,这个也需要花费时间。

性能聚焦的区域

  1. tcp连接建立握手
  2. tcp慢启动拥塞控制
  3. 数据聚集的Nagle算法
  4. 用于捎带确认的tcp延迟确认算法
  5. TIME_WAIT时延和端口耗尽

tcp连接的握手时延

如果建立一条新的tcp连接,甚至是发送任意的数据之前,tcp软件会交换一系列的ip分组,对连接的有关参数会进行沟通,如果连接只是用来传输少量的数据,这些交换过程就会降低http的性能
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
建立tcp的几个步骤

  1. 建立tcp连接时,客户端需要向服务器发送一个小的tcp分组,这个分组中有设置syn标记,表明是一个连接请求
  2. 如果服务器接受了请求,就会对参数进行计算,并向客户端返回一个分组,这个分组中的syn和ack都被置位,说明连接已成功
  3. 客户端向服务器回送一条确认信息,通知它连接已成功建立
    小的HTTP事务可能会在TCP建立上花费50%

延迟确认

每个tcp段都会有一个小的序列号和数据完整性校验和,每个段的接收者受到完整的段的时候,会像发送者会送小的确认分组,如果发送者没有再指定的窗口时间内受到确认的信息,发送者就会认为分组被损坏和损毁,重新发送数据。
延迟算法为了增强确认报文找到通向传输数据分组的可能性。延迟确认算法会在一个特定的窗口时间中将输出确认存放在缓存区中,以寻找能够捎带它的输出数据分组,如果在这个时间段内没有输出分组,就将确认信息放在单独的分组中去。如果没有输出分组,就会将确认信息放在单独的分组中传送。
HTTP具有双峰特征的请求——应答行为,降低了捎带信息的可能,延迟确认算法会引入相当大的时延。

tcp慢启动

tcp会随着时间提高传输的速度。用于防止因特网的突然过载和拥塞。
如果HTTP事务由大量的数据要发送,不能一次将所有的分组都发送出去,发送一个分组,等待确认,就可以发送两个分组,每个分组必须被确认。

Nagle算法和TCP_NODELAY

如果tcp发送了大量含有少量数据的分组,网络的性能就会严重的下降。 发送大量单字节分组的行为称为“发送端傻窗口综合症”。这种行为效率很低、违反社会道德,而且可能会影响其他的因特网流量
Nagle算法鼓励发送全尺寸的段,只有当所有其他分组都被确认之后,才会允许发送非全尺寸的分组。如果其他分组仍然在传输过程中,就将那部分数据缓存起来。只有当挂起分组被确认,或者缓存中积累了足够发送一个全尺寸分组的数据时,才会将缓存的数据发送出去
缺点: 1. 小的HTTP报文可能无法填满一个分组,可能会因为等待那些永远不会到来的额外数据而产生时延
TCP_NODELAY:http应用在自己的栈中设计参数,禁用这个算法,提高性能。但是要确保在tcp中写入大块的数据

TIME_WAIT累积和端口耗尽

当某个TCP端点关闭TCP连接时,会在内存中维护一个小的控制块,用来记录最近所关闭连接的IP地址和端口号,这类信息维持2MSL时间。
TIME_WAIT状态通常会持续2倍的最大报文段生存时间(2MSL),以确保在这段时间内不会创建具有相同地址和端口号的新连接。
当系统中存在大量的短连接时,每个连接在关闭后都会进入TIME_WAIT状态,导致TIME_WAIT状态的数量迅速增加。由于每个TCP连接都需要一个唯一的端口号,而端口资源是有限的,因此大量的TIME_WAIT状态可能会导致端口资源耗尽,从而影响新的连接的建立。

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

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

相关文章

@autowired 注入进来对象为null的几种场景及解决办法

一、原因 Autowired 注解用于自动注入 Spring 容器中管理的依赖对象。如果注入的对象为 null&#xff0c;可能是以下原因之一&#xff1a; 被注入的对象没有被 Spring 容器管理&#xff0c;即没有被 Spring 扫描到或者没有配置相应的 。注入的对象在 Spring 容器中有多个实例…

el-date-picker的使用,及解决切换type时面板样式错乱问题

这里选择器的类型可以选择日月年和时间范围&#xff0c;根据类型不同&#xff0c;el-date-picker的面板也展示不同&#xff0c;但是会出现el-date-picker错位&#xff0c;或者面板位置和层级等问题。 源代码&#xff1a; <el-selectv-model"dateType"placeholder&…

BOOST_SREATCH

BOOST Boost是一个由C社区开发的开源库&#xff0c;为C语言标准库提供扩展。这个库由C标准委员会库工作组成员发起&#xff0c;旨在提供大量功能和工具&#xff0c;帮助C开发者更高效地编写代码。Boost库强调跨平台性和对标准C的遵循&#xff0c;因此与编写平台无关&#xff0…

PyCharm设置前端:全面解析与个性化配置指南

PyCharm设置前端&#xff1a;全面解析与个性化配置指南 PyCharm&#xff0c;作为一款强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;在编程界享有极高的声誉。然而&#xff0c;对于许多前端开发者来说&#xff0c;如何在PyCharm中设置和优化前端工作环境可…

如何防止商业秘密泄露?商业秘密保护措施有哪些?

商业秘密是企业核心竞争力的关键所在&#xff0c;其保密性直接关系到企业的生存和发展。 因此&#xff0c;防止商业秘密泄露&#xff0c;确保商业秘密的安全至关重要。 本文将探讨如何有效防止商业秘密泄露&#xff0c;并重点介绍域智盾软件作为解决方案&#xff0c;在商业秘密…

Jvm(一)之栈、堆、方法区

前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#xff0c;感受周围的世界。让我们一起提醒自己&#xff0c;要适时放慢脚步…

【机器学习系列】掌握随机森林:从基础原理到参数优化的全面指南

目录 目录 一、随机森林简介 (一)随机森林模型的基本原理如下&#xff1a; (二)随机森林模型的优点包括&#xff1a; (三)森林中的树的生成规则如下&#xff1a; (四)在随机森林中&#xff0c;每棵树都使用不同的训练集进行训练&#xff0c;原因如下 随机森林的分类性能&…

说说影响网络的因素

1. 物理层面 带宽 带宽是指网络传输数据的能力&#xff0c;带宽越大&#xff0c;网络能够传输的数据量就越大。 信号强度和干扰 信号强度和干扰对无线网络尤其重要。信号强度低或干扰严重会导致数据丢失、传输错误和重传次数增加&#xff0c;从而降低网络性能。 器件质量 路由…

点赋科技:建设智能饮品高地,打造数字化产业先锋

在当今数字化时代的浪潮中&#xff0c;点赋科技以其敏锐的洞察力和卓越的创新能力&#xff0c;致力于建设智能饮品高地&#xff0c;打造数字化产业先锋。 点赋深知智能饮品机对于推动社会进步和满足人们日益增长的需求的重要性。因此&#xff0c;他们投入大量资源和精力&#x…

2020 6.s081——Lab1:Xv6 and Unix utilities梦开始的地方

一任宫长骁瘦 台高冰泪难流 锦书送罢蓦回首 无余岁可偷 ——知否知否 完整代码见&#xff1a;6.s081/kernel at util SnowLegend-star/6.s081 (github.com) Lecture 01知识点总结 首先透彻理解Lecture01的知识很是重要 ①pidwait((int *) 0); “wait(int *status)”函数用于…

Python变量用法——单下划线变量名_

单下划线变量名_ 在常用的诸多变量中&#xff0c;单下划线_是比较特殊的一个。它常作为一个无意义的占位符出现在赋值语句中。_这个名字本身没有什么特别之处&#xff0c;这算是大家约定俗成的一种用法。 举例&#xff0c;假如你想在解包赋值时忽略某些变量&#xff0c;就可以…

Day54 判断子序列 + 不同的子序列

392 判断子序列 题目链接&#xff1a;392. 判断子序列 - 力扣&#xff08;LeetCode&#xff09; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成…

记一次服务器数据库被攻击勒索

如图&#xff0c;早上一起来就发现&#xff0c;我的MongoDB数据库里面的信息全部没有了&#xff0c;只留下一段话。 大致意思就是&#xff1a;我的数据库的数据被他们备份然后全部删掉了&#xff0c;我必须要支付0.0059的bitcoin&#xff08;折合400美刀&#xff09;来赎回我的…

Springboot+WebSocket实现消息推送

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455&#xff0c;并由RFC7936补充规范。WebSocketAPI也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数…

学习率调整

学习率调整 import mathdef adjust_learning_rate(optimizer, epoch, args):"""Decay the learning rate with half-cycle cosine after warmup"""if epoch < args.warmup_epochs:lr args.lr * epoch / args.warmup_epochs else:lr args.m…

不是,你不会还在用双层遍历循环来做新旧数组对比,寻找新增元素吧?

目录 一、双层循环遍历 1.1、双循环错误示范 1.2、正确的做法 ①使用array.includes() ②使用set 二、array.includes()的使用与技巧 2.1、基本语法 2.2、返回值 2.3、使用技巧 2.3.1、用户输入验证 2.3.2、权限检查 2.4、兼容问题 三、总结 一、双层循环遍历 1.…

【重学C语言】十七、预处理指令

【重学C语言】十七、预处理指令 预处理指令预定义宏`#define` 宏定义示例注意事项特殊符号条件编译头文件包含`#pragma`预处理指令 C语言中的预处理指令(Preprocessor Directives)是一种特殊的指令,它们在编译过程的早期阶段(即实际编译之前)被预处理器(Preprocessor)处…

OpenCV学习 基础图像操作(十六):图像距离变换

基础原理 顾名思义&#xff0c;我们可以利用像素之间的距离作为对该像素的一种刻画&#xff0c;并将其运用到相应的计算之中。然而&#xff0c;在一幅图像之中&#xff0c;某种类型的像素并不是唯一的&#xff0c;因此我门常计算的是一类像素到另一类的最小距离&#xff0c;并…

My Spirit | “顶级复盘”

世界不会在意你的自尊&#xff0c; 人们看到的只是你的成就。 在你没有成就之前&#xff0c; 切勿过分强调自尊。 ——菲茨杰拉德《了不起的盖茨比》 目录 My Spirit | “顶级复盘”00 | 日复盘01 | 周复盘2.1 周计划2.2 周复盘2.3 下步计划2.4 下步总结 02 | 月复盘2.1 本月目…

香橙派KunPengPro评测

一、引言 二、开箱 2.1、主要包含说明 1、充电器(赠typec-c线) 2、香橙派kunpengpro(已经带装好带散热器) 3、SD卡(32G)(已经带装好系统openEuler 22.03 (LTS-SP3)) (注意&#xff1a;上电接HDMI线可直接用&#xff0c;账号&#xff1a;openEuler 密码&#xff1a;openEuler)…