网络编程4——TCP协议的三大安全机制:三次握手四次挥手+确认应答机制+超时重传机制

news2024/11/15 8:16:51

文章目录

  • 前言
  • 一、TCP协议段与机制
    • TCP协议的特点
    • TCP报头结构
    • TCP协议的机制与特性
  • 二、TCP协议的 连接管理机制
    • TCP建立连接:三次握手
    • TCP断开连接:四次挥手
  • 三、TCP协议的 确认应答机制
  • 四、TCP协议的 超时重传机制
  • 总结


前言

本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下!

本篇文章主要介绍了传输层的TCP协议中的三大安全机制,今天分享的全都是理论,因此大家一定要认真。


一、TCP协议段与机制

TCP协议的特点

特点说明
有连接刻意保存对端的相关信息
可靠传输尽全力将数据传输过去不是百分百成功,自己会知道数据传输是否成功
面向字节流以一个字节为基本单位(一个数据可以分成几份 多次发多次收)
有接收缓冲区,也有发送缓冲区后续文章介绍
大小不受限对于要传输的数据大小没有要求
全双工一条通信路径,双向通信。(可以同时发送和接收数据)

TCP报头结构

在这里插入图片描述

6位标志位
在这里插入图片描述


TCP协议的机制与特性

TCP的协议段格式,比UDP的协议段格式复杂一万倍!😵😵
所以他的机制与功能也比UDP更加强大!!😇😇

TCP对数据传输提供的管控机制,主要体现在两个方面: 安全和效率
这些机制和多线程的设计原则类似: 保证数据传输安全的前提下,尽可能的提高传输效率

TCP协议的机制与特性
1️⃣连接管理
2️⃣确认应答
3️⃣超时重传
4️⃣流量控制
5️⃣拥塞控制
6️⃣滑动窗口
7️⃣延时应答
8️⃣捎带应答
9️⃣面向字节流
🔟异常处理

  • 1️⃣-5️⃣是TCP协议保证数据传输安全的 安全机制
  • 6️⃣-8️⃣是TCP协议提高传输效率的 效率机制
  • 9️⃣-🔟是TCP协议的 其他特性

二、TCP协议的 连接管理机制

连接管理包括
TCP建立连接:三次握手
TCP断开连接:四次挥手

知识点须知

  • SYN:同步报文段 ,指一方要向另一方,申请建立连接。
    位于6位标志位中的第5位,默认是0,当第5位比特位为1是则认为这是一个SYN报文。
  • ACK:应答报文 , 指对收到对方数据包的确认。
    位于6位标志位中的第2位,默认是0,当第2位比特位为1是则认为这是一个ACK报文。
  • FIN:结束报文 , 指一方要向另一方提出释放连接。
    位于6位标志位中的第6位,默认是0,当第6位比特位为1是则认为这是一个FIN报文。

6位标志位在这里插入图片描述


切记!!!!!

  • TCP是如何实现可靠性的?
    答:依靠 确认应答机制 与 超时重传机制 实现可靠性的。
    可千万不是靠三次握手与四次挥手啊!!!

TCP建立连接:三次握手

握手指的是通信双方,进行一次网络交互。

  • 三次握手相当于 客户端 和 服务器 之间,通过三次交互,建立了连接

建立连接一定是客户端主动发起的

在这里插入图片描述


上述过程:
1️⃣客户端向服务器发送一个SYN( 确认服务器是否可以收到数据 )

2️⃣服务器收到SYN返回给客户端一个ACK( 1.告诉客户端,服务器可以收到数据 2.服务器知道客户端可以发送数据 )

3️⃣服务器向客户端发送一个SYN( 确认客户端是否可以收到数据 )

4️⃣客户端收到SYN返回给服务器一个ACK( 1.告诉服务器,客户端可以收到数据 2.客户端知道服务器可以发送数据 )

  • 这四次交互是为了检验服务器与客户端的收发数据的功能是否正常。

  • 明明完成了四次交互,为什么叫做三次握手呢??

原因是服务器返回给客户端的ACK与发送给客户端的SYN合并成一个报文了。
因此这个报文的标志位的第2位与第5位都是1,就代表这个报文即使ACK报文又是SYN报文。

这两个报文是一定会合并的,因为这个ACK报文与SYN报文是同一个时机触发的(都是由内核来完成的),所以才称之为三次握手,而不是四次握手


TCP断开连接:四次挥手

挥手指的是一方提出的释放连接请求。

断开连接客户端与服务器都有可能主动发起的,下面假设客户端主动申请断开连接
在这里插入图片描述
上述过程与三次握手的过程非常相似,只不过SYN报文换成了FIN报文。

上述过程:
1️⃣客户端向服务器发送一个FIN( 告知服务器,客户端要断开连接 )

2️⃣服务器收到FIN返回给客户端一个ACK( 服务器知道了 )

3️⃣服务器向客户端发送一个FIN( 告知客户端,服务器要断开连接 )

4️⃣客户端收到SYN返回给服务器一个ACK( 客户端知道了 )

不用担心第四次的ACK返回不了,内核会一直维护TCP直到四次挥手结束的。

别想了,就是四次挥手,中间的ACK与FIN不是一定合并的。
原因: ACK与FIN是不同时机触发的
ACK是由内核完成的,会在收到FIN的时候第一时间返回ACK
FIN是调用close方法或进程结束时才会触发的

因此这就和你写的代码有很大的关系了,有两种情况。

1.服务器发现客户端断开连接后,立刻调用close方法,服务器的ACK还没发,那么此时就FIN与ACK就会合并起来一起发出去。
2.服务器发现客户端断开连接后,并没有立刻调用close方法,而是执行了其他操作,服务器的ACK已经发出去了,此时FIN就只能单独发了。

这两个报文是不一定会合并的,所以才称之为四次挥手。


三、TCP协议的 确认应答机制

TCP协议是可靠传输,而保证可靠传输的最核心的机制就是确认应答机制。

确认应答机制的大概内容就是, 每次收到数据 ,都会 给对端发送一个应答报文(ACK) ,应答报文与TCP报文的格式一样

在这里插入图片描述
发送端可以根据有没有收到对端应答报文,来确定这条信息是不是安全可靠的传输给了对端。

但是此时也会遇到一个问题!
在这里插入图片描述

这是正常的回答。但是在网上经常会出现后发先至的情况。就变成了下面这样。

在这里插入图片描述

明明是明晚要回家的意思,因为后发先至,滚啊先到了,变成了回复第一句话的应答,好啊好变成了回复第二句话的应答。那么这个意思可就完全变了。😇😇😇

可以为每句话与回答添加序号
在这里插入图片描述
这样就不会弄巧成拙了。

所以真实的TCP数据传输也引入了序号和确认序号。协议段中的32位序号与32位确认序号

因为TCP传输数据的基本单位是字节,
所以就给发送的每个字节都编了序号。
在这里插入图片描述


在这里插入图片描述

应答报文中确认序号的意义就是告诉发送方,确认序号之前的字节我都收到了,并且确认序号就是你下一个要发送数据的编号。
对应上图中的两个应答报文即,
1001号前面的字节都收到了,你该发1001字节了。
13139号前面的字节都收到了,你该发13139字节了。


确认序号 须知

  • 发送方的确认序号是无意义的数据
  • 确认序号的规则,取自己接收到数据的最后一个字节的 下一个字节的序号 (假设对面发了1000个字节过来,但是我收到的最后一个字节编号是10,那么我给发送方的应答报文ACK中确认序号就是11)。
  • 确认序号的作用:接收方通过ACK的确认序号,告诉发送方哪些数据已经收到了,便于发送方判断数据是否安全完整的送达。

四、TCP协议的 超时重传机制

如果一切都顺利,那么自然一切都好。

但是网络环境是十分复杂的,两台设备进行网络交互,中间要经过许许多多的节点,如果中间任何一个节点,出现了问题都会导致丢包。
因此网络传输中都会有概率出现丢包。

丢包:设备间进行传输的数据包,丢失了一部分或全部丢失都叫做丢包。

以下两种丢包情况会触发超时重传机制:
1️⃣

客户端发送的数据丢失,
服务器没有收到数据,不会返回ACK

在这里插入图片描述
2️⃣

服务器收到数据,但是返回的ACK丢包了。

在这里插入图片描述


这两种情况下,客户端向服务器发送数据,客户端会等待一段时间(TCP为了保证无论在任何环境下都能比较高性能的通信,因此会动态计算这个最大超时时间) 如果一段时间后没有收到应答报文ACK ,发送方就视为数据丢包,就会 触发超时重传机制:重新再发送一遍数据

如果是应答报文ACK丢包,也就是说接收方会重复收到两遍数据,不用担心,TCP已经帮我们处理好了。
TCP会在接收缓冲区中根据数据的序号自动去重,保证应用程序读不到重复数据。

当然了,重新传送的数据也有可能会再次丢包。一旦出现连续丢包,那么网络就出现了非常严重的问题。

TCP针对多次丢包的思路是:多次进行超时重传。
但是没进行一次超时重传,超时等待的时间都会变长(降低重传频率)。
连续多次重传仍无法收到ACK的话,TCP就会尝试重置连接(相当于重新连接),如果重置连接也失败,TCP就会断开连接,放弃通信。

总结

以上就是今天要讲的内容,本文分享了TCP协议中的三个安全机制,今天分享的内容大多是理论,希望大家可以细细品读,如果有哪里不理解,可以私信或评论区沟通。

路漫漫不止修身,也养性。

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

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

相关文章

unordered_map 浅析

【unordered_map 浅析】 ◆● unordered_maphttps://cplusplus.com/reference/unordered_map/ (1)unordered_map 适用于需要快速查找,且不要求元素存储顺序的场景,尤其适合使用自定义类型作为键的情况。但是需要注意的是&#xff…

RabbitMQ的集群

新建一个虚拟机,重新安装一个RabbitMQ,不会安装的可以看下面的连接: 在Linux中安装RabbitMQ_流殇꧂的博客-CSDN博客 1.修改/etc/hosts映射文件,两台虚拟机都需要修改 vim /etc/hosts 2.修改完成后重启linux服务器: reboot 3.查看.erlang.cookie文件的位置: find / -name .erlan…

环形链表 II

题目链接 环形链表 II 题目描述 注意点 如果 pos 是 -1,则在该链表中没有环 解答思路 首先判断链表中是否有环,思路为双指针当快慢指针相遇时,说明链表中有环,假设链表中非环的节点数量为a,链表中环的节点数量为b…

分享一个由rust实现的openai api服务端+Android客户端

开发缘由 官方网页存在经常中途断开的问题.经常使用不同ip登录openai帐号可能会导致封号.使用开源项目chatgpt-web搭建过一个网页端,目前已被DNS污染,体验GitHub Copilot.已经使用了rust语言一段时间,打算用它写个服务端练手. 服务端 技术栈 rust Rust是一种系统级编程语言…

Elasticsearch【域的属性、分词器、Elasticsearch搜索文档】(三)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch常用操作_域的属性 分词器_默认分词器 分词器_IK分词器 分词器_拼音分词器 分词器_自定义分词器 Elasticsearch搜索文档_准备工作 Elasticsearch搜索文档_搜索方式 Elasticsearch常用操作_域的属性 index 该域是否创建索引。只有值设置为true&#…

【双指针】844. 比较含退格的字符串

844. 比较含退格的字符串 解题思路 思路:函数deLETE的作用是处理带有退格符号的字符串。它使用双指针法来模拟字符串处理。初始时,慢指针slow和快指针fast都指向字符串的开头。然后,通过遍历字符串,如果当前字符不是退格符号&…

postman报错提示 Could not get any response怎么解决

目录 postman报错 解决方法: 在通过postman请求做接口测试的过程中,有时候会遇到一些报错,当遇到这些报错我们不要着急,看着具体哪里报错,然后进行解决 postman报错 经常使用postman的小伙伴们都应该遇到过一些报错…

工作:三菱PLC之CC-LINK通讯知识及应用

工作:三菱PLC之CC-LINK通讯及应用 一. cc-link接线图(RS485两线式接线) CC-Link Ver.1.00兼容电缆(特性阻抗:100Ω,终端电阻100Ω) CC-Link Ver.1.10兼容电缆(特性阻抗:…

Gradio库:使用Markdown模块创建交互式应用

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

如何使用多线程

一个进程正在运行时,至少会有一个线程在运行。 package ChapterOne;public class Test {public static void main(String[] args) {System.out.println(Thread.currentThread().getName());//currentThread方法返回正在被执行的线程的信息//getName返回正在被执行线…

【Docker】Docker实战

文章目录 搭建nginx服务搭建私有库Busybox阿里云上创建私有库 搭建nginx服务 首先拉取nginx的镜像。 docker pull nginx:1.24.0以后台的方式运行nginx,并且创建一个shell进行交互。 docker run --name nginx1 --rm -it -p 8080:80 nginx:1.24.0 bash#在交互的bas…

Kubernetes_核心组件_KubeProxy_Service找到Pod与DNS解析Service/Pod

文章目录 前言一、Service找到Pod(Iptables)二、Service找到Pod(IPVS)2.1 IPVS模式原理2.2 IPVS模式实践修改为 IPVS 模式 之前修改为 IPVS 模式之中修改为 IPVS 模式之后 三、Service和Pod的DNS域名3.1 Service DNS域名3.2 Service与Deployment/StatefulSet配合Deployment普通…

无源光网络(PON)介绍及其应用

文章目录 1、无源光网络(PON)介绍ONU(Optical Network Unit),光网络单元OLT(Optical line terminal),光线路终端 2、FTTH、FTTB、FTTR组网介绍FTTR组网规划 3、局端接入设备产品介绍…

Elasticsearch 基本使用(五)查询条件匹配方式(query query_string)

查询条件匹配方式 概述querytermtermsrangematch_allmatchmatch 匹配精度问题 match_phrasematch_pharse_prefixmatch_bool_prefixmulti_match query_string简单查询一个字段在多个字段上应用同一个条件 (类似multi_match)在所有字段上应用同一个条件 &a…

mysql 大数据量从“.log“文件插入方法

要被插入的数据文件以及内容 表结构 插入成功,插入时如果有主键唯一索引,则按照唯一索引的大小顺序插入,速度会快很多

基于Spring Boot的智能学生考勤系统设计与实现(Java+spring boot+MySQL+微信小程序+

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的智能学生考勤系统设计与实现(Javaspring bootMySQL微信小程序人脸识别) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 后端:Java…

SpringBoot 如何使用 TestEntityManager 进行 JPA 集成测试, 如何使用

Spring Boot 是一个非常流行的 Java Web 开发框架,它简化了开发过程,提高了开发效率。在开发过程中,我们通常需要使用 JPA 操作数据库,为了保证代码的质量和正确性,我们需要进行集成测试。TestEntityManager 是 Spring…

bat批处理脚本控制台输出中文乱码问题

背景 最近在搞springcloud框架,涉及各种微服务。比如服务注册与发现、网关、鉴权、文件服务、日志服务、搜索服务、用户中心等等。如果要打包发布应用,就得一个个去打包,一个个去拷贝jar包,很繁琐。所以就想着写个bat脚本&#x…

【Zookeeper】使用Curator操作Zookeeper

简介 Curator 是 Apache ZooKeeper 的Java客户端库。 Zookeeper现有常见的Java API如&#xff1a;原生JavaAPI、Curator、ZkClient等。 添加依赖 <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId&…

gitlab:(二)gitlab添加win10 台式机的ssh key

当前gitlab版本为12系列&#xff1a; 点击settings 找到ssh keys &#xff0c;再找到“ generate one or use an existing key.” 点击 generate one 参考如下的教程&#xff1a; window cmd 命令行示例 添加 ssh keys 添加的效果