传输控制协议TCP

news2024/10/5 19:10:26

目录

TCP报文格式

TCP的特点

TCP原理:

1.确认应答机制

2.超时重传机制

3.连接管理机制

建立连接

​编辑关闭连接

4.滑动窗口机制

​5.流量控制

6.拥塞控制

7.延迟应答

8.捎带应答


TCP报文格式

1.源端口号:发送端的哪一个端口发出的

2.目的端口号:接收端的哪一个端口所接收

3.序号:每一个字节数据都进行了编号

 4.确认序号:通知发送端已接收的TCP信息

5.首部长度:TCP报头的长度总和

6.保留:空着,方便日后对TCP进行调整或升级

7.标志位(一个一位):

  • URG:紧急指针是否有效
  • ACK:确认字符表明信息接收无误
  • PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走
  • RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段
  • SYN:请求建立连接;我们把携带SYN标识的称为同步报文段
  • FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段

8.窗口大小:窗口大小的信息(后面解释)

9.校验和:确认TCP信息传输是否正确

10.紧急指针:标识TCP信息中哪一部分数据是紧急数据

11.选项:可有可无,有就是对TCP报文进行一定的拓展.因为选项的存在,TCP的报头长度是不固定的.

TCP的特点

  1. 面向字节流:随意的读取数据,不像数据报一样规定发出的大小与读取的大小需要一致
  2. 拥有缓冲区:创建Socket时同时会在内核中分别创建一个发送缓冲区与接收缓冲区
  3. 全双工:既可以发送也可以接收
  4. 保活定时器:不定时的向对方发送一个包,检查连接是否还存在.如果不存在了,会自动释放掉连接

TCP原理:

1.确认应答机制

 A给B发送信息后,只有收到B相应的应答信息,才会继续发送下一条信息.

2.超时重传机制

情况一:

A发送信息后,可能会丢包.在一定时间没有收到B的应答信息后,A会重传上一条发送的信息. 

情况二:

A发送信息后,B的应答信息丢失了.在一定的时间后,A重传上一条信息.

此时B就会收到两条相同的信息.可以在B端的接收缓冲区中根据序列号对信息进行去重操作

3.连接管理机制

建立连接

根据前面的确认应答机制,A向B发起连接时需要分四步:

  1. A向B发送SYN请求建立连接
  2. B向A发送ACK表示确认收到信息
  3. B向A发送SYN请求建立连接
  4. A向B发送ACK表示确认收到信息

为了节省资源,可以发现第2步与第3步分别的发出对象与接受对象都是一致的且时间连续.

所以,第2步与第3步可以合并一齐发送.

就有了TCP建立连接中的三次握手.

TCP的三次握手操作,既可以确认连接双方的身份,也可以反映出连接双方的接受功能与发送功能是否正常,并在一定程度上对TCP传输的可靠性起到了辅助作用.

关闭连接

同样的,A向B关闭连接也是一共分为四步:

  1. A向B发送FIN表示即将关闭连接
  2. B向A发送ACK表示确认应答
  3. B向A发送FIN也表示即将关闭连接
  4. A再向B发送ACK表示确认应答

在A最后一次向B发送ACK后,才会分别真正的关闭连接,释放资源

以上就是TCP的四次挥手.

此处中的B不会把ACK与FIN合并成一条TCP发送给A.

因为两条语句之间可能会有一定的时间间隔.

这个if语句中的hasNext是接收到A端的FIN信息后判断的.

在break之后B会立即发送ACK.

至于什么时候发送FIN取决于编写的代码是如何运行的.

(代码来源于:[JAVAee]网络编程-套接字Socket_HY_PIGIE的博客-CSDN博客的TCP示例一中的服务器截取) 

4.滑动窗口机制

我们通过确认应答机制其实可以发现,其效率并不是非常高效.

发送信息后要等待对方发送确认应答后才能发送下一条,不然就要等待超时重传了.

于是,便有了滑动窗口机制.

滑动窗口机制是:

根据一定的大小,可以等待返回的AC发送后面的TCP信息

如下图:

在A发送1~1000后没有收到ACK也可以紧接着发送后两条TCP信息. 

在A收到了发送1~1000的ACK后,窗口会相应的向后移动一条TCP信息.

当然其中也会发送丢包的情况

情况一:

B端返回的ACK丢包.

像上图中,如果接收了1~1000,下一条为1001的ACK丢包了,但下一条1001~2000的ACK没有丢包.

A就可以通过1001~2000的ACK来确实1~1000已经被B接收到了.

(ACK的含义能够涵盖上面所有的ACK,所以之前的ACK丢包了也没有太大的影响)

情况二:

A发送的信息丢包.

A发送的1~1000丢包,并继续发送后面的TCP信息.

B端照常接收,但会申请1~1000的信息,当连续三次申请后.

A会重传1~1000的信息 

5.流量控制

接收端处理数据的速度是有限的。

如果发送端发的太快,导致接收端的缓冲区被打满,这个时候如果发送端继续发送,就会造成丢包,继而引起丢包重传等等一系列连锁反应。

因此TCP支持根据接收端的处理能力,来决定发送端的发送速度。这个机制就叫做流量控制

(如果接收端缓冲区满了,就会将窗口置为0;这时发送方不再发送数据,但是需要定期发送一
个窗口探测数据段,使接收端把窗口大小告诉发送端。)

6.拥塞控制

在网络上,计算机可能会进入拥塞状态.如果在拥塞状态下,TCP还使用滑动窗口增大效率的进行传输信息.会导致许多信息丢失,加重拥塞状态.

对此,TCP引入了慢启动.

开始先发少量的数据,对网络状态进行试探,并使用窗口对信息的发送进行了一定的限制.

初始,窗口大小为1,在发送M1并收到确认应答后.窗口的大小成倍的增加,发送方继续根据扩大后的窗口发送信息.

(图片来自《计算机网络》[第七版]谢希仁编著) 

虽然叫"慢启动",但他增加的速度是以指数形式增加的.到了后面速度会非常快.

这就不符合为了应对计算机拥塞状态的初心了.

于是,便有了一个阈值.在窗口大小达到这个阈值后,会以线性的方式递增.

拥塞控制主要作用是,在避免给网络造成太大压力的同时尽快传输信息的方案.

7.延迟应答

在接收端中的接收缓存区,加设内存空间为10.

一次收到了5大小的信息并返回ACK.

返回ACK后,接收端就会将缓存区的信息进行刷新.那缓存区还有额外5的空间就会一直没有被使用到,浪费了许多性能.

对此,TCO引入了一个延迟应答.

接收端接收一次信息,往缓存区中写入了5.且并没有立刻返回ACK.

而是,间隔一段时间后再返回ACK.在这段间隔的时间中,就可以接收第二次发送的信息,这时接收缓存区又写入了5.

再返回ACK的时候就可以一次性将10大小的缓存区全部刷掉

但也并不是每一条信息都会延迟应答.

  • 数量限制:每隔N个包就应答一次;(N一般为2)
  • 时间限制:超过最大延迟时间就应答一次
     

8.捎带应答

在延迟应答的基础上,我们发现,很多情况下,客户端服务器在应用层也是 "一发一收" 的.

在A发送了1~24后并向B申请1~5的信息.

B可以将确认1~24的ACK与发送1~5的信息合并成一个包发送.

总的来说,TCP这么多原理与属性.实现了其可靠性和帮助提升性能的为: 

可靠性:

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

提高性能:

  • 滑动窗口
  • 快速重传
  • 延迟应答
  • 捎带应答

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

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

相关文章

【深度学习】遗传算法[选择、交叉、变异、初始化种群、迭代优化、几何规划排序选择、线性交叉、非均匀变异]

目录 一、遗传算法二、遗传算法概述2.1 选择2.2 交叉2.3 变异 三、遗传算法的基本步骤3.1 编码3.2 初始群体的生成3.3 适应度评估3.4 选择3.5 交叉3.6 变异3.7 总结 四、遗传算法工具箱4.1 initializega4.2 ga4.3 normGeomSelect4.4 arithXover4.5 nonUnifMutation 五、遗传算法…

【Transformer】自注意力机制Self-Attention | 各种网络归一化Normalization

1. Transformer 由来 & 特点 1.1 从NLP领域内诞生 "Transformer"是一种深度学习模型,首次在"Attention is All You Need"这篇论文中被提出,已经成为自然语言处理(NLP)领域的重要基石。这是因为Transfor…

苹果电脑 Java切换版本

效果 1、安装 Java1.8和Java11 直接官网下载并安装 2、安装后的文件 /资源库/Java/JavaVirtualMachines/ 3、修改配置文件 vi ~/.bash_profile#java export JAVA_8_HOME"/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home" alias jdk8expor…

大语言模型(LLM)与 Jupyter 连接起来了

现在,大语言模型(LLM)与 Jupyter 连接起来了! 这主要归功于一个名叫 Jupyter AI 的项目,它是官方支持的 Project Jupyter 子项目。目前该项目已经完全开源,其连接的模型主要来自 AI21、Anthropic、AWS、Co…

信号调制原理演示,模拟和数字调制技术大比拼

【中英双语字幕】信号调制原理演示,模拟和数字调制技术大比拼!_哔哩哔哩_bilibili

Filament for Android 编译搭建(基于Ubuntu20.04系统)

一、Filament 源代码下载 github下载地址: 2、安装clang 我是直接安装clang-10 Ubuntu 20.04 ,sudo apt install clang 命令默认就是clang-10 $sudo apt-get install clang-10 # 安装 AST.h 等头文件 $sudo apt-get install libclang-10-dev $sudo …

大语言模型:LLM的概念是个啥?

一、说明 大语言模型(维基:LLM- large language model)是以大尺寸为特征的语言模型。它们的规模是由人工智能加速器实现的,人工智能加速器能够处理大量文本数据,这些数据大部分是从互联网上抓取的。 [1]所构建的人工神…

期权定价模型系列【3】—Delta动态对冲

Delta动态对冲 本文章主要介绍常见的delta对冲概念,具体的delta动态对冲代码可以参考【期权量化】专栏同名文章 专栏地址: http://t.csdn.cn/obNflhttp://t.csdn.cn/obNfl 1.前言 期权交易有四种基本交易方式:买入看涨期权、卖出看涨期权、买…

Linux基础知识学习

一、i.mx6ull交叉编译QT项目 1、步骤 2、安装交叉编译链 使能交叉编译链,使能刚安装的编译器,不然还是老版本的 source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi 3、命令行交叉编译QT项目 wandzhangwa…

Redis系列(二):深入解读Redis的两种持久化方式

博客地址:blog.zysicyj.top Redis为什么要引入持久化机制 Redis引入持久化机制是为了解决内存数据库的数据安全性和可靠性问题。虽然内存数据库具有高速读写的优势,但由于数据存储在内存中,一旦服务器停止或崩溃,所有数据将会丢失…

由于找不到vcruntime140_1.dll,无法继续执行代码的常见解决方法

在遇到vcruntime140_1.dll丢失的问题时,我对于计算机的运行状况感到非常困扰。这个错误导致我无法正常运行某个应用程序或游戏,给我带来了很多不便。然而,在修复这个问题的过程中,我学到了一些有用的知识和技巧,下面就…

tkinter+爬虫+pygame实现音乐播放器

文章目录 前文安装模块示意图爬虫完整代码pygametkinter完整代码结尾前文 本文将涉及爬虫(数据的获取),pygame(音乐播放器),tkinter(界面显示),将他们汇聚到一起制造一个音乐播放器,欢迎大家的订阅。 安装模块 pip install requests,parsel,lxpy,pygame 示意图

volatile用法详解(c语言)

前言 volatile是易变的、不稳定的意思。或许你没见过这个关键字,但它的的确确存在着。 volatile作用 保持内存可见性 volatile关键字和const 一样是一种类型修饰符,变量可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等,遇到这个关键字声明的变量…

起亚中国与壳牌中国宣布战略合作协议,加速电动化品牌转型

根据相关媒体的报导,起亚中国和壳牌中国最近宣布了一项战略合作协议,旨在充分利用各自在充电基础设施方面的技术和产业资源优势,展开更深入的合作。 为了满足中国消费者对电动车的需求,起亚于今年3月发布了中国中长期电动化战略&…

Thinkphp6在线预约按摩系统H5对接杉德宝支付开发 第三方支付平台

在线预约按摩系统后端使用的是thinkphp6开发的 前端是使用uniapp开发的,在微信浏览器里面一打开就会自动授权登录 1、在\app\common.php底部增加一个打印测试使用的 if (!function_exists(ljLog)) {function ljLog($data, $logNameDEBUG, $fname"testlog&…

在Eclipse在Java里面调用Python脚本的方法

由于项目中需要用到Java调用Python的脚本,来实现一些功能,就对jython做了一些了解,通过jython可以实现java对python脚本的调用。Java调用Python开发环境配置(EclipseJythonPyDev) 1、Jython是什么 Java可以使用Jython库来调用Python库。Jyt…

Java进阶-Oracle(二十一)(2)

🌻🌻 目录 一、Oracle 数据库的操作(DDL DML DQL DCL TPL)1.1 标识符、关键字、函数等1.1.1 数值类型:1.1.2 字符串类型:1.1.3 日期类型1.1.4 大的数据类型--适合保存更多的数据 1.2 运算符1.3 函数---预定义函数、自定义函数&…

MFC 多语言对话框

可以直接看一下bilibili的这个本人录制的视频:MFC资源多语言_哔哩哔哩_bilibili 这里所说的多语言也是国际化 新建一个MFC项目,我这边是中文简体,如果想加入其他语言,方法如下: 修改完这些之后,需要在代码…

f1tenth仿真2

起点(0.192,0.201) 终点(9.902,5.148) 起点(9.902,5.148) 终点(-13.289,7.058) 起点(-13.289,7.058) 终点(-13.289,0.201) 起点(-13.289,0.201) #! /usr/bin/env python import time from numba import jit import math import rospy import numpy as…

python教程:删除列表中某个元素的3种方法

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! python中关于删除list中的某个元素,一般有三种方法:remove、pop、del: 1.remove: 删除单个元素,删除首个符合条件的元素,按值删除 举例说明: >>> str[1,2,3,4,5,…