超简单了解三次握手与四次挥手

简单介绍TCP协议

TCP 是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的 “连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息,如 ip 地址、端口号等。

以小故事来通俗理解三次握手与四次挥手

举个栗子,我们把客户端来比作男孩子,服务端比作女孩子,用他们从认识到谈恋爱的过程来说明‘三次握手’,用他们从恋爱到分手的过程来说明‘四次挥手’。

  1. ‘第一次握手’:男孩喜欢上了女孩子,想办法对女孩子进行告白,但是由于男孩子比较腼腆,所以他想到了写情书告诉女孩子说:“请和我交往吧!”。写完信把信放到邮筒,寄给女孩子。
  2. ‘第二次握手’:女孩子收到男孩子寄来的情书,心花怒放。原来女孩子也喜欢这个男孩子。于是给男孩子回信说:“我收到你的来信了,我们在一起吧!”。然后将信寄了回去。
  3. ‘第三次握手’:男孩子收到了女孩子的来信,然后两个人约在一个周末准备去旅游,过恩爱周末!三次信封,通俗的代表了三次握手,来确认客户端与服务端连接是否正常。

接着:我们来说四次挥手。

  1. ‘第一次挥手’:日久见人心,因为种种原因,男孩和女孩不得不分手,于是男孩决定先说分手,便写一封信告诉女孩。
  2. ‘第二次挥手’:女孩收到信之后,知道了男孩要和自己分手,默默流泪,然后写信给男孩说要给男孩收拾行李。
  3. ‘第三次挥手’:女孩把男孩送的东西都整理好了,于是再次写信给男孩:你的东西我整理好了,过来取行李吧。
  4. ‘第四次挥手’:孩收到女孩第二封信之后,知道了女孩收拾好东西了,可以正式分手了,于是再次写信告诉女孩:我知道了,这就去拿回来!

四次信封,通俗的代表了四次挥手。

关于三次握手

三次握手即TCP连接的建立。这个连接必须是一方主动打开,另一方被动打开的。
超简单了解三次握手与四次挥手_第1张图片

图的解释:

  1. client 端发送 syn 字段,请求连接
    第一次:客户端发送网络包,服务器收到了。这样服务器得出结论:客户端的发送能力、服务端的接收能力是正常的。
  2. server 端回复 ack、syn 字段字段确定与之连接
    第二次:服务端发包,客户端收到了。此时客户端得出结论:服务端的接收、发送能力正常,客户端的接收、发送能力正常
  3. client 接到确认后进入 established 已建立状态,并发送 ack 字段确认对方的连接
    第三次:客户端发送的包,服务端收到了。这样服务端就能得出结论:服务端的接收、发送能力正常,客户端的接收、发送能力正常

为什么要进行三次握手?

“三次握手” 的作用就是双方都能明确自己和对方的收、发能力是正常的。
他是为了防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。


关于四次挥手

四次挥手即TCP连接的释放(解除)。连接的释放必须是一方主动释放,另一方被动释放。

图的解释:

  1. 客户端发送 FIN 字段,客户端进入 fin_wait1 状态,服务端进入 close_wait 状态
  2. 服务端回复 ACK 字段,客户端进入 fin_wait2 状态
  3. 服务端再次发送 FIN 字段,服务端并进入 last_ack 状态
  4. 客户端确认,回复 ACK字段,客户端进入 time_wait 状态,服务端进入关闭状态

为什么“握手”是三次,“挥手”却要四次?

TCP建立连接时之所以只需要“三次握手”:在二次握手中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。收到建立请求的报文后,把 ACK 和 SYN 放在一个报文里发送。

TCP释放连接时之所以需要“四次挥手”:当接收到主动方的 FIN 报文后,并不能立即释放连接,因为还有必要的数据需要处理,所以服务器先返回ACK确认收到报文,经过CLOSE-WAIT阶段准备好释放连接之后,才能返回FIN释放连接报文。

所以是“三次握手”与“四次挥手”。


图片来源:[小康博客](https://www.antmoe.com/posts/eaefe101/index.html)

你可能感兴趣的:(网络通信,网络通信)