TCP三次握手(详解)

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

c:标志位(Flags):

共6个,即URG、ACK、PSH、RST、SYN、FIN等。具体含义如下

URG:紧急指针(urgent pointer)有效。

ACK:确认序号有效。

PSH:接收方应该尽快将这个报文交给应用层。

RST:重置连接。

SYN:发起一个新连接。

FIN:释放一个连接。

三:TCP的三次握手的图示

============================================================================

1:图示


所谓的三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。

以下为客户端主动发起连接的图解:

在这里插入图片描述

2:客户端各个状态:


CLOSED状态:为关闭状态

SYN_SENT状态:为请求连接状态, 当你要访问其它的计算机的服务时首先要发个同步信号给该端口,此时状态为SYN_SENT,如果连接成功了就变为ESTABLISHED,此时SYN_SENT状态非常短暂。

ESTABLISHED状态:连接成功

3:服务端的各个状态:


LISTENING状态:监听状态, State显示是LISTENING时表示处于侦听状态,就是说该端口是开放的,等待连接,但还没有被连接。就像你房子的门已经敞开的,但还没有人进来。

SYN-RCVD状态:收到和发送一个连接请求后等待对方对连接请求的确认。

ESTABLISHED状态:连接成功

补充:SYN-RCVD状态

当服务器收到客户端发送的同步信号时,将标志位ACK和SYN置1发送给客户端,此时服务器端处于SYN_RCVD状态,

如果连接成功了就变为ESTABLISHED,正常情况下SYN_RCVD状态非常短暂。如果发现有很多SYN_RCVD状态,那你的机器有可能被SYN Flood的DoS(拒绝服务攻击)攻击了。

SYN Flood的攻击原理是:

在进行三次握手时,攻击软件向被攻击的服务器发送SYN连接请求(握手的第一步),

但是这个地址是伪造的,如攻击软件随机伪造了51.133.163.104、65.158.99.152等等地址。

服务器 在收到连接请求时将标志位 ACK和 SYN 置1发送给客户端(握手的第二步),

但是这些客户端的IP地址都是伪造的,服务器根本找不到客户机,也就是说握手的第三步不可能

完成。这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个

未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级

(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,

但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而

消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的

CPU 时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。

此时从正常客户的角度看来,服务器失去响应,这种情况我们称做: 服务器端受到了

SYN Flood攻击(SYN洪水攻击 )

百度百科

4:TCP三次握手的过程


握手之前主动打开连接的客户端结束CLOSED阶段,被动打开的服务器端也结束CLOSED阶段,并进入LISTEN阶段。随后开始“三次握手”:

a:首先客户端先向服务器端发送一个TCP报文

标记位为SYN,表示“请求建立新连接”;

序号为Seq=X(X一般为1)(传输信息的时候每个数据包的序号);

随后客户端进入SYN-SENT阶段(请求连接的阶段)。

b:服务器端收到来自客户端的TCP报文之后,结束LISTEN阶段。并返回一段报文

标志位为SYN和ACK,表示“确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接”(即告诉客户端,服务器收到了你的数据);

序号为Seq=y;(返回一个收到信息的数据包 并给其标序号为y)

确认号为Ack=x+1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值(两端配对 接收到消息 并反馈的过程;随后服务器端进入SYN-RCVD阶段。

ACK:代表确认收到消息

c:客户端接收到来自服务器确认收到数据的TCP报文后,明确了从客户端到服务器的数据传输是正常的,结束SYN-SENT阶段,并返回一段TCP报文

标志位为ACK,表示“确认收到服务器端同意连接的信号”(即告诉服务器,我知道你收到我发的数据了);

序号为Seq=x+1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值;

确认号为Ack=y+1,表示收到服务器端序号Seq,并将其值加1作为自己的确认号Ack的值;

随后客户端进入ESTABLISHED阶段。(即成功建立了连接)

d:关于确认号Ack和数据包的序号Seq值得变化

Ack确认号:就是确认收到消息后 返回给 发送端的 序号(Ack = 发起方的Seq + 1)

ACK确认序号(Seq)有效:确认发送的数据包的成功到达

Seq:序号:给每个数据包一个序号,保证接受端可以按序收到数据包(首次握手的时候 Seq = 上次握手的时候的Ack值,如果没有 则可以是任意值)

在客户端与服务器端传输的TCP报文中,双方的确认号Ack和序号Seq的值,都是在彼此Ack和Seq值的基础上进行计算的,这样做保证了TCP报文传输的连贯性。一旦出现某一方发出的TCP报文丢失,便无法继续"握手",以此确保了"三次握手"的顺利完成

5:为甚要三次握手


a:为了防止服务器端开启一些无用的连接增加服务器开销

总结

谈到面试,其实说白了就是刷题刷题刷题,天天作死的刷。。。。。

为了准备这个“金三银四”的春招,狂刷一个月的题,狂补超多的漏洞知识,像这次美团面试问的算法、数据库、Redis、设计模式等这些题目都是我刷到过的

并且我也将自己刷的题全部整理成了PDF或者Word文档(含详细答案解析)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

66个Java面试知识点

架构专题(MySQL,Java,Redis,线程,并发,设计模式,Nginx,Linux,框架,微服务等)+大厂面试题详解(百度,阿里,腾讯,华为,迅雷,网易,中兴,北京中软等)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

算法刷题(PDF)

我的美团offer凉凉了?开发工程师(Java岗)三面结束等通知...

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
**

[外链图片转存中…(img-Sf4D0Q8E-1714769476982)]

算法刷题(PDF)

[外链图片转存中…(img-sojXDdyb-1714769476982)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值