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三次握手(连接)和四次挥手(断开)(HCIA) -> 正文阅读

[网络协议]TCP三次握手(连接)和四次挥手(断开)(HCIA)

TCP:传输控制协议

(面向连接的可靠传输协议? ----? 在完成了基本传输工作上,保障了传递的可靠性)

TCP的报文格式:

源端口号:TCP连接中,发起连接的主机使用的端口号

目的端口号:TCP连接中,接受连接的主机使用的端口号

序号:TCP传输的每个数据段,都有序号,作用是为了进行排序。网络中允许传输的数据长度是有限制的,数据较大时,会分成多个小数据段进行传输。而这些数据段发送到目的主机时(同时发送多个数据),无法保证是按照顺序到达目标主机。所以每个数据段,都有一个序号,来标识他们属于哪个部分,然后在目标主机中进行重新拼接。

确认序号:接收方收到一个数据段,会发送一个确认报文给发送方,来证明自己已经接到这个数据段,确认序号的作用就是告诉发送方自己接到了哪个数据段。例如:接收方收到序号为 a 的报文段,则确认序号就是 a+1 。(表示自己已经接收了 a ,下一个将接收的就是 a+1 。)

首部长度:TCP的报文首部 + 选项的字节数

ACK:只有1 bit 的标志位。如果为1,则表示这个数据段中的确认序号是有效的,即这个数据报是对之前接受到的某个报文的确认(TCP报文可同时作为确认报文和传递数据报文)

RST:只有 1 bit 的标志位。如果客户端向服务器一个端口请求建立TCP连接,服务器那个端口不允许连接(eg:没开启此端口),这时服务器会回送TCP一个报文,将RST位置写为1,让客户端不用向这个端口发起连接。

SYN:只有 1 bit 的标志位。如果为1,则说明这是一条建立的TCP报文段。

FIN:只有 1 bit 的标志位。如果为1,则说明这是一条断开的TCP报文段。

一、三次握手

TCP建立连接过程需要发送三次报文,所以TCP建立连接的过程被称为三次握手。我们假设客户端向服务器发起TCP连接。

(1)第一次握手

客户端的TCP程序首先向服务器的TCP程序发送一个TCP报文。报文不包含数据,并且它的SYN标志位置为1,表示这是一条建立连接的TCP报文段,所以这个报文段也被称为SYN报文段。客户端的TCP程序就会随机选择一个序号作为客户端报文的初始序号(假设序号为client_iwn),而后放入这个报文段的序号部分。这个报文段由运输层传递到网络层后,会被封装在一个IP数据报中发往服务器。

(2)第二次握手

包含SYN报文段的IP数据报被服务器接收后,服务器的网络层将SYN数据报抽取出来,交给运输层。同时服务器为该TCP连接分配资源(包括发送缓存、接收缓存和变量等等),并向客户端发送允许连接的TCP报文段。这条允许连接的报文段不包含数据,SYN标志位也被置为1,同时它的ACK标志位也被置为1,表示它是SYN报文段的确认报文。所以这条允许连接的报文段也被称为SYNACK报文段。服务器随机选择一个序号,作为服务器报文段的初始序号(假设称为server_iwn),并将其放入SYNACK报文段的序号部分,同时确认号字段被设置为client_iwn + 1(SYN报文段的序号+1)。这时候这个报文段可以解释为服务器向客户端说:“我已经收到了你的连接请求,我允许你连接,我的初始序号是server_iwn”。

(3)第三次握手

当客户端接收到SYNACK报文段后,它也将为TCP连接分配资源(缓存和变量),同时生成一条SYNACK报文段的确认报文,并会发送给服务器。由于经过上面两个步骤,已经算是建立了连接,所以这次的SYN标志位将被置为0,而不是1(这时候ACK标志位是1)。同时,这条报文段的序号被设置为client_iwn + 1(第一条客户报文的序号是client_iwn,而这是它的下一条,所以+1),而确认序号被设置为server_iwn + 1(第一条服务器报文的序号是server_iwn,客户端成功接收,所以期望服务器下一次发送server_iwn + 1)。和上面两条报文不同,第三条报文可以携带数据,比如HTTP的请求就是在TCP的第三次握手报文中发送到服务器的。

(图示):

?

二、四次断开(四次挥手)

TCP在断开连接时,客户端与服务器之间要交换四次报文。所以,TCP的断开连接也叫四次挥手。

(1)第一次挥手

由客户端进程发出断开连接指令,这会导致客户端的TCP程序创建一个特殊的TCP报文段,然后发送到服务器。这个报文段的FIN字段被置为1,表示这是一条断开连接的报文。

?(2)第二次挥手

服务器接收到客户端发来的断开连接报文,然后向客户端回送这个报文的确认报文(ACK字段为1),告诉服务器已经接收到FIN报文,并且允许断开连接。

(3)第三次挥手

当服务器发送完确认报文后,服务器的TCP程序就会创建一条自己的断开连接报文,此报文的FIN字段被置为1,然后发往客户端。

(4)第四次挥手

这时客户端已经接收到服务器发来的FIN报文段,则会产生一条确认报文(ACK为1),发送给服务器,告知服务器已经接收到了它的断开报文。服务器接收到这条ACK报文段后,就会释放TCP连接相关的资源(缓存和变量),客户端等待一段时间后(半分钟、一分钟或两分钟),也灰释放处于客户端的缓存和变量。

(四次挥手,相对于建立连接来说要简单点。上面的例子是由客户端请求断开的示范,并且可以让服务器断开连接。)

(图示):

三、总结

? ? ?以上是对TCP的三次握手和四次挥手做的一个相对细致的讲解,相信看完之后会有一个相对深入的理解。

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

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