2021-07-27 详解TCP连接建立和释放的过程(三报文握手和四次挥手)

TCP建立过程(三次握手)定义:三次握手,又称三报文握手,是指TCP连接建立的过程,由于在一次握手中发送了三次TCP报文段,因此叫做三报文握手。在socket编程中,这一过程由客户端执行connect来触发。连接过程:客户机A运行的是TCP客户程序,服务器B运行的是TCP服务器程序,A主动打开连接,而B被动打开连接;B的TCP服务程序创建传输控制块TCB,准备接受客户进程的连接请求,此时服务器进入Listen状态;A的TCP客户进程首先创建传输控制模块TCB,在打算建立TCP连接时,向B发出连接请求报文段,此报文的首部同步位SYN=1,同时选择一个随机的初始序号x令seq=x。(TCP规定,SYN=1的报文段不能携带数据,但要消耗一个序号),此时A进入了SYN-SENT(同步已发送)状态;B收到A的连接请求报文段后,通过SYN=1获悉A需要建立TCP连接,因此需要给A发送确认。此确认报文段将SYN和ACK都置为1,确认号ack为x+1,同时为自己选择一个随机的初始序号y,令seq=y,此SYN报文段不能携带数据且消耗一个序号,至此,B进入SYN-RCVD(同步收到)状态;A的TCP进程收到B的确认后,检查ack是否为x+1、ACK是否为1,通过验证则还需要再发送一次确认报文段,报文段的ACK置为1,确认号ack=y+1,序号加1成为seq=x+1,ACK报文段可以携带数据,但是如果不携带数据则不消耗序号,至此A进入ESTABLISHED(已建立连接)状态;B收到A的确认报文段后,也进入ESTABLISHED(已建立连接)状态。报文段	SYN(同步位)?	ACK(确认位)、ack(确认号)?	seq(序号)	携带数据、消耗序号?A->B SYN	1		x	不能携带数据B->A SYN	1	1,x+1	y	不能携带数据A->B ACK		1,y+1	x+1	可以携带数据,但不携带就不消耗序号seq显然,B发送给A的报文段携带信息较多,实际上这个报文段可以分成两个部分发送,第一个部分是确认报文段(ACK=1,ack=x+1),然后再发送一个同步报文段(SYN=1,seq=y),这样TCP建立连接过程就成为了四报文握手。为什么需要在B发送给A确认报文段后,A再次发送确认报文段?这是为了防止B的连接资源被白白的浪费,具体的产生情形是这样的:A向B发送一个连接请求报文段,但是由于某种原因,此报文段在某个网络节点滞留;由于A长时间没有收到B的确认报文,因此A重传连接请求报文段,此时完成一个连接过程,在服务完成后,连接释放;假设此时之前A发送的第一个连接请求报文段被发送到了B,由于之前的连接已经结束了,此时B会认为这是A发送的一个新的连接请求报文段,于是向A发送确认报文段,连接建立,danshiA认为这是一个无效的确认,因此不予理会,这时B的连接资源会一直被占用;若采用三次握手,则不会产生上述的情况。TCP连接释放过程(四次挥手)连接释放过程在连接即将释放之前,A和B都处于ESTABLISHED状态,A的应用进程首先向其TCP发出连接释放报文段,并停止发送数据,主动关闭TCP连接;连接释放报文段首部的终止控制位FIN置1,序号seq=u(u不是随机生成的,u为前面已经传送过的数据的最后一个字节的序号加1),A进入FIN-WAIT-1(终止等待1)状态,等待B的确认;(FIN报文段即使不携带数据,也需要消耗一个序号);B收到连接释放报文后发出确认报文段ACK=1,确认号ack=u+1,同时序号seq=v(v为B发送数据报文最后一个字节的序号加1),然后B进入CLOSE-WAIT(关闭等待)状态,这时TCP服务器进程通知高层的应用程序,A到B方向的连接就释放了;注意,这时说的是A->B方向的连接释放,而B->A方向的连接没释放,也就是说,B发送geiA数据A仍要接收,这个状态会持续一段时间。这时,我们说TCP连接进入了半关闭状态。(是TCP连接进入了半关闭状态,而不是A或B)A收到B的报文段,进入FIN-WAIT2(终止等待)状态。若B的高层应用程序没有数据需要发送给A了,应用程序通知TCP释放连接,这时B发出一个FIN报文段,同时需要重复发送上次已经发送过的ack=u+1,这时B进入了LAST-ACK(最后确认)状态;A收到B的报文段后,再发送一个确认报文段,进入TIME-WAIT(时间等待)状态;B收到A发送的确认报文段,就进入了CLOSED状态;A在经过了时间等待计时器设置的2MSL的时间后,就进入了CLOSED状态;MSL:Maximum Segment Lifetime,最长报文段寿命,1 MSL≈2min;为什么A需要等待2MSL才能关闭连接?一是为了防止B一直处于LAST-ACK状态,如果A发送完ACK报文段后就释放连接,那么如果B没有收到A发送的ACK段会超时重传FIN段,但是这时A无法收到了,B就僵死在了LAST-ACK,而等待2MSL后A没有收到B发送的重传FIN段,说明B已经CLOSED,这时A就可以CLOSED了;二是为了防止三次握手提到的“已经失效的连接请求报文段”出现,2MSL可以保证所有的段都消失在网络中。可以这样说,四次握手中:第一次握手是A告知B我要断开连接,这时A就直接断开了;第二次握手是B告知A收到了其连接释放报文段,但B没有打算断开连接,因此去报文段中不含有FIN;第三次握手是B的高层应用程序没有数据发送给A了,因此需要断开连接,其报文段含有FIN=1;第四次握手是A表明收到了B的连接断开报文段,至此,连接就可以释放了。

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

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

相关文章

《新一代城市大脑建设与发展》专家研讨会在京举办(新版)

(这个新版本增加了三位专家的发言)2021年6月26日,新一代城市大脑建设与发展专家研讨会在京举办,本次活动由城市大脑全球标准研究组主办,远望智库承办。6G 俱乐部提供了重要支持。20多位专家参与本次研讨会,…

排序算法-查找算法

排序算法 冒泡排序 从左向右扫描数据&#xff0c;选着最大的数据。要点&#xff1a;比较相邻的两个数&#xff0c;如果左边的数大于右边的数就进行交换。 template<class T> void BubbleSort(T *array, const int length) { for (int i 0; i <length-1; i) { fo…

当法律纽带变成“机器红线”,能让自动驾驶汽车更安全吗?

来源&#xff1a; 脑极体美国汽车协会(American Automobile Association, AAA)与哈佛大学的一项研究结果显示&#xff0c;高达77%的人表示担心自己与自动驾驶汽车共享道路的安全性&#xff0c;62%则担心自动驾驶汽车发生意外时的肇责归属。某种程度上来讲&#xff0c;这可以说是…

李联宁|量子计算机:技术路线、风险及战略投资

来源&#xff1a;《学术前沿》杂志2021年4月上&#xff08;微信有删节&#xff09;作者&#xff1a;西安交通大学城市学院教授 李联宁原文责编&#xff1a;桂琰新媒体责编&#xff1a;李思琪视觉&#xff1a;王洋图片来源&#xff1a;网络由于现有半导体微电子技术物理极限的原…

vs code 配置java

VS code 入门 Vs code 配置Java 首先到VS code官网下载VS code软件&#xff0c;打开界面如图&#xff1a; 下载安装好&#xff0c;打开界面如图(注下图已汉化)&#xff1a; 为了便于使用&#xff0c;我们先进行汉化&#xff0c;在最左边点击图1-1中的图标&#xff0c;出现如图…

四、HTTP控制器

1、控制器的作用&#xff1a;数据和视图之间的桥梁 2、控制器创建方法&#xff1a; &#xff08;1&#xff09;手动创建 <?php namespace App\Http\Controllers; class UserController extends Controller { public function showProfile($id) { return view(user.profile,…

机器人行业专利构建与维护刻不容缓,专利研发需下苦功!

来源&#xff1a;机器人大讲堂自我国加入世界贸易组织&#xff0c;已经近20年过去。但不可忽视的是&#xff0c;发达国家或地区利用其产业先发优势&#xff0c;也一直在知识产权和专利上&#xff0c;采用知识产权和专利贸易壁垒&#xff0c;限制我国企业参与国际市场竞争。机器…

java-弹簧布局(自适应窗口)

一、布局管理器 弹簧布局管理器以容器和组件的边缘为操作对象&#xff0c;通过组件与容器边缘以及组件与组件边缘建立约束(建立位置关系)&#xff0c;实现对组件的布局管理。主要通过函数putConstraint(Strting s1,Component c1,int len,Strting s2,Component c2);当s2在s1的北…

从1G到5G,从回顾过去到展望未来

来源&#xff1a;《从1G到5G&#xff1a;移动通信如何改变世界》 作者&#xff1a;王建宙始于20世纪80年代的蜂窝式移动通信&#xff0c;只用了30多年的时间&#xff0c;就实现了在全世界的普及。如今&#xff0c;手机是人们随身携带的使用频率最高的工具。手机改变了人类的沟…

重磅:国拨概算5.34亿!“新一代人工智能”重大项目项目申报指南发布

来源&#xff1a;brainnews各省、自治区、直辖市及计划单列市科技厅&#xff08;委、局&#xff09;&#xff0c;新疆生产建设兵团科技局&#xff0c;国务院各有关部门&#xff0c;各有关单位&#xff1a;为落实国务院印发的《新一代人工智能发展规划》总体部署&#xff0c;现根…

Idea中在代码顶部添加自定义作者和时间

一、在工具栏找到File>settings>Editor>File and Code Templates 二、选择右边的File Header,在编辑框中添加自定义信息&#xff0c;例如&#xff1a; 三、然后点击应用&#xff0c;保存就OK啦&#xff01; 转载于:https://www.cnblogs.com/HelloBigTable/p/10261145.…

MFC框架解析

通过上述方法&#xff0c;我们进行代码的编写&#xff0c;创建一个空项目&#xff0c;我们要编写MFC应有程序&#xff0c;因此设置项目的属性&#xff0c; 项目->属性->链接器->系统->子系统为&#xff1a;窗口 (/SUBSYSTEM:WINDOWS)&#xff0c;项目->属性-&g…

162年难题,黎曼猜想被印度数学家迎刃而解?克雷数研所发出质疑

来源 &#xff1a; 新智元黎曼猜想又被证明了&#xff1f;5年前&#xff0c;印度一名数学物理学家Kumar Easwaran声称自己证明了「黎曼猜想」&#xff01;他发表了一篇论文「The Final and Exhaustive Proof of the Riemann Hypothesis from First Principles」解释自己的发现&…

MFC的六大关键技术

//main.h头文件 #pragma once #include"a.h" class CShape { public:virtual CRuntimeClassTest* GetRuntimeClassTest() const;BOOL IsKindOf(const CRuntimeClassTest* pClass) const; public:static CRuntimeClassTest classCShape; };static char szCShape[] &q…

20210709未来智能实验室收录资料

整理&#xff1a;未来智能实验室1.加州理工博士&#xff1a;用概率模型解析大脑中的神经活动2.智能化战争的基本形态 3.联合全域指挥控制的人工智能生态系统| 新品推荐4.数字化转型白皮书&#xff1a;数智技术驱动智能制造&#xff0c;42页pdf5.2021综述论文《几何深…

HTTP的请求报文与响应报文

报文&#xff1a; 简单来说&#xff0c;报文就是也就是HTTP报文&#xff0c;作用是在各个系统之间进行和响应时用来交换与传输的数据单元&#xff0c;即站点一次性要发送的数据块&#xff0c;这些数据块以一些文本形式的元信息开头&#xff0c;这些信息描述了报文的内容及含义&…

MFC关键技术-动态创建

//a.h头文件 #pragma once #include"m.h" #include<iostream> using namespace std;class CShape;//类声明//RTTI结构体 struct CRuntimeClassTest {LPCSTR m_lpszClassName;int m_nObjectSize;UINT m_wSchema;CShape*(PASCAL*m_pfnCreateShape)();//PASCAL宏为…

谷歌利用人工智能设计的芯片揭示了智能的本质

来源&#xff1a;TechTalks 网站作者&#xff1a;Ben Dickson译者&#xff1a;Sambodhi策划&#xff1a;刘燕InfoQ 中文站曾经翻译并分享过《谷歌的深度学习在 AI 芯片中找到了一条关键路径》&#xff0c;该文介绍了 ZDNet 与谷歌大脑总监 Jeff Dean 谈到谷歌如何使用人工智能来…

MFC关键技术-永久保存机制

//Main.h文件 #pragma once #include<afxwin.h>class CEllipse :public CObject {DECLARE_SERIAL(CEllipse)private:double m_point; public:CEllipse(){}void Serialize(CArchive&); };//Main.cpp文件 #include"main.h"IMPLEMENT_SERIAL(CEllipse, CObjec…