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

TCP三次握手的过程

一、什么是TCP

TCP是面向连接的、可靠的、基于字节流的传输层通信协议。

二、TCP的头部格式

序列号:在建立连接时由计算机生成的随机数作为其初始值,通过SYN包传给接收端主机,每发送一次数据,就「累加」一次该「数据字节数」的大小。用来解决网络包乱序问题
确认应答号:指下一次「期望」收到的数据的序列号,发送端收到这个确认应答以后可以认为在这个序号以前的数据都已经被正常接收。用来解决丢包的问题
控制位:

  • ACK:该位为1时,「确认应答」的字段变为有效,TCP规定除了最初建立连接时的sN包之外该位必须设置为1 。
  • RST:该位为1时,表示TCP连接中出现异常必须强制断开连接。
  • SYN:该位为1时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
  • FIN:该位为1时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换FIN位为1的TCP 段。

三、三次握手的过程

我们在上面知道了序列号、确认应答号、以及控制位,那么我们下面就描述一下三次握手的过程!

解释:

  • 一开始,客户端和服务端都处于cLose 状态。先是服务端主动监听某个端口,处于LISTEN状态
  • 客户端会随机初始化序号( x ),将此序号置于TCP首部的「序号」字段中,同时把SYN标志位置为1,表示 SYN报文。接着把第一个SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于SYN-SENT状态。
  • 服务端收到客户端的SYN报文后,首先服务端也随机初始化自己的序号( y ),将此序号填入TCP首部的「序号」字段中,其次把TCP首部的「确认应答号」字段填入x + 1,接着把SYN和ACK标志位置为1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于SYN-RCVD状态。
  • 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文TCP首部ACK标志位置为1,其次「确认应答号」字段填入y + 1,最后把报文发送给服务端,这次报文可以携带客户到服务端的数据,之后客户端处于ESTABLISHED状态。
  • 服务端收到客户端的应答报文后,也进入ESTABLISHED状态。
  • 从上面的过程可以发现第三次握手是可以携带数据的,前两次握手是不可以携带数据的。
  • 一旦完成三次握手,双方都处于ESTABLTSHED状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了。

四、在Linux系统中查看连接状态

可以通过netstat - napt命令进行查看:

Tcp协议                  源地址+源端口          目标地址+目标端口   连接状态   进程pid和进程名字

五、结语

       希望可以通过这篇文章让您对TCP的三次握手有一个初步的理解,后续会更新三次握手的细节问题欢迎查看!

相关文章:

  • Github 2024-06-14 开源项目日报Top10
  • C语言之#define #if 预处理器指令
  • HTML前端
  • 基于LangChain-Chatchat实现的RAG-本地知识库的问答应用[0]-模型、工具、分词器等支持列表
  • VSCode插件开发之初始化项目
  • GPRS与4G网络:技术差异与应用选择
  • PHP入门教程1:PHP的基础概念和基本语法
  • 17个有用的CLI命令
  • 跨文化美学实践:以‘Shockman登峰侠‘为例探析翻译艺术与文化意蕴
  • 回答网友的一个Delphi问题
  • React@16.x(29)useRef
  • 用python把docx批量转为pdf
  • [Rust] 求Vec中的最值、统计特定值的数量和统计数组总和
  • 软设之需求分析的工具
  • C++格式化库fmt使用方法
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CentOS 7 防火墙操作
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • PHP那些事儿
  • React的组件模式
  • React系列之 Redux 架构模式
  • tab.js分享及浏览器兼容性问题汇总
  • ucore操作系统实验笔记 - 重新理解中断
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 从伪并行的 Python 多线程说起
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 协程
  • 组复制官方翻译九、Group Replication Technical Details
  • ​io --- 处理流的核心工具​
  • ​用户画像从0到100的构建思路
  • #传输# #传输数据判断#
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (1) caustics\
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (done) 两个矩阵 “相似” 是什么意思?
  • (补)B+树一些思想
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (排序详解之 堆排序)
  • (三)uboot源码分析
  • (小白学Java)Java简介和基本配置
  • .net core Swagger 过滤部分Api
  • .NET 某和OA办公系统全局绕过漏洞分析
  • .net 生成二级域名
  • .net打印*三角形
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • [04]Web前端进阶—JS伪数组
  • [2016.7 test.5] T1
  • [20171113]修改表结构删除列相关问题4.txt
  • [C++]C++基础知识概述
  • [Effective C++读书笔记]0012_复制对象时勿忘其每一部分
  • [emacs] CUA的矩形块操作很给力啊
  • [Excel]如何找到非固定空白格數列的條件數據? 以月份報價表單為例