TCP三次握手和四次挥手

一. TCP协议中三次握手过程

客户端初始状态:closed,服务端:listen

  • 1.第一次握手:客户端发送给服务端一个SYN报文,指出客户端此时的初始化序列号为ISN©,此时客户端状态为SYN_SEND状态。
  • 2.第二次握手:服务端收到SYN报文后,会以自己的SYN报文应答,同时指定了自己的初始化序列号为ISN(S),以及把客户端的ISN©加1
    作为ACK的值,表示自己的接收能力是正常的,已经接收到了客户端的SYN,此时服务端状态为SYN_REVD
  • 3.第三次握手:客户端接收到SYN报文,以服务端的ISN+1作为ACK值发送给服务端,表示自己接收能力也是正常的,已经接收到服务端的SYN报文,此时客户端状态为established状态
  • 4.服务端接收到ACK报文后,也是处于established状态,此时双方建立连接。

简单理解:
第一次握手是客户端发送网络包给服务端,这样服务端可以确定:客户端发送能力、服务端接收能力是正常
第二次握手是服务端发包,客户端接收,这样客户端可以确定:客户端发送、接收能力,服务端发送、接收能力都是正常的,但是服务端还不知道服务端的发送能力是否正常。
第三次握手是客户端发包,服务端接收,这样客户端也能确定:客户端发送、接收能力,服务端发送、接收能力都是正常的.
所以需要三次握手后,双方才能确定双方发送、接收能力都是正常。

注:在TCP/IP协议中,如果接收方成功的接收到数据,那么会回复一个ACK数据。通常ACK信号有自己固定的格式,长度大小,由接收方回复给发送方。

二. TCP协议中三次握手作用

1.确认双方的发送、接收能力是否正常
2.指定自己的序列号,为后面的可靠传送做好准备。


三.TCP协议中三次握手中ISN序列号是否是固定

三次握手中最重要的交换客户端和服务端的ISN序列号,以便让对面知道接下来接收数据的时候如何按序列号组装数据。所以是不能固定的,固定容易被攻击。


四.半连接队列

服务端收到客户端的SYN报文后,就会转变状态为SYN_RCVD状态,双方未完全建立连接,服务端会把这种状态下的请求连接放到一个队列中去,这叫半连接队列。
存放三次握手后建立连接的状态叫全连接队列,如果队列满了会可能出现丢包现象。


五.重传次数

服务端发送完SYN-ACK包后,如果未接收到客户端的确认包,会首次重传,等待一段时间后,进行第二次重传,接着第三次,第四次等等,但是如果超过了系统规定的重传次数后,系统会将该连接信息从半连接队列中删除。等待时间一般呈现指数增长,例如1s,2s,4s,8s.

六.三次握手中是否能携带数据。

第一二次握手不能,第三次可以。
第一次如果可以的话,那如果要恶意攻击网站,只需在第一次的syn报文中放入大量数据,重复发送便足以让服务器花大量时间内存来接收报文,这样让服务器更容易受到攻击。

七.四次挥手过程

客户端状态established,服务端状态:established

  • 第一次挥手:客户端发送一个FIN报文,报中指定一个序列号,此时状态为FIN_WAIT1状态。
  • 第二次挥手:服务端接收到FIN报文后,把客户端的报文序列号+1作为ACK序列号发送ACK报文给客户端,表示已经收到客户端报文,此时服务端状态为CLOSE_WAIT2
  • 第三次挥手:如果服务端也想断开连接,发送一个FIN报文和指定一个序列号给客户端,此时服务端状态为LASE_ACK状态
  • 第四次挥手:客户端收到FIN后,把服务端的序列号+1发送ACK报文给服务端,此时服务端状态为TIME_WAIT,需要等一段时间后确保服务端收到ACK报文后才会进入CLOSED状态

服务端收到ACK报文后,关闭连接,状态为CLOSED。

八.TIME_WAIT状态

发送完ACK报文后的客户端并不是马上进入CLOSED状态,而是先进入一个TIME_WAIT状态,客户端需要等待一个间隔时间后才会关闭,原因是客户端需要确保服务端是否已经收到了报文,如果没收到,服务端会再次发送FIN报文,客户端接收到FIN报文后才知道之前的ACK报文丢失了,便再次发送ACK报文
TIME_WAIT的等待时间会维持在一个报文的来回时间,一般设置一个倒计时,倒计时完了没接收到FIN报文就代表服务端已经成功接收。

LISTEN – 侦听来自远方TCP端口的连接请求;

SYN-SENT -在发送连接请求后等待匹配的连接请求;

SYN-RECEIVED – 在收到和发送一个连接请求后等待对连接请求的确认;

ESTABLISHED- 代表一个打开的连接,数据可以传送给用户;

FIN-WAIT-1 – 等待远程TCP的连接中断请求,或先前的连接中断请求的确认;

FIN-WAIT-2 – 从远程TCP等待连接中断请求;

CLOSE-WAIT – 等待从本地用户发来的连接中断请求;

CLOSING -等待远程TCP对连接中断的确认;

LAST-ACK – 等待原来发向远程TCP的连接中断请求的确认;

TIME-WAIT -等待足够的时间以确保远程TCP接收到连接中断请求的确认;

CLOSED – 没有任何连接状态;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值