白话文理解TCP、TCP三次握手、TCP四次挥手

1,864 阅读5分钟

前言:本文主要是分享一下关于对TCP、UDP、TCP三次握手、TCP四次挥手的个人理解,尽量用白话文的方式去解释,但是肯定会夹杂一些专业名词,对这一块一无所知的小白兄弟请见谅。

什么是TCP协议?

设备(手机/电脑)能够使用联网功能是因为设备底层实现了TCP/IP协议,可以使设备终端通过网络建立TCP连接。TCP协议可以对上层网络提供通道,使上层网络数据的传输建立在“无差别”的网络之上。

可以简单理解TCP相当于一个连接通道,而HTTP、HTTPS就是基于这个连接通道的应用:运输员。

TCP三次握手相当于 建立连接通道,而TCP四次挥手相当于 关闭连接通道。

最后上一张OSI 7层网络模型(这里看不懂没关系,结合下文食用味道更好)

OSI.png

TCP三次握手和TCP四次挥手发生在哪里?

不带着问题驱动去解决问题就是耍流氓,

这里引用一道常见的面试题:从输入URL地址到看到页面,中间都经历了啥?去理解TCP三次握手和TCP四次挥手应用在哪?

从输入URL地址到看到页面,中间都经历了啥?(这里只讲简单步骤,因为本文主要是为了去白话文描述一些TCP的相关问题)

  1. URL地址解析
  2. 缓存检查
  3. DNS解析
  4. TCP三次握手
  5. 数据传输
  6. TCP四次挥手
  7. 页面渲染

可以看到TCP三次握手和TCP四次挥手主要发生在于数据传输的前后。

TCP三次握手是什么?

客户端通过IP向服务器发起请求获取数据,此时需要我们客户端和服务器建立起网络连接通道(只有建立了网络连接通道我们才能通过IP地址向服务器获取数据 ),这个建立通道的过程就是TCP三次握手。

TCP为了使通道更加稳定可靠,TCP三次握手就是三次效验的过程。

效验的常用名词:

  • seq序号,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记
  • ack确认序号,只有ACK标志位为1时,确认序号字段才有效,ack=seq+1
  • 标志位
  • ACK:确认序号有效
  • RST:重置连接
  • SYN:发起一个新连接
  • FIN:释放一个连接
  • ……

效验的过程:

tcp3.png

三次握手为什么不用两次,或者四次呢?

TCP作为一种可靠传输控制协议,其核心思想:既要保证数据可靠传输,又要提高传输的效率!

  • 简单说就是两次不够稳定(不够可靠)
  • 四次效率不高

TCP四次挥手是什么?

TCP四次挥手的目的是断开TCP连接通道。

TCP四次挥手和TCP三次握手一样都是客户端主动发起的。

那么客户端什么时候发起TCP四次挥手呢?

当客户端把信息(请求头、请求主体……)传给服务器之后,它就开始发起我们这个TCP四次挥手(断开链接)的请求。

为什么建立连接通道的时候是三次握手,而关闭连接通道的时候是四次挥手?

理论性解释:

服务器端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文

但关闭连接时,当服务器端收到FIN报文时,很可能并不会立即关闭链接,
所以只能先回复一个ACK报文,告诉客户端:”你发的FIN报文我收到了”,

只有等到服务器端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送,故需要四步握手。

假如关闭连接通道也是三次挥手,会这样::

1.当客户端将信息(请求头、请求主体……)传给服务器之后,它就立马通知 服务器端 我准备要关闭连接通道了

1.当客户端将信息(请求头、请求主体……)传给服务器之后,它就立马通知 服务器端 我准备要关闭连接通道了

2.由于数据传输的内容相对过大且准备数据传输内容需要时间,
服务端等响应数据内容准备好并将响应数据内容和回应客户端的话:我收到你要断开连接的通知了
传输给客户端。(由于等待时间过长没有响应,客户端会想服务器这小子到底听到了没啊?都不理人的)
(这个过程会相对漫长耗时,此时过程中客户端并不知道服务器端是否知道自己要断开连接的通知,就无法准备断开连接的工作)

3.客户端:好的,再见。

这样的过程显然是不合理的。

而四次挥手,便显得更加的合理:

1.当客户端将信息(请求头、请求主体……)传给服务器之后,它就立马通知 服务器端 我准备要关闭连接通道了

2.由于数据传输的内容相对过大且准备数据传输内容需要时间,
服务器端无法第一时间将数据传输给客户端,
但是它需要告诉客户端一声:我知道了,你等我把数据内容传输给你后就断开连接吧。(立即回答)

3.服务器端 将 客户端请求的数据返回给客户端,同时,服务器再告诉客户端:你要的东西我都给你了

4.客户端收到数据后,告诉服务器端:你给我的东西我收到了,那我断开连接了,再见

结合上面的铺垫,那就可以用下面的图片来表示了:

TCP4.png