| |
|
开发:
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地址范围 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |