网络原理TCP/IP(2)

文章目录

  • TCP协议
  • 确认应答
  • 超时重传
  • 连接管理
  • 断开连接

TCP协议

TCP全称为"传输控制协议(Transmission Control Protocol").⼈如其名,要对数据的传输进⾏⼀个详细
的控制;
TCP协议段格式
在这里插入图片描述
• 源/目的端口号:表⽰数据是从哪个进程来,到哪个进程去;
• 32位序号/32位确认号:后⾯详细讲;
• 4位TCP报头⻓度:表⽰该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最⼤⻓度是15*4=60
• 6位标志位:
URG:紧急指针是否有效
ACK:确认号是否有效
PSH:提⽰接收端应⽤程序⽴刻从TCP缓冲区把数据读⾛
RST:对⽅要求重新建⽴连接;我们把携带RST标识的称为复位报⽂段
SYN:请求建⽴连接;我们把携带SYN标识的称为同步报⽂段
FIN:通知对⽅,本端要关闭了,我们称携带FIN标识的为结束报⽂段

• 保留(六位)reserved保留位:UDP协议长度受到2个字节的限制,想要进行扩展,发现扩展不了,一旦改变报头长度,就会使机器发送的UDP数据报和其他机器不兼容,TCP在设定报头的时候就提前准备了几个保留位,后续一旦需要扩展功能,使用保留位就可以实现,就可以避免TCP的扩展不兼容的问题
• 16位校验和:发送端填充,CRC校验.接收端校验不通过,则认为数据有问题.此处的检验和不光包含TCP⾸部,也包含TCP数据部分.
• 16位紧急指针:标识哪部分数据是紧急数据;

确认应答

网络传输过程中,经常会出现后发先至的情况,原因是:一个数据包从发送方到接收方传输过程中走的路径可能不一样,导致先发后至。
为了解决上述问题,引入了序号和确认序号,对数据进行编号,应答报文告诉发送方我应答是哪个数据
在这里插入图片描述
TCP将每个字节的数据都进⾏了编号.即为序列号
主机B收到1-1000这些字节数据之后反馈一个应答报文,应答报文中的确定序号的值就是1001,
1001的含义:
1.小于1001的数据都已经收到了
2.发送方接下来要给我发1001开始的数据了

TCP的确认应答是确保TCP可靠性的最核心机制
在这里插入图片描述
每⼀个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;下⼀次你从哪⾥开始发.

超时重传

超时重传是确认应答的补充,如果一切顺利,通过应答报文就可以告诉发送方当前数据是不是成功收到,但是网络上可能存在丢包的情况,如果数据包丢了没有到达对方,对方自然也就没有ack报文,这种情况下就需要超时重传,当认为丢包之后,就会把刚才的数据包再传输一次,等待的过程有一个时间的阈值,就是“超时”。
在这里插入图片描述
• 主机A发送数据给B之后,可能因为⽹络拥堵等原因,数据⽆法到达主机B;
• 如果主机A在⼀个特定时间间隔内没有收到B发来的确认应答,就会进⾏重发;但是,主机A未收到B发来的确认应答,也可能是因为ACK丢失了;

在这里插入图片描述
TCP socket在内核中存在接收缓冲区(一块内存空间),发送方发来的数据是要先放到接收缓冲区的然后应用程序调用read/scanner.next才能读到数据,当数据再次接收到缓冲区时候,接收方首先会先判定是否存在,如果存在就会丢弃重复数据。

接收方如何判定这个数据是否是“重复数据” ? 核心判定依据是根据数据的序号

1.数据还在接收缓冲区里,没被read走,此时就拿着新接收的数据序号和缓冲区中的所有数据的序号核对
2.数据在接收缓冲区外,已经被应用程序read走了,此时新来的数据序号直接无法再接收缓冲区查到(注意:应用程序读取数据的时候是按照序号的先后顺序连续读取的,一定是先读序号小的数据后读序号大的数据

超时重传不是无限的重传,重传过程也是有一定策略的
1.重传次数是有上限的,重传到一定程度还没有ack应答就尝试重置连接,如果重置也失败了,就直接放弃连接
2.重传的超时时间阈值也不是固定不变的,随着重传的次数的增大,而增大(重传的频率越来越低)

连接管理

建立连接和断开连接是网络原理中高频的问题
在内核中是如何建立连接的?
TCP要经过 三次握手 建⽴连接,目的就是让通信双方都能保存对方的相关信息

在这里插入图片描述
上述的流程上讲,是有四次交互,但是实际过程中,其中的两次交互可以合二为一,最终形成了“三次握手”,所谓的建立连接过程,本质上就是通信双方各自给对方发起一个syn,各自给对方回应一个ack

注意:

  1. 客户端是主动的一方,第一次交互一定是客户端主动发起的
  2. 所谓的syn是一个特别的TCP数据报,没有载荷,不会携带应用层数据,六个标志位中的第五位,为1

在这里插入图片描述
三次握手的意义是什么?

  1. 三次握手,可以先针对通信路径,进行投石问路,初步的确定一下通信链路是否畅通
  2. 三次握手也是在验证通信双方发送能力和接受能力是否正常

断开连接

断开连接的本质目的就是为了把对端的信息从数据结构中删除掉/释放掉
四次挥手也是存在确认应答和超时重传
在这里插入图片描述
四次挥手,断开连接的第二次和第三次操作不能合二为一,因为在实际通信过程中,ack和第二个fin时间间隔比较长,此时就无法进行合并了,就要分成两次来传输

三次握手和四次挥手
相似之处:
都是通信双方各自给对方发起一个syn/fin,各自给对方返回ack
数据传输的顺序,syn/ack/syn/ack fin/ack/fin/ack
不同之处:
三次握手中间两次一定能合并,四次挥手则不一定
三次握手必须是客户端主动,四次挥手,客户端/服务器都可以主动

连接管理过程中涉及到的TCP状态转换
TCP服务器和客户端都有一定的数据结构来保存这个连接的信息
在这个数据结构中其中就有一个属性叫做“状态”
操作系统内核根据状态的不同,决定了当前应该干什么
在这里插入图片描述
在这里插入图片描述
LISTEN状态,表示服务器这边创建好了serverSocket了,并且绑定端口号完成
ESTABLISHED状态,表示客户端和服务器连接已经建立完毕(三次握手完成)
CLOST WAIT状态,表示收到对方的fin之后进入这个状态(谁被动断开连接谁进入CLOSE WAIT)
TIME WAIT状态,表示本端给对方发起FIN之后,对端也给本端发FIN,此时本端进入TIME WAIT(谁主动断开连接谁进入TIME WAIT)

TIME_WAIT 存在的意义,主要是防止,最后一个ACK丢包。客户端如果在这个环节,把TCP连接释放掉,此时意味着重传的FIN就无法被返回ACK了(保存对端信息的数据结构存在,才能给这个连接提供各种操作,才能返回ACK)
此时的TIME_WAIT等待也不是无休止的等待,最多等2MSL(MSL是一个系统内核的配置项,表示客户端到服务器之间,消耗的最长时间,这个时间一般是一个非常大的时间,常见的设置值是1min)

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

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

相关文章

spring问题点

1.事务 1.1.事务传播 同一个类中 事务A调非事务B B抛异常 AB事务生效(具有传播性) 同一个类中 事务A调非事务B A抛异常 AB事务生效 也就是主方法加了事务注解 则方法内调用的其他本类方法无需加事务注解, 发生异常时可以保证事务的回滚 最常…

day07-CSS高级

01-定位 作用:灵活的改变盒子在网页中的位置 实现: 1.定位模式:position 2.边偏移:设置盒子的位置 left right top bottom 相对定位 position: relative 特点: 不脱标,占用自己原来位置 显示模…

跟着cherno手搓游戏引擎【14】封装opengl

本节先把代码粘上,后续会慢慢把注释都给加上,先看代码了解个大概(待更新) 前置: RendererAPI.h: #pragma once namespace YOTO {enum class RendererAPI {None 0,OpenGL1};class Renderer {public:inline static R…

(每日持续更新)jdk api之NotSerializableException基础、应用、实战

博主18年的互联网软件开发经验,从一名程序员小白逐步成为了一名架构师,我想通过平台将经验分享给大家,因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验,晚上进行用心精简、整理、总结、定稿&…

Flink 流式读取 Debezium CDC 数据写入 Hudi 表无法处理 -D / Delete 消息

问题场景是:使用 Kafka Connect 的 Debezium MySQL Source Connector 将 MySQL 的 CDC 数据 (Avro 格式)接入到 Kafka 之后,通过 Flink 读取并解析这些 CDC 数据,然后以流式方式写入到 Hudi 表中,测试中发现…

【爬虫专区】批量下载PDF (无反爬)

天命:只要没反爬,一切都简单 这次爬取的是绿盟的威胁情报的PDF 先看一下结构,很明显就是一个for循环渲染 burp抓包会发现第二次接口请求 接口请求一次就能获取到了所有的数据 然后一个循环批量下载数据即可,其实没啥难度的 imp…

如何安装MySQL

如何安装MySQL 前提条件下载MySQL在 Windows 上安装 MySQL验证 MySQL 安装 MySQL是当今工业界广泛使用的最流行的关系数据库管理软件之一。它通过各种存储引擎提供多用户访问支持。它得到了甲骨文公司的支持。在本节中,我们将学习如何为初学者下载和安装 MySQL。 前…

安卓相对布局RelativeLayout

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"150dp"><TextViewandroid…

在VM虚拟机搭建NFS服务器

NFS共享要求如下&#xff1a; &#xff08;1&#xff09;共享“/mnt/自已姓名的完整汉语拼音”目录&#xff0c;允许XXX网段的计算机访问该共享目录&#xff0c;可进行读写操作。&#xff08;说明&#xff1a;XXX网段&#xff0c;请根据你的规划&#xff0c;再具体指定&#xf…

完整的 HTTP 请求所经历的步骤及分布式事务解决方案

1. 对分布式事务的了解 分布式事务是企业集成中的一个技术难点&#xff0c;也是每一个分布式系统架构中都会涉及到的一个东西&#xff0c; 特别是在微服务架构中&#xff0c;几乎可以说是无法避免。 首先要搞清楚&#xff1a;ACID、CAP、BASE理论。 ACID 指数据库事务正确执行…

【C语言刷题系列】喝汽水问题

文章目录 一、文章简介 1.先买再换 1.1 代码逻辑&#xff1a; 1.2 完整代码 1.3 运行结果 1.4 根据方法一总结优化 2.边买边换 2.1 代码逻辑&#xff1a; 2.2 完整代码 2.3 运行结果 一、文章简介 本文所述专栏——C语言经典编程问题 C语言刷题_倔强的石头106的博客…

unity3d的海盗王白银城演示

这是一个外网上的下载的海盗王unity3d制作的白银城演示场景。 地图只含有白银城区&#xff0c;没有野外和怪物。 当然也没有服务器端的。 我对灯光、摄像头、天空背景等做过调整&#xff0c;使它显示起来比较鲜丽。 它的模型和贴图是直接拿了海盗的&#xff0c;没有做过优化调整…

【算法与数据结构】139、LeetCode单词拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题可以看做一个动态规划问题。其中&#xff0c;字符串s是背包&#xff0c;而字典中的单词就是物品。…

指针的学习1

目录 什么是指针&#xff1f; 野指针 造成野指针的原因&#xff1a; 如何避免野指针&#xff1f; 内存和指针 如何理解编址&#xff1f; 指针变量和地址 取地址操作符& 指针变量和解引用操作符 指针变量 如何拆解指针类型&#xff1f; 指针变量的大小 指针变量…

麒麟系统—— openKylin 安装 Maven

麒麟系统—— openKylin 安装 Maven 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。2. 确保 java 已经安装完毕 二、下载Maven三、解压 Maven 与环境配置解压配置环境变量验证 最终&#xff1a;介绍配置的其他参数使用 本文将分享如何在麒麟操作系统 openKylin 上安装…

【Spring源码分析】推断构造方法

推断构造方法源码解析 一、确认候选构造——AutowireAnnotationBeanPostProcessor#determineCandidateConstructors二、autowireConstructor 方法源码解析三、总结 阅读此需阅读下面这些博客先【Spring源码分析】Bean的元数据和一些Spring的工具【Spring源码分析】BeanFactory系…

【Java程序设计】【C00207】基于(JavaWeb+SSM)的宠物领养管理系统(论文+PPT)

基于&#xff08;JavaWebSSM&#xff09;的宠物领养管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的宠物领养系统 本系统分为前台系统、管理员、收养者和寄养者4个功能模块。 前台系统&#xff1a;游客打开系统…

机器学习入门-----sklearn

机器学习基础了解 概念 机器学习是人工智能的一个实现途径 深度学习是机器学习的一个方法发展而来 定义:从数据中自动分析获得模型,并利用模型对特征数据【数据集:特征值+目标值构成】进行预测 算法 数据集的目标值是类别的话叫做分类问题;目标值是连续的数值的话叫做回…

FullStack之Django(1)开发环境配置

FullStack之Django(1)开发环境配置 author: Once Day date&#xff1a;2022年2月11日/2024年1月27日 漫漫长路&#xff0c;才刚刚开始… 全系列文档请查看专栏: FullStack开发_Once_day的博客-CSDN博客Django开发_Once_day的博客-CSDN博客 具体参考文档: The web framewor…

Docker中配置MySql环境

目录 一、简单安装 1. 首先从Docker Hub中拉取镜像 2. 启动尝试创建MySQL容器&#xff0c;并设置挂载卷。 3. 查看mysql8这个容器是否启动成功 4. 如果已经成功启动&#xff0c;进入容器中简单测试 4.1 进入容器 4.2 登录mysql中 4.3 进行简单添加查找测试 二、主从复…