【网络基础】TCP协议2

TCP建立连接

什么是TCP连接

用于保证可靠性和流量控制维护的某些状态信息,这些信息的组合,包括 Socket、序列号和窗口大小称为连接。
Socket:由 IP 地址和端口号组成
序列号:用来解决乱序问题等
窗口大小:用来做流量控制

三次握手作用

  1. 建立连接
  2. 协商起始序列号
  3. 协商双方的接收缓冲区大小

三次握手的过程

在这里插入图片描述

  1. 第一次握手:客户端发送一个SYN到服务器请求建立连接,这个SYN包含一个序列号(用于在后续的数据传输中进行标记),客户端进入SYN_SENT状态,等待服务器响应。
  2. 第二次握手:服务器收到SYN包后,捎带应答一个SYN+ACK(确认应答序列号+1)给客户端(包含服务器自己的序列号),服务器进入SYN_RECV状态,等待服务器响应。
  3. 第三次握手:客户端收到SYN+ACK后,发送一个ACK确认应答。这个ACK包包含对服务器的应答,即客户端确认应答序列号+1。客户端发送后状态变为ESTABLISHED,服务端收到报文后也变为此状态。

为什么是三次握手?

能防止历史连接的建立,能减少双方不必要的资源开销,能帮助双方同步初始化序列号。
奇数次握手,可以确保一般情况握手失败的连接成本嫁接在客户端上。验证全双工的最小次数。
不是两次?
连接失败的成本会嫁接到服务端,无法防止历史连接的建立,会造成双方资源的浪费,也无法可靠的同步双方序列号。
不是四次?
三次握手就已经理论上最少可靠连接建立,所以不需要使用更多的通信次数。
不是一次?
服务端接收到客户端的 SYN 包就认为建立连接成功的话,这样会带来 SYN 洪水攻击问题。

accept的第二个参数backlog

backlog+1表示底层已经建立好连接队列的最大长度。当服务器一个连接建立完成(即进入ESTABLISHED状态),当服务端没有调用accept函数,该连接便会进入该队列等待。如果队列已满,服务端收到连接后进入SYN_RECV状态(半连接状态)放入半连接队列,服务器不会长时间维护此状态,一定时间会丢弃。

TCP断开连接

四次挥手过程

在这里插入图片描述

  1. 第一次挥手:客户端主动向服务端发送FIN报文,请求断开连接(客户端进入FIN_WAIT_1状态),表明客户端不会再向服务端发送数据(但可以接受服务端发来的数据)。
  2. 第二次挥手:服务端接收到FIN报文后,会发送ACK报文(进入CLOSE_WAIT状态),表明服务端收到了客户端的FIN。而服务端可能还有数据需要进行处理和发送,连接并没有真正关闭。(客户端收到ACK进入FIN_WAIT_2状态)
  3. 第三次挥手:服务端处理完数据,发送FIN报文给客户端。(服务端变为LAST_ACK)
  4. 第四次挥手:客户端收到FIN报文后(状态变为TIME_WAIT),向服务端发送ACK报文,表明确认连接关闭。(服务端收到ACK报文后,状态变为CLOSED)
  5. 主动关闭连接的一方进行第四次挥手后,需要维持一段TIME_WAIT状态一段时间(报文最大生存时间)然后进入CLOSE状态。

TIME_WAIT状态

主动断开连接的一方会进入TIME_WAIT状态,该状态时连接没有彻底断开,ip和port正在被使用,无法立即重启。

setsockopt设置套接字能被复用

在这里插入图片描述

为什么 TIME_WAIT 等待的时间是 2MSL?

MSL 是 Maximum Segment Lifetime,报文最大生存时间,即报文从一端到另一端所需时间的最大值。它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。
让通信双方历史数据得以消散。让断开连接时4次挥手有较好的容错性(即如果最后一次ACK丢失,客户端在TIME_WAIT还可以重发)。
如果客户端(主动关闭放)最后一次 ACK 报文(第四次挥手)在网络中丢失了,那么根据 TCP 可靠性原则,服务端(被动关闭方)会重传 FIN 报文。假设客户端(主动关闭连接放)没有 TIME_WAIT 状态,而是在发完最后一次 ACK 报文就直接进入 CLOSED 状态。如果该 ACK 报文丢失了,服务端则重传 FIN 报文,而此时客户端已经进入关闭状态了,在收到服务端重传的 FIN 报文后,就会回复 RST 报文。
在这里插入图片描述
服务端收到这个 RST 并将其解释为一个错误(Connection reset by peer),这对于一个可靠的协议来说不是一个优雅的终止方式。
为了防止这种情况出现,客户端必须等待足够长的时间,确保服务端能够收到 ACK,如果服务端没有收到 ACK,那么就会触发 TCP 重传机制,服务端会重新发送一个 FIN,这样一去一来刚好两个 MSL 的时间。
在这里插入图片描述

流量控制

TCP流量控制基于接收方的实际接收能力。在数据传输过程中,接收方会根据其缓冲区的大小和当前的网络状况,通过发送确认信号(ACK)来通知发送方可以发送的数据量。发送方则根据接收方的确认信号来控制其数据发送速率,确保发送的数据量不会超过接收方的处理能力。

  • 接收端将自己接收缓冲区剩余空间的大小放入 TCP 报头中的窗口大小字段,通过 ACK 报文通知发送端。
  • 窗口大小字段越大,说明网络的吞吐量越高。
  • 接收端一旦发现自己的缓冲区快满了,就会将窗口大小设置成一个更小的值通知给发送端。发送端接受到这个窗口之后,就会减慢自己的发送速度。
  • 如果接收端缓冲区满了,就会将窗口大小置为0。这时发送方不再发送数据,但是需要定期发送一个窗口探测数据段,使接收端把窗口大小告诉发送端。还有一种策略就是,接收端的缓冲区剩余空间更新后,接收端会给发送端发送窗口更新通知来告知对方接收缓冲区剩余空间的大小。
  • TCP 是全双工的,可以在两个方向上进行流量控制。 三次握手时,会通过 TCP报头中的窗口大小字段来告知对方自己的接收缓冲区剩余空间的大小。那么在正式进行网络通信时,就已经得知对方的接收能力了,可以根据对方的接收能力来发送数据。
  • 16位窗口字段最大能表示的值是 65535,那么 TCP 窗口最大就是 65535 字节么?并不是,实际上,TCP 报头 40字节选项中还包含了一个窗口扩大因子 M,实际窗口大小是窗口字段的值左移 M 位,M 的取值范围是 0 到 14。

滑动窗口

TCP滑动窗口是一种动态窗口,它的大小可以在一定范围内进行调整。发送方和接收方都维护一个窗口,窗口的大小决定了在无需等待对方确认的情况下,可以连续发送数据包的最大数量。

在这里插入图片描述

工作原理

TCP滑动窗口以字节为单位,分为发送窗口和接收窗口。发送方在发送数据时,会根据接收方的窗口大小来确定发送的数据量。当发送方发送一个数据包后,它会等待接收方的确认(ACK)报文。如果接收方成功接收了数据包并返回了ACK报文,那么发送方的滑动窗口就会向右滑动一格,继续发送下一个数据包。如果发送方在一段时间内没有收到接收方的ACK报文,那么它会认为数据包丢失,并启动超时重传机制。
在这里插入图片描述
如上图当发送端收到ACK2001后就向右滑动,滑动窗口大小表示无需等待 ACK 应答而可以继续发送数据的数量的最大值。大小是动态变化的。

  • 右不变,左移动,窗口变小:对方应用层没有从tcp接收缓冲区拿数据。
  • 左右都移动,整体的范围扩大/变小
    start=确认序号
    end=确认序号+窗口大小
    滑动窗口一直向右移动并不会造成越界问题。因为发送缓存区是被看成环形队列的,当滑动窗口向右移动时,如果超出了缓冲区的范围,那么就会进行模除运算,重新回到缓冲区的起始位置进行向右移动。

丢包问题

情况一.ack丢失

  • 允许少量的ack丢失,因为确认序号表示序号之前的报文都已经被接收。例如:当3000-4000丢失,3000-4000的应答报文中确认序号仍然是3001,4000-5000的报文中也是3001。

情况二.数据丢失

在这里插入图片描述
当1001-2000的报文丢失,主机A收到三次相同的确认应答,那就会触发快重传机制。
为何还需要超时重传?
快重传有条件的(必须三次一样的确认应答)才能触发,如果报文是最后一个或者倒数第二个就不满足快重传条件。超时重传作为一个兜底策略,而快重传是为了提高效率。

拥塞控制

如果通信双方出现了大量的数据丢包(超时)问题,tcp会判断网络出问题了(网络拥塞)。此时不能立即对报文进行超时重传。tcp协议是多主机在网络出现拥塞时达成共识

解决方案

TCP引入慢启动机制,先发少量数据探探路,如果得到应答,再慢慢增大数据量。
引入拥塞窗口概念,初始值为1,每次收到一个ack,拥塞窗口+1,每次发送数据包时,将拥塞窗口和接收端反馈的窗口大小(前文认为的滑动窗口大小)作比较,取最小值最为实际发送的大小。
在这里插入图片描述

  • 拥塞窗口:主机判断网络健康状态的指标,超过拥塞窗口大小,会引发网络拥塞。
    在这里插入图片描述
  • 指数增长:刚开始发送数据时,拥塞窗口大小被设置为 1,并且以指数形式进行增长。因为指数前期增长较慢,可以避免网络拥塞问题。而中后期时指数增长快,此时网络也恢复了,可以尽快恢复双方的通信效率。
  • 线性增长:慢启动的阈值初始时被设置为对方窗口大小的最大值,上图中的慢启动阈值为 16。当拥塞窗口的大小增长到慢启动阈值时就不再以指数形式进行增长,而采用线性增长的方式。注意:线性增长阶段时,还未发生网络拥塞问题。
  • 乘法减小:当拥塞窗口大小增长到 24 时,发生了网络拥塞问题,此时慢启动阈值就会变成当前拥塞窗口大小的一半,同时拥塞窗口大小变成一。然后拥塞窗口再次以指数的形式进行增长,周而复始。

应答

延迟应答

接收端在处理完多个数据包后再发送ACK应答,从而增大了滑动窗口的大小,提高了数据传输的效率。

  • 假设接收端缓冲区为 1M,一次收到了 500K 的数据。如果立刻进行应答,那么返回的窗口大小就是 500K。
  • 但实际上接收方处理数据的速度可能会很快,10ms 之内就可以把 500K 数据从缓冲区消费掉了。
  • 在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来。
  • 如果接收端稍微等一会再应答,比如等待 200ms 再应答,那么这个时候接收方返回的窗口大小就是 1M。
  • 数量限制:每隔 N 个包就应答一次。
  • 时间限制:超过最大延迟时间就应答一次(这个时间不会导致超时重传)

捎带应答

TCP 协议的捎带应答机制就是发送的同一个 TCP 数据包中即包含数据又包含 ACK 应答的一种机制。

小结

可靠性

  • 检验和
  • 序列号(按序到达+去重)
  • 确认应答
  • 超时重发
  • 连接管理
  • 流量控制
  • 拥塞控制

提高性能

  • 滑动窗口
  • 快速重传
  • 延迟应答
  • 捎带应答
  • 流量控制

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业邮箱域名是什么?怎么注册一个企业邮箱域名?

企业邮箱域名是什么?企业邮箱域名是企业申请的专属域名,绑定专属的邮箱域名,能够在发送邮件时提高品牌识别性、专业性和宣传效果。那么,我们该怎么注册一个企业邮箱域名呢?本文将为你详细介绍。 一、企业邮箱域名是什…

揭秘高效引流获客的艺术

在数字营销的海洋中,吸引潜在客户的注意力就像捕捉闪烁的鱼群——需要技巧、耐心和正确的工具。有效的引流获客策略能为企业带来生机,如同春风拂过荒漠,唤醒沉睡的种子。本文将带你领略那些让企业脱颖而出的获客秘籍,让你的目标客…

机器视觉技术精准测量点胶高度与宽度:提升生产质量的新利器

在现代化生产线中,点胶工艺是许多产品制造过程中的重要环节。点胶的高度和宽度直接影响到产品的质量和性能。传统的测量方法往往效率低下、精度不高,而机器视觉技术的引入,为点胶高度和宽度的测量带来了革命性的变革。本文将探讨机器视觉如何…

一文汇总对比英伟达、AMD、英特尔显卡GPU

‍‍🏡博客主页: virobotics(仪酷智能):LabVIEW深度学习、人工智能博主 📑上期文章:『【仪酷LabVIEW AI工具包案例】使用LabVIEW AI工具包YOLOv5结合Dobot机械臂实现智能垃圾分类』 🍻本文由virobotics(仪酷…

运筹系列92:vrp算法包VROOM

1. 介绍 VROOM is an open-source optimization engine written in C20 that aim at providing good solutions to various real-life vehicle routing problems (VRP) within a small computing time. 可以解决如下问题: TSP (travelling salesman problem) CVRP …

使用Navicat将MySql数据库导入和导出

一,导出数据表 1.使用Navicat打开数据库,右键数据库,点击转储SQL文件,点击结构和数据。 2.选择生成文件的地方 3.等待生成完成 4.生成完成 二,导入数据库表和数据SQL文件 1.新建一个数据库 2.右键选择运行SQl文件 记…

租赁小程序开发搭建支持时租日租月租

租赁小程序开发搭建支持时租日租月租 一款开源版的小程序,专为物品租赁服务设计,能满足客户在各种租赁场景中的需求。 该程序支持时租、日租、夜租等多种租赁方式,并配备了DIY页面和分销系统。用户可以通过平台轻松租赁商品,支付…

Android:资源的管理,Glide图片加载框架的使用

目录 一,Android资源分类 1.使用res目录下的资源 res目录下资源的使用: 2.使用assets目录下的资源 assets目录下的资源的使用: 二,glide图片加载框架 1.glide简介 2.下载和设置 3.基本用法 4.占位符(Placehold…

C++11新特性之lambda表达式

一、lambda表达式的优点 lambda是c11非常重要也是最常用的特性之一,他有以下优点: 就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或函数对象。lambda是一个匿名的内联函数简洁:避免了代码膨胀和功能分散,让…

强化学习——马尔可夫奖励过程的理解

目录 一、马尔可夫奖励过程1.回报2.价值函数 参考文献 一、马尔可夫奖励过程 在马尔可夫过程的基础上加入奖励函数 r r r 和折扣因子 γ \gamma γ&#xff0c;就可以得到马尔可夫奖励过程&#xff08;Markov reward process&#xff09;。一个马尔可夫奖励过程由 < S , …

网络编程:服务器模型-并发服务器-多进程

并发服务器概念&#xff1a; 并发服务器同一时刻可以处理多个客户机的请求 设计思路&#xff1a; 并发服务器是在循环服务器基础上优化过来的 &#xff08;1&#xff09;每连接一个客户机&#xff0c;服务器立马创建子进程或者子线程来跟新的客户机通信 &#xff08;accept之后…

Web APIs(获取元素+操作元素+节点操作)

目录 1.API 和 Web API 2.DOM导读 DOM树 3.获取元素 getElementById获取元素 getElementsByTagName获取元素 H5新增方法获取 获取特殊元素 4.事件基础 执行事件 操作元素 修改表单属性 修改样式属性 使用className修改样式属性 获取属性的值 设置属性的值 移除…

【多人协作】场景模拟(一)

文章目录 实现多人协作场景&#xff1a;操作流程1开发人员a和b克隆仓库到本地2在本地仓库建立分支并与远程分支建立链接3开发人员工作并提交代码4将合并dev分支与master分支 实现多人协作 多人协作开发是git的最核心也是最重要的操作。多人协作也就意味着同一时间里&#xff0…

基于springboot+vue+Mysql的音乐翻唱与分享平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

2024年3月 青少年等级考试机器人理论真题三级

202403 青少年等级考试机器人理论真题三级 第 1 题 流程图图例如下&#xff0c;与该图例功能对应的选项是&#xff1f;&#xff08; &#xff09; A&#xff1a;开始/结束 B&#xff1a;输入/输出 C&#xff1a;判断 D&#xff1a;处理 第 2 题 Arduino UNO/Nano主控板&am…

鸿蒙ArkUI开发:常用布局【弹性布局方向图】

弹性布局方向图 Flex({ direction: FlexDirection.Row }) FlexDirection.Row&#xff08;默认值&#xff09;&#xff1a;主轴为水平方向&#xff0c;子组件从起始端沿着水平方向开始排布FlexDirection.RowReverse&#xff1a;主轴为水平方向&#xff0c;子组件从终点端沿着F…

【机器学习300问】83、深度学习模型在进行学习时梯度下降算法会面临哪些局部最优问题?

梯度下降算法是一种常用的优化方法&#xff0c;用于最小化损失函数以训练模型。然而&#xff0c;在使用梯度下降算法时&#xff0c;可能会面临以下局部最优问题。 &#xff08;一&#xff09;非凸函数的局部极小值 问题描述&#xff1a;在复杂的损失函数中&#xff0c;如果目…

2023年上半年信息系统项目管理师——综合知识真题与答案解释(3)

2023年上半年信息系统项目管理师 ——综合知识真题与答案解释(3) 整个4月份都在忙处理我家所在楼的电梯托管工作&#xff0c;红头文件的5月期限&#xff0c;临时加入&#xff0c;人少琐事较多&#xff0c;从寻找电梯托管公司&#xff0c;整理总结托管公司资料&#xff0c;组织…

基于SpringBoot+微信小程序的订餐(点餐)配送系统设计与实现+毕业论文(12000字)

系统介绍 本微信小程序在线订餐系统管理员功能可以修改个人中心&#xff0c;用户管理&#xff0c;菜品分类管理&#xff0c;菜品信息管理&#xff0c;订单信息管理&#xff0c;取消订单管理&#xff0c;订单配送管理&#xff0c;菜品评价管理以及系统管理。微信小程序用户可以…