Skip to content

TCP与UDP

 at 14:17(Updated)

UDP

面向报文

  UDP 是一个面向报文(报文可以理解为一段段的数据)的协议。意思是 UDP 只是报文的搬运工,不会对报文进行任何拆分和拼接操作。 具体来说

不可靠性

高效

  因为 UDP 没有 TCP 那么复杂,需要保证数据不丢失且有序到达,所以 UDP 的头部开销小,只有八字节,相比 TCP 的至少二十字节要少得多,在传输数据报文时是很高效的。

udp-header

UDP 头部包含了以下几个数据:

传输方式

  UDP不止支持一对一的传输方式,同样支持一对多、多对多、多对一的方式,也就是说 UDP 提供了单播、多播、广播的功能

TCP

头部

TCP 头部比 UDP 头部复杂的多

tcp-header

对于 TCP 头部来说,以下几个字段是很重要的

建立链接三次握手

tcp-link

  在 TCP 协议中,主动发起请求的一端为客户端,被动连接的一端为服务端。不管是客户端还是服务端,TCP 连接建立完后都能发送和接收数据,所以 TCP 也是一个全双工的协议。

  起初,两端都为 CLOSED 状态,在通信开始前,双方都会创建 TCB。服务器创建完 TCB 后进入 LISTEN 状态,此时开始等待客户端发送数据。

PS:第三次握手可以包含数据,通过 TCP 快速打开(TFO)技术。起始只要涉及到握手的协议,都可以使用类似 TFO 的方式,客户端和服务端存储相同 cookie ,下次握手时发出 cookie 达到减少 RTT 的目的。

明明两次握手就可以建立起连接,为什么还需要第三次应答?

  因为这是为了防止失效的连接请求报文段被服务端接收,从而产生错误。举个例子:

  客户端发送了一个连接请求A,但是因为网络原因造成了超时,这是 TCP 会启动超时重传的机制再次发送一个连接请求B。此时请求顺利到达服务端,服务端应答完就建立了请求。如果连接请求A在两端关闭后终于抵达了服务端,那么这时服务端会认为客户端又需要建立 TCP 连接,从而应答了该请求并进入 ESTABLISHED 状态。此时客户端其实是 CLOSED 状态,那么就会导致服务端一直等待,造成资源浪费。 (在建立连接中,任意一端掉线,TCP 都会重发 SYN 包,一般会重试五次,在建立连接中可能会遇到 SYN FLOOD 攻击。遇到这种情况可以选择调低重试次数或者干脆在不能处理的情况下拒绝请求)

断开链接四次握手

tcp-close

  TCP是全双工的,在断开连接时两端都需要发送 FIN 和 ACK

为什么客户端要进入TIME-WAIT 状态,等待 2MSL 时间后才进入 CLOSED 状态?

  为了保证服务端能收到客户端的确认应答。若客户端发完确认应答后直接进入 CLOSED 状态,如果确认应答因为网络问题一直没有到达,那么会造成服务端不能正常关闭。

常见面试题

为什么连接的时候是三次握手,关闭的时候却是四次握手?

为什么不能用两次握手进行连接?

如果已经建立了连接,但是客户端突然出现故障了怎么办?

什么是SYN洪泛攻击?

推荐文章