1. 三次握手与四次挥手
1.1 三次握手
- 为什么建立连接的时候是三次握手,而不是两次握手?
- 是为了防止已经失效的报文突然又传到服务器引起错误。假设是利用两次握手建立连接,在某个时间节点,客服端向服务器发送了一个 SYN1 包请求建立连接,但是由于某些未知原因,该包未正常到达服务端。为了建立连接,客服端回重新发送 SYN2 包,这次的请求包正常到达服务端,然后服务端返回 SYN + ACK 包建立起了连接。但是这时 SYN1 包又重新到达服务端,服务端会认为这是客户端又发起的新的连接,于是又回复了一个 SYN + ACK 包,进入等待数据状态。上面的这个过程会导致服务端认为建立了两个连接,而客户端认为只有一个连接,造成了状态不一致的情况。但如果是三次握手的话,即使服务端收到了错误的 SYN1 包,但是由于没有收到客户端发送的 ACK 包,所以不会建立第二条连接。所以 TCP 的三次握手本质上是为了解决网络信道不可靠的问题,为了在不可靠的信道上建立起可靠的连接。
2. 为什么说 TCP 协议是可靠的协议(怎么解决丢包问题、乱序问题)? - TCP 协议为每一个连接建立一个发送缓冲区(index 从 0 开始),发送数据时从发送缓冲区取一部分数据组成报文,在其 TCP 协议头中会携带序列号和长度。接收端在收到数据后会回复确认报文,确认报文中的 ACK 等于序列号加长度(下一包数据的起始序列号)。通过序列号和长度将乱序数据包重组;通过接收端返回的 ACK 信息确认是否需要重传。
1.2 四次挥手
2. TCP 和 UDP
TCP 和 UDP 都是传输层协议,传输二进制文件
TCP 是基于连接的,稳定可靠;UDP是基于非连接的,传输速度快
99. 参考
|