当前位置: 首页 > 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…...

Python函数 之 匿名函数

1.概念 匿名函数: 使用 lambda 关键字 定义的表达式&#xff0c;称为匿名函数. 2.语法 lambda 参数, 参数: 一行代码 # 只能实现简单的功能&#xff0c;只能写一行代码 # 匿名函数 一般不直接调用&#xff0c;作为函数的参数使用的 3.代码 4.练习 # 1, 定义匿名函数, 参数…...

深入解析 Mybatis 中 Mapper 接口的实现原理

《深入解析 Mybatis 中 Mapper 接口的实现原理》 在使用 Mybatis 进行数据库操作时&#xff0c;Mapper 接口扮演着重要的角色。它提供了一种简洁、类型安全的方式来与数据库进行交互。那么&#xff0c;Mybatis 是如何实现 Mapper 接口的呢&#xff1f; 一、Mybatis 简介 Myb…...

微信小程序获取用户头像

微信为了安全更改了许多API接口&#xff0c;属实烦人。这次带来的是微信小程序基础库3.5.0还能使用的获取用户头像方法 按键式 <view><view><button open-type"chooseAvatar" bindchooseavatar"onGetUserImage">获取用户头像</butto…...

uniapp小程序连接蓝牙设备

uniapp小程序连接蓝牙设备 一、初始化蓝牙模块二、开始搜索三、连接蓝牙四、监听特征值变化五、调用示例utils.js文件 一、初始化蓝牙模块 这一步是必须的&#xff0c;在开发项目过程中&#xff0c;初始化蓝牙模块之后&#xff0c;紧接着就要开启一些监听的api&#xff0c;供后…...

AI大模型推理过程与优化技术深度剖析

在人工智能的浩瀚星空中&#xff0c;AI大模型以其卓越的性能和广泛的应用前景&#xff0c;成为了推动技术进步的璀璨明星。本文旨在深入探讨AI大模型的推理过程及其背后的优化技术&#xff0c;为理解这一复杂而精妙的技术体系提供一个清晰的视角。 一、AI大模型的推理过程揭秘 …...

Dubbo 核心概念介绍

Dubbo 是一款阿里巴巴开源的高性能 RPC&#xff08;远程过程调用&#xff09;框架&#xff0c;广泛应用于微服务架构中。它主要解决服务治理、负载均衡、故障转移等分布式系统问题。本文将介绍 Dubbo 的核心概念&#xff0c;包括服务提供者&#xff08;Provider&#xff09;、服…...

练习 6.7:⼈们 在为练习 6.1 编写的程序中,再创建两个表⽰⼈的字典,然后将这三个字典都存储在⼀个名为 people 的列表中。

练习 6.7&#xff1a;⼈们 在为练习 6.1 编写的程序中&#xff0c;再创建两个表⽰⼈的字典&#xff0c;然后将这三个字典都存储在⼀个名为 people 的列表中。 要求 遍历这个列表&#xff0c;将其中每个⼈的所有信息都打印出来。 代码 human {shuicc: {first_name: shui,la…...

星环科技知识平台TKH:引领企业构建高效AI基础设施,加速数智化转型新纪元

5月30-31日&#xff0c;2024向星力未来数据技术峰会期间&#xff0c;星环科技正式发布其最新人工智能基础设施产品——Transwarp Knowledge Hub星环知识平台&#xff08;以下简称TKH&#xff09;。该平台旨在为企业打通从人工智能基础设施建设到大数据、人工智能等研发应用的完…...

嵌入式板级支持包(BSP)80道面试题及参考答案(3万字长文)

目录 解释什么是通用输入输出(GPIO)接口及其在BSP中的作用。 描述SPI接口的主要特点和用途。 说明IC总线协议的工作原理。 如何在BSP中配置一个UART接口? USB设备控制器在BSP中的初始化步骤是什么? 以太网接口如何在BSP中被支持? 什么是SDIO,它在哪些场景下会被使…...

如何找回误删的文件?4个常用文件恢复方法!

对于许多用户来说&#xff0c;误删文件是一种常见而令人懊恼的情况。恢复误删文件的重要性在于&#xff0c;它可以帮助用户找回宝贵的数据&#xff0c;避免因数据丢失带来的各种不便和损失。 如何找回不小心删除的文件&#xff1f; 误删数据不知道怎么恢复&#xff0c;会给我…...

洛米wordpress主题/网站开发软件有哪些

HDFS sink里有个属性hdfs.rollInterval86400&#xff0c;这个属性你设置了24小时滚动一次&#xff0c;它的确就到了24小时才滚动&#xff0c;但是我们的需求往往是到了0点就滚动文件了&#xff0c;因为离线的job因为都会放在夜里执行。 如果flume是早上9点启动的&#xff0c;那…...

广州市委/整站优化 mail

题目&#xff1a;原题链接&#xff08;困难&#xff09; 标签&#xff1a;树、二叉树、二叉搜索树 解法时间复杂度空间复杂度执行用时Ans 1 (Python)O(N)O(N)O(N)O(N)O(N)O(N)476ms (42.39%)Ans 2 (Python)Ans 3 (Python) 解法一&#xff1a; class Solution:def __init__(s…...

如何做网站跳转页面/疫情最新消息今天

最简单、快速的方法&#xff1a; 将需要进行排序的字段编码设置为GBK&#xff0c;然后在查询时直接使用asc/desc就可以啦 转载于:https://www.cnblogs.com/yulongcode/p/11338813.html...

icp网站 是什么意思/网站排名前十

Beego是一个完全的MVC框架&#xff0c;你可以使用你的Go语言专业技术构建你的web应用程序。Beego框架下&#xff0c;你可以自动化地实现测试、打包和部署。Revel能让Go语言的web开发如虎添翼&#xff0c;大大提高你的开发效率。 Martini是一个受到Sinatra (一个Ruby 框架)启发而…...

汕头制作企业网站/seo技术有哪些

点击关注公众号&#xff0c;Java干货及时送达作者&#xff1a;雷小帅&#xff1b;公众号&#xff1a;爱笑的架构师很多朋友都在考虑回二线城市发展&#xff0c;但是又担心二线城市公司坑多&#xff0c;最近我花了一些时间&#xff0c;梳理了武汉几乎所有的互联网公司&#xff0…...

淄博做网站seo/搜狗收录提交入口

上一篇&#xff1a;基于MATLAB2018a的自动驾驶微观交通GUI仿真平台开发&#xff0c;及相关自动驾驶交通流的个人看法&#xff08;上&#xff09; - 一二三四的文章 - 知乎 一二三四&#xff1a;基于MATLAB2018a的自动驾驶微观交通GUI仿真平台开发&#xff0c;及相关自动驾驶交通…...