【网络】传输层TCP协议的报头和传输机制

news2025/1/11 20:54:12

目录

引言

报头和有效载荷

确认应答机制

超时重传机制

排序和去重

连接管理机制


个人主页:东洛的克莱斯韦克-CSDN博客

引言

TCP是传输层协议,全称传输控制协议。TCP报头中有丰富的字段以及协议本身会制定完善的策略来保证网络传输的可靠性。

TCP是全双工(可以同时读写)的,因为TCP协议维护了两块缓冲区,一个用来读,一个用来写。建立链接成功会返回给应用层文件描述符,应用层调用该文件描述符写入,数据就刷到写缓冲区,应用层调用该文件描述符读,就会从读缓冲区读取数据。

报头和有效载荷

数据部分称为有效载荷,剩下的称为报头。报头是结构化数据。

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

4 位TCP首部长度 : 表示该 TCP 头部有多少个 32 bit( 有多少个 4 字节 ); 所以TCP 头部最大长度是 15 * 4 = 60,上述选项中报头去掉选项固定大小是20字节,报头的选项可带可不带,所以报头的长度是20到60字节

标志位

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

16 位窗口大小 :用于流量控制
16 位校验和 : 发送端填充 , CRC 校验 . 接收端校验不通过 , 则认为数据有问题 . 此 处的检验和不光包含 TCP 首部 , 也包含 TCP 数据部分 .
16 位紧急指针 : 标识哪部分数据是紧急数据 ;
32位序号:TCP 将每个字节的数据都进行了编号 . 即为序列号。
32位确认序号:每一个 ACK 都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据; 下一次你从哪里开始发
数据:整个报文的有效载荷

确认应答机制

在网络通信中,主机A向主机B发消息,主机A不可能知道数据包是否到达了主机B。所以需要主机B向主机A应答,让主机A知道数据包并没有丢失。

需要通过应答来确保单方向上通信的可靠性,单方向是因为主机B不知道自己的应答是否丢失,如果主机B要确认自己的应答是否丢失就需要主机A再向主机B发送应答,这样的话就套娃了,所以没有完全可靠的通信,只能确保单方向上的通信。


超时重传机制

基于上述的应答机制可以再思考一下,主机A发出的数据包可能丢了,可能在某个路由下排队。对应的,主机B收到了数据包,那应答的数据包万一丢失了呢?

为了应对上述情况,TCP在发出一个数据包时,会设个时间,只要超出这个时间主机A都认为主机B没有收到数据包,会重新发送。

Linux (BSD Unix Windows 也是如此 ), 超时以 500ms 为一个单位进行控制, 每次判定超时重发的超时时间都是 500ms 的整数倍。 如果重发一次之后, 仍然得不到应答 , 等待 2*500ms 后再进行重传 。如果仍然得不到应答, 等待 4*500ms 进行重传。 依次类推 , 以指数形式递增。 累计到一定的重传次数, TCP 认为网络或者对端主机出现异常 , 强制关闭连接。

排序和去重

主机A可能向主机B发了很多数据包,由于网路问题,数据包到达主机B可能乱序了。认识了上述重传机制后主机A可能向主机B发送同样的数据包。那么主机B怎么做到排序和去重呢——TCP报头中的序列号。

主机B收到数据包后会给主机A响应,即发送的TCP报头中的确认序号分别为1001,2001,3001。那么此时,我们时允许主机B响应的数据包可以有部分丢失,如果拿到了带有3001序号的TCP报头,那么主机A就知道前3000个字节已经成功发送给B,即使前两个响应的数据包丢失了也没关系,此时主机A知道下次应该从3001开始传。

连接管理机制

在TCP协议通信之前是要建立链接的,OS也要创建对应的内核数据结构管理链接。通信双方发送TCP的报头协商——包头中的标志位。
建立链接要三次握手,握手是个形象的说法,本质是通过TCP报头中的标志位协商
上图中只画了标志位,实际传输时双方用TCP报头协商。
客户端发起SYN请求,服务端响应SYN和ACK表示自己也要建立链接并告诉客户端自己已经收到链接请求,此时客户端才的OS才创建相关的内核数据结构管理该链接,客户端在给服务端发送ACK只要服务器收到了ACK,服务端才建立链接,OS也会创建相关的内核结构来管理该链接,至此双方完成握手。
如果第三次的ACK丢包了呢? 那么客户端和服务端在短时间内会有认知偏差,在三次握手规定中,第三次的ACK不会得到服务端的响应,那么只要客户端把该报头发送出去,就认为双方握手成功,但该数据包丢失了,服务端会认为握手失败,并给客户端发送带有 RST标志位的数据包来要求客户端重新握手。
完成三次握手就可以让双方知道前两次通信一定没有问题,可以验证全双工。
三次握手建立链接可以有效避免 SYN洪水问题,可以拿一次握手,两次握手来比较差别。
从图中可以看出,只要客户端发起SYN请求服务端就要建立链接,服务端维护链接耗费的资源先不谈,如果客户端在握手期间出异常了服务端并不清楚的情况下要一直维持链接,链接资源是有限的,如果客户量大的话就要维持很多无效链接。如果有大量的肉机不断地发送SYN请求,服务器上地服务很容易挂掉。
断开链接要四次挥手
整个过程如下图

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

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

相关文章

ICM-20948芯片详解(12)

接前一篇文章:ICM-20948芯片详解(11) 六、寄存器详解 2. USER BANK 0寄存器详述 (56)FIFO_EN_1 参考代码: 无。 (57)FIFO_EN_2 ACCEL_FIFO_EN 1 —— 以采样率将ACCEL-XOUT_H、…

haproxy实例

什么是haproxy Haproxy是一款提供高可用性,负载均衡以及基于tcp和http的的应用交付控制器的开源软件。它由法国人威利塔罗使用c语言开发的。它广泛用于管理和路由网络流量,并确保应用程序的高可用性和高性能。 haproxy的功能 提供第4层(TCP层…

vulnhub系列:Hackademic.RTB1

vulnhub系列:Hackademic.RTB1 靶机下载 一、信息收集 nmap 扫描存活,根据 mac 地址寻找 IP nmap 192.168.23.0/24nmap 扫描端口,开放端口:22、80 nmap 192.168.23.143 -p- -Pn -sV -O访问80端口,页面发现 target …

DirectX修复工具解决问题:一步步教你排除常见错误

在日常使用电脑的过程中,许多用户可能会遇到与DirectX相关的问题,特别是在运行大型游戏或图形密集型应用程序时。这种情况下,选择一款合适的DirectX修复工具免费版来解决问题至关重要! 我们将分享六款好用的DirectX修复工具&…

字节Java后端二面也太难了吧...

粉丝投稿,字节二面直接连环问场景题,难以招架,已经准备好市场上常见的场景题了,希望能帮助你! 由于平台篇幅原因,很多内容展示不了,需要这份《java面试宝典》的伙伴们转发文章关注后&#xff…

Linux_Shell变量及运算符-05

一、Shell基础 1.1 什么是shell Shell脚本语言是实现Linux/UNIX系统管理及自W动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算…

MySQL基础练习题38-每位教师所教授的科目种类的数量

目录 题目 准备数据 分析数据 总结 题目 查询每位老师在大学里教授的科目种类的数量。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Teacher (teacher_id int, subject_id int, dept_id int)## 向表中插入数据 Truncate table…

ALB使用指南|深入探究 lj-lua-stacks:如何生成 Lua 代码级别的火焰图?

前言 ALB(Another Load Balancer)是一款由灵雀云基于 OpenResty 开发的开源Kubernetes(K8s) 网关,拥有多年的生产环境使用经验。Openresty框架高性能的基础上,提供了一系列高级特性,包括多租户支…

JsonUtility和JsonConvert.DeserializeObject

文章目录 JsonUtility 和 JsonConvert在字符串转类型时的不同总结 JsonUtility 和 JsonConvert在字符串转类型时的不同 不同: JsonUtility.FromJson要转的字符串内不能有注释的字符串 但JsonConvert.DeserializeObject要转的字符串里可以有 原因:. Jso…

新品|暴雨发布第四代工作站静安系列-TR1176

极致性能引领未来 暴雨信息推出全新一代工作站——静安系列TR1176,搭载了强劲的第四代处理器,为客户带来前所未有的计算速度与效率。无论是处理大规模数据集、复杂算法还是高负载多任务,都能轻松应对,确保客户的工作流程顺畅无阻…

【随笔】Java 连接操作FTP与SFTP 详细指南

引言 在Java开发中,文件传输协议(FTP)和安全文件传输协议(SFTP)是处理文件传输的两种常见方式。FTP是标准的网络文件传输协议,而SFTP则在FTP基础上增加了安全层(SSH),提…

设计模式 之 —— 组合模式

目录 什么是组合模式? 定义 特点 结构 组合模式(java代码示例) 首先定义接口 定义叶节点(Leaf类) 定义容器节点(Composite类) 测试类: 树形图 运行结果: 组…

CUDA Programming - (1) CUDA简介

1. GPU 简介 处理器一般包含以下几部分:Cache 缓存,ALU 计算单元,Control 控制中心,RAM 内存。 CPU(Central Processing Unit):中央处理器。适合进行逻辑,ALU计算核心较少。适合控…

乒乓球桌上的AI新星:谷歌机器人Agent,是竞技的未来,还是科技的幻想?

在巴黎奥运会乒乓球的激烈角逐中,一个不同寻常的选手悄然登场——谷歌的乒乓球机器人Agent。 这是首个在竞技水平上达到人类标准的AI机器人。 01 AI机器人颠覆初级玩家 Agent不仅能够在正反手之间自如转换,连续进攻,甚至在面对诸如长球、高…

【Qt】QWidegt的enable属性

enabled:描述了一个控件是否处于“可用”状态(相对的概念“禁用”)。 API说明 isEnabled() 获取到控件的可⽤状态 setEnabled 设置控件是否可使⽤. true 表⽰可⽤, false 表⽰禁⽤ 所谓“禁用”指的是该控件不能接收任何用户的输入事件…

localStorage用法

一、localStorage API使用 注意,localStorage 只能存储字符串。 1.1 存储数据 例如,对象存储时,可以使用JSON.stringify 转成字符串; // 假设你有一个对象 const myObject {name: Alice,age: 25, };// 使用 JSON.stringify 将…

解决windows7虚拟机安装不了vmtools问题

安装不了vmtools问题所在: 没打补丁 ​ 打补丁问题 补丁在本地下载之后无法传到win7虚拟机中 补丁获取 补丁链接如下: https://catalog.s.download.windowsupdate.com/c/msdownload/update/software/secu/2019/09/windows6.1-kb4474419-v3-x64_b5614c6…

脱胎于 S 语言的R语言,Ross Ihaka 和 Robert Gentleman 和社区的力量让 R 在学术界与研究机构放光彩

R语言从一门用于统计学教学的编程语言,发展成为全球数据科学领域的重要工具,离不开其强大的功能、丰富的社区资源和开源精神。这些都离不开Ross Ihaka 和 Robert Gentleman 和 社区的力量。 在1990年代初,新西兰奥克兰大学的统计学教授Ross I…

图解Kafka | 彻底弄明白 Kafka 两个最重要的配置

我已经使用 Kafka 近两年了,我发现有两个配置很重要,但是不太容易理解。这两个配置分别是acks和min.insync.replicas。 本文将通过一些插图来帮助理解这2个配置,以便更好的使用Kafka为我们服务。 复制 我假设你已经熟悉 Kafka了 &#xff…

【TabBar嵌套Navigation案例-按钮交换图片和文字的位置-分类 Objective-C语言】

一、接下来,我们接着来说这个Button的问题, 1.首先,我要做的事情,就是让它们两个去交换位置, 那么这个时候,我要去自定义一个东西, 然后,我现在要来到发现这个页面的View里边,我要去自定义一个Button, New一个File, 来一个Cocoa Touch Class, 然后,继承的是UIB…