TCP协议数据传输过程及报文分析

news2024/11/20 3:31:13

目录

TCP数据的传输过程

建立连接(三次握手)

第一次握手

第二次握手

第三次握手

总结

数据传输

断开连接(四次挥手)

第一次挥手

第二次挥手

第三次挥手

第四次挥手

总结

最后 


TCP数据的传输过程

        TCP(Transmission Control Protocol,传输控制协议)是专门为了在不可靠的互联网络中提供一个可靠的端到端的通信而设计的,是TCP/IP协议体系中运输层的重要协议。TCP为应用层提供面向连接的、可的数据传输服务。发送方应用进程将数据交给TCP,TCP保证将这些数据有序地、无差错地、完整地送达目的应用进程。TCP为应用进程构建了一个可靠的比特流管道,发送方应用进程的报文从一端流人,无差错地、完整地从另一端流出,交给接收方应用进程。

        使用TCP进行数据传输包括三个阶段,依次分别是:建立连接(三次握手)、数据传输、断开连接(四次挥手)。

  • 建立连接:目的是使通信双方在开始传输数据前建立联系,使双方都确定对方愿意与之通信;同时在建立连接的过程中还要相互传递和协商一些必要的参数(如发送字节的起始编号、窗口大小等),为后面的数据传输打下基础。
  • 数据传输:连接建立后,开始传输数据,TCP连接的数据传输是双向的,在数据传输阶段TCP要纠正数据传输中的丢失、错误、乱序等问题,并要进行流量控制和拥塞控制。
  • 关闭连接:在两个通信的应用进程之间的数据传输完毕后,就要关闭它们之间的连接,释放资源。

        整个TCP数据传输如下图所示:

建立连接(三次握手)

        为了保证客户端和服务器端的可靠连接,TCP建立连接时必须要进行三次会话(发送三个数据包),也叫TCP三次握手,进行三次握手的目的是为了确认双方的接收能力和发送能力是否正常。如下图:

第一次握手

        最开始的时候客户端和服务器都是处于CLOSED关闭状态。主动打开连接的为客户端,被动打开连接的是服务器。(所以源端口是我们的客户端:56069,目的端口是服务端:8080)

        TCP客户端进程也是先创建传输控制块TCB,然后向服务器发出连接请求报文,这是报文首部中的标志位SYN置1,同时选择一个初始序列号 seq=x(这里seq为0) ,此时,TCP客户端进程进入了 SYN-SENT 同步已发送状态,并正在等待接受方的确认(ACK)以及相应的SYN-ACK回应。

第二次握手

        TCP服务器收到请求报文后,如果同意连接,则会向客户端发出确认报文。确认报文中标志位ACK置1,SYN置1,确认号是ack number=x+1(这里ack number为1),同时也要为自己初始化一个序列号 seq=y(这里为0),此时,TCP服务器进程收到客户端的SYN(同步)请求后,会回复一个SYN-ACK(同步-应答)报文,并进入SYN-RCVD状态。这个状态表示接受方已经收到了发起方的SYN请求,并且正在等待发起方确认(ACK)以完成连接的建立。

第三次握手

        TCP客户端收到确认后,还要向服务器给出确认。确认报文的ACK置1,ack number=y+1(这里ack number为1),自己的序列号seq=x+1(这里seq为1),此时,TCP连接建立,客户端进入ESTABLISHED已建立连接状态,触发三次握手。

        当TCP连接的发起方收到接受方的SYN-ACK(同步-应答)报文,并发送了确认(ACK)报文后,连接状态就会从SYN-SENT转变为ESTABLISHED。同样地,当接受方收到发起方的ACK报文后,其连接状态也会从SYN-RCVD转变为ESTABLISHED。所以在第三次握手报文成功发出并收到后,客户端和服务端就成功建立了连接。

总结

  • 第一次握手:客户端向服务器发送一个SYN包,并进入SYN_SEND状态,等待服务器确认。这个SYN包中包含了客户端的初始序列号,用于后续的数据传输。
  • 第二次握手:服务器收到客户端的SYN包后,会发送一个SYN+ACK包给客户端,确认客户端的SYN包(通过ACK=客户端初始序列号+1实现),同时服务器也进入SYN_RECV状态,并发送自己的SYN包,其中包含了服务器的初始序列号。
  • 第三次握手:客户端收到服务器的SYN+ACK包后,会向服务器发送一个ACK包,用来确认收到服务器的SYN包(通过ACK=服务器初始序列号+1实现)。当这个ACK包发送完毕,客户端和服务器都进入ESTABLISHED状态,表示TCP连接已经成功建立。

        所以,在整个握手过程中,双方通过交换SYN和ACK包,确认了彼此的初始序列号,以及双方都能够正常接收和发送数据。这就为后续的数据传输建立了一个可靠的通道。需要注意的是,握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。

数据传输

  • 在连接建立之后,客户端和服务器开始进行数据传输。
  • 数据在应用层被拆分成数据段,然后在传输层被进一步拆分成TCP报文段(也称为数据包)。每个TCP报文段都包含源端口号、目标端口号、序列号、确认号、标志位等信息。
  • 客户端发送TCP报文段给服务器,并等待服务器的确认。服务器接收到报文段后,会进行校验和验证,确保数据的完整性,然后发送确认报文段给客户端。
  • 如果客户端在规定时间内未收到确认报文段,会进行重传操作,直到数据被成功接收

断开连接(四次挥手)

        数据传输完毕后,双方都可释放连接。最开始的时候,客户端和服务器都是处于ESTABLISHED状态,然后客户端主动关闭,服务器被动关闭。在这个过程中,每个方向都需要进行关闭操作,因此称为“四次挥手”。通过这个过程,TCP协议能够确保双方都能够优雅地关闭连接,避免数据丢失和连接残留等问题。

第一次挥手

        第一次挥手(即第一个FIN报文的发送)通常是由想要关闭连接的一方发起的,这可以是客户端,也可以是服务端。

        客户端发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。(注意:上面的报文,首先发出断开连接的是服务端,并非是客户端。)

第二次挥手

        服务器端接收到连接释放报文后,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT 关闭等待状态。(注意:这里首先发出断开连接申请的是服务端,所以这里发出第二次挥手的是客户端)

第三次挥手

        客户端接收到服务器端的确认请求后,客户端就会进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文,服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。(注意:这里首先发出断开连接申请的是服务端,所以这里发出第三次挥手的是客户端)

第四次挥手

        客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态,但此时TCP连接还未终止,必须要经过2MSL后(最长报文寿命),当客户端撤销相应的TCB后,客户端才会进入CLOSED关闭状态,服务器端接收到确认报文后,会立即进入CLOSED关闭状态,到这里TCP连接就断开了,至此四次挥手完成。

总结

  1. 当一方(通常是客户端)决定结束连接时,它会发送一个FIN包给另一方(通常是服务器),表示自己没有数据需要发送了。
  2. 服务器收到FIN包后会发送一个ACK包进行确认,并进入CLOSE_WAIT状态,表示收到客户端的关闭请求。
  3. 服务器也会发送一个FIN包给客户端,表示它也没有数据需要发送了,也准备关闭连接。
  4. 客户端收到服务器的FIN包后,会发送一个ACK包进行确认,确认收到服务器的关闭请求然后进入TIME_WAIT状态,等待一段时间后最终进入CLOSED状态,表示连接已经完全关闭。

最后 

        三次握手是TCP协议建立连接时,为了保证连接的可靠性而采取的一种通信机制。这个机制涉及到客户端和服务器之间的三次交互。

        通过这三次握手,客户端和服务器之间可以确认双方的初始序列号,以及对方能够正常接收和发送数据,从而建立起一个可靠的连接。

        而四次挥手是TCP协议在关闭连接时,为了保证数据传输的完整性和连接的可靠性而采取的一种通信机制。这个机制涉及到客户端和服务器之间的四次交互。通过这四次挥手,客户端和服务器之间可以确保双方都能够正常关闭连接,并且数据传输的完整性得到了保证。

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

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

相关文章

在python中,对encodeURIComponent的使用避坑指南

随笔记录 某站点对请求参数加密的时候对键值对都进行了encodeURIComponent。那encodeURIComponent的作用是什么呢?如何在python中进行使用呢?使用过程中如何结合实际情况解决问题呢?以下是避坑指南,会让你少走很多弯路。 作用 en…

NVIDIA CUDA Toolkit

NVIDIA CUDA Toolkit CUDA Toolkit 12.4 Update 1 Downloads | NVIDIA Developer CUDA Toolkit是用于CUDA开发的软件包,主要包括CUDA编译器、运行时库、GPU驱动程序和开发工具等。它允许开发者使用通用编程语言(如C、C)来利用NVIDIA GPU进行…

mac终端出现bogon原因与解决办法

问题描述 不知道啥原因mac终端的用户名就变成了 xxxbogon ,可能是强制关闭终端导致的吧。 问题原因 终端在初始化时,需要确定主机的名字,此时终端会向 DNS 服务器反向查询本机 IP 地址,然后把得到的名字作为自己的主机名。如果…

使用 Rust 后,我​​使用 Python 的方式发生了变化

使用 Rust 后,我​​使用 Python 的方式发生了变化 Using type hints where possible, and sticking to the classic “make illegal state unrepresentable” principle. 尽可能使用类型提示,并坚持经典的“使非法状态不可表示”原则。 近年来&#xff…

LeetCode78:子集

题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集 &#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 代码 class Solution { public:vector<vector<int>> res;vector<…

xgp怎么取消续费 手把手介绍微软商店xgp关闭自动续费教程

Xbox是美国微软公司创建的电子游戏品牌&#xff0c;随2001年11月第一代Xbox游戏机发布而首次推出。其产品和服务包括家用游戏机、游戏制作与发行、线上游戏服务和内容订阅服务。Xbox已发售的家用游戏机有Xbox、Xbox360、Xbox One、Xbox One S、Xbox One X、Xbox Series X、Xbox…

亚服战网安装卡45%的解决方案

解决方案 先ping cn.patch.battlenet.com.cn这个域名&#xff0c;正常来说是一定会失败的&#xff0c;如果成功就不卡45%了然后ping tw.patch.battle.net 这个域名&#xff0c;这个域名应该是能成功的。 去该网址解析一下这个域名的ip&#xff0c;https://site.ip138.com/tw.p…

漏洞修复优先级考虑-不错的思路

权威说法&#xff1a; 漏洞利用预测评分系统 &#xff08;EPSS&#xff09; 是一项数据驱动的工作&#xff0c;用于估计软件漏洞在野外被利用的可能性&#xff08;概率&#xff09; https://www.first.org/epss/ GitHub - TURROKS/CVE_Prioritizer: Streamline vulnerability…

Kubernetes TDengine 系列|安装 TDengine 的 Grafana 插件|Grafana监控TDengine数据

为了让Grafana 能够监控到TDengine 数据&#xff0c;快速集成搭建数据监测报警系统&#xff0c;所以直接安装TDengine 插件。 目录 一、安装 TDengine 的 Grafana 插件1、下载TDengine grafana插件2、解压到指定目录3、配置未签名插件 二、配置数据源&#xff0c;简单查询TDen…

JDK的安装和配置

目录 1.Java 开发工具包在上方已关联资源下载使用2.JAVA_HOME3.CLASSPATH4.PATH5.安装jdk17情况需要将path变量中删除6.包内含有visualvm7.注意&#xff1a;如果安装JDK17在我们安装的时候可能会自动进行环境变量配置&#xff0c;我们需要在环境变量配置PATH中删除如下信息8.验…

汽车信息安全--如何理解TrustZone(1)

目录 1.车规MCU少见TrustZone 2. 什么是TrustZone 2.1 TrustZone隔离了什么&#xff1f; 2.2 处理器寄存器和异常处理 3.小结 1.车规MCU少见TrustZone 在车规MCU里&#xff0c;谈到信息安全大家想到的大多可能都是御三家的HSM方案&#xff1a;英飞凌的HSM\SHE、瑞萨的ICU…

循环神经网络介绍(RNN)

序列模型 定义&#xff1a;自然语言处理、音频、视频以及其他序列数据的模型 类型&#xff1a; 语音识别 情感分析 机器翻译 特点&#xff1a; 序列数据前后之间有很强的关联性 序列数据的输入输出长度不固定 循环神经网络 定义&#xff1a;循环&#xff08;递归&#xff…

revit\navisworks各种安装问题

You have entered a nonvalid serial number &#xff0c;怎么都不给你一个机会输出序列号&#xff0c;怎么办&#xff1f; step1: C:\Program Files (x86)\Common Files\Autodesk Shared\AdskLicensing目录下找到uninstall.exe&#xff0c;右键管理员模式运行&#xff0c;会…

7.MyBatis 操作数据库(初阶)

文章目录 1.什么是MyBatis2.为什么要学习 MyBatis&#xff1f;3.通过spring框架创建MyBatis项目3.1使用MyBatis查询数据库3.2 mysql连接不上报错解决方法 4.MyBatis的基础操作4.1企业建表规范&#xff1a;4.2MyBatis基本实现4.3单元测试4.4使用MyBatis可能遇到的问题4.5配置MyB…

初学python记录:力扣2385. 感染二叉树需要的总时间

题目&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第 0 分钟&#xff0c;感染 将会从值为 start 的节点开始爆发。 每分钟&#xff0c;如果节点满足以下全部条件&#xff0c;就会被感染&#xff1a; 节点此…

一款面向个人和企业的本地云存储解决方案——派盘

派盘是一款什么软件? 派盘是一款面向个人和企业的本地云存储解决方案,它利用了本地硬盘的存储容量,通过“云化”的方式,可以将本地硬盘变成云存储空间,拥有强大的数据保护功能,保证了数据的私密性和安全性。 派盘不仅可以帮助个人用户打造“数字第二大脑”,还可以帮助团…

03 - 伪目标

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 思考2. 伪目标的引入2.1 伪目标的语法&#xff1a;先声明&#xff0c;后使用2.2 伪目标的妙用&#xff1a;规则调用&#xff08;函数调用&#xff09;2.3 绕开 .PHONY 关键字定义伪目标 1. 思考 Makefile 中的 目标 究竟是什么&…

1.3K Star我上位机项目中用了这个开源项目

软件介绍 ClientServerProject的软件是一款基于C-S&#xff08;客户端-服务器&#xff09;架构的通用开发框架&#xff0c;为中小型系统的快速开发提供强大的支持。该框架由服务端、客户端以及公共组件三部分组成&#xff0c;不仅提供了基础的账户管理、版本控制、软件升级、公…

车企如何利用数据技术,指导汽车全生命周期的业务运营?

引言&#xff1a;数据正作为重点&#xff0c;为行业提供不可或缺的指导 《汽车数据发展研究报告&#xff08;2023&#xff09;》指出&#xff0c;汽车行业正由传统硬件制造向“电动化、智能化、网联化”方向转变。德勤预测&#xff0c;到 2025 年&#xff0c;汽车行业 20%的利…

vue集成百度地图vue-baidu-map

文章目录 vue集成百度地图vue-baidu-map1. Vue Baidu Map文档地址2. 设置npm数据源3. 安装vue-baidu-map4. 配置vue-baidu-map4.1 main.js全局注册4.2 vue页面设置4.3 效果 vue集成百度地图vue-baidu-map 1. Vue Baidu Map文档地址 https://dafrok.github.io/vue-baidu-map/#…