Linux网络基础--传输层Tcp协议(上) (详细版)

news2024/12/22 20:04:17

目录

Tcp协议报头:

4位首部长度:

源端口号和目的端口号

32位序号和确认序号

标记位

超时重传机制:

两个问题

连接管理机制

三次握手,四次挥手

建立连接,为什么要有三次握手?

先科普一个概念:SYN洪水:参考博客:[黑客入门] TCP SYN洪水 (SYN Flood) 攻击原理与实现(非常详细)零基础入门到精通,收藏这一篇就够了_tcp syn flood-CSDN博客

正面回答为什么要有三次握手:


Tcp协议报头:

4位首部长度:

首先我们来理解其中最好理解的4位首部长度:

  • 在Tcp协议报头中描述报头长度的长度单位是4字节,总范围为[0,60],单位:字节,也就是说,如果Tcp协议的报头长度为36时,设首部长度 = x,则可以推导出x=9,转换为二进制:1001

done

---------------------------------------------------------------------------------------------------------------------------------

源端口号和目的端口号

可以看看这篇文章:Linux网络基础-----传输层UDP协议-CSDN博客

此处不再赘述;

done

---------------------------------------------------------------------------------------------------------------------------------

32位序号和确认序号

  • 发送方每次发送的请求中,Tcp报头都会携带对应的32位序号,用来表示当前发送的信息的唯一性,同样的,接收方每次做出应答时,应答的Tcp报头中的32位确认序号就是32位序号 + 1,表示当前确认序号之前的数据已经全部收到!

比如说如果确认序号是3001,那么表示3001之前的所有序号的数据都被收到了!

--------------------------------------------------------------------------------------------------------------------------------

标记位

六位

如果应答确认报文:对于Tcp报头,将标记位ACK置为1,序号和确认序号正常比对,即可表示确认报文。

  • 假设发送方先发送了序号为1至1000的数据,接收方成功接收后,会返回一个ACK响应。此时,ACK中携带的确认序号将是1001,表示接收方已经接收到序号为1001之前(即1至1000)的所有数据,并要求发送方从序号1001开始发送下一条数据。
  • 需要注意的是,确认应答的起始序号(即确认序号)并不是固定的1001,而是根据每次发送数据的序列号动态变化的。

----------------------------------------------------------------------------------------------------------------------------

超时重传机制:

        

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

:假设主机A发了数据给主机B,主机B确实收到了,但是主机B发给主机A的ACK应答,主机A没有收到,在经过一段特定的时间后,主机A会将上一次发送给主机B的数据视为丢包了,会重新再传输一次,直到收到来自主机B的ACK应答再开始下一次新的数据发送。

两个问题

到这里,问题有2个,首先,此时主机B会存在2份一摸一样的数据,主机B是如何对这2份数据去重的呢?答案是:ACK序列号!ACK应答中携带确认序号,告诉接收方“我”收到了多少个字节的数据,通过序列号去重相同的数据字节下标,即可解决数据重复的问题!

第二个问题,特定的时间只多久?是否固定?这个问题也很好解释,首先,重传的时间肯定是和数据传输时的网络状态强相关的,那么这个特定的时间一定是随着网络状态动态变化的,在Linux中中,这个特定的时间初始值为500ms,每丢包一次,这个时间就double一次,直到不再丢包。

----------------------------------------------------------------------------------------------------------------------------

连接管理机制

三次握手,四次挥手

三次握手建立连接,四次挥手断开连接;

先说三次握手,上图:

当Client发起Tcp连接时,会将Tcp报头的标记位的SYN置为1,表示这是一次连接请求,Server收到后,会有一次应答,应答的Tcp报头的标记位的SYN和ACK都置为1,Client收到ACK应答后,自身状态会设置为已连接状态,发送一个ACK应答给Server,Server收到这次ACK之后才会将自己的accept返回,成功建立连接。

那么此处又有问题了:Client最后发送的ACK应答,如果Server没收到这次ACK应答怎么办?

此时,Tcp报头中的标记为又要上场了,RST标记位:Client自身建立好Tcp连接时,如果继续发送消息到Server,但是Server并没有收到Client最后一次的ACK响应,此时,Server会向Client应答一次,这次应答的Tcp报头的标记位中的RST标记位和ACK被置为1,Client收到Server的这次应答后,就知道之前的Tcp连接建立失败了,此时Client会释放异常的连接,重新发起三次握手建立连接

四次挥手:

如果Client的数据全部发送完毕了,在应用层使用了close(fd)释放了文件描述符后,向Server发送断开连接的请求,Tcp报头中的FIN标记位置为1,直到Client收到来自Server的ACK应答之后,Client单方面关闭连接成功,不再给Server发送用户的数据。

如果,Client断开连接后,Server还在处理Client之前发送的历史数据时,依然可以给对应Client发送应答,Client也必须针对这些应答再给Server发送ACK响应(空报文)!

问题又来了,应用层调用close之后,文件读写端不是都会被关闭吗?那么Client该如何拿到Server对历史数据的处理结果呢?

很简单,Linux的shutdown接口,函数原型:

可以对指定的文件描述符,进行指定端的关闭操作,SHUT_RD表示只关闭读端,SHUT_WR表示只关闭写端。这样,Client就能拿到Server的数据了;

建立连接,为什么要有三次握手?

 要正面回答这个问题,首先要阐述一下为什么一次,二次握手不行‘;

先科普一个概念:SYN洪水:参考博客:[黑客入门] TCP SYN洪水 (SYN Flood) 攻击原理与实现(非常详细)零基础入门到精通,收藏这一篇就够了_tcp syn flood-CSDN博客

对于一次握手,二次握手,由于连接比较简单,Clinet可以伪造大量的SYN连接请求,向服务器发起连接请求,一次握手的话,server极有可能会在短时间内被打满相当多的Tcp链接,因为在Server看来,如果只有一次握手,当收到Client的SYN请求时,就默认双方都建立好了Tcp链接

容易让服务器出现严重的问题,甚至挂掉,二次握手同理,Client可以忽略来自Server的应答,继续SYN洪水,还是容易造成上述一次握手的问题。,但是对于三次握手,服务器虽然无法保证能防御SYN洪水,但是比一次,二次握手好一点,至少能保证Clinet一定在自己建立连接成功之前先建立连接成功的状态!

正面回答为什么要有三次握手:

首先,

  • 验证全双工:验证网络的连通性,对于客户端来说,只使用最少的次数验证了双方的连通性,因为能收到服务器的ACK应答;对于服务器来说,也只用了最少的次数验证了双方的连通性,因为同理能收到来自客户端的ACK应答
  • 建立双方通信的共识意愿,客户端先发出SYN连接请求,服务器收到了,返回一个ACK应答,至此,客户端建立连接结束,但是Tcp连接是全双工的,服务器也要向客户端发送连接请求SYN,得到客户端的ACK应答后,即完成三次握手,而在其中服务器向客户端发送第一次ACK时会捎带SYN,即捎带应答;

----------------------------------------------------------------------------------------------------------------------------

TODO

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

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

相关文章

全志H618 Android12修改doucmentsui鼠标单击图片、文件夹选中区域

背景: 由于当前的文件管理器在我们的产品定义当中,某些界面有改动的需求,所以需要在Android12 rom中进行定制以符合当前产品定义。 需求: 在进入File文件管理器后,鼠标左击整个图片、整个文件夹可以选中该类型,进行操作,故代码分析以及客制化如下: 主要涉及的代码:…

Unity命令行传递自定义参数 命令行打包

命令行参数增加位置 -executeMethod 某脚本.某方法 参数1 参数2 参数3 ... 例如执行EditorTest.GetCommandLineArgs方法 增加两个命令行参数 Version=125 CDNVersion=100 -executeMethod EditorTest.GetCommandLineArgs Version=125 CDNVersion=100 Unity测试脚本 需要放在…

如何重新设置VSCode的密钥环密码?

故障现象: 忘记了Vscode的这个密码: Enter password to unlock An application wants access to the keyring “Default ke... Password: The unlock password was incorrect Cancel Unlock 解决办法: 1.任意terminal下,输入如下…

电子发票汇总改名,批量处理电子发票问题

今天给大家推荐一个财务方面工作的软件。可以帮你解决很多财务。发票方面的问题。 电子发票汇总改名 批量处理电子发票问题 这个软件安装之后。会在桌面上分成三个小软件,分别是修改单位信息、自定义命名规则和电子发票汇总改名。 你可以在这个软件里提取PDF或者of…

Linux——卷

Linux——卷 介绍 最近做的项目,涉及到对系统的一些维护,有些盘没有使用,需要创建逻辑盘并挂载到指定目录下。有些软件需要依赖空的逻辑盘(LVM)。 先简单介绍一下卷的一些概念,有分区、物理存储介质、物…

MySQL通用语法 -DDL、DML、DQL、DCL

SQL 全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了 一套操作关系型数据库统一标准 。 SQL通用语法 MySQL语言的通用语法。 SQL语句可以单行或多行书写,以分号结尾。SQL语句可以使用空格/缩进来增强…

利用DnslogSqlinj工具DNSlog注入

工具下载链接 https://github.com/adooo/dnslogsqlinj 配置 将域名和API进行一个更改 之后再安装两个python2的库就可以使用dnslog进行自动化注入了 python2安装pip2 curl https://bootstrap.pypa.io/2.7/get-pip.py -o get-pip.py python2 get-pip.py库 pip2 install geven…

QT网络(一):主机信息查询

网络简介 在QT中进行网络通信可以使用QT提供的Qt Network模块,该模块提供了用于编写TCP/IP网络应用程序的各种类,如用于TCP通信的QTcpSocket和 QTcpServer,用于 UDP 通信的 QUdpSocket,还有用于网络承载管理的类,以及…

STM32-笔记5-按键点灯(中断方法)

1、复制03-流水灯项目,重命名06-按键点灯(中断法) 在\Drivers\BSP目录下创建一个文件夹exti,在该文件夹下,创建两个文件exti.c和exti.h文件,并且把这两个文件加载到项目中,打开项目工程文件 加载…

重塑医院挂号体验:SSM 与 Vue 搭建的预约系统设计与实现

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

mysql的事务控制和数据库的备份和恢复

事务控制语句 行锁和死锁 行锁 两个客户端同时对同一索引行进行操作 客户端1正常运行 客户端2想修改,被锁行 除非将事务提交才能继续运行 死锁 客户端1删除第5行 客户端2设置第1行为排他锁 客户端1删除行1被锁 客户端2更新行5被锁 如何避免死锁 mysql的备份和还…

C# OpenCV机器视觉:尺寸测量

转眼就是星期一了,又到了阿强该工作的时候了!阿强走进了他作为机器视觉工程师的办公室,准备迎接新一天的挑战。随着周末的结束,他心中暗想:“如果我能让机器像我一样聪明,那就太好了!” 正当他…

四川托普信息技术职业学院教案1

四川托普信息技术职业学院教案 【计科系】 周次 第 1周,第1次课 备 注 章节名称 第1章 XML语言简介 引言 1.1 HTML与标记语言 1.2 XML的来源 1.3 XML的制定目标 1.4 XML概述 1.5 有了HTML了,为什么还要发展XML 1.5.1 HTML的缺点 1.5.2 XML的特点 1.6 X…

网络安全防范

实践内容 学习总结 PDR,$$P^2$$DR安全模型。 防火墙(Firewall): 网络访问控制机制,布置在网际间通信的唯一通道上。 不足:无法防护内部威胁,无法阻止非网络传播形式的病毒,安全策略…

GhostRace: Exploiting and Mitigating Speculative Race Conditions-记录

文章目录 论文背景Spectre-PHT(Transient Execution )Concurrency BugsSRC/SCUAF和实验条件 流程Creating an Unbounded UAF WindowCrafting Speculative Race ConditionsExploiting Speculative Race Conditions poc修复flush and reload 论文 https:/…

c4d动画怎么导出mp4视频,c4d动画视频格式设置

宝子们,今天来给大家讲讲 C4D 咋导出mp4视频的方法。通过用图文教程的形式给大家展示得明明白白的,让你能轻松理解和掌握,不管是理论基础,还是实际操作和技能技巧,都能学到,快速入门然后提升自己哦。 c4d动…

你的第一个博客-第一弹

使用 Flask 开发博客 Flask 是一个轻量级的 Web 框架,适合小型应用和学习项目。我们将通过 Flask 开发一个简单的博客系统,支持用户注册、登录、发布文章等功能。 步骤: 安装 Flask 和其他必要库: 在开发博客之前,首…

嵌入式单片机的运行方式详解

程序的运行方式轮询系统 指的是在程序运行时,首先对所有的硬件进行初始化,然后在主程序中写一个死循环,需要运行的功能按照顺序进行执行,轮询系统是一种简单可靠的方式,一般适用于在只需要按照顺序执行的并且没有外部事件的影响的情况下。 程序的运行过程中出现如按键等需…

学技术学英文:SpringBoot的内置监控组件-Spring Boot Actuator

导读: Spring Boot Actuator是Spring Boot提供的一个模块,简单配置后就能开启,属于拿来即用,具体功能如下: 监控和管理Spring Boot应用 Spring Boot Actuator提供了一组REST端点和命令行工具,用于查看应…

「Mac畅玩鸿蒙与硬件45」UI互动应用篇22 - 评分统计工具

本篇将带你实现一个评分统计工具,用户可以对多个选项进行评分。应用会实时更新每个选项的评分结果,并统计平均分。这一功能适合用于问卷调查或评分统计的场景。 关键词 UI互动应用评分统计状态管理数据处理多目标评分 一、功能说明 评分统计工具允许用…