计算机网络-三次握手和四次挥手

三次握手

一、为什么需要三次握手⁉️⁉️

1.1 三次握手过程

第一次握手: 客户端发送网络包,服务端收到网络包;
结论:
客户端角度:自身发送能力正常,不确定自身的接收能力,不确定服务端的发送接收能力;
服务器角度:自身接收能力正常,不确定自身的发送能力,确定客户端的发送能力,不确定客户端接收能力;
第二次握手: 服务端发送网络包,客户端收到网络包;
结论:
客户端角度:自身发送能力正常,确定自身的接收能力,确定服务端的发送能力,确定服务器接收能力;
服务器角度:自身接收能力正常,确定自身的发送能力,确定客户端的发送能力,不确定客户端接收能力;
所以,最后对于服务器而言,它不确定客户端的接收能力
第三次握手: 客户端发送网络包,服务器接收到网络包;
结论:
最后一次就是得出结论,对于服务器来说,确定最后客户端的接收能力,然后就建立连接了,皆大欢喜😁

1.2 三次握手的作用

首先肯定是确定客户端和服务器的接收和发送能力
然后就是指定自己的初始化序列号,为后面的可靠传送做准备
什么是初始化序列号(ISN)呢?
那就要说一说三次握手的状态了
刚开始:客户端处于closed的状态,服务器处于listen状态
第一次握手:客户端向服务器发送一个SYN报文,并指明客户端自身的初始化序列号ISN©。此时客户端的状态变为SYN_Send状态
第二次握手:服务端收到客户端的SYN报文之后,会已自己的SYN报文作为应答,并指明了自己的初始化序列号ISN(s),同时会把客户端的ISN+1作为ACK的值,表示自己已经收到了客户端的SYN,此时服务器的状态变为SYN_RCVD的状态
第三次握手:客户端收到了SYN报文之后,会发送一个ACK报文(服务器的ISN+1),表示已经收到了服务器的SYN报文,此时客户端处于established状态
服务器收到ACK报文后,也处于established状态,此时双方就建立起了链接,皆大欢喜😁
结论:
客户端状态变化:closed–>SYN_Send–>established
服务器状态变化:listen–>SYN_RCVD–>established

1.2.1 (ISN)是固定的吗⁉️

假设ISN是固定的,那就很容易能猜出后续的确认号,所以固定是不可能的,肯定是动态生成的。
ISN:(Initial Sequence Number),客户端和服务器在链接的时候交换ISN,以便让对方知道接下来接收数据的时候如何按序列号组装数据

1.2.2 什么是半连接队列⁉️

服务器第一次收到SYN之后,就会处于SYN_RCVD状态,此时双方还没有完全建立其连接,服务器会把这种状态下的请求连接放在一个队列里,这种队列被称为半连接队列
有半连接,肯定就有全连接队列,就是已经完成三次握手,建立起连接就会把请求放在全连接队列中,如果队列满了就可能出现丢包的现象。
那半连接队列有什么作用呢??⁉️
当服务器发送了SYN_ACK包后(第二次握手),如果一直未收到客户端的确认包,服务器会进行重传,如果重传次数超过了最大重传次数,系统就会把该连接信息从半连接队列中删除。
那重传的频率是怎样的呢??⁉️
每次重传的等待时间不一定相同,一般是指数增长,例如时间间隔为1s、2s、4s、8s

二、建立连接的时候能不能进行数据的传输⁉️

第三次握手是可以携带数据的,因为对于客户端而言,确定了自己的发送和接收能力,同样也确定了服务器的发送和接收能力,所以是可以携带数据的,前两次是不可以的,老铁没毛病,泰裤辣!
为什么前两次不可以呢???
假如第一次的时候携带数据,如果有人恶意攻击服务器,那他每次都在第一次握手中SYN报文中放入大量数据,因为攻击者根本不用在意服务器的接收和发送能力,然后疯狂的重复发送SYN报文,会让服务器花费很多时间内存空间来接收这些报文,所以显而易见,第一次握手如果可以放入数据的话,就会让服务器很容易被攻击;第二次握手携带数据的话当然就是会让客户端很容易受到攻击。

四次握手

一、为什么需要四次握手⁉️

1.1 四次握手的过程

假如是客户端先发起关闭请求
状态:客户端和服务器先都处于established状态
第一次挥手客户端发送一个FIN报文,报文中指定一个序列号;客户端状态变为FIN_WAIT1状态
第二次挥手服务器收到FIN报文,会发送一个ACK(客户端的序列号+1)报文,表明自己知道你想断开了;此时服务器处于CLOSE_WAIT状态,客户端收到后变为FIN_WAIT2状态
第三次挥手服务器心想,你都想断开了,那就断开吧,所以服务器就发送一个FIN报文,并指定序列号;此时服务器处于LAST_ACK状态
第四次挥手客户端收到FIN之后,就知道了服务器想断开了,此时就发送一个ACK(服务器的序列号+1),表明自己知道了,此时客户端处于TIME_WAIT(CLOSEING)状态。需要过一阵子确保服务器收到了自己的ACK报文之后才会进入CLOSED状态
最后:服务器收到了ACK报文后,就处于关闭连接,状态变为CLOSED状态

服务器或客户端的状态

LISTEN:监听来自远方TCP端口的连接请求
SYN_SEND:在发送连接请求后等待匹配的连接请求
SYN_RECEIVED:在收到和发送一个连接请求后等待对连接请求的确认
ESTABLISHED:代表一个打开连接,数据可以传送给用户
FIN_WAIT1:等待远程TCP的连接中断请求,或先前的连接中断请求的确认
FIN_WAIT2:从远程TCP等待连接中断请求
CLOSE-WAIT:等待从本地用户发来的连接中断请求
CLOSING:等待远程TCP对连接中断的确认
TIME_WAIT:等待足够的时间以确保远程TCP接收到连接中断的请求确认
LAST_ACK:等待原来发向远程TCP的连接中断请求的确认
CLOSED:没有任何连接的状态

                                                          ------越努力越幸运 zcl
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立花泷的学习日记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值