TCP/IP三次握手与四次挥手总结

三次握手:

  客户端A    服务端B
1. A发出请求联机,SYN=1和seq number=i的SYN包给B,并进入SYN_SEND状态
2. B收到后确认联机信息 ,向A发送ACK包(ack=1,ack number=i+1)和一个SYN包(syn=1,seq number=k)给A ,此时B进入SYN_RECE状态
3. A收到B发来的SYN+ACK包,检查ack number是否是i+1和ack标志位是否是1,如果是则向服务端B发送确认包ACK(ack number=k+1,ack=1),此包发送完毕客户端和服务端都进入established状态,完成三次握手。

 四次挥手:

1. A向B发送TCP包,用了关闭客户端到服务端的数据传送,将标志FIN=1,seq number=i,A进入FIN_WAIT1状态。
2. B收到FIN后,发送一个ACK(ack=1,ack number=i+1)还有一个seq number=j 给A, B进入CLOSE_WAIT(因为服务器B向A发送的数据不一定也发完)状态,A收到回应ACK报文后进入FIN_WAIT2状态
3. 服务器B发送一个TCP包,用来关闭服务端到客户端的数据传送,标志位FIN=1,ACK=1,seq number=k,ack number= i+1,B进入LAST_ACK状态
4.A收到FIN后,A进入TIME_WAIT,接着发送一个ACK(ack=1ack number=k+1)和seq number=i+1给B,B收到后进入CLOSED状,A还要等待2倍的MSL时间进入Closed状态


MSL(Maximum Segment Lifetime)报文最长存活时间


为什么建立连接协议是三次握手,而关闭是四次握手呢?

  因为服务端LISTEN状态下的SOCKET当收到SYN报文的建立请求后,可以把ACK和SYN放在一个报文里来发送,但是关闭连接的时候,当收到对方的FIN报文时,它只是表示对方没有数据可发了,但是你的数据未必全部发送给对方,所以未必会马上关闭SOCKET,所有可以先发个ACK报文给对方,等自己的数据全部发完给对方后,再发FIN报文来表示自己现在可以关闭连接了。所以ACK报文和FIN报文大多数是分开发的。

 为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

  因为无法保证最后发送的ACK报文一定会被对方收到,也就是说对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用是用来重发可能丢失的ACK报文。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值