HTTP02三次握手四度挥手

三次握手

A:我准备好了你准备好了吗,收到请回答。
B:收到收到,我也准备好了,收到请回答。
A:收到收到

粗略理解

  • step01 A询问B服务器,并带着序号seq=x的问题
    • SYN=1,seq=x
  • step02 B用 ack=x+1响应seq=x的问题,同时问了A一个问题 SYN=1,seq=y
    • ACK=1,ack=x+1,SYN=1,seq=y
  • step03 A回答B的问题,同时当前问题的序号加1
    • ACK=1,ack=y+1,seq=x+1

SYN 是啥?

  • 就是一个确认报文
  • SYN=1 代表向对方询问。 我已经OK了,我要去问你了,同时要加一个序号 seq = x,

序号 seq

保证 每次询问的问题都会有一个seq,这样即使 对方没有反应,下次询问的时候又有新的序号,不会发生错乱

ACK=1 代表回答

ack=x+1 代表 回答你刚刚seq=x的问题

TCP规定SYN=1时不能携带数据,但要消耗一个序号,因此声明自己的序号是 seq=x

四步挥手

1.客户端发送一个 FIN ,告诉服务器想关闭连接。
2.服务器收到这个 FIN ,发回一个 ACK。(关闭需要时间,此时只是回应知道这个事了)
3.服务器通知应用程序关闭网络连接,应用程序关闭后通知服务器。服务器发送一个 FIN 给客户端 。 (真的关闭后,再次发送FIN给客户端,同时告诉你也关闭吧,我已经关了)
4.客户端发回 ACK 报文确认。

为什么挥手要四步

这是因为服务端的 LISTEN 状态下的 SOCKET 当收到客户端建立连接请求的SYN 报文后,它可以把 ACK 和 SYN ( ACK 起应答作用,而 SYN 起同步作用)放在一个报文里来发送。但关闭连接时,当服务器收到客户端的 FIN 报文通知时,服务器只能发一个回应报文ACK:“哦,我知道了”,然后通知应用程序。应用程序完成全部数据发送并确定可以终止了,服务器才能发送FIN告诉客户端可以真正断开连接了。所以这一步ACK报文和FIN报文需要分开发送,因此多了一个步骤。

TCP报文格式

  • ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1。
  • SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。
  • FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

参考链接