TCP协议结构

news2024/9/24 7:24:14

文章目录

    • TCP---传输控制协议
    • TCP报文结构

TCP—传输控制协议

  • 缓冲区的意义

TCP协议是自带发送和接收缓冲区的,相当于malloc了两段内存空间。

系统调用接口send,write等并不是直接把数据发送到网络上,而是把数据拷贝到TCP的发送缓冲区,至此应用层的任务就完成了。

这样的设计可以提高应用层响应效率,其次是当前的网络状况是只有TCP协议可以知道的,应用层完成不知道。

那么什么时候发,发多少,出错了怎么办等这类问题,都是由TCP协议解决的,所以TCP协议叫做“传输、控制协议”。

因为缓冲区的存在,可以让应用层和TCP进行解耦。相当于应用层负责拷贝数据,TCP负责安排传输的方式。

TCP报文结构

408c.png)

  • 16位源/目的端口号

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

  • 4位首部长度—实现有效载荷和报头的分离

4位首部长度:这是用来描述报头长度大小的,所以其单位并不是比特位,而是4个字节。

也就是说4位首部长度取值范围是0-15,那么报头长度取值范围就是该范围乘上4,也就是0-60字节,可以理解为就是加上下面的选项。不过一般都是0101,也就是5*4=20字节。

有了这个长度,在读到一个报文以后,进行报头和有效载荷分离的时候,会在前20个字节里分析出4位首部长度,确定出报头大小,从而实现报头和有效载荷的分离。

  • 32位序号/32位确认号

用于保证按序到达

  • 16位窗口大小

这个字段用于流量控制。

传输过程需要合理地进行安排,需要根据对方的接收能力进行流量控制。

在应答报文的报头填上:我自己的接收缓冲区中剩余的空间大小。

  • 6个标志位

server端可能在任一时刻都有大量的报文在向它发送数据,这些数据的来源如何甄别?如何区分不同种类的TCP报文?靠的就是6个标志位。

  • URG

表示该报文中携带了紧急数据。也可理解为紧急指针:有数据需要优先读取,就可以设置读取的起点。但是最大为1字节。

  • ACK

这个标志位是用来表示接收到的报文是表示确认信号的,代表确认号是否有效。例如接收到的报文是确认序号+ACK,这个标志位通常置1。

  • PSH

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

  • RST

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

  • SYN

这个标志位是建立链接的请求标志位。意味着接下来要进行三次握手。

我们把携带SYN标识的称为同步报文段。

  • FIN

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

  • 32位序号

在发送信息时使用TCP协议会将信息拆分成多个数据报发送给接收方,发送数据时会对每个字节的数据进行编号,等数据到达接收端是会对数据进行重新排序,避免网络数据报乱序。这就是32位序号的意义。

当触发TCP超时重传机制时,有可能造成接收方接收重复数据,这时接收方会根据接收到的数据序号进行去重。如果之前收到了这个序号的数据就进行去重。

  • 32位确认序号

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

也即是说,32位序号里保存的是对历史报文数据+1,或者说是32位序号里的数据+1。例如:确认序号是10,代表着10之前的报文都已经收到了,下次发送请从10开始!

  • 注意

每一次发送与接收,无论是数据还是应答,都是一个完整的TCP报文,而不是简单的传输序号。可以不携带数据,但必须有TCP报头。

  • 疑问

为什么序号和确认序号是两个分离的字段?在发送和确认的时候不是只需要用到一个字段吗?

TCP是一个全双工的协议,双方通信的时候,一个报文既可以携带要发送的数据,也可以携带对历史报文的确认。

通俗的说,在你发送序号的时候,也可能在确认别人发来的序号,那么此时就需要将序号和确认序号分开两个字段。

  • 总结

32位序号用来保证按序到达,32位确认序号用来保证确认应答。

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

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

相关文章

Java读取Properties配置文件的6种方式

Java读取Properties的方式 项目结构:经典的maven项目结构 配置文件1和2内容一致: jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urlmysql://localhost:3306/database?useUnicodetrue&characterEncodingutf-8&serverTimezoneAsia/Shanghai jdbc.…

Axios二次封装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、Axios是什么?二、为什么要对Axios进行二次封装三、Axios二次封装1.首先,安装 Axios:2.创建一个名为 http.js 的文件&#xf…

AI 工具合辑盘点(三)持续更新

人工智能技术的发展已经改变了我们的生活,越来越多的AI工具正在被广泛应用于各个领域。ChatGPT这样的代表性AI模型正在大放异彩,为我们带来了无数的便利和惊喜。在本文中,我们将介绍一系列优秀的AI工具,这些工具可以帮助你完成各种…

课程教学大纲系统的设计与实现

技术栈: Nginx、MySQL、Maven、SpringBoot、Spring、SpringMVC、MyBatis、HikariCP、fastjson、slf4j、Vue、NodeJS系统功能: 本系统分教师和管理员两种角色,不同角色可操作的功能不尽相同,各个角色具体功能如下:教师 …

Python实现哈里斯鹰优化算法(HHO)优化随机森林回归模型(RandomForestRegressor算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO),该算法有较强的全…

SpringCloud------Eureka单机版整合生产以及消费(四)

SpringCloud------Eureka(四) Eureka 读音:有瑞卡 Eureka基础知识 单机构架步骤 集群构建步骤 autuator微服务信息完善 服务发现Discovery eureka自我保护 服务注册与发现 包括: Eureka Zookeeper Consul Nacos 【分布式的CAP理…

FlinkCDC初体验

一、CDC简介 1.1 什么是CDC? CDC是 Change Data Capture(变更数据获取 )的简称。 核心思想是,监测并捕获数据库的 变动(包括数据或数据表的插入 、 更新 以及 删除等),将这些变更按发生的顺序完整记录下 来&#xff0c…

【Flask】Python基于Flask应用

Flask介绍 Flask 是一款发布于2010年非常流行的 Python Web 框架。 特点 微框架、简洁,给开发者提供了很大的扩展性。Flask和相应的插件写得很好,用起来很爽。 开发效率非常高,比如使用 SQLAlchemy 的 ORM 操作数据库可以节省开发者大量书…

【LeetCode】数据结构题解(5)[分割链表]

分割链表 1.题目来源2.题目描述3.解题思路4.代码展示 所属专栏:玩转数据结构题型 博主首页:初阳785 代码托管:chuyang785 感谢大家的支持,您的点赞和关注是对我最大的支持!!! 博主也会更加的努力…

聊一聊 GDB 调试程序时的几个实用命令

一:背景 1. 讲故事 用惯了宇宙第一的 Visual Studio 再用其他的开发工具还是有一点不习惯,不习惯在于想用的命令或者面板找不到,总的来说还是各有千秋吧,今天我们来聊一下几个在调试中比较实用的命令: 查看内存硬件…

B站java、计算机学习整理(菜鸟版本)

B站java、计算机学习整理(菜鸟版本) 简介1、入门篇2、工具篇3、数据库篇4、框架篇5、JVM 篇6、源码篇7、算法与数据结构8、操作系统9、计算机组成原理10、计算机网络11、 设计模式 简介 处在互联网时代,是一种幸福,因为各式各样的…

Win10系统开机自动蓝屏无法使用怎么U盘重装系统?

Win10系统开机自动蓝屏无法使用怎么U盘重装系统?今天和大家一起来分享Win10系统蓝屏之后怎么去进行修复的方法。很多用户都有遇到电脑蓝屏无法启动的问题,那么遇到这个问题之后怎么去重装系统呢?接下来我们来看看以下的解决方法分享吧。 准备…

Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 今天来分享一下如何使用Python突破某网游游戏JS加密限制,进行逆向解密,实现自动登录。 逆向目标 目标:某 7 网游登录 主页:aHR0cHM6Ly93d3cuMzcuY29tLw 接口:aHR…

牛客_华为_ HJ63 DNA序列

HJ63 DNA序列 st input() n int(input())max_ratio 0 ratio 0 res for i in range(0,len(st)-n1):s st[i:in]ratio s.count(C)s.count(G)if ratio > max_ratio:max_ratio ratiores s print(res)

cPanel XSS漏洞分析研究(CVE-2023-29489)

一、漏洞原理 漏洞简述 cPanel 是一套在网页寄存业中最享负盛名的商业软件,是基于于 Linux 和 BSD 系统及以 PHP 开发且性质为闭源软件;提供了足够强大和相当完整的主机管理功能,诸如:Webmail 及多种电邮协议、网页化 FTP 管理、…

【考前看几题】系统集成项目管理师-2022年上半年-上午真题(广东卷)

前言 汇总知识点、重点问题、难点 由问题引出知识点 软件技术、其他技术、管理基础、整体管理、范围管理、成本管理、人力资源管理 干系人管理、合同管理、采购管理、配置管理、质量管理、风险管理、安全管理 文章目录 前言软件技术、其他技术管理基础整体管理范围管理成本管理…

第12届蓝桥杯国赛真题剖析-2021年5月29日Scratch编程初中级组

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第128讲。 第12届蓝桥杯Scratch国赛真题,这是2021年5月29日举办的全国总决赛,比赛仍然采取线上…

【java】Java 异常处理的十个建议

文章目录 前言一、尽量不要使用e.printStackTrace(),而是使用log打印。二、catch了异常,但是没有打印出具体的exception,无法更好定位问题三、不要用一个Exception捕捉所有可能的异常四、记得使用finally关闭流资源或者直接使用try-with-resource五、捕获…

TCP协议特性讲解

文章目录 TCP报文结构确认应答超时重传三次握手与四次挥手滑动窗口流量控制拥塞控制延时应答捎带应答面向字节流 - 粘包问题异常处理 - 心跳包 TCP报文结构 16位源端口号:表示数据从哪来的。 16位目的端口号:表示数据要到哪里去。 32位序号:由…

Centos7 安装 MySql8

1、查看是否安装 mariadb rpm -qa | grep mariadb 显示:mariadb-libs-5.5.56-2.el7.x86_64 2、卸载 mariadb rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64 3、安装 mysql 依赖包 yum install libaio 4、创建 mysql 安装目录 mkdir /usr/local/mysql 创…