TCP三次握手解析

TCP的三次握手确保了客户端和服务端都能正确地建立连接,验证双方的发送和接收能力。在这个过程中,客户端首先发送SYN报文,服务端回应SYN并确认客户端的序列号,最后客户端再次确认服务端的序列号,完成连接。半连接队列存储了处于SYN-RCVD状态的请求,全连接队列则保存已建立连接的会话。这个过程保证了连接的可靠性和避免无效的连接请求。
摘要由CSDN通过智能技术生成

3次握手实际上就是客户端和服务端互相确认对方的接收能力和发送能力是否正常,并指定自己的初始化序列号为后面的可靠性传输做准备。

简单点说就是:

第一次:客户端发数据给服务端,服务端接收到了,代表服务端确认了客户端的发送能力

第二次:服务端应答客户端的第一次数据,客户端收到了,此时客户端就确认了服务端的接收能力(能够回复自己的信息)和发送能力

第三次:此时只剩下服务端不知道客户端的接收能力是否正常,所以第三次就是应答服务端的数据,这时服务端也就确认了客户端的接收能力

到此,客户端和服务端就都确认了对方的接收能力和发送能力。(这就是为什么需要3次握手,2次为什么不行,4次的话过多,3次最少次数)

3次握手报文数据

a2dd7378e86542b6ba0da3d29324e01d.jpeg
第一次:客户端给服务端发送一个SYN(同步序列编号)报文,并指明客户端的初始化序列号ISN(Initial Sequence Number),该值假设为x。此时客户端状态为SYN-SENT。报文中标志位SYN=1,序号seq=x。

 

第二次:服务端接收到客户端的SYN包,由包中标志位SYN=1知道客户端请求连接,会生成一个自己的SYN报文作为应答。这个应答的SYN报文也需要初始化序列号ISN(注意这是服务端的,前面那个是客户端的),改值假设为y。然后设置报文中序号seq=y,确认号ack=x+1(客户端的序号加1,表示自己收到了客户端的SYN),并且设置标志位SYN=1,ACK=1(标志位ACK为1时,确认号的字段才有效)。此时服务端状态为SYN-RCVD。

第三次:客户端收到服务端的确认SYN报文后,检查ack是否为x+1,ACK标志位是否为1,如果正确就会应答一个自己的SYN报文。报文的ack值也是服务端的seq值加一(ack=y+1),表示已经收到了服务端的SYN报文。报文标志位ACK=1,内容ack=y+1,seq=x+1(初始为seq=x,第二个报文段所以要+1),此时客户端状态为ESTABLISHED。服务端收到后确认ACK标志为是否为1,ack的值是否为y+1,正确则状态为ESTABLISHED,错误或者没收到(一段时间内为收到客户端的确认包)则会按照一定的限制频率重新执行第二次。

注意:大写的ACK和SYN表示标志位,小写的seq和ack表示序号和确认号。标志位SYN=1表示一个新的连接,ACK=1,确认序号有效。ACK报文段可以携带数据,不携带数据则不消耗序号,比如上面第三步,虽然seq=x+1,但是没携带数据,所以不会消耗序号,下次携带数据(发送数据)则seq还是等于x+1。SYN消耗一次序号。

什么是半连接和全连接队列?

服务器第一次收到客户端的SYN之后,服务器状态为SYN-RCVD状态,此时双方还没有完全建立连接,服务器会把这种状态下的请求连接放在一个队列里面,这个队列就是半连接队列。状态为ESTABLISHED,代表已经完全连接,也会将这种状态的连接放到一个队列里没这个队列就是全连接队列。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值