TCP和UDP 的不同点
- TCP 是基于连接, 而UDP基于 非连接。
- TCP 传输数据稳定,适用于对网络通讯质量要求较高的场景。
- UDP 的优点是速度快,但是可能丢包,适用于对实时性要求较高的场景,对少量丢包没有要求的场景。比如域名查询,语音通话,视频直播等。
- UDP 适用于隧道网络。(比如VPN,VXLAN)
TCP 就好比 打电话 UDP 就好比写信
- UDP 无法确认对方是否能接收到。 TCP可以。
- UDP 无法确认传输的顺序是否正确。 TCP可以。
- UDP 无法确认传输的内容是否完整。 TCP可以。
TCP 三次握手
这是一个建立连接的过程
客户端发送给服务端一个SYN包,请求连接。
服务端接收后返回一个SYN+ACK包确认。
客户端接收后返回一个ACK包,这时候连接就建立完成了。
为什么是三次握手而不是两次握手?为什么服务端接收后返回一个SYN+ACK包就建立连接?
- 这是为了防止已经失效的请求报文,突然又传输到服务器。
- 如果只才用两次握手就建立连接,如果第一次发送的 SYN1 包因为某些原因,产生了滞留,没有发送过去。
- 这时客户端又发送 SYN2 包重新建立连接, 这次得数据包成功到达。服务端回复 SYN+ACK 之后建立连接。
- SYN1 包,突然恢复发送过来, 这时候服务端会误认为客户端又发送起一个连接,从而在两次握手之后进入等待状态。
- 这个时候 服务端认为是两个连接, 客户端认为是一个连接, 造成状态不统一。
- 如果是在三次握手的情况下,服务端收不到最后的 ACK 包 就不会建立连接。
所以三次握手的本质,就是为了在不可靠的信道上,建立起可靠的连接。
如何处理丢包问题?如何处理乱序问题
- tcp 协议为每一个连接都建立了一个 发送缓冲区。
- 从建立连接后的第一个字节的序号为0,后面每个字节都会加1。
- 发送数据时, 从发送缓冲区 取出一部分数据组成发送报文, 在TCP协议头中会附带序列号和长度。
- 服务端端在接收之后需要回复确认报文。 确认报文 ACK = 序列号 + 长度 = 下一个包需要发送的起始序列号。
- 这样一问一答的发送方式,能够确认客户端发送的数据是否被接收。
- 客户端也可以一次性发送 连续的多包数据, 服务端只需要回复 一个 ACK 确认就行。
- 客户端可以把发送的数据分割成一系列的碎片,发送过去。
- 服务端根据序列号和长度进行组合,在接收完之后重构成完整的数据。
- 假设出现丢包问题, 服务端可以要求客户端重新发送, 服务端发送丢失的包的序列号 (假如:ACK = 100 + 100),ACK = 序列号 + 长度。 以确保不会丢包。
为什么是四次挥手?
- 客户端主动发送 FIN 包 关闭请求,自己进入终止等待状态。 (第一次挥手)
- 服务端收到 FIN 包, 回复一个 ACK 包,表示自己进入关闭等待状态。(第二次挥手)
- 这时候还能继续接收和发送数据。
- 等待数据发送完毕, 服务端发送一个 FIN 包,进入最后确认状态。(这是第三次挥手)
- 客户端收到之后回复 ACK 包,进入超时等待状态。经过超时等待时间之后关闭连接。(这是第四次挥手)
为什么客户端需要等待超时连接时间?
- 这是为了保证对方已收到 ACK 包。
- 假设客户端发送完 ACK 包,就释放了连接。如果 ACK 包在网络中丢失,服务端将一直无法关闭。
- 如果客户端发送完 ACK 包,等待一段时间,服务端没有收到 ACK 包, 就会重新发送一个 FIN 包, 客户端响应这个 FIN 包, 并 刷新超时时间。
四次挥手也是保证在不可靠的信道上,建立起可靠的连接。
UDP 协议
- UDP 协议是基于非连接的。
- 就是封装一下数据,直接发送出去。
- 数据包之间没有状态上的联系。
- 性能损耗非常小,cpu 内存占用的资源也非常少。
- 不能保证丢包问题。稳定性弱。
文章总结于: www.bilibili.com/video/BV1kV…
看文章还看不懂的小伙伴可以再看一下视频。