IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 2021-07-27 详解TCP连接建立和释放的过程(三报文握手和四次挥手) -> 正文阅读

[网络协议]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的连接断开报文段,至此,连接就可以释放了。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 08:11:23  更:2021-07-28 08:12:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:42:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码