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

TCP网络传输控制协议

目录

什么是TCP

TCP的特点

TCP通信步骤

三次握手(建立连接)

数据传输

四次挥手(连接释放)

为什么要进行三次握手?两次握手行不行?一次握手行不行?

为什么是四次挥手?三次、两次挥手行不行?


什么是TCP

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它负责在网络中的两个应用程序之间提供可靠的数据传输,确保数据按顺序、无差错、不丢失地传输。

TCP的特点

  1. 面向连接:通信双方在数据交换之前需要先建立连接,连接建立后才能进行数据传输,传输结束后再释放连接。

  2. 可靠性:TCP使用确认、重传、超时和流量控制等机制来保证数据的可靠传输。确认机制确保接收方可以确认已成功接收的数据,重传机制在数据丢失时重新发送,超时机制用于处理长时间没有收到确认的情况,流量控制则用于避免发送方发送过多数据导致接收方缓冲区溢出。

  3. 字节流传输:TCP将应用程序交给它的数据视为一连串的字节流,而不是分割成独立的消息。TCP负责将这些数据分割成合适的数据包并交给IP层进行传输。

  4. 拥塞控制:TCP通过拥塞窗口控制机制来避免网络拥塞,并通过动态调整发送速率来适应网络状况,以保证网络吞吐量的最优化。

  5. 全双工通信:TCP连接支持全双工通信,即双方可以同时进行数据发送和接收。

  6. 流量控制:TCP使用滑动窗口协议来进行流量控制,确保发送方和接收方之间的数据传输速率合理,不至于造成数据丢失或拥塞。


TCP通信步骤

三次握手(建立连接)
  • 客户端服务器发送一个连接请求报文段(SYN),并指明初始化序列号。
  • 服务器收到请求后,如果同意连接,则发送一个确认报文段(ACK),同时也指明自己的初始化序列号。
  • 客户端收到确认后,再向服务器发送确认报文段(ACK),此时连接建立成功,可以开始传输数据。
  • 第一次握手(SYN)

    • 客户端发送一个特定的TCP报文段,其中包含一个SYN(同步)标志位设置为1,同时选择一个初始序列号(ISN)。
    • 这个报文段告诉服务器,客户端想要建立连接,并且客户端的初始序列号是多少。
  • 第二次握手(SYN + ACK)

    • 服务器收到客户端的SYN报文段后,如果同意建立连接,会发送一个响应。这个响应的TCP报文段中,SYN标志位设置为1(表示同步),ACK标志位也设置为1(表示确认)。同时,服务器也选择一个自己的初始序列号(ISN)。
  • 第三次握手(ACK)

    • 客户端收到服务器的响应后,会发送最后一个确认报文段。这个报文段的ACK标志位设置为1,确认服务器的初始序列号,并且可以携带数据。
    • 这个报文段告诉服务器,客户端已经收到了服务器的确认,连接建立成功。可以开始发送数据了。

数据传输

连接建立后,双方可以开始通过TCP连接传输数据。数据被分割成TCP数据段,每个数据段包含一个序列号,用于在接收端重新组装数据,序列号保证数据的顺序传输,并使用确认(ACK)来保证数据的可靠性,ACK会告诉发送端已经接收到了哪些数据。


四次挥手(连接释放)

客户端服务器任何一方都可以发起连接的释放,释放过程分为四个步骤:

  • 第一步:某一方发送一个连接释放报文段(FIN)。
  • 第二步:另一方收到后发送确认报文段(ACK)作为确认。
  • 第三步:当另一方也准备好释放连接时,发送一个连接释放报文段(FIN)。
  • 第四步:对方收到后发送确认报文段(ACK),连接关闭。
  • 第一次挥手(FIN)

    • 客户端:当客户端的应用程序决定关闭连接时,会发送一个带有FIN(Finish,结束)标志位设置为1的TCP报文段给服务器,表示客户端不再发送数据。
    • 客户端进入FIN-WAIT-1状态,等待服务器的确认或拒绝。
  • 第二次挥手(ACK)

    • 服务器:服务器收到客户端的FIN报文段后,会发送一个ACK(Acknowledgement,确认)报文段给客户端,表示已经收到了客户端的关闭请求。
    • 服务器进入CLOSE-WAIT状态,此时服务器可以继续发送数据给客户端。
  • 第三次挥手(FIN)

    • 服务器:当服务器的应用程序决定关闭连接时,会发送一个带有FIN标志位设置为1的TCP报文段给客户端,表示服务器也准备好关闭连接。
    • 服务器进入LAST-ACK状态,等待客户端的最后确认。
  • 第四次挥手(ACK)

    • 客户端:客户端收到服务器的FIN报文段后,会发送一个ACK报文段给服务器作为确认。这个ACK报文段表示客户端确认了服务器的关闭请求。
    • 客户端进入TIME-WAIT状态,等待可能出现的延迟报文段,确保对最后一个ACK的确认。

在客户端发送最后一个ACK之后,连接进入完全关闭状态。服务器在接收到这个确认后也会关闭连接。TIME-WAIT状态的持续时间通常是两个最大段生存期(Maximum Segment Lifetime,MSL),这个时间段过后,客户端可以关闭连接并释放资源。

四次挥手确保了双方的数据都能完整地传输和接收,同时避免了连接中可能出现的延迟数据影响后续连接的正常建立。


为什么要进行三次握手?两次握手行不行?一次握手行不行?

TCP采用三次握手的设计是为了确保双方都能正确同步序列号(Sequence Number),以及确认彼此已经准备好发送和接收数据。两次握手不足以满足TCP连接建立的安全性和可靠性要求,主要原因如下:

  1. 序列号同步:在TCP的通信过程中,每个数据包都包含一个序列号,用于标识数据包在传输过程中的顺序。通过三次握手,客户端和服务器能够确保彼此已经同步了初始的序列号,从而可以正常地进行数据传输。如果只有两次握手,可能无法准确确认双方的序列号是否同步,容易导致混乱或错误的数据传输。

  2. 防止旧连接的影响:三次握手可以有效地防止旧连接请求对网络造成不必要的负担。第三次握手中,服务器对客户端的确认可以避免在网络中出现旧的连接请求被错误接收的情况,确保连接的唯一性和正确性。

  3. 安全性:三次握手提供了一种简单而有效的机制,可以防止恶意的连接请求攻击(如SYN洪泛攻击)。通过客户端和服务器交换多次握手的信息,网络可以更可靠地识别和验证连接请求的合法性。

因此,尽管两次握手理论上可以建立起连接,但为了确保可靠性、安全性,TCP设计采用了三次握手的方式,这已经被广泛认可并且被实践证明是有效的连接建立方式。

两次握手在某些特定的情况下工作,但是它没有三次握手有的可靠性和安全性:

  • 序列号同步问题:两次握手只有客户端发起连接请求并且服务器确认后建立连接。在这种情况下,客户端发送的序列号是固定的,而服务器的序列号还未被确认。这可能导致不同步的序列号,从而引发数据传输问题或安全性问题。

  • 连接确认的不完全性:两次握手无法完全确认服务器是否真的愿意接受连接。如果客户端发送了连接请求,但是服务器没有及时响应或者响应丢失,客户端无法确认服务器是否真的愿意建立连接。

一次握手在TCP中是不可能的,因为建立连接需要双方进行通信,至少需要一个往返的传输来确认连接的建立。一次握手无法实现双方的确认和同步,也无法满足TCP连接建立的基本要求。


为什么是四次挥手?三次、两次挥手行不行?

TCP采用四次挥手的设计是为了确保在关闭连接时能够达到以下几个关键的目标和需求:

  • 完整的数据传输:在关闭连接前,双方可能还有未传输完成的数据。四次挥手允许双方在最后关闭之前完成数据的传输和确认,确保数据不丢失和传输完整性。

  • 双向连接的确认:TCP是全双工通信,因此在关闭连接时需要双方都能发送和接收数据。四次挥手允许客户端和服务器分别关闭它们的连接,避免了未完成的数据传输造成的不确定性。

  • 释放网络资源:四次挥手允许双方在关闭连接后释放已分配的网络资源,如缓冲区和连接状态信息,避免资源的浪费和长时间的占用。

三次挥手的实现在理论上也是可能的,但可能会遇到以下问题:

  • 数据传输的完整性问题:如果仅采用三次挥手,可能导致最后一些数据段在传输过程中丢失,因为接收方在发送最后的确认之前可能已经关闭了它的连接。

  • 确认的不完整性:三次挥手可能无法完全确认双方都已经关闭了它们的连接。接收方可能会误解连接关闭的时机,导致连接状态不一致或资源未及时释放。

两次挥手是不可能的,因为TCP是全双工通信,必须在双方都确认关闭连接之前进行数据传输的完整性和正确性。一次挥手更是不可能的,因为无法在双方之间建立和确认连接关闭的过程。

相关文章:

TCP网络传输控制协议

目录 什么是TCP TCP的特点 TCP通信步骤 三次握手(建立连接) 数据传输 四次挥手(连接释放) 为什么要进行三次握手?两次握手行不行?一次握手行不行? 为什么是四次挥手?三次、两…...

PCDN技术如何应对网络带宽限制?(壹)

PCDN技术应对网络带宽限制的操作主要包括以下几个方面: 利用边缘计算资源:PCDN是以P2PCDN技术为基础,通过挖掘利用边缘网络海量碎片化闲置资源来构建内容分发网络。这意味着,当网络带宽受限时,PCDN能够更有效地利用这…...

Java数据结构-链表与LinkedList

链表 链表的概念 链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 通俗来说,相比较于顺序表(物理上连续,逻辑上也连续),链表物理上不一定连续。 链表是…...

单元测试实施最佳方案(背景、实施、覆盖率统计)

1. 什么是单元测试? 对于很多开发人员来说,单元测试一定不陌生 单元测试是白盒测试的一种形式,它的目标是测试软件的最小单元——函数、方法或类。单元测试的主要目的是验证代码的正确性,以确保每个单元按照预期执行。单元测试通…...

mysql笔记(表导出文件,文件导入表)

遇见权限问题1: cat /etc/my.cnf加入[mysqld] secure_file_priv ""遇见目录错误2:因为 MySQL 服务器没有权限在根目录下创建文件。你可以尝试将文件导出到一个 MySQL 服务器有权限写入的目录下,例如 MySQL 数据目录或 /tmp目录。sudo chmod 755 /path/to…...

Navicat 17 新特性 | 原生支持 Linux ARM 平台以及银河麒麟和统信操作系统

随着 Navicat 17 的发布,引起了业界的广泛共鸣与热烈讨论。此前,我们深入探讨了Navicat 17的多项新特性,涵盖《模型设计:引领创新,优化升级》,《高效的查询与配置》以及《用户界面交互:流畅体验…...

【pytorch】手写数字识别

https://blog.csdn.net/qq_45588019/article/details/120935828 基本均参考该博客 《深度学习原理Pytorch实战》 初步处理 导包 import torch import numpy as np from matplotlib import pyplot as plt from torch.utils.data import DataLoader from torchvision import tr…...

SpringBoot3.3.0升级方案

本文介绍了由SpringBoot2升级到SpringBoot3.3.0升级方案,新版本的升级可以解决旧版本存在的部分漏洞问题。 一、jdk17下载安装 1、下载 官网下载地址 Java Archive Downloads - Java SE 17 Jdk17下载后,可不设置系统变量java_home,仅在id…...

用 Kotlin 编写四则运算计算器:从零开始的简单教程

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...

java算法day13

java算法day13 104 二叉树的最大深度111 二叉树的最小深度226 翻转二叉树101 对称二叉树100 相同的树 104 二叉树的最大深度 我最开始想到的是用层序遍历。处理每一层然后计数。思路非常的清楚。 迭代法: /*** Definition for a binary tree node.* public class…...

方便快捷传文件—搭建rsync文件传输服务器

比如我们有一个服务器,想把各个机器的文件都通过脚本传给这台机,用sftp或者直接rsync就必须输密码,肯定不行,做等效性免密又麻烦,怎么办呢,这么办! 在服务端 yum -y install rsync #编辑&…...

python调用qt编写的dll

报错:FileNotFoundError: Could not find module F:\pythonProject\MINGW\sgp4Lib.dll (or one of its dependencies). Try using the full path with constructor syntax. 只有两种情况: 1.路径不对 2.库的依赖不全 1、如果是使用了qt库的&#xff0…...

SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测

SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测 目录 SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现NGO-CNN-LSTM-Mutilhead-Attention北方苍鹰算…...

【Redis】初识 Redis

文章目录 1 什么是 Redis2 Redis 的特点2.1 速度快2.2 可编程性2.3 可拓展性2.4 持久化2.5 主从复制2.5 高可用和分布式2.6 客户端语言多 3 Redis 使用场景3.1 实时数据存储3.2 缓存和 Session 存储3.3 消息队列 4 Redis 重大版本5 CentOS7 安装 Redis5 1 什么是 Redis Redis …...

【PTA天梯赛】L1-003 个位数统计(15分)

作者:指针不指南吗 专栏:算法刷题 🐾或许会很慢,但是不可以停下来🐾 文章目录 题目题解总结 题目 题目链接 题解 使用string把长度达1000位的数字存起来开一个代表个位数的数组 a[11]倒序计算最后一位,…...

c语言位操作符相关题目之交换两个数的值

文章目录 一、题目二、方法11,思路2,代码实现 三、方法21,思路2,代码实现 四、方法31,思路2,代码实现 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 实现两个变量的…...

智能家居装修怎么布线?智能家居网络与开关插座布置

打造全屋智能家居。计划的智能家居方案以米家系列为主,智能家居联网方案以无线为主。装修前为了装备智能家居做了很多准备工作,本文深圳侨杰智能分享一个智能家居装修和布线方面的心得与实战知识。希望能对大家的装修有所帮助。 ​1.关于网络 如果房子比…...

GD32MCU最小系统构成条件

大家是否有这个疑惑:大学课程学习51的时候,老师告诉我们51的最小系统构成?那么进入32位单片机时代,gd32最小系统构成又是怎么样的呢? 1.供电电路 需要确保供电的电压电流稳定,以东方红开发版为例&#xff…...

C语言——循环结构:while、do...while、for

while循环 基本结构 C语言中的while循环是一种基本的循环控制结构,它允许程序重复执行一段代码块,直到指定的条件不再满足为止。while循环的语法结构如下: while (condition) { // 循环体 // 在这里编写要重复执行的代码 } condition …...

C#实现最短路径算法

创建点集 double r 200 * 500;double width 1920;double height 1080;int col (int)(r / width);int row (int)(r / height);List<(double, double)> list1 new List<(double, double)>();for (int i 0; i < row; i){var y i * height;if (y < r){va…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...