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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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…

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是目前…

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…

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

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

LeetCode 1933. 判断字符串是否可分解为值均等的子串

文章目录1. 题目2. 解题1. 题目 一个字符串的所有字符都是一样的&#xff0c;被称作等值字符串。 举例&#xff0c;"1111" 和 "33" 就是等值字符串。 相比之下&#xff0c;"123"就不是等值字符串。 规则&#xff1a;给出一个数字字符串s&…

LeetCode 1921. 消灭怪物的最大数量(排序)

文章目录1. 题目2. 解题1. 题目 你正在玩一款电子游戏&#xff0c;在游戏中你需要保护城市免受怪物侵袭。 给你一个 下标从 0 开始 且长度为 n 的整数数组 dist &#xff0c;其中 dist[i] 是第 i 个怪物与城市的 初始距离&#xff08;单位&#xff1a;米&#xff09;。 怪物以…

软件测试课程学习总结

一、知识结构 介绍&#xff1a; 1.Definition of Software testing: Software testing is any activity aimed at evaluating an attribute or capability of a program or system and determining that it meets its required results Software Testing is an empirical&#…

vue 高德地图 不同区域显示不同颜色_高德百度哪家强?苹果Carplay第三方分屏功能评测...

几天前&#xff0c;苹果公司正式更新了iOS13.4版本。一个小版本系统更新&#xff0c;却让车主群热闹了起来。在这个版本中&#xff0c;苹果正式开放了Carplay分屏显示模式下对第三方地图的支持。车主们的热情&#xff0c;化为高德地图和百度地图微博下网友的催更。不过&#xf…

同花顺如何切换k线_30分钟线可分析出庄家的意图:教你如何用30分钟K线选股做超短线...

30分钟做超短线的好处1、兼具超短线和短线的优点&#xff0c;是联系超短周期和短周期的有利武器。2、30分钟线把一天分成8个部分&#xff0c;正好是一个神奇数字&#xff0c;自然界中很多神奇的规律不可不信&#xff01;3、对于庄家控盘的股票&#xff0c;30分钟线可分析出庄家…

LeetCode 1925. 统计平方和三元组的数目

文章目录1. 题目2. 解题1. 题目 一个 平方和三元组 (a,b,c) 指的是满足 a2b2c2a^2 b^2 c^2a2b2c2 的 整数 三元组 a&#xff0c;b 和 c 。 给你一个整数 n &#xff0c;请你返回满足 1 < a, b, c < n 的 平方和三元组 的数目。 示例 1&#xff1a; 输入&#xff1a;…

石头剪刀布程序流程图_机器学习终章:剪刀石头布猜拳机器人

8.1. 简介TensorFlow对于我们普通人来说一直是高冷的存在&#xff0c;都是大神们的狂欢。喵家最近将TensorFlow移植到喵家编程软件Kittenblock中&#xff0c;希望能让人工智能&#xff0c;机器学习尽快落地。能让普通用户也能用上这个好用的机器学习框架&#xff0c;解决生活中…

java 工厂模式的写法_java工厂模式三种详解

工厂方法模式(Factory Method)工厂方法模式分为三种&#xff1a;1、普通工厂模式&#xff0c;就是建立一个工厂类&#xff0c;对实现了同一接口的一些类进行实例的创建。首先看下关系图&#xff1a;举例如下&#xff1a;(我们举一个发送邮件和短信的例子)首先&#xff0c;创建二…

LeetCode 1926. 迷宫中离入口最近的出口(BFS)

文章目录1. 题目2. 解题1. 题目 给你一个 m x n 的迷宫矩阵 maze &#xff08;下标从 0 开始&#xff09;&#xff0c;矩阵中有空格子&#xff08;用 . 表示&#xff09;和墙&#xff08;用 表示&#xff09;。 同时给你迷宫的入口 entrance &#xff0c;用 entrance [entra…

LeetCode 1930. 长度为 3 的不同回文子序列(计数)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s &#xff0c;返回 s 中 长度为 3 的不同回文子序列 的个数。 即便存在多种方法来构建相同的子序列&#xff0c;但相同的子序列只计数一次。 回文 是正着读和反着读一样的字符串。 子序列 是由原字符串删除其中部分字符&…

修改telnet的用户名密码_远程管理设备telnet的N种设置方法

作为一名网络工程师&#xff0c;日常管理和配置设备&#xff0c;可以选择的方法有很多&#xff0c;很多(如下图)&#xff0c;但是最常用的配置手段&#xff0c;任然是本地使用console口&#xff0c;远程使用telnet(或SSH)&#xff0c;本文以思科设备演示几种telnet的设置方法&a…