网络原理-TCP_IP(2)

news2024/11/17 13:43:47

TCP协议

TCP全称为"传输控制协议(Transmission Control Protocol)".协议如其名,要对数据的传输进行一个详细的控制.

TCP协议段格式

源/目的端口号:表示数据从哪个进程来,到哪个进程去.

32位序号/32位确认序号:后面详细讲.

4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个四字节);这个字段是一个16比特的字段,取值范围为0-15(即最大长度为60字节).TCP头部最小长度为20字节.

保留(6位):设定报头时,提前准备的保留位(虽不用,但先占位置),后面再使用,就可以避免tcp扩展引起的不兼容问题.

6位标志位(TCP的核心部分,后面也会讲到) :

URG:紧急指针是否有效;

ACK:确认号是否有效;

PSH:提示接收端应用程序立刻从TCP缓冲区把数据读走;

RST:对方要求重新建立连接;我们把携带RST标识的称为复位报文段;

SYN:请求建立连接;我们把携带SYN标识的称为同步报文段;

FIN:通知对方,本端要关闭了,我们称携带FIN标识的为结束报文段;

16位窗口大小:后面再说

16位校验和:类似于UDP校验和,但是把报头和数据载荷放在一起计算校验和.

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

选项:TCP报头中的前20个字节是固定长度的.后面包含"选项这部分"(可有可无,有一个也可有多个)

确认应答

注意:这个是确保可靠性的最核心的机制了.

TCP将每个字节的数据都进行了编号,即为序列号(防止出现先发后至的问题). 

每一个ACK都带有确认序列号,意思是告诉发送者,我们已经收到了哪些数据;下一次从哪里开始发.

应答报文的确认序号是按照发送过去的最后一个字节的序号+1设定.

超时重传

是确认应答的补充.

整个网络中,可能存在某个路由器/交换机.某个时刻突然负载量很高,短时间可能有大量的数据要经过这个设备转发.要知道,一台设备的处理量是有限的,很可能瞬间的高负载超出了设备量的极限,此时多出来的部分就无了(丢包了).

主机A在发送数据给B时,可能因为网络拥堵等原因,数据无法到达主机B;

如果主机A在一个特定的时间间隔内没有收到B的确认应答,就会进行重发; 

 这种情况是接收方本来就未收到数据,此时重传理所应当,没有任何问题.

但是,主机A未收到B发来的确认应答,也可能是ACK丢失了.

因此主机B会收到很多重复数据.那么TCP协议需要能够识别出哪些包是重复的包,并且把重复的包丢弃掉,这里就引入了缓冲区的概念.

TCPsocket在内核中存在接收缓冲区(一块内存空间).发送方的数据,是要先放在缓冲区中的.然后应用程序调用read/scanner.next才能读到的数据,这里的读操作是读接收缓冲区.

当数据到达缓冲区的时候,接收方会首先判定一下看当前缓冲区中是否有这个数据了(或者这个数据曾经在缓冲区里面存在过).就直接把新来的数据丢弃了,就能确保程序调用read/scanner.next()的时候 不会出现重复数据了.

接收方是如何判定这个数据是否是"重复数据".核心的判断依据就是根据数据的序号.

1.数据还在缓冲区中,没有被read走.此时,就拿着新收到数据的序号,和缓冲区中的所有数据序号对比一下,看看有没有一样的,有一样的就是重复了,就可以把新收到的数据丢弃.

2.数据在缓冲区中,已经被应用给read走了,此时新来的数据序号无法得到.注意:应用程序在读取数据的时候,是按照序号的先后顺序连续读取的.一定是先读小的序号,后读大的序号的数据的.(可以想象为带有优先级的阻塞序列).

此时socket api就可以记录上一次读到最后一个字节的序号是多少.比如上一次读到的序号是3000,新收到的数据序号为1001,1001一定之前读过,可以将其判断为"重复的包"直接丢掉.

这样就可以利用序列号很容易做到去重的效果,

那么,超时的时间如何确定?

最理想的状态下,找到一个最小的时间,保证"确认应答一定能在这个时间内返回".

但是这个时间的长短,随着网络环境的不同,是有差异的.

如果超时的时间设置太长,会影响整体重传的效率.

如果超时的时间设置的太短,有可能会发送重复的包.

TCP为了保证无论在任何环境下都能较高性能的通信,因此会动态计算这个最大的超时时间,

1.Linux中(BSD Unix和Windows也是如此),超时以500ms为一个单位进行控制,每次判定超时重发的超时时间都是500ms的整数倍.

2.如果重发一次之后,仍然得不到应答,等待2 * 500ms进行重传.

3.如果仍然得不到应答,等待4*500ms进行重传,以此类推,以指数形式递增.

4.累计达到一定重传次数,TCP认为网络或者对端主机出现异常,强制关闭连接.

 

 

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

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

相关文章

恒创科技:云服务器公网带宽选择多少合适?有计算公式吗?

随着云计算技术的不断发展,越来越多的企业和个人选择使用云服务器来部署应用和存储数据。而在选择云服务器时,公网带宽是一个重要的参数,它直接影响到服务器的网络性能和数据传输速度。 公网带宽是指云服务器在互联网上的数据传输速率&#x…

Mongodb安装Linux

确定你的CentOS 版本 使用以下命令: /etc/centos-release下载Mongodb 解压tgz压缩包 创建data和log文件夹 , 确定你的文件夹访问权限 在log文件夹里面创建mongodb.log文件(这一步很重要 ! ! !) touch mongodb.log创建mongodb.conf文件 在你的mongodb文件夹下 vi mongo…

虚拟机扩容后黑屏卡死解决方法

亲测有效,首先一般是在扩容后黑屏的,现象为开机后看到个横线光标不闪,黑屏,进入不了桌面。原因是硬盘已经满了,所以解决方法就是清理硬盘。所以首先还是要解决登录问题。 开机时按 esc 键进入 GNU GRUB,选择…

浙大发布Agent学习框架,13B 模型达到 ChatGPT 水平!

2023 年下半年,AI Agent 正式开启「大模型下半场」。 自“人工智能”这门学科创立之初,一种可以“观察世界”-“思考推理”-“做出行动”-“反思学习”的人造代理就是构建通用人工智能的终极目标之一。而基于大模型的 AI Agent 借助大模型强大的推理判断…

github官网连接超时解决方案(图解版,亲测成功)

目录 一、521github镜像站1.1、521github镜像站访问地址 二、Github520镜像站2.1、Github520镜像站访问地址地址 三、UsbEAm Hosts Editor加速器3.1、UsbEAm加速器下载、安装及使用 四、SwitchHosts加速器4.1、SwitchHosts加速器下载、安装及使用 五、原名(Steam)目…

Android P 屏保和休眠相关知识

Android P添加屏保功能,如果休眠时间设定大于屏保时间,则先进入屏保,达到休眠时间后再进入休眠 需求: 添加屏幕互保开关,默认关闭。只保留时钟,可设定指针和数字、夜间模式。启用时间改多长时间无操作进入…

LeetCode —— 137. 只出现一次的数字 II

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️…

互联网加竞赛 基于深度学习的人脸表情识别

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的人脸表情识别 该项目较…

angular 表单FormGroup笔记

一、校验 1、校验提示 <nz-form-item><nz-form-label>手机号码</nz-form-label><nz-form-control [nzErrorTip]"mobileTemplate"><input nz-input formControlName"mobile" placeholder"请输入" /><ng-templ…

springboot mybatis-plus 项目分层笔记

整体定义 config: 配置项&#xff0c;包含configuration注解 constants: 常量类enums: 枚举 exceptions: 全局异常处理&#xff0c;自定义异常&#xff0c;RestControllerAdvice 注解 fia3: 三大器依据执行顺序&#xff1a;过滤器filter、拦截器interceptor、切面aop 简称 fia…

Flutter canvas 画一条波浪线 进度条

之前用 Flutter Canvas 画过一个三角三角形&#xff0c;html 的 Canvas 也画过一次类似的&#xff0c; 今天用 Flutter Canvas 试了下 感觉差不多&#xff1a; html 版本 大致效果如下&#xff1a; 思路和 html 实现的类似&#xff1a; 也就是找出点的位置&#xff0c;使用二阶…

Python实现avif图片转jpg格式并识别图片中的文字

文章目录 一、图片识别文字1、导包2、代码实现3、运行效果 二、avif格式图片转jpg格式1、导包2、代码实现3、运行效果4、注意事项 三、Python实现avif图片转jpg格式并识别文字全部代码 在做数据分析的时候有些数据是从图片上去获取的&#xff0c;这就需要去识别图片上的文字。P…

Buffer缓冲区类设计实现

目录 类设计理念 类设计接口函数 类设计函数实现 测试 正常读取与写入 相同类型拷贝 扩容测试 按行读取 类设计理念 类设计接口函数 #include <vector> #include <cstdint>#define BUFFER_DEFAULT_SIZE 1024 // Buffer 默认起始大小 class Buffer { pr…

Redis -- String 字符串, 计数命令,字符串操作

"学如逆水行舟&#xff0c;不进则退。" 目录 Redis的String字符串 常见命令 set get mget mset setnx setex psetex 计数命令 incr incrby decr decrby incrbyfloat 字符串操作 append getrange setrange strlen 小结 string内部编码 Redis…

全方面解析msvcp110.dll文件的修复教程,六个修复msvcp110.dll文件丢失问题的详细方法

msvcp110.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2012 Redistributable Package&#xff08;微软视觉C 2012重新分配包&#xff09;的一部分。这个文件主要包含了C标准库中的一些函数&#xff0c;特别是与内存管理、异常处理、字符串处理和数学计算相关的…

部署YUM仓库服务

一、yum仓库 1. yum简介 yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红帽软件包管理器的缩写&#xff09;构建的软件更新机制&#xff0c;能够自动解决软件包之间的依赖关系。 为什么会有依赖关系的发生 因为linux本身就是以系统简洁为自身优势&#xff0c;所以…

动态gif制作方法是什么?一个网站在线制作

一般我们说的gif动图就是动态图片是一种图片格式。Gif动图就是由一帧一帧的静态画面合成一张有动态效果的图片。接下来。给大家讲一讲gif生成&#xff08;https://www.gif.cn/&#xff09;的方法吧&#xff01;很简单不需要下载软件&#xff0c;手机、pc均可操作&#xff0c;只…

Unity触发检测Trigger踩坑合集

正常状态 绿色方块&#xff1a;刚体碰撞盒检测触发碰撞脚本 蓝色方块&#xff1a;碰撞盒 检测脚本&#xff1a; 正常进出&#xff1a; 踩坑1 绿色方块&#xff1a;刚体碰撞盒检测触发碰撞脚本 蓝色方块&#xff1a;碰撞盒 保持绿色和蓝色方块的接触 对蓝色方块&#xff1a…

87.网游逆向分析与插件开发-物品使用-物品交换的逆向分析与C++封装

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;物品丢弃的逆向分析与C代码的封装-CSDN博客 码云地址&#xff08;ui显示角色数据 分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;5222a6b1e5…

程序员的新风口,来了?

过去几年逐渐沉寂的程序员培训行业&#xff0c;现在重新热闹了起来。 作为一家IT培训机构的课程顾问&#xff0c;小娜发现&#xff0c;最近一段时间&#xff0c;咨询鸿蒙开发课程的人越来越多了&#xff0c;为了能够及时回复&#xff0c;我整理了一份话术&#xff0c;以便快速摸…