HTTP三次握手,四次挥手记不住?不明白?拿来吧你

1,604 阅读3分钟

前置

1、HTTP概述
HTTP中文名为:超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。

2、TCP6个标志位
SYN(synchronous建立联机) 、ACK(acknowledgement 确认)、 PSH(push传送)、FIN(finish结束)、RST(reset重置)、URG(urgent紧急)

三次握手

我们以(鲁班)给(鲁班大师)打电话为例

sequenceDiagram
鲁班->>鲁班大师: 喂,你好 ? SYN(seq = x)?
鲁班大师->>鲁班:  ACK(ack = x + 1)SYN(seq = y)喂,你好,能听到吗 ?
鲁班-)鲁班大师:  ACK(ack = y + 1) 我能听到!

解析

此处的(鲁班)就是我们的客户端、(鲁班大师)就是服务端

  • 第一次握手
    鲁班拿出手机(此处代表客户端机器),拨通了鲁班大师的电话(此处代表服务端)在三声嘟嘟嘟,说了句喂,你好?并丢出了一个SYN包,包里有个Synchronize Sequence Numbers(也就是seq=x),它的值为x,然后满意的把手机设为SYN_SENT状态,等待鲁班大师回答。
  • 第二次握手
    这时鲁班大师电话响了,接通电话,就迎面砸来了鲁班丢来的包,然后打开包一看里面有个x,根据他多年的经验,立马就生成了一个ACK确认包,包里有个Acknowledge number(也就是ack = x + 1),这时他想了想,不能被白砸,于是也生成了一个SYN包,并放入(seq = y),随之将两个包一并丢给鲁班,然后开心的将手机设为SYN_RECV状态,等待鲁班回应。
  • 第三次握手
    鲁班等了会,接到了鲁班大师丢来的两个包,打开一看,ACK(ack = x + 1)SYN(seq = y),聪明的鲁班心领神会,仿照鲁班大师,也丢出了ACK(ack = y + 1)的包,发送完毕之后,客户端和服务器进入ESTABLISHED,这时TCP连接成功,三次握手完毕。

注:以上许多情景纯属析构,只是为了方便理解和记忆,参考原理即可,并附上正规的三次握手图

sequenceDiagram
客户端->>服务端: SYN(seq = x)
服务端->>客户端:  ACK(ack = x + 1)SYN(seq = y)
客户端-)服务端:  ACK(ack = y + 1) 

这时小伙伴就提出了问题,干嘛非要三次,两次不香吗?

以我们的想法,两次确实可以,但是出于安全考虑,第三次握手是非常重要的。

第一次握手,服务器可以知道客户端是可以发送消息的
第二次握手,客户端知道,服务器是可以连接的
第三次握手,服务器可以很明确的知道,我发给客户端的东西,客户端是可以接收到的

倘若没有第三次握手,第二次握手完成后,服务端就直接发送东西给客户端,而不巧的是,这时候客户端却断开了连接,服务端却不知道,依然给客户端发送东西,那客户端肯定是无法接收到服务端发来的东西的,由此可见,三次握手必不可少

四次挥手

情景再现

经过一段时间,鲁班对鲁班大师已经无话可说了,于是决定挂断电话

sequenceDiagram
鲁班->>鲁班大师: 我说完了,准备挂电话了 FIN(x),
鲁班大师->>鲁班:  哦 ACK(x + 1)
鲁班大师->>鲁班:  我也说完了 FIN(y)
鲁班->>鲁班大师: 哦 ACK(y + 1)

解析

  • 第一次挥手
    鲁班对鲁班大师说:“我说完了”。并发送一个FIN(x)的通知
  • 第二次挥手
    鲁班大师接收到FIN(x)通知之后,说了句:“哦”,然后发送一个确认包给鲁班ACK(x + 1)
  • 第三次挥手
    鲁班大师想起来,得告诉鲁班他也没话说了,于是对鲁班说:“我也说完了”。并发送一个FIN(y)通知给鲁班
  • 第四次挥手
    鲁班接收到FIN(y)通知之后,发送确认包ACK(y + 1)给鲁班大师,然后断开连接

至此,四次挥手结束,并附上挥手图

sequenceDiagram
客户端->>服务端: FIN(x),
服务端->>客户端:  ACK(x + 1)
服务端->>客户端:  FIN(y)
客户端->>服务端: ACK(y + 1)