TCP连接全过程_tcp连接过程-程序员宅基地

技术标签: 网络  tcp/ip  计算机网络  

三次握手

状态的含义:

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 阶段,完成“四次挥手”。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_49461415/article/details/126807526

智能推荐

Toeplitz矩阵以及矩阵乘法FFT加速_toeplitz矩阵乘向量例子-程序员宅基地

文章浏览阅读3.9k次。Toeplitz矩阵以及矩阵乘法FFT加速1.Toeplitz矩阵托普利兹矩阵,简称为T型矩阵,它是由Bryc、Dembo、Jiang于2006年提出的。托普利兹矩阵的主对角线上的元素相等,平行于主对角线的线上的元素也相等;矩阵中的各元素关于次对角线对称,即T型矩阵为次对称矩阵。这里我们使用matlab中自带的函数生成一个toeplitz矩阵的例子:x=[1 2 3 4];y=[1 5 6 7 8 9];z=toeplitz(x,y);我们可以得到一个这样的矩阵结果:我们可以看到,其中x中_toeplitz矩阵乘向量例子

Python pandas练习Retuns50stocks股票,纯英文ipynb作业20题,100%正确答案_create a function that takes a positive integer an-程序员宅基地

文章浏览阅读848次,点赞2次,收藏3次。#%% mdAssigment 4Instructions: This problem set should be done individuallyAnswer each question in the designated space belowAfter you are done. save and upload in blackboard.Please check that you are submitting the correct file. One way to avoid mist_create a function that takes a positive integer and returns the next bigger

FDR校正的程序实现及严格程度对比_fdr校正后全没有意义-程序员宅基地

文章浏览阅读2.4w次,点赞9次,收藏44次。FDR校正的程序实现及严格程度对比前言 做统计分析就离不开P value<0.05,而写过科研文章的人也都知道没有经过FDR校正的P值就像一盘散沙,不用风吹,走两步自个儿就散了。那么FDR校正这个让人又爱又恨的东西是什么呢?又是如何实现呢? 原理是这样:设总共有m个候选基因,每个基因对应的p值从小到大排列分别是 p(1),p(2),..._fdr校正后全没有意义

淦VINS-MONO源码 01--IMU的误差模型和标定-程序员宅基地

文章浏览阅读921次。IMU的误差模型和标定工作原理加速度计工作原理陀螺仪测量原理误差来源IMU噪声模型biasscale轴偏差IMU校准确定性误差六面法标定bias和scale factor温度相关的参数标定随机误差高斯白噪声Bias 随机游走艾伦方差标定数学模型加速度计数学模型陀螺仪数学模型在看完orb-slam后,也投了一些实习,发现纯视觉的方案在很多方面都没得到采用,特别是自动驾驶中定位感知方面,基本上是雷达+IMU+相机+GPS等等的多传感器融合,所以接下来的计划会看看vins-mono和loam的源代码,一个是IM

Dotween常用方法详解-程序员宅基地

文章浏览阅读10w+次,点赞213次,收藏880次。Dotween是unity里非常常用的插件,但是很多人应该没有仔细的阅读过它的api,它实际有很多好用的方法,下面我就针对一些相对常用的方法,做下总结:一、Unity常用组件拓展方法(1) Transform拓展方法1)Position 改变世界坐标 移动方法,第一个参数是要移动到的目标点,不是移动这个向量的距离 transform.DOMov..._dotween

matlab图片纹理特征直方图,常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。...-程序员宅基地

文章浏览阅读1k次。常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。一 颜色特征(一)特点:颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,此时所有属于图像或图像区域的像素都有各自的贡献。由于颜色对图像或图像区域的方向、大小等变化不敏感,所以颜色特征不能很好地捕捉图像中对象的局部特征。另外,仅使用颜色特征查询时,如果数据库很大,常会将许多不需要的图像也检...

随便推点

sqlite3 调用sqlite3_exec查询数据时出现"callback requested query abort"-程序员宅基地

文章浏览阅读4.9k次,点赞6次,收藏7次。不知道有没有人跟我一样,在调用sqlite3的API中sqlite3_exec()函数时出现abort问题,今天我就遇到了,如下图。函数基本原型为: int sqlite3_exec(sqlite3*,const char *sql,sqlite_callback,void *param,char **errmsg); 主要功能是用于查询数据库里的_callback requested query abort

关于ctags的安装和使用_ctags 安装-程序员宅基地

文章浏览阅读627次。1、运行下列命令,是ctags进行安装$ sudo apt-get install ctags2、安装成功后,在项目目录下,就可以了$ ctags -R3、一些细节,如果你是你只想生成php的$ ctags --languages=php -R .4、或者$ ctags -R --exclude=*.js5、无聊时,可以查看ctags都支持那些语言$ ctags --list-languages开发中如何跳转ctrl + ]跳转后如何回到开始的位置_ctags 安装

4.链表组件(LeetCode 817)_给定链表头结点 head,该链表上的每个结点都有一个唯一的整型值 。 同时给定列表 g-程序员宅基地

文章浏览阅读254次。问题描述 :给定链表头结点 head,该链表上的每个结点都有一个唯一的整型值 。同时给定列表 G,该列表是上述链表中整型值的一个子集。返回列表 G 中组件的个数,这里对组件的定义为:链表中一段极长连续结点的值(该值必须在列表 G 中)构成的集合。极长的含义是:这段连续结点的前面或后面结点不属于G。示例 1:输入:head: 0->1->2->3G = [0, 1, 3]输出: 2解释:链表中,0 和 1 是相连接的,且 G 中不包含 2,所以 [0, 1] 是 G 的一_给定链表头结点 head,该链表上的每个结点都有一个唯一的整型值 。 同时给定列表 g

使用神器MobaXterm连接远程mysql和redis-程序员宅基地

文章浏览阅读3.4k次。https://mobaxterm.mobatek.net/download-home-edition.htmlmysqlredis连接测试mysql127.0.0.13307密码使用线上密码redis127.0.0.16380密码使用线上密码转载于:https://www.cnblogs.com/cxscode/...

Shell判断字符串是否为空-程序员宅基地

文章浏览阅读1k次。主要有以下几种方法:echo “$str”|awk '{print length($0)}'expr length “$str”echo “$str”|wc -c但是第三种得出的值会多1,可能是把结束符也计算在内了判断字符串为空的方法有三种:if [ "$str" ="" ] if [ x"$str" = x ]if [ -z "$str" ] (-n ...

ingress-nginx-限速_ingress nginx速率限制-程序员宅基地

文章浏览阅读2.8k次。限速这些注释定义了可由单个客户端IP地址打开的连接的限制。这可用于缓解DDoS攻击。nginx.ingress.kubernetes.io/limit-connections:来自单个IP地址的并发连接数。 nginx.ingress.kubernetes.io/limit-rps:每秒可从给定IP接受的连接数。 nginx.ingress.kubernetes.io/limit-rpm..._ingress nginx速率限制

推荐文章

热门文章

相关标签