TCP连接全过程

2023-10-27

三次握手

状态的含义:

CLOSED:没有任何连接状态

LISTEN:侦听来自远方的TCP端口的连接请求 

SYN-SENT: 再发送连接请求后等待匹配的连接请求(客户端)

SYN-RCVD:再收到和发送一个连接请求后等待对方对连接请求的确认(服务器)

ESTABLISHED:代表一个打开的请求

建立连接时的状态变迁:

一开始,建立连接之前服务器和客户端都处于CLOSED状态,服务器开始创建socket后开始监听,变为LISTEN状态.客户端请求建立连接,向服务器发送SYN报文,客户端的状态变为SYN_SENT。服务器收到客户端的报文后向客户端发送ACK和SYN报文,此时服务器的状态变为SYN_RCVD。然后,客户端收到ACK、SYN,就向服务器发送ACK,客户端状态变为ESTABLISHED,服务器收到客户端的ACK后也变为ESTABLISHED.此时,3次握手完成,连接建立!

详细解释:

  • 第一次握手:客户端的应用进程主动打开,并向服务器发送请求报文段,其首部中:SYN=1,seq=x
  • 第二次握手:服务器应用进程被动打开。若同意客户端的请求,则发回确认报文,其首部中:SYN=1,ACK=1,ack=x+1,seq=y。

  • 第三次握手:客户端收到确认报文之后,通知上层应用进程连接已建立,并向服务器发出确认报文,其首部:ACK=1,ack=y+1。当服务器收到客户端的确认报文之后,也通知其上层应用进程连接已建立。

TCP为什么要三次握手呢?

  1. 防止重复连接: 当网络很差的情况下,发送方可能会连接发送多次建立连接的请求.如果TCP握手的次数只有两次,那么接收方只能选择接受请求或者拒绝接受请求,但它并不清楚这次的请求是正常的请求,还是由于网络环境问题而导致的过期请求,如果是过期请求的话就会造成错误的连接。所以如果 TCP 是三次握手的话,那么客户端在接收到服务器端 SEQ+1 的消息之后,就可以判断当前的连接是否为历史连接,如果判断为历史连接的话就会发送终止报文(RST)给服务器端终止连接;如果判断当前连接不是历史连接的话就会发送指令给服务器端来建立连接。
  2. 同步初始化序列化:TCP 为了保证在不稳定的网络环境中构建一个稳定的数据连接,它就需要一个“序列号”字段来保证自己的稳定性,而这个序列号的作用就是防止数据包重复发送,以及有效的解决数据包接收时顺序颠倒的问题。

    那么在建立 TCP 连接时就需要同步初始化一个序列号来保证 TCP 的稳定性,因此它需要执行以下过程:1.首先客户端发送一个携带了初始序列号的 SYN 报文给服务器端;2.服务端接收到消息之后会回复一个 ACK 的应答报文,表示客户端的 SYN 报文已被服务端成功接收了;3.而客户端收到消息之后也会发送一个 ACK 给服务端,服务器端拿到这个消息之后,我们就可以得到一个可靠的初始化序列号了。而如果是两次握手的话,就无法进行序列号的确认工作了,因此也就无法得到一个可靠的序列号了,所以 TCP 连接至少需要三次握手。

以上两种原因就是 TCP 连接为什么需要三次握手的主要原因,当然 TCP 连接还可以四次握手,甚至是五次握手,也能实现 TCP 连接的稳定性,但三次握手是最节省资源的连接方式,因此 TCP 连接应该为三次握手。

四次挥手

状态的含义: 

ESTABLISHED:代表一个打开的连接

FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认

CLOSE-WAIT:等待从本地用户发来的连接中断请求

FIN-WAIT-2:从远程TCP等待连接中断请求

LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认

TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认

CLOSED:没有任何连接状态

断开连接时的状态变迁:

由于tcp连接是全双工的,断开连接会比建立连接麻烦一点点。客户端先向服务器发送FIN报文,请求断开连接,其状态变为FIN_WAIT1。服务器收到FIN后向客户端发生ACK,服务器状态变为CLOSE_WAIT。客户端收到ACK后就进入FIN_WAIT2状态。此时连接已经断开了一半了。如果服务器还有数据要发送给客户端,就会继续发送。直到发完了,就发送FIN报文,此时服务器进入LAST_ACK状态。客户端收到服务器的FIN后,马上发送ACK给服务器,此时客户端进入TIME_WAIT状态,再过了2MSL长的时间后进入CLOSED状态。服务器收到客户端的ACK就进入CLOSED状态。

详细解释:

  • TCP发送一个FIN,用来关闭客户到服务器的数据传送
  • 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1.和SYN一样,一个FIN将占用一个序号
  • 服务器关闭客户端的连接,发送一个FIN给客户端
  • 客户端发回ACK报文确认,并将确认序号设置为收到序号加1

TCP为什么要四次挥手?

  1. 关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。
  2. 服务器收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。

为什么客户端在TIME-WAIT阶段要等2MSL?

为的是确认服务器端是否收到客户端发出的ACK确认报文,当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文.所以客户端在发送完 ACK 确认报文之后,会设置一个时长为 2MSL 的计时器。

MSL 指的是 Maximum Segment Lifetime:一段 TCP 报文在传输过程中的最大生命周期。

2MSL 即是服务器端发出为 FIN 报文和客户端发出的 ACK 确认报文所能保持有效的最大时长。

服务器端在 1MSL 内没有收到客户端发出的 ACK 确认报文,就会再次向客户端发出 FIN 报文:

如果客户端在 2MSL 内,再次收到了来自服务器端的 FIN 报文,说明服务器端由于各种原因没有接收到客户端发出的 ACK 确认报文。客户端再次向服务器端发出 ACK 确认报文,计时器重置,重新开始 2MSL 的计时。

否则客户端在 2MSL 内没有再次收到来自服务器端的 FIN 报文,说明服务器端正常接收了 ACK 确认报文,客户端可以进入 CLOSED 阶段,完成“四次挥手”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP连接全过程 的相关文章

  • JavaWeb笔记:第07章 MVC

    JavaWeb笔记 第07章 MVC EL JST Filter Listener JQuery AJAX Maven JSON Redis Linux Nginx 1 MVC 开发模式 2 EL表达式 2 1 概念 作用 语法 2 2 E
  • Springboot初识--Bean的理解

    注解下的Spring Ioc Spring所提供的两个核心理念 一个是控制反转 Inversion of Control IoC 另一个是面向切面编程 Aspect Oriented Progarmming AOP IoC容器是spring
  • Mybatis中parameterType的用法

    在mybatis映射接口的配置中 有select insert update delete等元素都提到了parameterType的用法 parameterType为输入参数 在配置的时候 配置相应的输入参数类型即可 parameterTy

随机推荐

  • rsync安装及使用详细步骤

    目录 1 介绍rsync 2 rsync的安装以及操作方法 3 启动rsync 4 文件传输 5 效验 6 总结 rsync 是一个开源的命令行工具 用于在不同的主机之间同步文件和目录 它可以通过远程 shell 或 rsync 协议 默认
  • SQL语句学习系列(1)

    目录 查询语句 1 查询所有列的所有行 2 查询指定列的所有行 3 查询满足条件的行 4 查询满足多个条件的行 6 查询满足条件的行数 7 查询满足条件的唯一值 8 查询满足条件的分组统计 9 查询满足条件的平均值 10 查询满足条件的最大
  • C语言练习题(14) 有以下函数,该函数的功能是( )int fun(char *s) { char *t = s; while(*t++); return(t-s); }(非常详细的讲解)

    1 有以下函数 该函数的功能是 int fun char s char t s while t return t s A 比较两个字符的大小 B 计算s所指字符串占用内存字节的个数 C 计算s所指字符串的长度 D 将s所指字符串复制到字符串
  • 深入研究源码:Android10.0系统启动流程(三):Zygote

    前言 研究过程中参考了很多的文章 这篇源码分析 可能是全网最全的Zygote源码分析了 如果觉得这篇源码分析太干 也可以先看一下后续的相关总结 戳https juejin im post 6844903966665539591 全文概览 我
  • java项目的心得,java项目的代码层次的架构划分

    java项目使用的架构是ssm Spring SpringMVC MyBatis 一 后台代码一般分三层 Controller Service Dao 1 Controller层是对前端或者接口的响应一个逻辑处理的层 这个层级一般调用的是S
  • 3、MyBatisPlus的CRUD 接口

    MyBatisPlus的CRUD 接口 一 insert 1 插入操作 2 主键策略 二 update 1 根据Id更新操作 2 自动填充 3 乐观锁 三 select 1 根据id查询记录 2 通过多个id批量查询 3 简单的条件查询 4
  • Nor flash 页写地址与数据大小的限制

    厂商提供的flash手册如下 如果页写指令的地址不是256的整数倍 并且写入的数据量超过了当前地址所在页的边界 则超过的那些数据会重新写入当前页的首地址 即256的整数倍地址 所以 在进行页写的时候 要注意这个限制 跨页写数据时注意分多个页
  • JAVA验证数字的整数位长度及小数据位长度

    文章目录 一 案例说明 二 使用步骤 1 引入库 2 读入数据 一 案例说明 验证数字的整数位长度及小数据位长度 二 使用步骤 1 引入库 代码如下 示例 import java util regex Matcher import java
  • 9、无须光照的模型假阴影实现 URP

    模型阴影 我们在实际项目中 经常会有模型影子的需求 这个时候如果使用光照的话 在移动端性能消耗太大 如果使用一个假的阴影片 效果又不太好 我们希望有能够有和灯光系统一样的阴影效果 我们通过模拟灯光的方式来实现 之前我们写的shader都是对
  • USB设备开发---- usb描述符概述

    说到USB设备 不得不提到各种描述符 descriptors 一般来说 描述符有如下几种 1 设备描述符 Device Descriptors 2 配置描述符 Configuration Descriptors 2 接口描述符 Interf
  • 图和带权图(数据结构13-14章——读书笔记)

    一 图 在计算机程序设计中 图是最常用的结构之一 一般来说 用图来帮助解决的问题类型与本书中已经讨论过的问题类型有很大差别 如果处理一般的数据存储问题 可能用不到图 但对某些问题 图是必不可少的 1 1 图简介 图是一种与树有些相像的数据结
  • java中很实用的快捷键

    Windows下eclipse 1 ctrl shift o 自动引入包和删除无用包 2 ctrl shift x和ctrl shift y 英文字母大小写的转换 3 ctrl d 删除当前行 删除当前行 4 ctrl shift 自动注释
  • Django+Vue 实现登录功能(elementUI,axios,Qs)前后端分离

    技术栈 Django vue Element webpack axios Qs 介绍 利用django vue 实现了 前后端分离 目前只实现了登录功能 后期项目将继续更新 实现步骤 1创建Django项目 django admin sta
  • 2022春哈工大ICS大作业——程序人生-hello‘sP2P

    计算机系统 初发布于2022 5 15 修改于2022 5 20 大作业 题 目 程序人生 Hello s P2P 专 业 学 号 班 级 学 生 沈业力 指 导 教 师 史先俊 计算机科学与技术学院 2022年5月 摘 要 本论文目的在于
  • C++ STL : std::list

    练习下C STL中std list类的常用方法 方便以后查阅 如有不正确的地方 请读者及时指正 欢迎转载 谢谢 include
  • 面向2022届毕业生-自动驾驶/SLAM/DL/C++ 岗位收集整理

    收集整理 Created by leijobs876 gmail com 目标方向 C C 开发 Andorid 开发 深度学习部署 自动驾驶感知与定位 ROS机器人开发 文章目录 收集整理 目标方向 方向完全一致 总体结果 1 秋招进展框
  • java byte数组赋值_干货!写给小白看的入门级Java基本语法,强烈推荐

    众所周知 Java 是一门面向对象的编程语言 它最牛逼的地方就在于它是跨平台的 你可以在 Windows 操作系统上编写 Java 源代码 然后在 Linux 操作系统上执行编译后的字节码 而无需对源代码做任何的修改 今天我们就来仔细讲一讲
  • Java之对象转型(casting)

    1 一个基类的引用类型可以指向其子类的对象 2 一个基类的引用指向子类的对象时不可以访问其子类对象新增加的成员 属性和方法 比如 一只狗继承动物类 如果将狗当成动物传入 那么狗局不能访问自己独有的成员 只能当成动物来用 3 可以引用 变量
  • 网络安全高级工具软件100套(上)

    1 Nessus 最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器 它可以运行于几乎所有的UNIX平台之上 它不止永久升级 还免费提供多达11000种插件 但需要注册并接受EULA acceptance 终端用户授权协议
  • TCP连接全过程

    三次握手 状态的含义 CLOSED 没有任何连接状态 LISTEN 侦听来自远方的TCP端口的连接请求 SYN SENT 再发送连接请求后等待匹配的连接请求 客户端 SYN RCVD 再收到和发送一个连接请求后等待对方对连接请求的确认 服务