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

目录

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.rhkb.cn/news/493624.html

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

相关文章

【NLP 18、新词发现和TF·IDF】

目录 一、新词发现 1.新词发现的衡量标准 ① 内部稳固 ② 外部多变 2.示例 ① 初始化类 NewWordDetect ② 加载语料信息,并进行统计 ③ 统计指定长度的词频及其左右邻居字符词频 ④ 计算熵 ⑤ 计算左右熵 ​编辑 ⑥ 统计词长总数 ⑦ 计算互信息 ⑧ 计算每个词…

clickhouse-数据库引擎

1、数据库引擎和表引擎 数据库引擎默认是Ordinary,在这种数据库下面的表可以是任意类型引擎。 生产环境中常用的表引擎是MergeTree系列,也是官方主推的引擎。 MergeTree是基础引擎,有主键索引、数据分区、数据副本、数据采样、删除和修改等功…

Pytorch | 从零构建Vgg对CIFAR10进行分类

Pytorch | 从零构建Vgg对CIFAR10进行分类 CIFAR10数据集Vgg网络结构特点性能应用影响 Vgg结构代码详解结构代码代码详解特征提取层 _make_layers前向传播 forward 训练过程和测试结果代码汇总vgg.pytrain.pytest.py 前面文章我们构建了AlexNet对CIFAR10进行分类: Py…

大数据机器学习算法和计算机视觉应用07:机器学习

Machine Learning Goal of Machine LearningLinear ClassificationSolutionNumerical output example: linear regressionStochastic Gradient DescentMatrix Acceleration Goal of Machine Learning 机器学习的目标 假设现在有一组数据 x i , y i {x_i,y_i} xi​,yi​&…

DB-GPT V0.6.3 版本更新:支持 SiliconCloud 模型、新增知识处理工作流等

DB-GPT V0.6.3版本现已上线,快速预览新特性: 新特性 1. 支持 SiliconCloud 模型,让用户体验多模型的管理能力 如何使用: 修改环境变量文件.env,配置SiliconCloud模型 # 使用 SiliconCloud 的代理模型 LLM_MODELsiliconflow_p…

ChromeOS 131 版本更新

ChromeOS 131 版本更新 1. ChromeOS Flex 自动注册 在 ChromeOS 131 中,ChromeOS Flex 的自动注册功能现已允许大规模部署 ChromeOS Flex 设备。与 ChromeOS 零接触注册类似,自动注册将通过组织管理员创建的注册令牌嵌入到 ChromeOS Flex 镜像中。这将…

你好Python

初识Python Python的起源 1989年,为了打发圣诞节假期,Gudio van Rossum吉多 范罗苏姆(龟叔)决心开发一个新的解释程序(Python雏形) 1991年,第一个Python解释器诞生 Python这个名字&#xff…

【Linux系统编程】:信号(2)——信号的产生

1.前言 我们会讲解五种信号产生的方式: 通过终端按键产生信号,比如键盘上的CtrlC。kill命令。本质上是调用kill()调用函数接口产生信号硬件异常产生信号软件条件产生信号 前两种在前一篇文章中做了介绍,本文介绍下面三种. 2. 调用函数产生信号 2.1 k…

BlueLM:以2.6万亿token铸就7B参数超大规模语言模型

一、介绍 BlueLM 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型,本次发布包含 7B 基础 (base) 模型和 7B 对话 (chat) 模型,同时我们开源了支持 32K 的长文本基础 (base) 模型和对话 (chat) 模型。 更大量的优质数据 :高质量语料…

apache-tomcat-6.0.44.exe Win10

apache-tomcat-6.0.44.exe Win10

linux-----常用指令

文件和目录操作指令 ls(list)指令 功能:用于列出目录的内容,包括文件和子目录。示例: ls:列出当前目录下的所有非隐藏文件和目录。例如,在一个包含文件file1.txt、file2.txt和目录dir1的目录中&…

海外外卖APP开发新方向:基于同城外卖系统源码的多元化解决方案

时下,基于同城外卖系统源码的多元化解决方案,正成为海外外卖APP开发的新方向,推动着全球外卖市场的变革。本篇文章,小编将为大家讲述外卖APP开发的新方案。 一、同城外卖系统源码:创新与灵活的基础 同城外卖系统源码…

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:/…

「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件

本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。 关键词 UI互动应用天气预报数据绑定动态展示状态管理 一、功能说明 自定义…

常用Python自动化测试框架有哪些?

随着技术的进步和自动化技术的出现,市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整,这些自动化测试框架就能够开箱即用,大大节省了测试时间。而且由于这些框架被广泛使用,他们具有很好的健壮性&#xff0…

彻底认识和理解探索分布式网络编程中的SSL安全通信机制

探索分布式网络编程中的SSL安全通信机制 SSL的前提介绍SSL/TLS协议概述SSL和TLS建立在TCP/IP协议的基础上分析一个日常购物的安全问题 基于SSL的加密通信SSL的安全证书SSL的证书的实现安全认证获取对应的SSL证书方式权威机构获得证书创建自我签名证书 SSL握手通信机制公私钥传输…

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

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

python如何保存.npy

数据处理的时候主要通过两个函数: (1)np.save(“test.npy”,数据结构) ----存数据 (2)data np.load(test.npy") ----取数据 给2个例子如下: 1、存列表 z [[[1, 2, 3], [w]…

gitee给DeployKey添加push权限

git执行push操作,将本地修改推送到gitee远程仓库时,报错: error: src refspec master does not match any error: failed to push some refs to gitee.com:XXX/XXX.git进一步执行以下强制推送命令: $ git push --set-upstream o…

Unbuntu下怎么生成SSL自签证书?

环境: WSL2 Unbuntu 22.04 问题描述: Unbuntu下怎么生成SSL自签证书? 解决方案: 生成自签名SSL证书可以使用OpenSSL工具,这是一个广泛使用的命令行工具,用于创建和管理SSL/TLS证书。以下是生成自签名…