一文读懂TCP的三次握手(详细图解)
创始人
2024-02-24 05:34:33
0

在学习TCP三次握手的过程前,首先熟悉几个缩写简称:

TCB

传输控制块,打开后服务器/客户端进入监听(LISTEN)状态

SYNTCP报文标志位,该位为1时表示发起一个新连接
ACKTCP报文标志位,该位为1时,确认序号有效,确认接收到消息。TCP规定,在连接建立后所有报文的传输都必须把ACK置1
seqsequence number,报文初始序列号,代表发送的第一个字节的序号
ackacknowledgement number,报文确认序号,代表希望收到的下一个数据的第一个字节的序号

熟悉上面几个标志位和序列号含义后,下面来看TCP的三次握手过程:

先上几个帮助理解的点:

不管请求还是应答,都是带两种数据:请求号SYN/应答号ACK + 数据包报文号;

请求时要发请求号SYN,应答时要发送应答号ACK;在数据包传送时,发送方要发送当前数据包报文号seq和确认收到上一个数据包的确认报文号ack。

下面结合示意图来理解三次握手过程:

前期:

TCP服务器创建传输控制块TCB,进入监听LISTEN状态,准备接收请求。

第一次握手:客户端——请求(发送请求SYN+数据包当前序列号seq,无需应答)

客户端创建传输控制块TCB,进入监听LISTEN状态。
设置SYN=1,表示这是握手报文,并发送给服务器
设置发送的数据包序列号seq=x
此时客户端处于同步已发送SYN-SENT状态

第二次握手:服务器——确认(发送应答ACK+请求SYN+确认收到上一个数据包的确认号ack+ 当前数据包序列号seq)

设置ACK=1,表示确认应答。
设置ack=x+1,表示已收到客户端x之前的数据,希望下次数据从x+1开始
设置SYN=1,表示握手报文,并发送给客户端
设置发送的数据包序列号seq=y
此时服务器处于同步已接收SYN-RCVD状态

第三次握手:客户端——确认服务器的确认(发送应答ACK+确认收到上一个数据包的确认号ack+ 当前数据包序列号seq ,连接已建立,无需请求)

设置ACK=1,表示确认应答。
设置ack=y+1,表示收到服务器发来的序列号为seq=y的数据包,希望下次数据从y+1开始
设置seq=x+1,表示接着上一个数据包seq=x继续发送
至此三次握手结束,连接建立

为什么要使用三次握手机制?

1.为了阻止历史连接

若网络状况不好的时候,客户端发送的SYN信号未能及时传输给服务器。当网络恢复时已经失效的SYN信号又到达服务器。如果只有两次握手便可建立连接,那么此时客户端就不知道这个连接是不是已经失效了的历史连接,从而导致错误的发生。三次握手时,客户端便可以根据上下文来判断此次连接是否为历史连接,避免错误的发生。

2. 为了避免服务器开启无用连接增加服务器开销

客户端设置了一个超时时间,超过了就重新发送一个TCP连接请求。如果没有第三次握手的话,服务端是不知道客户端是否收到服务返回的信息的,这样没有给服务器端一个创建还是关闭连接端口的请求,服务器端的端口就一直开着,等到客户端因超时重新发出请求时,服务器就会重新开启一个端口连接。那么服务器端上没有接收到请求数据的上一个端口就一直开着,长此以往,这样的端口多了,就会造成服务器端开销的严重浪费。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...