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 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 计算机网络——三次握手,四次挥手 -> 正文阅读

[网络协议]计算机网络——三次握手,四次挥手

目录

一、认识常用的序号和标识位

二、TCP连接建立(三次握手)

1、三次握手过程

2、问题

三、TCP连接释放(四次挥手)

1、四次挥手过程

2、过程解释:

3、问题


一、认识常用的序号和标识位

(1)序号:seq,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。

(2)确认序号:ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1。

(3)标识位:

????????ACK:确认序号有效

? ? ? ?SYN:发起一个新连接。
???????FIN:释放一个连接

二、TCP连接建立(三次握手)

1、三次握手过程

在本例中A运行的为TCP客户程序,B运行的为TCP服务器程序,A属于主动打开连接,B属于被动打开连接

第一次发送消息:A向B发送请求报文段,A随机选取一个初始序号(seq=x)并将同步位SYN置为1,发送之后,TCP客户进入SYN-SENT(同步已发送状态)

第二次发送消息:当B服务器收到来自A的请求报文段后,若同意建立连接,则向A发送确认,因为B已经收到序列号为x的数据包,B准备接受序列号为x+1的包,所以ack=x+1。同时B告诉A自己的初始序列号:seq = y,并将SYN,ACK都置为1,B发送确认消息后,进入SYN-RCVD(同步收到状态)

第三次发送消息:当A客户进程收到B的确认消息后,还要向B发送确认告诉B已经收到了它发来的确认信息并准备建立连接,A自己这条消息的序列号是x+1,所以seq=x+1, 而ack=y+1是表示A正准备接受B序列号为y+1的数据包。A向B发送确认后进入ESTABLISHED(已建立连接状态)

当B收到A的确认后也进入建立连接状态,则建立连接结束。

2、问题

为什么是三次握手,不能是两次握手?
1.如果A没有向B发送ACK确认收到消息,则服务器会不断地超时重传ACK/SYN(第二个报文段)
2.若为2次,会浪费服务器的资源(SYN溢出攻击或网络环境影响 客户端的SYN会被重传多次)

三次握手的必要性?

防止已失效的连接请求报文段突然又传送到了B,因而产生错误

假定出现一种异常情况,即A发出的第一个连接请求报文到并没有丢失,而是因为某些网络节点长时间滞留了,以致延误到连接释放后的某个时间才到达B

但是B收到此“已失效的报文段”后,就误以为A又发出一次新的连接请求。于是就向A发出确认报文段,同意建立连接。

由于现在A并没有再次向B发出建立请求的连接,因此就不会理会B,也不会向B发送数据。但是B却一直等待A发来数据。这样就会浪费B的资源利用。

采用“三次握手”的方法可以防止上述现象的发生。如上述的假定情况,A不会向B发送确认信息。B由于收不到确认,就知道A并没有要求建立连接

三、TCP连接释放(四次挥手)

1、四次挥手过程

2、过程解释:

建立连接,数据传输结束后,通信双方就可以释放连接了。

此例中A位主动关闭方,B为被动关闭方。

(1)、主动关闭方A向被动关闭方B发送终止连接请求,将终止控制位FIN置为1,序列号seq=u,此时A进入FIN-WAIT-1(终止等待1)状态,虽然FIN不携带数据,但也消耗一个序号

(2)、当被动关闭方B收到A发来的释放连接报文后向A发送确认信息,确认号ack=seq+1,即ack=u+1,自己的序列号为v,发送后B进入CLOSE-WAIT(关闭等待状态),此时A到B方向的连接就释放了,TCP连接处于半关闭状态

(3)、A收到了B发来的释放确认后就进入了FIN-WAIT-2(终止等待2)状态,被动关闭方过一段时间如果没有要向A发送的数据了,就通知TCP进程也释放连接,这时B向A发送释放连接通知,FIN置为1,其序列号为W,由于半封闭状态可能有数据,则B要重复上次的确认号ack=u+1,这时B进入LAST-ACK(最后确认状态)

(4)、当A收到B发来的释放请求时,要发出确认,ACK=1,seq=u+1,sck=w+1,然后进入TIME-WAIT(时间等待状态)经过2MSL进入CLOSED状态,当B收到A发来的确认消息,则也进入CLOSED状态,释放连接结束。

3、问题

为什么要进行两次FIN?
???因为为全双工信道,任意时刻双方互相通讯,至少有2条通讯信道,一个FIN只能关一条,所以得有两个FIN。

第一条FIN为关闭主动方到被动方的传输通道,第二条FIN关闭被动方到主动方的传输通道。

为什么要设置等待时间TIME-WAIT?
? ? ? ? ?1.保证迟来的数据能被识别并丢弃
? ? ? ? ?2.保证可靠的终止TCP连接,防止对后续运行的程序造成影响(TIME_WAIT存在时间? ? ? ? ? ? ? ?内,主动断开方无法用相同的IP地址端口号再启动一个网络通讯)

? ? ? ? ?(存在时间大约是2MSL:MSL为报文段在网络中最大生存时间)

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:45:47  更:2021-11-20 18:46:00 
 
开发: 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/26 7:52:38-

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