面试官,不要再问我 TCP 三次握手了

本文深入解析TCP三次握手的原理,包括连接建立过程中的各阶段状态变化、半连接状态概念、ISN序列号分配机制、三次握手是否能携带数据以及SYN攻击等关键问题。通过详细步骤说明,帮助读者理解三次握手的必要性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


三次握手只基于TCP面向连接的传输方式

什么是三次握手?

        所谓三次握手是A端和B端连接时,发起连接的一端需要发送两次的TCP报文,接收端需要发送一次的TCP报文,总共加起来三次的报文信息交流的过程;

先看看三次握手的原理及相关问题


三次握手的原理?

第一次握手:A端发起一个连接请求报文,发起连接需要将SYN从0变成1,同时初始化序号seq=x,设置好,发送给B端,发送完毕后,A端的状态由CLOSE(关闭状态)变成SYN_SEND(同步已发送状态)。

第二次握手:B端收到一个请求连接,如果同意连接,返回一个同意报文,将报文的ACK从0变成1,SYN从0变成1,初始化序号seq=y,设置ack=x+1,表示接受到请求报文,设置后,B端发送A端后,B端的状态由LISTEN(监听状态)变成SYN_RCVD(同步已收到状态),

第三次握手:A端收到回复,状态变成ESTABLSHED(已连接状态),回复一个已连接的报文,将报文SYN由0变成1,表示不再发起一个新的连接,保留ACK=1,表示ack确认号有效,设置ack=x+1表示已经收到回复,设置seq=x+1表示报文的序列号,B端收到回复,状态由SYN_RCVD(同步已收到状态)变成ESTABLSHED(已连接状态),连接完成;

 

三次握手相关问题

为什么连接是3次握手,2次不行吗? 

两次握手是不行的,首先第一次握手,A端发送了一个请求报文给B端,B端收到,这时B端知道A端的发送能力正常,B端的接收能力正常;第二次握手,B端回复了一个应答报文,告诉A端收我收到了你的请求报文,A端知道A端的发送能力正常,A端接收能力正常,B端的发送能力正常,B端的接收能力正常;第三次握手,A端回复了应答报文,B端收到,这时B端知道A端的接收能力正常,B端的发送能力正常,

 

什么是半连接状态?

A端发送了一个SYN请求连接给B端后,B端将请求连接放入SYN-RCVD队列中,这时A端和B端处于半连接状态;

 

ISN(initial Sequence Number)是固定的吗?

不同的报文分配不同的ISN序列号,首次连接的线程报文序号是随机分配的,连接成功后,ISN序号跟数据段的大小有关

 

三次握手可以携带数据吗?

第一次和第二次握手不可以携带数据,第三次握手可以携带数据;为了防止攻击,必须经过两次握手后才能携带数据,首先第一次握手,A端发送了一个请求报文给B端,B端收到,这时B端知道A端的发送能力正常,B端的接收能力正常;第二次握手,B端回复了一个应答报文,告诉A端收我收到了你的请求报文,A端知道A端的发送能力正常,A端接收能力正常,B端的发送能力正常,B端的接收能力正常;只有A端确定了双方的接收和发送能力正常后,B端才允许A端携带数据发送到B端;或者这样理解,A端发了一个请求包给B端,B端发回了一个接收包给A端,A端发送给B端的包中才有权限携带数据。

 

SYN攻击是什么?

SYN攻击就是发送大量SYN请求连接报文,但是报文里面的ip地址是随机的,无效的地址;举个例子:比如A端要攻击B端,A端向B端发送大量伪造ip地址的SYN请求连接报文,B端收到请求连接报文,返回一个应答报文,由于请求连接的ip是伪造的,B端发出的应答报文始终无法达到另外一端,另外一个也就无法返回一个ACK确认,B端不断重复发送,导致资源分配拥堵,不足等问题而无法工作;

如果第三次握手失败,客户端和服务端如何处理?

如果第三次握手失败,主要原因是客户端发送的ACK包无法送达服务端,首先服务端重发SYN,ACK包,最多重发5次,如果还未收到,则关闭连接,进入CLOSE状态,而客户端每收到一个SYN,ACK包,就重发一次ACK包;

 

三次握手的报文信息跟踪

第一次握手:

第二次握手:

第三次握手:

 

三次握手的一些字段理解

理解ACK序列号,SYN确认号

序列号SYN用来标识报文,表示发起一个连接

确认号ACK用来确认收到,表示确认SYN序号有效

梳理一下上面的流程:
第一次握手:客户端向服务端发送一个初始化报文。该报文将SYN标志为1,表示打开一个尝试跟客户端进行通信的连接,此时服务端知道客户端尝试跟自己连接。
第二次握手:假如服务端有足够的资源处理该进程,服务端向客户端发送一个回复的报文,将报文的SYN标志为1,表示打开一个连接,将报文ACK表示为1,表示确认收到了客户端发送过来的SYN连接请求。
第三次握手:客户端向服务端发送另外一个报文,将报文ACK标志为1,表示收到服务端发送过来的SYN连接请求。

理解ACK确认号,SEQ序号

ACK确认号,当ACK为1时,标志段的确认字段才有效,ACK=SEQ+1

SEQ序号用来标识从源端向目的端发送的字节流

梳理上面连接跟踪的过程
第一次握手:客户端给服务端发送了请求报文,SEQ=X表示将请求报文的SEQ序号设置为x。(客户端发送test)
第二次握手:服务端收到请求报文,返回了一个应答报文,SEQ=Y表示将请求报文的SEQ序号设置为y(y是一个随机数),
ACK确认号设置为x+1表示收到了客户端发送的SEQ序号为x的报文请求。(客户端发送能力成功,服务端接收能力成功,客户端发送test)
第三次握手:客户端向服务端发送一个确认报文,ACK=Y+1确认了收到客户端发送的序号为Y的应答报文,由于收到ACK=Y+1确认号,表示
双方的接收和发送都准备好了,客户端将请求报文的序号设置为X+1。

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值