TCP协议

TCP

  • 1. 格式
  • 2. TCP原理
    • 2.1 确认应答(安全机制)
    • 2.2 超时重传(安全机制)
    • 2.3 连接管理机制(安全机制)
      • 2.3.1 三次握手
      • 2.3.2 四次挥手
    • 2.4 滑动窗口(效率机制)
  • 2.5 流量控制(效率机制)

1. 格式

在这里插入图片描述
源/目的端口号:表示数据是从哪个进程来,到哪个进程去;
32位序号/32位确认号:后面详细讲;
4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最大长度是15 * 4 = 60
6位标志位:
URG:紧急指针是否有效
ACK:确认号是否有效
PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

16位校验和:发送端填充,CRC校验。接收端校验不通过,则认为数据有问题。此处的检验和不光包含TCP首部,也包含TCP数据部分

16位紧急指针:标识哪部分数据是紧急数据

2. TCP原理

TCP对数据传输提供的管控机制,主要体现在两个方面:安全和效率。
这些机制和多线程的设计原则类似:保证数据传输安全的前提下,尽可能的提高传输效率

2.1 确认应答(安全机制)

在这里插入图片描述

TCP将每个字节的数据都进行了编号。即为序列号
每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下一次你从哪里开始发

2.2 超时重传(安全机制)

在这里插入图片描述

主机A发送数据给B之后,可能因为网络拥堵等原因,数据无法到达主机B;
如果主机A在一个特定时间间隔内没有收到B发来的确认应答,就会进行重发

2.3 连接管理机制(安全机制)

2.3.1 三次握手

在这里插入图片描述
TCP 要想保证可靠传输的前提就是网络通信是否通畅, "三次握手"机制就是用来验证网络通信是否通畅, 以及验证每个主机的发送能力和接收能力是否正常.
"三次握手"的每一步都有自己的用处:

  1. “第一次握手” 是用来验证客户端发送能力和服务器接收能力是否正常
  2. "第二次握手"是用来验证服务器的发送能力和客户端接受能力是否正常
  3. "第三次握手"是用来通知服务器服务器的发送能力和客户端接受能力是否正常

除此之外, 通信的时候也涉及到一些需要双方保持一致的参数也可以通过"三次握手"协商.

综上所述, "三次握手"的作用主要就是两方面:

  1. 验证通信路径是否通畅, 双方发送/接收能力是否正常.
  2. 协商必要参数, 使客户端和服务器使用相同的参数进行消息传输.

2.3.2 四次挥手

在这里插入图片描述
"四次挥手"的流程和"三次握手"非常相似, 经历过"四次挥手"之后连接就会断开, 双方就可以把各自保存的对方的信息的空间释放了.
网上很常见的一些面试题:
"四次挥手"可不可以三次完成?

"四次挥手"有的时候确实可以三次完成, 但是有的时候中间这两次不一定能合并.
因为 FIN 是通过应用程序的代码控制的, 而 ACK 是由内核控制的, 当收到 FIN 请求时会立刻返回 ACK, 但是由于程序可能没执行完所以不会立刻返回 FIN, 所以中间这两次不一定能合并.

如果服务器实在不发送 FIN 客户端连接就一直不会关闭吗?

当服务器接收到 FIN 请求就会转换成 CLOSE_WAIT 状态, 此时站在服务器的角度, 虽然连接没有关闭但是已经不能正常使用了. 如果缓冲区还有数据仍然可以正常读到但是如果进行写操作就会触发异常. 站在客户端角度, 如果经过一段时间的等待还是没有收到服务器的 FIN 请求就会单方面释放连接. 所以并不会一直不关闭.

如果通信过程中出现丢包怎么处理?

"三次握手"和"四次挥手"也带有重传机制, 会尽可能的重传, 如果连续多次重传失败就会单方面释放连接. 但是有一点需要注意的是: 最后一个 ACK 也有可能丢包, 所以当客户端发出去最后一个 ACK 时不能立即释放连接, 而是需要等待一段时间之后对方没有重传 FIN 才可以释放.(一般是等待网络是任意两点之间传输数据的最大时间 * 2)

2.4 滑动窗口(效率机制)

刚才我们讨论了确认应答策略,对每一个发送的数据段,都要给一个ACK确认应答. 收到ACK后再发送下一个数据段. 这样做有一个比较大的缺点,就是性能较差。尤其是数据往返的时间较长的时候.
既然这样一发一收的方式性能较低,那么我们一次发送多条数据,就可以大大的提高性能(其实是将多个段的等待时间重叠在一起了).
在这里插入图片描述
和之前的方式不同, 滑动窗口是一次性发出一组数据, 在这一组数据发送的过程中不需要等待 ACK, 此时就相当于一份等待时间等四个 ACK.
一次发送数据的大小称为"窗口".
"窗口"越大批量发送的数据就越多, 效率就越高, 但是不能无限大, 那样就相当于完全不用等 ACK就和不可靠传输差不多了.

当然, 在数据传输的过程中也会发生"丢包"此时就会分为以下两种情况:

  1. 数据包丢失
    以上图为例: 当1001 - 2000 丢失之后 2001 - 3000 这个数据到达 B , B返回的 ACK 确认序号仍然是 1001 , 虽然 A 后续的数据都给 B 顺利传输过去了但是 B始终的会和 A 索要 1001 - 2000 这个数据, 当 A 连续几次都收到了 B 的索要请求就会知道该数据丢失了就会重传该数据. 当重传的 1001 到达 B 之后 B 返回的 ACK 就是 5001 了 1001 之后的数据不需要重传.
  2. ACK 丢失
    ACK 丢失并没有太大的影响, 因为当收到下一个确认序号时就表明之前的数据已经全部收到. 所以 除非所有的 ACK 都丢失, 如果只是丢一部分不会影响可靠传输.

2.5 流量控制(效率机制)

滑动窗口虽然能提高效率但是如果窗口太大就可能导致接收方或者传输中间的链路处理不过来就会产生丢包, 反而影响了效率. 流量控制就是给滑动窗口加个现在避免窗口太大导致接收方处理不过来.
因此, 流量控制就是根据接收方的处理能力来限制发送方的发送速度(窗口大小)
流量控制是根据接收缓冲区的剩余空间大小来作为衡量的指标
接收方在返回 ACK 报文时就会把接收缓冲区剩余大小反馈给发送方, 作为下一次发送数据窗口大小的参考依据.
在这里插入图片描述
当我们看的该数据只有 16 位时不免会感到疑惑, 这里大小只有 16 位是不是就代表窗口大小最大就是 16? 其实不然, 在选项中有一个选项, 是窗口大小扩展因子, 实际窗口大小是 16 位窗口大小 << 扩展因子, 此时就可以使能够表示的窗口大小就非常大了.

当接收缓冲区满了 A 会停止发送数据, 但是由于不知道多会有空闲空间, 所以就会周期性发送 “窗口探测包”(不会携带具体数据)只是为了触发 ACK(查询当前接收缓冲区情况), 当发现有空闲空间就会发送数据.
接收方可以通过窗口大小反向控制发送方传输数据.

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

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

相关文章

机器学习——回归

目录 一、线性回归 1、回归的概念&#xff08;Regression、Prediction&#xff09; 2、符号约定 3、算法流程 4、最小二乘法&#xff08;LSM&#xff09; 二、梯度下降 梯度下降的三种形式 1、批量梯度下降&#xff08;Batch Gradient Descent,BGD&#xff09;&#xff…

基于SpringBoot+Vue的点餐管理系统

基于springbootvue的点餐平台网站系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 菜品详情 个人中心 订单 管理员界面 菜品管理 摘要 点餐管理系统是一种用…

一个使用uniapp+vue3+ts+pinia+uview-plus开发小程序的基础模板

uniappuviewPlusvue3tspiniavite 开发基础模板 使用 uniapp vue3 ts pinia vite 开发基础模板&#xff0c;拿来即可使用&#xff0c;不要删除 yarn.lock 文件&#xff0c;否则会启动报错&#xff0c;这个可能和 pinia 的版本有关&#xff0c;所以不要随意修改。 拉取代码…

Java根据一个List内Object的两个字段去重

背景 在Java开发过程中&#xff0c;我们经常会遇到需要对List进行去重的需求。 其中常见的情况是&#xff0c;将数组去重&#xff0c;或者将对象依据某个字段去重。这两种方式均可用set属性进行处理。 今天讨论&#xff0c;有一个List&#xff0c;且其中的元素是自定义的对象&…

vscode git提交

<template><view><cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"content">额外加工</block></cu-custom><uni-section title" "><view style"margin: 0 20px;&q…

AI:66-基于机器学习房价预测

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

pytest 的使用===谨记

发现用例的规则 a) 文件test_.py开头和_test.py结尾 b) Test开头的类中test开头的方法&#xff08;测试类不能带有__init__方法&#xff09; c) 模块中test开头的函数&#xff08;可以不在class中&#xff09; 注意点&#xff1a; pytest是以方法为单位发现用例的&#xff0c;你…

三国志14信息查询小程序(历史武将信息一览)制作更新过程03-主要页面的设计

1&#xff0c;小程序的默认显示 分为三部分&#xff0c;头部的标题、中间的内容区和底部的标签栏。点击标签可以切换不同页面&#xff0c;这是在app.json文件中配置的。代码如下&#xff1a; //所有用到的页面都需要在 pages 数组中列出&#xff0c;否则小程序可能会出现错误或…

Wnmp服务安装并结合内网穿透实现公网远程访问——“cpolar内网穿透”

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

【神经网络】【GoogleNet】

1、引言 卷积神经网络是当前最热门的技术&#xff0c;我想深入地学习这门技术&#xff0c;从他的发展历史开始&#xff0c;了解神经网络算法的兴衰起伏&#xff1b;同时了解他在发展过程中的**里程碑式算法**&#xff0c;能更好的把握神经网络发展的未来趋势&#xff0c;了解神…

技术分享 | web自动化测试-PageObject 设计模式

为 UI 页面写测试用例时&#xff08;比如 web 页面&#xff0c;移动端页面&#xff09;&#xff0c;测试用例会存在大量元素和操作细节。当 UI 变化时&#xff0c;测试用例也要跟着变化&#xff0c; PageObject 很好的解决了这个问题。 使用 UI 自动化测试工具时&#xff08;包…

Microsoft Edge浏览器不兼容解决办法

找到 Edge 的安装位置&#xff0c;一般在 C:\Program Files (x86)Microsoft Edge\Application\ 这个目录&#xff0c;把 edge.exe 或msedge.exe 修改为 chrome.exe 再重启电脑。

Rust核心功能之一(所有权)

目录 1、什么是所有权&#xff1f; 1.1 所有权规则 1.2 变量作用域 1.3 String 类型 1.4 内存与分配 变量与数据交互的方式&#xff08;一&#xff09;&#xff1a;移动 变量与数据交互的方式&#xff08;二&#xff09;&#xff1a;克隆 只在栈上的数据&#xff1a;拷贝…

Verilog使用vscode

使用vscode打开.v文件 Tools setting texteditor vscode文件路径 [line number]:[file name] &#xff08;可能会出错&#xff0c;可以去vscode确认打开的文件路径&#xff0c;后经调整后改为 vscode文件路径 [file name]&#xff09; 安装插件 搜索Verilog 添加使用最多的 …

3D视觉引导纸箱拆码垛,助力物流行业转型升级

近年来&#xff0c;自动化和智能化技术在各行业的应用越来越广泛&#xff0c;特别是在物流和仓储领域。纸箱拆码垛是物流仓储中的一个重要环节。 人工分拣效率低、错误率高、成本高&#xff0c;传统的拆码垛设备存在兼容性差&#xff0c;对纸箱的识别率不高、操作不灵活等问题…

Centos7下搭建H3C log服务器

一、rsyslogH3C 安装rsyslog服务器 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld关闭selinux sed -i s/enforcing/disabled/ /etc/selinux/config && setenforce 0centos7服务器&#xff0c;通过yum安装rsyslog yum -y install r…

vr地铁消防虚拟逃生自救系统降低财产及人员伤害

无论是在公共场所还是在家中&#xff0c;火灾都是一种常见的突发事件。这往往会严重影响到人们的财产和生命安全。因此&#xff0c;如何预防火灾和安全逃生就成为了非常重要的话题。这款VR模拟火灾疏散逃生系统&#xff0c;帮助人们了解火灾逃生的技巧以及正确的应对方法。 以传…

Leetcode刷题详解——子集

1. 题目链接&#xff1a;78. 子集 2. 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xf…

day05_Java中的运算符

在Java中提供了丰富的运算符 其按照功能分&#xff1a;算术运算符、赋值运算符、比较运算符、逻辑运算、条件运算符按照操作数个数分&#xff1a;一元运算符&#xff08;单目运算符&#xff09;、二元运算符&#xff08;双目运算符&#xff09;、三元运算符 &#xff08;三目…

zabbix监控安装-linux

zabbix6.4中文文档1. 简介 (zabbix.com) Zabbix 是一个企业级的开源分布式监控解决方案。 1.zabbix结构体系 Server&#xff1a; server 是存储所有配置、统计和操作数据的中央存储库。 Proxy&#xff1a; zabbix proxy可以代替 Zabbix server 收集性能和可用性数据。p…