【网络基础】TCP协议2

news2025/4/20 12:17:24

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 应答的一种机制。

小结

可靠性

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

提高性能

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

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

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

相关文章

Web 安全漏洞之文件上传

目录 文件上传漏洞及危害 文件名 HTML 和 SVG 软链 服务器磁盘 防御方法 网络安全学习路线 (2024最新整理) 学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明: 文件上传漏洞及危害 文件上传漏洞…

基于SpringBoot + Vue的兼职网站管理系统设计与实现+毕业论文+答辩PPT

系统介绍 本系统包含管理员、用户、企业三个角色。 管理员角色:前台首页、个人中心、用户管理、企业管理、兼职信息管理、职位申请管理、留言板管理、系统管理。 用户角色:前台首页、个人中心、职位申请管理。 企业角色:前台首页、个人中心、…

【异常处理】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 求一元二次方程式ax^2bxc0的实根&#xff0c;如果方程没有实根&#xff0c;则输入有关警告信息。要求&#xff1a;建立一元二次方程类&#xff0c;利用异常技术处理。 源码 #include <iostream> #include <cmath>using namespa…

JVM的垃圾回收算法有哪些?从可达性分析算法开始,深入解读三大核心垃圾回收算法

导航&#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/黑马旅游/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码-CSDN博客 目录 一、概念准备 1.1 GC Roots 1.2 可达性分析算法 1.3 非可达对象被回收过程中的两次标记 1.4…

【数据结构与算法 刷题系列】环形链表的约瑟夫问题

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;数据结构与算法刷题系列&#xff08;C语言&#xff09; 目录 一、问题描述 二、解题思路详解 解题思路 解题步骤 三、C语言代码…

文件流-ASCII文件(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 编写程序实现以下功能&#xff1a;【要求处理ASCII文件】 &#xff08;1&#xff09;按职工号由小到大的顺序将5个员工的数据&#xff08;包括号码、姓名、年龄和工资&#xff09;输出到磁盘文件中保存&#xff1b; &#xff08;2&#xff…

服务器3389端口,服务器3389端口风险提示的应对措施

3389端口是Windows操作系统中远程桌面协议&#xff08;RDP&#xff09;的默认端口。一旦该端口被恶意攻击者利用&#xff0c;可能会导致未经授权的远程访问和数据泄露等严重安全问题。 针对此风险&#xff0c;强烈建议您采取以下措施&#xff1a; 1. 修改默认端口&#xff1a;…

八、e2studio VS STM32CubeIDE之内存使用情况窗口

目录 一、概述/目的 二、STM32CubeIDE Build Analyzer 三、e2studio Memory Usage 八、e2studio VS STM32CubeIDE之内存使用情况窗口 一、概述/目的 1、嵌入开发最大特点之一就是资源受限&#xff0c;关注芯片资源使用详情是优秀工程师的技能之一 2、Keil和IAR都不支持内存…

Linux性能压测指标信息

1、CPU使用 服务器CPU整体负载信息 可以查看top命令输出的第三行数据 查看多核CPU命令 mpstat -P ALL 和 sar -P ALL top命令执行后输入1 2、内存使用 top命令或者free命令来查看内存的信息&#xff0c;第一行是物理内存使用&#xff0c;第二行是虚拟内存使用(交换空间)。…

WebSocket建立网络连接——小案例

WebSocket是一种实现全双工通信的网络技术标准&#xff0c;它允许在用户的浏览器和服务器之间进行持久的、双向的通信。以下是对WebSocket的具体介绍&#xff1a; 实时性&#xff1a;与传统HTTP请求相比&#xff0c;WebSocket提供了更高效的实时数据交换方式。一旦建立连接&am…

【cpp】并发多线程 Unique

1. unique_lock 何时锁定资源。 unique_lock lock1 时候&#xff0c;还没有锁住资源。 实际是后面&#xff0c;显式的出发&#xff1a; 比如&#xff0c; lock.lock, 或 std::lock(lk1,lk2), 或者条件变量CV.wait(mtx, []{!re})。 #include <iostream> #include <mu…

虚拟仿真云平台在教育应用中的优势和意义

虚拟仿真云实验教学平台作为一种新型的教学方法&#xff0c;近年来在高校教育中得到了十分广泛的应用。它通过模拟真实的实验场景和实验操作&#xff0c;让学生在计算机上进行实验操作和数据处理&#xff0c;为学生提供了更加便捷、可靠、有效的实验学习环境。本文&#xff0c;…

ssm123基于java web的网上书城系统的设计与实现+vue

基于java web的网上书城系统的设计与实现vue 摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;商品交易当然也不能排除在外&#xff0c;随着商品交易管理的不断成熟&#xff0c;它彻底改变了…

基于SpringBoot + Vue实现的考编(考研)论坛网站设计与实现+毕业论文

系统介绍 系统包含用户和管理员两个角色 用户&#xff1a;登录、注册、经验交流平台、发布帖子、回复帖子、查看公告信息、跳蚤市场&#xff08;商品购买、商品出售、商品评价&#xff09;、个人中心等功能 管理员&#xff1a;登录、个人中心、管理员管理、用户管理、基础数据管…

REACT 在组件之间共享状态

有时&#xff0c;您希望两个组件的状态始终一起变化。要做到这一点&#xff0c;请从他们俩身上删除状态&#xff0c;将其移动到他们最近的共同父级&#xff0c;然后通过道具将其传递给他们。这被称为提升状态&#xff0c;这是编写 React 代码时最常见的事情之一。 举例提升状态…

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

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

机器人学导论实验1—CoppeliaSim 平台介绍及初步使用BJTU

1. 实验内容分析 对实验内容的理解及关键点&#xff1a; 理解这个实验的关键点在于理解如何使用CoppeliaSim和MATLAB来控制和操作机器人。需要熟悉这两个工具的基本操作&#xff0c;例如如何加载场景、如何修改机器人参数、如何使用MATLAB客户端程序来控制机器人等。此外&#…

开源分布式爬虫管理平台:性能强悍!!【送源码】

简介 基于 Golang 的分布式爬虫管理平台&#xff0c;支持 Python、NodeJS、Go、Java、PHP 等多种编程语言以及多种爬虫框架。 谁适合使用 Crawlab? 网路爬虫工程师&#xff1a; 通过集成爬虫程序到 Crawlab&#xff0c;网路爬虫工程师可以聚焦于爬虫的核心解析逻辑&#xff0…

C语言学习【C语言基本数据类型二】

C语言学习【C语言基本数据类型二】 _Bool类型 C99标准添加了_Bool类型&#xff0c;用于表示布尔值&#xff0c;即逻辑值true和false&#xff0c;原则上仅占用1位存储空间&#xff1b; float、double和long double 记数法示例 C标准规定&#xff0c;float类型必须至少能表示…

2024CCPC郑州站超详细题解(含题面)ABFHJLM(河南全国邀请赛)

文章目录 前言A Once In My LifeB 扫雷 1F 优秀字符串H 随机栈J 排列与合数L Toxel 与 PCPC IIM 有效算法 前言 这是大一博主第一次参加xcpc比赛&#xff0c;虽然只取得了铜牌&#xff0c;但是收获满满&#xff0c;在了解了和别人的差距后会更加激励自己去学习&#xff0c;下面…