乐趣区

关于程序员:计算机网络-第一章-TCP协议的三次握手

  • 视频教程:一条视频讲清楚 TCP 协定与 UDP 协定 - 什么是三次握手与四次挥手_哔哩哔哩_bilibili
  • 视频教程:TCP 三次握手和四次挥手_哔哩哔哩_bilibili

1、TCP 协定和 UDP 协定

  • TCP 协定和 UDP 协定都工作在传输层。

1)TCP 协定

  • TCP 协定是基于连贯的,相当于打电话,只有对方接起来电话,通话才会开始。
  • TCP 协定的长处是稳固牢靠,实用于对网络通信品质较高的场景,比方传输文件,发送邮件,浏览网页等。

2)UDP 协定

  • UDP 协定是基于非连贯的,相当于寄一封信,信寄出去后,不论对方是否收到信(是否丢包),也不论多封函件是否按程序达到(数据包乱序)。
  • UDP 协定的长处是速度快,然而可能产生丢包,实用于对实时性要求较高然而对大量丢包没有要求的场景,比方语音通话,视频直播。

2、TCP 协定的连贯

  • SYN 包,指 synchronization,意为同步。
  • ACK 包,指 acknowledgment,意为确认。
  • FIN 包,指 finish,意为终止。

1)三次握手

  • 三次握手是建设连贯的过程。三次握手的实质是为了解决网络信道不牢靠的问题,为了在不牢靠的信道上建设牢靠的连贯。

(1)第一次握手

  • 客户端会随机初始化序号,将该序号搁置在 TCP 首部的【序号】字段中,同时把 SYN 标记地位 1,示意 SYN 报文。
  • 接着把第一个 SYN 报文发送给服务端,示意向服务端发动连贯,该报文不蕴含应用层数据,之后客户端处于 SYN-SENT 状态。

(2)第二次握手

  • 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化本人的序号,将此序号搁置在 TCP 首部的【序号】字段,其次把客户端的序号 + 1 并搁置在 TCP 首部的【确认号】,而后把 SYN 标记位和 ACK 标记位都置 1。
  • 接着把该报文发送给客户端,该报文也不蕴含应用层数据,之后服务端处于 SYN-RCVD 状态。

(3)第三次握手

  • 客户端收到服务器报文后,还须要向服务器发送一个应答报文。首先该应答报文的 TCP 首部 ACK 标记位为 1,其次把服务端的序号 + 1 并搁置在 TCP 首部的【确认号】。
  • 最初把应答报文发送给服务端,== 这次报文能够携带服务端的数据,== 服务端收到应答报文后,连贯建设。

(4)DDOS 攻打

  • 实际上,如果黑客一直向服务端发送 SYN 包又不进行下一步,服务器须要一直记住对方的序号和本人新生成的序号,最终导致服务器奔溃,这就是典型的 DDOS 攻打。因而,服务器罗唆不保留本人的序号,通过服务器的 IP 地址和端口等公有信息进行算法运算失去序号。

2)四次挥手

  • 处于连贯状态的客户端和服务端都能够被动发动敞开连贯申请。

(1)第一次挥手

  • 假如客户端被动发动敞开连贯申请,此时客户端向服务端发送一个 TCP 首部的 Fin 标记位被置 1 的报文,即 FIN 报文,之后客户端本人进入终止期待 1 状态。
  • 客户端向服务端发送 FIN 时,仅仅示意客户端不再发送数据了然而还能接收数据。

(2)第二次挥手

  • 服务端收到 Fin 包后,向客户端发送一个 ACK 包,服务端进入了敞开期待状态。

(3)第三次挥手

  • 客户端收到服务端的 ACK 报文后,进入终止期待 2 状态。
  • 服务端此时还能够发送未发送的数据,而客户端还能够接收数据。
  • 服务端不再发送数据时,向客户端发送一个 Fin 包,并进入最初确认状态。

(3)第四次挥手

  • 客户端收到服务端的 Fin 包后,向服务端发送 ACK 包,并进入超时期待状态。
  • 服务端收到 ACK 包后,进入 closed 状态,至此服务端实现连贯的敞开。
  • 客户端期待 2MSL 一段时间后,主动进入 closed 状态,至此客户端实现连贯的敞开。

    • MSL 指的是 Maximum Segment Lifetime:一段 TCP 报文在传输过程中的最大生命周期。
    • 2MSL 即是服务器端收回为 FIN 报文和客户端收回的 ACK 确认报文所能放弃无效的最大时长。

3、为什么不是两次握手?

  1. 为了避免曾经生效的申请报文,忽然又传到服务器引起谬误。
  2. 假如是两次握手,客户端向服务器发送 SYN 包(A),因为某些起因,导致 SYN 在网络中滞留。
  3. 客户端在期待了一段时间后,发现没有收到服务端的确认报文,会从新发送 SYN 包(B),B 包胜利达到了服务端,服务端发送确认报文给客户端,连贯建设。
  4. 一段时间后,服务器收到了 A 包,服务器发送确认报文给客户端,连贯建设。
  5. 此时呈现了问题,客户端认为只建设了一个连贯,而服务端认为建设了两个连贯,造成了状态不统一。
  6. 在三次握手的状况下,服务端没有收到客户端第三次握手的 ACK 包,就不会认为连贯建设胜利。

4、为什么不是四次握手?

  • 因为通信不可能 100% 牢靠,而下面的三次握手曾经做好了通信的筹备工作,再减少握手,并不能显著进步可靠性,而且也没有必要。
退出移动版