TCP三次握手与四次挥手

 我来答
伊彩缘17
2022-06-16 · TA获得超过4883个赞
知道大有可为答主
回答量:4301
采纳率:100%
帮助的人:221万
展开全部

为了更好的理解TCP建立连接与释放连接的过程,我们不妨先了解TCP报文结构。

TCP报文包含 首部 数据部分

重点认识一下 TCP首部 结构:

1、源端口与目的端口:
各占两个字节,共4个字节。用来告知主机该报文的源与目的。

2、序号(seq number)
由于TCP是面向流的有序可靠连接,在一个TCP连接中传输的字节流中的每个字节都需要按顺序编号。

序号字段指的是本报文段所发送的数据的 第一个字节 的序号。

3、确认号(ack number)
表示 期望收到对方下一个报文段的序号值 ,同时表示前面的序号值都已经 成功接收 ,体现 累积确认机制

4、确认ACK
当ACK=1时,确认号有效。

5、同步SYN
当SYN=1时,表明这是一个请求连接报文段。

6、终止FIN
当FIN=1时,表示此报文段的发送方的数据已发送完毕,要求释放TCP连接。

7、 窗口大小(window size)
流量控制 中的滑动窗口大小,根据接收方的接收缓冲区剩余大小设置。

TCP 的整个交流过程可以总结为:建立连接,传输数据,释放连接。

TCP连接的建立采用客户端-服务器模式,我们将主动方成为客户端(Client),被动方成为服务器(Server)。

1、 第一次握手 :Client主动打开连接,发送TCP报文( SYN = 1,seq = i ),进行第一次握手,进入 SYN_SEND 状态;

2、 第二次握手 : Server收到了SYN报文,发送返回报文( ACK = 1,SYN = 1,ack = i+1, seq = j ),进行第二次握手,进入 SYN_RCVD 状态;

3、 第三次握手 : Client收到来自Server的报文,返回ACK报文( ACK = 1, ack = j+1,seq = i+1 ),进行第三次握手,进入 ESTABLISHED 状态; 另外, 第三次握手一般已经可以携带数据了

TCP有一个特别的概念叫做 半关闭 ,这个概念是说,TCP连接时全双工的连接,因此在关闭连接的时候,必须关闭传送和接收两个方向上的连接。

1、 第一次挥手 : Client发送关闭连接报文段( FIN= 1, seq = n ),进入 FIN_WAIT_1 状态;

2、 第二次挥手 : Server收到来自Client的FIN之后,立即返回一个 ACK=1 报文段(ack = n+1),进入 CLOSE_WAIT 状态;
此时Server还是可以发送数据给Client。

3、 第三次挥手 : 当Server确定所有数据都发送完毕之后,发送 FIN=1 报文段(seq = m),进入 LAST_ACK 状态;

4、 第四次挥手 : Client收到之后,返回 ACK=1 报文段(ack = m+1),进入 TIME_WAIT 状态;
Client等待2MSL(MSL,最长报文段寿命)之后进入CLOSED状态,Server收到最后一个ACK之后,也进入CLOSED状态。

在三次握手过程中,Server发送第二次握手报文之后,收到Client的ACk之前的状态称为 半连接 状态。在半连接状态的Server会为其认为即将完成连接的Client分配资源。

而SYN Flood攻击就是,在短时间内伪造大量不存在的IP地址,向Server不断发送SYN包,Server为这些伪造的Client分配资源,并返回SYN+ACK报文段,由于IP地址无效,所以Server不会收到第三次握手的ACK,需要不断发送直至超时,这些伪造的Client长时间占用未连接队列与Server预分配的资源,造成Server崩溃,无法响应正常的SYN包。

1、SYN cookies技术:先不分配数据区,而根据SYN计算一个cookies值,当收到Client的ACk之后,再进行对比,分配资源。

2、增大最大半连接和缩短超时时间。

1、TIME_WAIT状态能确保Server正常进入CLOSE状态:
TIME_WAIT状态是在Client发完最后一个ACK之后进入的状态,如果这个ACK丢失,则Server不能确认进入CLOSE状态,超时后,Server会重新发送FIN报文段,此时处于TIME_WAIT状态的Client就能收到FIN,重发ACK,确保四次挥手完成。

2、TIME_WAIT状态有 净空 的效果:
防止已经失效的连接请求出现在下次连接中。经过TIME_WAIT状态,可以使本连接内的所有请求都在网络中消失(从而起到净空的效果,不会赢下下一次连接)。

1、 只有主动close一方才会出现TIME_WAIT状态,只有TCP连接为 短连接 情况下才有可能出现大龄的TIME_WAIT状态。

2、 服务器使用短连接,每次客户端请求后,服务器都会主动发送FIN关闭连接。最后进入TIME_WAIT状态。由此,如果访问量过大的Web Server,会存在大量的TIME_WAIT状态。
可以通过修改内核参数,快速回收TIME_WAIT资源。

3、如果一直存在大量TIME_WAIT状态,回收不及时的话,会占用大量服务器资源,可能造成该无法提供服务的问题。

【参考】
[1] 理解TCP 和 UDP
[2] 《计算机网络》

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式