29-TCP

Zoella Lv3

图1

一、TCP 和 UDP 的区别

TCP 和 UDP 都是传输层协议,不同点在于:

  • TCP 是 面向连接的、可靠的、面向字节流
  • UDP 是 面向无连接

TCP 的三大核心特性

1、面向连接

在客户端和服务器互相通信之前,TCP 需要三次握手建立连接,而 UDP 不需要

2、可靠性

TCP 的可靠性体现在有状态、可控制

(1)有状态

TCP 会记录发送的数据,以及其中被接收和未被接收的数据,并保证数据包按序到达

(2)可控制

当意识到丢包或网络不佳,TCP 会根据情况调整自身行为,控制发送速度或者重发

3、面向字节流

UDP 的数据传输是基于数据报的,这仅仅继承了 IP 层的特性;而 TCP 为了维护状态,将 IP 包变成了字节流

二、TCP 三次握手过程 & 为什么是三次

1、流程

发送与接收方需要确认双方的两种能力:发送和接收,于是会有三次握手的过程:

图2

(1)服务器变为 LISTEN

起初双方都处于 CLOSED 状态。服务端开始监听某个端口,进入 LISTEN 状态

(2)客户端变为 SYN-SENT

客户端主动发起连接,发送 SYN,并进入 SYN-SENT 状态

其中 seq=x,表示客户端告诉服务端,我发送的首个数据包 序列号从 x 开始

(3)服务端变为 SYN-REVD

服务端接收到,返回 SYN 和 ACK(对应客户端发来的 SYN),并进入 SYN-REVD 状态

其中 seq=y,ack=x+1,seq=y 表示服务端的初始序列号是 y ,ack=x+1 表示服务端告诉客户端:已收到从序列号 x 开始的数据包,期望下次发送从序列号 x+1 开始的数据包

(4)客户端变为 ESTABLISHED

客户端再发送 ACK 给服务端,并进入 ESTABLISHED 状态

其中 seq=x+1 ,ack=y+1 。seq=x+1 表示客户端按照服务端的期望,从序列号 x+1 开始发送数据包,ack=y+1 表示客户端告诉服务端:已收到从序列号 y 开始的数据包,期望下次发送从序列号 y+1 开始的数据包

服务端收到 ACK 之后,也进入 ESTABLISHED 状态

注意:凡是需要对端确认的,一定会消耗 TCP 报文的序列号。
SYN 需要对端的确认,而 ACK 不需要,因此 SYN 消耗一个序列号,下次发送对应的 ACK 序列号要加 1,而 ACK 不需要。

2、为什么不是两次握手

根本原因:没有第三次握手,服务端无法确认客户端的接收能力

如果是两次,客户端发送 SYN 报文试图和服务端建立连接,但是这个包发生了滞留;一段时间后,客户端未收到服务端响应,以为丢了包,于是重传,两次握手建立好了连接。

但是在连接关闭后,如果滞留的包到达了服务端,这时由于是两次握手,服务端只要接收到、并给客户端发送了相应的数据包,就默认建立连接,但是此时客户端已经断开,这就带来了资源的浪费。

3、三次握手过程中可以携带数据么

第三次握手可以携带数据,前两次握手不能携带

如果前两次握手能够携带数据,一旦有人想攻击服务器,只需要在第一次握手中的 SYN 报文中放大量数据,服务器势必会消耗更多的时间和内存空间去进行处理,增大了服务器被攻击的风险

第三次握手时,客户端已处于 ESTABLISHED 状态,并且能够确认服务器的接收、发送能力正常,这时相对安全,可以携带数据

三、TCP 四次挥手的过程

  • Title: 29-TCP
  • Author: Zoella
  • Created at : 2024-11-05 17:31:10
  • Updated at : 2024-11-05 21:39:41
  • Link: https://zoella-w.github.io/2024/11/05/29-TCP/
  • License: This work is licensed under CC BY-NC-SA 4.0.