http三次握手和四次挥手

同步包内数据

SYN是一个标志位,syn=1 代表建立新的连接
sep是一个序号  会随机生成一个内容 占32位
Ack是确认序号,将收到的sep序号的值+1,当ACK标志位为ACK=1时确认序号才有效

三次握手(精简)

第一次:

从客户端调用connect开始,发送一个同步包给服务器,告诉服务器我要给你发消息了

第二次:

服务器发送确认包(同步包中的值+1)告诉客户端说可以,同时发送同步包告诉客户端我也要给你发消息了

第三次:

客户端发送确认包(服务器发的同步包的值+1)告诉服务器我准备好了,服务器收到确认包后三次握手结束,建立连接

三次握手(详解)

第一次:

从客户端调用connect开始,客户端发送一个同步包给服务器,告诉服务器我要给你发消息了

同步包:SYN=1,sep=k

第二次:

服务器收到客户端的同步包后,发现SYN=1,知道客户端是要建立新的连接,发送确认包告诉客户端我同意你的请求

确认包:将同步包内的sep的k值+1,确认序号Ack=k+1,将ACK=1使确认序号生效

并且告诉客户端我要给你发消息了(发送同步包)

同步包:SYN=1,sep=j

第三次:

1)客户端收到确认包后,发现

确认序号Ack=k+1,并且ACK=1

得知服务器将我发给他的sep值+1了,并且ACK=1,同意了我的连接请求
2)收到同步包后,发现SYN=1,知道服务器要和我建立连接了

同步包:SYN=1, sep=j

3)客户端发送确认包告诉服务器我知道了,服务器收到之后连接建立

确认包:Ack=j+1,ACK=1

四次挥手(精简)

msl:一个数据包在网络上的存活时间最多为1个msl,2分钟
FIN是一个标识符,FIN=1表示释放连接

第一次:

客户端调用close开始,发送同步包告诉服务器我不再给你发消息了

同步包:FIN=1, sep=k

第二次:

服务器发送确认包(同步包内值+1)告诉客户端我知道了

确认包:Ack=k+1,ACK=1

第三次:

服务器调用close,发送同步包告诉客户端我也不给你发消息了,此时服务器会等待1msl,若1msl后客户端无响应会再次发送请求

同步包:FIN=1,sep=w

第四次:

客户端发送确认包(服务器发送的同步包内的值+1)告诉服务器我知道了,此时会等待2msl,服务器收到之后连接断开

确认包:Ack=w+1,ACK=1


为什么四次挥手中第三次挥手和第四次挥手不能同时进行

因为第一次挥手时仅代表客户端不再发送消息,但还可以接收消息
服务器收到请求后recv解阻塞,既可以选择发送一些数据给客户端之后再调用close关闭发送功能,也可以马上调用close关闭发送功能,这是不确定的,所以要分开进行

②为什么要等待2msl:

1)2msl在客户端第四次挥手时启动,发送Ack回复可能因为网络原因1个msl后才到达服务器,也可能会丢失
2)服务器在第三次挥手时发送了断开请求,在1个msl后没有收到客户端的回复,会再次发送断开请求,这个请求可能因为网络原因需要1个msl才到达客户端,一发一收2次,所以需要等待2个msl
3)为了防止以上情况再次发生,客户端收到断开请求并回复后会刷新2msl时间,防止最后一个Ack服务器没有收到

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值