tcp长连接和短连接的区别_TCP --- 连接

da349fcba8e178a9d02ebb72cf94da4a.png

一个TCP连接由4个元组组成:2个ip地址和2个端口号

tcp三次握手

2a964a8ce48f48c2ac18f0bf4a076fe1.png

为什么是三次握手

解决历史连接问题

  1. 通过三次握手才能阻止重复历史连接的初始化
  2. 通过三次握手,才能对通讯双方的初始序号初始化

如果只有2次握手,发送方一旦发送创建连接的请求就无法撤回,如果网络环境较差,发送方连续发送多次连接请求,如果只有2次通信,接收方只能接受或者拒绝请求,且接收方不知道这个请求是不是历史请求。

所以通过三次握手和引入RST机制,接收方接到请求时会将发送方发来的seq+1发送给对方,此时由发送方来判断连接是否是历史连接

  • 如果是历史连接(seq过期或者超时),发送方会发送RST控制消息终止这次连接
  • 如果不是历史连接,发送方发送ack,完成连接的建立

解决序号问题

通信双方都需要获得一个用于发送信息的初始化序号,需要向对方发送syn并携带自己的期望的初始化序号,对方在收到后会回复ack以及seq+1 来确认

TCP 半关闭

072c56ebb679d497e5e30fd086a080ac.png

同时打开

同时打开需要4次数据交换

ae78062c82125df9d544060dd70b9669.png

同时关闭

951bb604ee07ca5a2a15464d8884607c.png

初始化序号

初始化序号会随时间的变化而变化,每个连接拥有不同的初始化序号。

一个TCP连接只有具备了4元组与当前窗口序号,才会被对方认为是正确的

建立连接超时

TCP为了建立连接频繁以指数回退的方式的发送SYN报文段,一些系统可以配置SYN的次数

TCP 选项

最大段大小选项

指的是TCP协议允许的从对方收到的最大报文段。这是通信对方在发送数据时能够使用最大报文段,最大段只记录了TCP数据的字节数不包括TCP和IP头部。当创建TCP连接时,通信的每一方都要在SYN报文段的MSS选项中说明自己允许的最大段大小。在没有事先指明的情况下,最大段默认大小为546字节(任何主机都能处理至少576字节(546+ 20 + 20))字节的ip数据报

选择确认选项

由于ack采用累积,TCP不能正确的确认之前已经接收之前已经收到的数据。如果发送方能够了解接收方当前的空洞,它就能在报文丢失或者遗漏时更好的进行重传。 TCP 选择确认(SACK)提供了上述功能。通过接收SYNC(SYNC+ACK)报文段中的允许选择确认选项。使用SACK选项用来来描述这些乱序的数据。从而帮助对方有效的重传

TCP最大传输单元发现

最大传输单元:两台主机之间路径的所有网络报文段中最大传输单元的最小值

发现过程:在一个连接建立时,TCP使用对外接口的最大传输单元的最小值,或者根据通讯对方的声明的最大段大小来选择发送方的最大段大小。路径最大传输单元不允许TCP发送方有超过另一方所声明的最大段大小的行为。如果对方没有指明最大段大小的数值,发送方将假设使用默认的536字节。注意,一条连接的两个方向上的最大段大小是不同的。

一旦发送方的最大段大小选定了初值,TCP通过这条连接发送的所有IPV4数据报都会对DF字段进行设置。如果收到PTB消息,TCP就会较少段的大小,然后用修改过的段进行重传。如果PTB中包含了下一跳的推荐最大传输单元,段大小可以设置为下一跳的最大传输单元减去IPV4(IPV6)与TCP头部的大小。如果不包含最大传输单元,发现和需要尝试多次

由于路由是动态变化的,在减少段大小的一段时间后,需要尝试一个更大的数值

TCP状态转换

ff9a0075d8da7b0f8965b18eb545b11c.png

51983ffdcc10ca306e07f5052e66d1cd.png

FIN_WAIT_1 、FIN_WAIT1、TIME_WATI 称做主动关闭,表示当本地程序发起一个关闭请求时,会进入的状态集合

CLOSEWAIT、LASK_ACK 称作被动关闭。

从LISTEN 到 SYN_SENT 的状态转换是合法的

从SYNC_RCV返回到LISTEN的状态只有在SYNRCVD状态是有LISTEN状态而非SYN_SENT状态转换而来的情况下才是正确的。这意味着一个被动打来操作(进入LISTEN状态)接收一个SYN,发送一个带ACK确认的SYN(进入SYN_CRVD)状态,然后收到一个重置消息而非ACK,端点就会返回到LISTEN状态,并等待另一个请求的。

TIME_WATI状态

在该状态中,TCP将会等待2倍最大段生存期。当TCP发送一个主动关闭的并发送最终的ACK时,连接必须处于TIME_WATI并报出2倍最大段生存期

TIME_WAIT仅在主动调用的一方出现,被动调用的一方会直接进入CLOSED状态。需要等待2MSL的原因是

  1. 防止延迟的数据段被其他使用相同源地址、源端口。目的地址。目的端口的TCP收到
  2. 保证TCP连接的远程被正确关闭

延迟数据段

为了保证新的TCP连接的数据段不会与还在网络中传输的历史连接的数据段重复,TCP连接在分配新的序列号之前需要至少静默数据段在网络中存活的最长时间

2MSL的原因是,网络中可能存在来自发起方数据段,当这些发起方的数据段被服务端处理后又会想客户端发起响应。所以一来一回需要2MSL

FIN_WAIT2 状态

在该状态,某TCP通讯端已经发送FIN,并已得到另一端的确认。除非出现半关闭状态,否则该TCP端将会等待另一端识别出自己已经收到一个文件末尾的通知并关闭这一端引起发送FIN连接。

同时打开和关闭的转换

同时打开

通信双方几乎同时想对方发送SYN报文段,然后进入SYNCSENT。当他们收到对方的SYN会进入到SYN_CRVD。然后重新发送一个新的SYN并确认之前收到的SYN。当通信两端都收到了SYN和ACK时,他们的状态都将变为ESTABLISED

同时关闭

两端同时从ESTABLISED变为FIN_WATI_1,同时他们都会向地方发送FIN,在接收到对方发来的FIN后,两端变成CLOSED状态,然后发送都发送ACK,当双端接收到ACK后,每个端都会将状态改为TIME_WAIT,从而初始化2MSL

重置报文段

当发现一个到达的报文段对于相关连接而言不是正确的,TCP就会发送一个重置报文段。

当一个请求到达本地没有相关的进程在目的端口监听时就会产生一个重置报文段。

半开连接

在未知另一端的情况下,通信的一端关闭或终止连接,那么认为该条TCP连接为半开连接。只要不通过半开连接传递数据。正常工作的一端不会检测出另一端已经奔溃

时间等待错误

4a757dd3ca0a1311f5848f1ed58e2149.png

等待的一端不需要做任何操作,只需要维持当前的状态到2MSL的计时结束。如果他在这段时间内接收到来自于这条连接的一些报文,或是更加特殊的重置报文。它将被破坏。这种情况称作时间等待错误。

连接队列

一个并行的服务器会为每一个客户端分配一个新的进程或线程。在被用于应用程序之前可能会处于 1. 尚未完成但已经接收到SYN (SYNC_CRVD)。 2. 已经完成3次握手处于(ESTABLISHED)。在内部操作系统用2个不同的连接队列分别对应上述2中情况。

  1. 当一个连接请求到达(SYN报文),将会检查系统参数net.ipv4.tcp_max_synbacklog。如果处于SYN_CRVD的个数超过这个阀值,进入的连接将会被拒绝
  2. 每一个处于监听状态下的节点都有一个固定长度的连接队列,其中的TCP连接已经被接受,但未被应用程序接受。
  3. 如果监听节点的队列有空间存储新的连接,TCP模块完成连接 客户端可能会认为服务器已经准备好接收数 据,然而服务器上的应用程序此时可能还未收到关于新连接的通知。如果这种情况发生,服 务器的TCP模块将会把到来的数据存人队列中
  4. 如果队列中已经没有足够的空间存放新的连接,TCP将会延迟对SYN的响应。

参考资料

为什么 TCP 建立连接需要三次握手 · Why's THE Design? - 面向信仰编程​draveness.me
4640491edc4dffeedba3876de5601550.png
为什么 TCP/IP 协议会拆分数据 · Why's THE Design? - 面向信仰编程​draveness.me
b69695fdf67441a4a0c99888059cf366.png
https://book.douban.com/subject/1088054/​book.douban.comShadow:TCP状态转换图总结​zhuanlan.zhihu.com
为什么 TCP 协议有 TIME_WAIT 状态 · Why's THE Design? - 面向信仰编程​draveness.me
f37dac2c1824a0d68e5502658e0821b8.png

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

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

相关文章

python substr函数_Sql SUBSTR函数

SQL常用函数总结SQL常用函数总结 这是我在项目开发中使用db2数据库写存储过程的时候经常用到的sql函数.希望对大家有所帮助: sql cast函数 (1).CAST()函数的参数是一个表达式,它包括用AS关键字分 ...SQL中CHARINDEX()/INSTR()函数…

LeetCode 1911. 最大子序列交替和(动态规划)

文章目录1. 题目2. 解题1. 题目 一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。 比方说,数组 [4,2,5,3] 的交替和为 (4 5) - (2 3) 4 。 给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和…

python实现etl_为什么选择R而不是Python做ETL

导读:1. 打破R慢的印象,ETL效率显著优于Python,堪比spark,clickhouse2. 对比python中的datatable、pandas、dask、cuDF、modin,R中data.table以及spark、clickhouse3. 探讨R中的ETL体系ETL在数据工作中起着至关重要的作…

LeetCode 1912. 设计电影租借系统(map+set)

文章目录1. 题目2. 解题1. 题目 你有一个电影租借公司和 n 个电影商店。 你想要实现一个电影租借系统,它支持查询、预订和返还电影的操作。 同时系统还能生成一份当前被借出电影的报告。 所有电影用二维整数数组 entries 表示,其中 entries[i] [shopi…

python第一周心得_python第一周心得-Go语言中文社区

Python 简介Python 作为一个近年备受好评的语言,它的一些优点让人无法忽视。Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。它的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号&am…

数据库总结

数据库只是一个工具 简写:SSMS 全拼:SQL Server Management Studio 服务器名称: 数据库服务所在的电脑的ip地址 通过".(本台)","lacal(本地)"登陆 点击电脑开始→ 运行→ cmd→ net start mssqlserver 服务器的启动 net stop mssqlserve…

python中接口测试垃圾数据如何清理_巧用PyUnit中unittest特性解决接口测试产生脏数据问题...

巧用PyUnit中unittest特性解决接口测试产生脏数据问题一、背景测试数据创建后需要对其删除,不然可能产生脏数据,对开发和测试、生产环境造成一定影响。其接口框架是基于Python,API规范基于REST。二、产生原因(1)改进前:清除资源的…

关于html标签元素的data-*属性

关于这个主题的文章和博客其实已经非常多了,这里并非要重复造轮子,只是看到一些例子稍微有点麻烦,其实也很简单,但是对于一个刚刚入门的人,w3c的例子甚至可能看不懂,这里列出一个最简单不过的小案例以供参考…

使用预训练模型进行句对分类(Paddle、PyTorch)

文章目录1. Paddle2. PyTorch3. 提交结果分别使用两种框架,加载预训练模型,对句对进行分类 数据下载:千言数据集:文本相似度 1. Paddle 可以使用 paddlenlp 直接加载预训练模型,比较方便 # %% # 比赛地址 # https…

python将元祖设为整形_python基础(5)---整型、字符串、列表、元组、字典内置方法和文件操作介绍...

对于python而言,一切事物都是对象,对象是基于类创建的,对象继承了类的属性,方法等特性1.int首先,我们来查看下int包含了哪些函数#python3.xdir(int)#[__abs__, __add__, __and__, __bool__, __ceil__, __class__, __de…

mysql1033错误存储引擎_MySQL Innodb存储引擎因为缓存配置出现的错误

引用100920 10:50:21 mysqld_safe Starting mysqld daemon with databases from /byread/dataInnoDB: The InnoDB memory heap is disabledInnoDB: Mutexes and rw_locks use GCC atomic builtinsInnoDB: mmap(11010048000 bytes) failed; errno 12InnoDB: Fatal error: cannot…

《你的灯亮着吗》 读书笔记三

紧接《你的灯亮着吗》读书笔记二 4、这是谁的问题? 当别人可以妥善解决自己的问题时,不要越俎代庖,如果这是他们的麻烦,就让它成为他们的麻烦,如果一个人处于解决问题的位置,却并不受问题困扰,那…

LeetCode 1913. 两个数对之间的最大乘积差

文章目录1. 题目2. 解题1. 题目 两个数对 (a, b) 和 (c, d) 之间的 乘积差 定义为 (a * b) - (c * d) 。 例如,(5, 6) 和 (2, 7) 之间的乘积差是 (5 * 6) - (2 * 7) 16 。 给你一个整数数组 nums ,选出四个 不同的 下标 w、x、y 和 z ,使数…

PHP和MySQL开发WordPress_wordpress是什么开发的

wordpress是什么开发的?WordPress是一个以PHP和MySQL为平台的自由开源的博客软件和内容管理系统。WordPress具有插件架构和模板系统。截至2018年4月,排名前1000万的网站超过30.6%使用WordPress。WordPress是最受欢迎的网站内容管理系统。WordPress是目前…

python 数据平滑_数据平滑方法的原理和应用

一、简介在实际的工程应用中,经常会遇到初始结果噪声太多的问题,比如信号强度抖动的太厉害,比如视频流中的bbox抖动的太厉害,比如光谱信号抖动的太厉害等等,这时候就需要一些简单的滑动平均算法。滑动平均其实是一个很…

LeetCode 1920. 基于排列构建数组

文章目录1. 题目2. 解题1. 题目 给你一个 从 0 开始的排列 nums&#xff08;下标也从 0 开始&#xff09;。 请你构建一个 同样长度 的数组 ans &#xff0c;其中&#xff0c;对于每个 i&#xff08;0 < i < nums.length&#xff09;&#xff0c;都满足 ans[i] nums[nu…

程序员职业生涯的11个阶段程序人生

程序员的职业生涯是一段充满起伏的有趣经历。考虑到其陡峭的学习曲线&#xff0c;完全可以预见你将经历挫折、启蒙、骄傲自大这几个时期&#xff0c;以及穿插其间的各种心路历程。在这篇文章中让我们轻松一下&#xff0c;在作者诙谐的语言中来回顾这11个阶段&#xff1a; 阶段1…

unity python_Unity引擎内嵌python

Unity脚本using System.Collections;using System;using System.Collections.Generic;using UnityEngine;using System.Diagnostics; //需要添加这个名词空间&#xff0c;调用DataReceivedEventArgpublic class LoadPython : MonoBehaviour{string sArguments "UnityLoad…

LeetCode 1922. 统计好数字的数目(快速幂)

文章目录1. 题目2. 解题1. 题目 我们称一个数字字符串是 好数字 当它满足&#xff08;下标从 0 开始&#xff09;偶数 下标处的数字为 偶数 且 奇数 下标处的数字为 质数 &#xff08;2&#xff0c;3&#xff0c;5 或 7&#xff09;。 比方说&#xff0c;“2582” 是好数字&a…

《人性的弱点》

卡耐基-《人性的弱点》&#xff0c;讲做人要平和、真诚&#xff0c;沟通的成功在于尽量避免争辩&#xff0c;最常见的情况是在争辩中取得了胜利却失去了成功的机会。这本书适合长时间的品味&#xff0c;以至自觉地养成良好的习惯以及卓越的品格。没有什么励志书是可以让你一下子…