当前位置: 首页 > news >正文

深入理解TCP网络协议(1)

目录

1.TCP协议的段格式

2.TCP原理

2.1确认应答

2.2超时重传

3.三次握手(重点)

4.四次挥手

1.TCP协议的段格式

我们先来观察一下TCP协议的段格式图解:

源/目的端口号:标识数据从哪个进程来,到哪个进程去

32位序号/32位确认号:TCP会话的每一端都包含一个32位(bit)的序列号,该序列号被用来跟踪该端发送的数据量。每一个包中都包含序列号,在接收端则通过确认号用来通知发送端数据成功接收

4位TCP报头长度:表示该TCP头部有多少个32位bit(有多少个4字节),所以TCP头部最大的长度是15*4=60 

6位标志位:

URG:紧急指针是否有效

ACK:确认号是否有效

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

RST:要求对方重新连接,我们把携带RST表示的称为复位报文段

SYN:请求建立连接,我们把携带SYN标识的称为同步报文段

FIN:通知对方,本端要关闭了.我们称携带FIN的叫结束报文段

16位校验和:发送端填充,CRC校验,如果接受端校验不通过,则认为数据有问题,这里的校验和不仅仅有TCP首部,也包含的有TCP数据部分

16位紧急指针:标识哪部分数据是紧急数据

40位头部选项和16位窗口大小;我会在后面的博客中详细介绍

2.TCP原理

TCP协议对于数据的管控主要有两个方面:安全和效率

在保证安全的时候,尽可能的提升效率

TCP是如何保证安全的呢,这就要涉及到我们的确认应答机制

2.1确认应答

我们用一张图来描述一下:

TCP协议对每个字节都进行了编号,有与之对应的序列号,当发送数据包到另一端以后,另一端就会确认应答发送应该数据包的最后一位+1,回馈给发送方,发送方下一次就以这个序列号为开始接着发.

2.2超时重传

在数据发送到接收方,没有得到及时响应的时候,就会触发超时重传机制.这也是TCP能保证安全的重要机制.

超时重传有以下两种情况:

1.数据发送给接收端的时候丢包

2.接收端确认应答的时候数据丢包,发送方不清楚数据是否到达,也会触发超时重传

这种情况,接收方会受到重复的数据,所以TCP协议会始别重复的包,并且把多余的给丢弃掉.

这时候我们就可以使用序列号来区分是不是相同的数据,很容易做到去重的效果.

那么这个超时重传的超时,具体时间如何确定呢?

如果时间太长的话,就会影响性能,而时间太短的话,极有可能会造成大量的重复包,造成资源浪费.

TCP协议为了兼顾到这两者,会动态的计算这个最大时间.

在Linux中(windows中也是如此),会以500ms为一个单位去控制,每次判定超时重传的时间都是这个数值的整数倍,如果依旧没有得到应答,就会在2*500ms的时间后再次重传,以此类推,每次都是上一次的两倍,但是如果时间过长又会发生什么呢?

答案是TCP会认为网络出现了问题,强制关闭连接.

3.三次握手(重点)

我们来深入理解,通过画图的方式来生动形象的的描述一下三次握手这个过程.

有的同学可能会有疑惑了,这明明是四次握手,为什么说是三次呢?实际上,第二次和第三次刚好一个在TCP协议格式第二位和第五位,刚好这两个可以一起发送过去,而TCP协议也确实是这样做的.

那么TCP协议的三次握手有什么好处呢?为什么不是两次不是四次,而偏偏是三次?且容我细细道来.

1.可以起到"投石问路"的效果,判断网络是否通畅,这个就像行军打仗的时候,前面的先锋部队会先去前面探路,确定路上没有阻碍了,后面的大部队才会跟着上来.

2.让发送端和接收端都能明白自己和对方的发送接收功能是否是好的.

比如在第一次握手的时候,接收端既然能收到请求就会知道 自己的接收功能莫问题,而发送端的发送功能莫问题

在第二次握手的时候,接收端返回一个应答报文和一个请求连接报文,接收端收到了以后,就知道自己的发送功能和接收功能都没问题.会回给接收端一个应答报文.

第三次握手的时候,接收端收到发送端的应答报文,就明白自己的发送功能和对方的接收功能都是好的.

这样,双方都明白自己和对方的发送功能和接收功能都是否完好.

如果是两次握手,那么就只是在我们上面提到的第二次握手,这样,接收端就不知道自己的发送功能和发送端的接收功能是不是好的,起不到我们想要的效果.

而三次握手已经满足了我们的需求,如果是四次或者多次,虽然也能做到,但是多余了,没有必要在做这么多重复没有意义的工作

4.四次挥手

四次挥手是客户端和服务器端断开连接的一个过程

 和三次握手不同的是,四次挥手不仅仅可以是客户端向服务器端发起,服务器端也可以向客户端发起.

三次握手建立连接的本质就是,客户端和服务器端都保存对端的信息,而断开连接则是在数据结构中删除这些信息.我们先用一张图来观察一下四次挥手的过程.

有兄弟可能会问了,凭什么三次握手就可以把中间的两次合并在一起,而四次挥手却不行呢?

这个问题的原因是因为,三次握手的时候,中间服务器确认应答ack和同步报文段syn都是在操作系统内核中完成的,它百分之百都可以同步的完成,所以可以一起发给客户端,

而四次挥手中,ack是在FIN过来以后立刻又内核给返回,而第二个FIN是由代码来完成的,在Java中就是调用了socket.close()方法来完成,如果代码逻辑很长,运行的时间长的话,这两个是不可能同时在一起发送过去,所以这个事并不是百分之百的,尽管有可能合并,但我们通常情况下,把断开连接的这种操作还是称之为四次挥手

相关文章:

深入理解TCP网络协议(1)

目录 1.TCP协议的段格式 2.TCP原理 2.1确认应答 2.2超时重传 3.三次握手(重点) 4.四次挥手 1.TCP协议的段格式 我们先来观察一下TCP协议的段格式图解: 源/目的端口号:标识数据从哪个进程来,到哪个进程去 32位序号/32位确认号:TCP会话的每一端都包含一个32位&#xff08…...

QT 中如何使用 JSON 功能?

在 Qt 中,您可以使用 QJsonDocument、QJsonObject 和 QJsonArray 类来处理 JSON 数据。以下是一个简单的示例,说明如何在 Qt 中使用这些类来解析和生成 JSON 数据: 1. 包含必要的头文件 首先,确保您的项目中包含了必要的 Qt JSO…...

C++面试:算法的执行效率和资源消耗、时间和空间复杂度分析根据实际场景,选用合适的数据结构和算法进行程序设计

目录 算法的执行效率和资源消耗、时间和空间复杂度分析 执行效率和资源消耗 时间复杂度分析 空间复杂度分析 实际应用 面试技巧 根据实际场景,选用合适的数据结构和算法进行程序设计 所根据原则 实例 如何选择数据结构示例 合适的数据结构:哈…...

力扣100215-按键变更的次数

按键变更的次数 题目链接 解题思路 我们发现只要相邻的两个字母不一样(大小写算一样)&#xff0c;那么按键变更次数就要加1 class Solution { public:int countKeyChanges(string s) {int ans 0;for(int i 1;i<s.size();i){if(s[i] - s[i-1] 32 || s[i] - s[i-1] -32 |…...

STM32-GPIO输出(HAL库)

STM32-GPIO 介绍 什么是GPIO&#xff1f; GPIO&#xff08;通用输入/输出&#xff09;是一种用于与外部设备进行数字通信的通用硬件接口。它允许微控制器或其他数字电路的引脚以灵活的方式配置为输入或输出&#xff0c;并在运行时进行动态控制。GPIO可用于连接和控制各种外围…...

倒计时80天

1.J-兔子不会种树_浙江机电职业技术学院第八届新生亮相赛&#xff08;同步赛&#xff09; (nowcoder.com) /****** __----~~~~~~~~~~~------___* . . ~~//...... __--~ ~~…...

PBM模型参数详解

本专栏着重讲解PBM学习所得&#xff0c;学习笔记、心得&#xff0c;并附有视频素材资料&#xff0c;视频详细目录如下&#xff1a; PBM相关参数解释1PBM相关参数解释2PBM相关案例实践1PBM相关案例实践2PBM相关案例实践2PBM相关案例实践3PBM多相流中次相界面设置1PBM多相流中次…...

贪吃蛇/链表实现(C/C++)

本篇使用C语言实现贪吃蛇小游戏&#xff0c;我们将其分为了三个大部分&#xff0c;第一个部分游戏开始GameStart&#xff0c;游戏运行GameRun&#xff0c;以及游戏结束GameRun。对于整体游戏主要思想是基于链表实现&#xff0c;但若仅仅只有C语言的知识还不够&#xff0c;我们还…...

Qlik Sense : IntervalMatch(离散匹配)

什么是IntervalMatch IntervalMatch 前缀用于创建表格以便将离散数值与一个或多个数值间隔进行匹配&#xff0c;并且任选匹配一个或多个额外关键值。 语法&#xff1a; IntervalMatch (matchfield)(loadstatement | selectstatement ) IntervalMatch (matchfield,keyfield…...

MySql45讲-08.事务到底是隔离的还是不隔离的?(结合MVCC视频)

命令的启动时机 begin/start transaction 命令并不是一个事务的起点&#xff0c;在执行到它们之后的第一个操作InnoDB表的语句&#xff0c;事务才真正启动。如果你想要马上启动一个事务&#xff0c;可以使用start transaction with consistent snapshot 这个命令。 事务的版本…...

备战蓝桥杯----数据结构及STL应用(基础2)

上次我们讲了vector的大致内容&#xff0c;接下来让我们讲一下栈&#xff0c;队列吧&#xff01; 什么是栈呢&#xff1f; 很简单&#xff0c;我们用的羽毛球桶就是&#xff0c;我们取的球&#xff0c;是最后放的&#xff0c;栈是一种先进后出的数据结构。 方法函数 s.push(…...

日常学习之:vue + django + docker + heroku 对后端项目 / 前后端整体项目进行部署

文章目录 使用 docker 在 heroku 上单独部署 vue 前端使用 docker 在 heroku 上单独部署 django 后端创建 heroku 项目构建 Dockerfile设置 settings.pydatabase静态文件管理安全设置applicaiton & 中间件配置 设置 requirements.txtheroku container 部署应用 前后端分别部…...

LangGraph:一个基于LangChain构建的AI库,用于创建具有状态、多参与者的应用程序

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

04-Nacos-服务注册基于spring boot实现

官方参考 在不依赖spring cloud 组件基础上&#xff0c;单独的微服务项目&#xff0c;实现nacos接入 1、依赖文件pom.xml <dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-discovery-spring-boot-starter</artifactId><…...

iOS 闭包和Block的区别

iOS 闭包和Block的区别 原文地址: mob64ca12eb7baf 引言 在iOS开发中&#xff0c;闭包和Block是两个常用的概念。它们都是将一段代码作为变量传递和使用的方式。尽管它们在实现上有一些相似之处&#xff0c;但它们之间还是存在一些重要的区别。本文将会详细介绍闭包和Block的…...

后端学习笔记——后端细碎知识点(每天更新......)

细碎知识点 主要是go后端&#xff0c;也会设计到python、java的知识&#xff0c;懒得分类整理&#xff0c;所以都写在一篇文章里面了&#xff0c;方便自己查看笔记。 context.BindJSON获取POST请求中的json数据gin.H封装了生成json的方式 common.ReturnJSONSuccess(c, gin.H{&…...

二进制中1的个数

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…...

python+matlab text(按图的相对位置显示)

python 用 python 画图时&#xff0c;如果想采用归一化的坐标来指定文本框的位置&#xff0c;则需要用到 transform ax.transAxes 参数&#xff0c;如 ax plt.gca() plt.text(0.1,0.2, "text", fontsize 20, transform ax.transAxes)matlab 方法1 text(___,Name…...

rust 引用/mut 的所有权

在任意给定时间&#xff0c;要么 只能有一个可变引用&#xff0c;要么 只能有多个不可变引用。 不可变引用&#xff08;shared reference&#xff09;实现了Copy trait&#xff0c;不会发生所有权转移可变引用&#xff08;mutable reference&#xff09;未实现&#xff0c;会发…...

油烟净化器科技改革,清新用餐生活

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 随着餐饮业蓬勃发展&#xff0c;人们对用餐环境的要求也与日俱增。本文将深入研讨餐饮油烟净化器技术的改革方向&#xff0c;…...

3种激活方案:解决IDM弹窗问题的开源工具应用指南

3种激活方案&#xff1a;解决IDM弹窗问题的开源工具应用指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 一、问题溯源&#xff1a;解析IDM激活弹窗的技术本质…...

从拼图游戏到自动驾驶:点云配准技术的跨领域进化史

从拼图游戏到自动驾驶&#xff1a;点云配准技术的跨领域进化史 1. 三维世界的数字拼图师 1987年&#xff0c;当Paul Besl和Neil McKay在实验室里尝试将两组扫描数据对齐时&#xff0c;他们可能不会想到&#xff0c;这项被称为迭代最近点&#xff08;ICP&#xff09;的技术会成为…...

企业级 Agent SKILL 最佳实践

最近&#xff0c;真的是屁颠屁颠地使用Openclaw作为业务核心为客户打造智能体的工作流程&#xff0c;包括组织、业务、技术三个全面的转型。同时&#xff0c;由于OpenAI的Sora下线&#xff0c;年初刚刚建立的AI漫剧工作流&#xff0c;资产库以及提示词都需要转换成替代品。还有…...

新手福音:免安装claude code,在快马平台开启你的ai编程第一课

作为一个刚接触编程的新手&#xff0c;最近想尝试用AI辅助写代码&#xff0c;但光是安装本地工具就让我头疼不已。直到发现了InsCode(快马)平台&#xff0c;才发现原来AI编程可以这么简单——不用配环境、不用解决依赖冲突&#xff0c;打开网页就能直接开玩。今天就把我的入门体…...

如何高效使用抖音批量下载器:3分钟快速上手完整指南

如何高效使用抖音批量下载器&#xff1a;3分钟快速上手完整指南 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为手动保存抖音视频而烦恼吗&#xff1f;每次看到喜欢的合集都要一个个点击分享保存&…...

Delphi 终极实战:将自定义控件打包成 BPL,安装到 Delphi 工具栏(组件库实战)

前面我们手写了专属 UI 组件库&#xff08;MyUIClass.pas&#xff09;&#xff0c;但如果你想在以后的项目中一键调用这些控件&#xff0c;而不是每次都复制粘贴代码&#xff0c;那就必须将它们打包成 Delphi 组件包&#xff08;BPL 文件&#xff09;。学会这篇&#xff0c;你将…...

背包问题Ⅱ与二分问题

今天我对背包问题有了更深的理解&#xff0c;我一定要写下来&#xff0c;巩固自己的思路并且&#xff0c;遇到新的难题二分&#xff0c;不管了&#xff0c;干就完了&#xff01;&#xff01;&#xff01;完全背包以今天写的代码展开详细描述与解释,并附上题目#define N 1001 in…...

2026必看:八款热门AI编程工具横评

一、AI编程工具榜单综述当下AI技术全面渗透软件开发领域&#xff0c;各类AI编程工具大幅降低了开发门槛、提升了编码效率&#xff0c;成为开发者必备的效率神器。本次横评精选海内外8款主流产品&#xff0c;覆盖AI原生IDE、插件式编程助手等不同形态&#xff0c;全方位盘点各工…...

Virtuoso ADE仿真避坑指南:你的时钟占空比测对了吗?详解dutyCycle函数threshold参数设置

Virtuoso ADE仿真避坑指南&#xff1a;时钟占空比测量的关键参数解析 在模拟电路设计中&#xff0c;时钟信号的占空比精度往往直接影响系统性能。许多工程师虽然熟悉Virtuoso ADE的基础操作&#xff0c;却在自动测量占空比时遭遇"数据看起来合理但实际存在偏差"的困境…...

AI巨头集体“铸Token”:从ChatGPT到“数字员工工厂”,程序员的狂欢还是危机?

想象一下&#xff1a;你早上醒来&#xff0c;打开电脑&#xff0c;不是自己敲代码&#xff0c;而是对着一只“龙虾”说&#xff1a;“帮我把昨天的Bug修了&#xff0c;顺便给老板发份周报。” 这不是科幻——2026年3月&#xff0c;这事儿正在发生。 全球头部科技公司突然集体“…...