【网络】TCP协议详解

目录

TCP协议格式

感性理解TCP报头

认识报头中的字段

序号和确认序号

4位首部长度

窗口大小

标记位

确认应答机制

超时重传机制


TCP协议格式

感性理解TCP报头

linux内核是用C语言写的,所以报头实际上就是一种结构化的数据对象,用伪代码可表示为如下结构:

认识报头中的字段

序号和确认序号

序号:表示本报文段所发送数据的第一个字节的编号。

确认序号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。

4位首部长度

4个比特位能够表示的十进制数据范围是【0,15】,TCP报头的总长度=4位首部长度*4字节,也就是说报头的总长度范围是【0,60】,但是报头中还包含固定大小的20字节。综上所述,报头的最终范围是【20,60】。

窗口大小

在发送数据的过程中,发送数据的速度太快不合适,发送的太慢也不行。窗口大小的作用就是反馈接收缓冲区剩余空间的大小。发送方根据这一反馈就能合适的进行数据发送。

TCP报文是要给对方发送的,对于客户端和服务端都是适用的,在通信的过程中交换对方的接收能力。

标记位

TCP报文是有类型的,根据不同的类型完成不同的动作。

SYN:同步标志位(握手请求)。

FIN:断开连接标记位。

ACK:确认号是否有效。

PSH:催促接收方,让上层尽快取走数据更新缓冲区。

URG:需要被尽快读取的数据,标记紧急指针是否有效。

RST:复位标记位,对方要求重新建立连接。

确认应答机制

TCP可靠性

在网络传输的过程中,存在不可靠的问题,本质原因是传输距离变长了。举个简单的例子,如果小明问同桌小红下课要不要去操场跑步,即使小红只是点了点头,小明也可以确认小红收到了我说的话。同理,如果我们相隔100米之外喊话,能不能听到,能不能把信息完整的听取到都是不可靠的。 在网络传输中,常见的不可靠场景有丢包、乱序、校验错误、重复等。

TCP的可靠性怎样保证:确认应答+超时重传。

●一个报文如果收到了应答,就能说明它的可靠性

小明:你吃了吗?

小刚:吃了

我们认为,只要收到了应答,历史消息就能确认被收到。也就是说,确认了应答才算可靠。

小明:一会去打球吗

小刚:未应答

在双方通信的过程中,一定会存在最新的消息没有被应答。最新的消息一般无法保证可靠性。

●数据发送的顺序和数据到达的顺序不一定是匹配的。

针对发送的请求进行编号,应答的时候也针对编号进行应答,这样就能保证数据传输没有歧义。

 TCP 是面向字节流的,TCP将每个字节的数据都进行了编号,即为序列号。

每一个ACK都带有对应的确认序列号,确认序列号意在告诉发送者,已经收到了哪些数据,下次发送该从哪里开始。

为什么要有两组序号?

答:TCP客户端和服务端双方的地位是对等的,是全双工的。既能接收数据也能发送数据。

超时重传机制

针对数据在网络传输中丢包的情况,TCP的处理方式是进行重传。

情况1:请求丢了。重传

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

 情况2:应答丢了。重传

主机A发送数据给B之后, 没有收到B发来的确认应答也可能是应答丢了,在一段时间间隔后就会进行重发。

这里需要注意的是,如果主机B收到很多重复的数据,TCP根据序列号能够识别出重复的包,很容易就能做到去重。

对于超时时间而言,设置为固定长短是不合理的。举个例子来说,如果在一个网络环境很快的情况下,数据已经丢了,过了很久才进行重传,效率就大大降低。反之,在一个网络环境较差的情况下,如果超时重传的时间设置的较短,数据还没到,就再次发送了。上述情况很明显是不合理的。

最理想的情况下, 找到一个最小的时间, 保证 "确认应答一定能在这个时间内返回"。但是这个时间的长短, 随着网络环境的不同, 是有差异的。
a.如果超时时间设的太长, 会影响整体的重传效率;
b.如果超时时间设的太短, 有可能会频繁发送重复的包;

所以超时重传的时间间隔是浮动的。TCP为了保证无论在任何环境下都能有较高性能的通信,会动态计算这个最大超时时间。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UNI-APP_subNVue原生子窗口使用,web-view层级问题解决

subNVues文档 app-subnvues文档 subNVues开发指南 需求:在pages/cloud_control/index页面使用subNVue原生子窗口 1.pages文件配置 "app-plus": {"bounce": "none","subNVues":[{"id": "control_popup&qu…

Chapter 3: Conditional | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Chapter 3: Conditional executionBoolean expressionsLogical operatorsConditional executionAlternative executionChained conditionalsNested conditionalsCatching exceptions using try and exceptShort-circuit evaluation of lo…

idea 启动项目 java: Compilation failed: internal java compiler error

1. 首先查看 项目的 编译的 JDK 版本是否是 匹配了或匹配的 2. 堆分配的内存不足导致,如下图位置 堆 构建程序的 堆大小调大

【JavaWeb】了解JavaScript DOM API

目录 1、什么是DOM 1.1、DOM树 1.2、 了解事件 2、常用的DOM API 2.1、选中页面元素 2.2、获取/修改元素内容 2.2.1、innerHTML和innerText 2.2、获取/修改元素属性 2.3、获取/修改表单元素属性 3、JQuery框架的简单了解和使用 4、代码案例:实现聚合索引功…

Ruoyi单体项目与Echarts4.2.1地图集成时的思路及解决办法

目录 背景 一、相关数据 1、湖南省2021全省地区生产总值 2、湖南Geojson数据 二、Ruoyi集成设计与实现 1、自定义地图注册 2、湖南地图引用 3、图表初始化及数据绑定 4、实际效果 总结 背景 在之前博客中,介绍了Echarts和Ruoyi集成的一些博客基于Echarts2.X的…

味尚食品 味尚拉面半干面是一种非常经典的中式面食

尊敬的客户,您好!感谢您对我们电商平台的关注,我们很高兴为您介绍我们平台上的一款热销产品——味尚拉面半干面。 味尚拉面半干面是一种非常经典的中式面食,其主要特点体现在面条的口感和味道方面,让人感觉仿佛在享受正…

密码学学习笔记(八):Public-Key Encryption - 公钥加密1

简介 公钥加密也被称为非对称加密。下面是一个例子: Bob生成一个密钥对,发布他的公钥𝑃𝐾𝐵, 保管密钥𝑆𝐾𝐵 私有的Alice使用𝑃𝐾𝐵 加密明文M…

Windows系统中将markdown文件批量转化为PDF

需要将一个文件夹下的多个md文件转化为PDF 下载安装pandoc 官网下载地址:Pandoc ,下载位置如下图。 下载后按照默认文件路径安装完成 使用everything软件查找pandoc.exe文件路径,如下图: 安装完成之后就可以在cmd窗口或Window…

深度学习技巧应用22-构建万能数据生成类的技巧,适用于CNN,RNN,GNN模型的调试与训练贯通

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用22-构建万能数据生成类的技巧,适用于CNN,RNN,GNN模型的调试与训练贯通。本文将实现了一个万能数据生成类的编写,并使用PyTorch框架训练CNN、RNN和GNN模型。 目录&#xff1…

Jupyter Notebook的内核添加新的虚拟环境

最近,在搭建环境的时候发现 Jupyter Notebook 的内核只有基础的python和pytorch,现在我想要在 Jupyter Notebook 中使用新的虚拟环境。 下面是解决的方法: (1)首先在Anaconda Prompt中激活虚拟环境,比如我…

LIN总线与RS485总线

LIN(Local Interconnect Network,局部互连网络)总线和RS485都是用于设备间通信的串行通信协议。下面我将分别列出它们的优势和劣势。 LIN总线的优势: 简单性:LIN总线的硬件和协议简单,易于实现和维护。成…

设计模式之装饰者模式-TS中装饰器介绍

装饰器的基本介绍 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,访问符,属性或参数上。 装饰器使用expression这种形式,expression求值后必须为一个函数,它会在运行时被调用,被装饰的…