计算机网络 第一章 TCP协议的三次握手

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%可靠,而上面的三次握手已经做好了通信的准备工作,再增加握手,并不能显著提高可靠性,而且也没有必要。

你可能感兴趣的:(程序员)