tcp
TCP
https://lucifer.ren/fe-interview/#/topics/network/tcp
TCP 三次握手和四次挥手
三次握手
- 客户端发消息给服务端(SYN)
- 服务器针对客户端的 SYN 返回一个 ACK,并且发送一个 SYN 给客户端
- 客户端针对服务端的 SYN 返回一个 ACK,服务端收到后确认连接
四次挥手
- 客户端要求断开连接,发送一个断开的请求,这个叫作(FIN)
- 服务端收到请求,发送给客户端一个 ACK,作为 FIN 的响应
- 同时通知自己相应的应用程序:对方要求关闭连接,可能还有发送出去的消息没响应,或者还有资源需要释放。确认可以关闭连接后,服务器向客户端发送一个 FIN
- 客户端收到这个 FIN 后,确认可以关闭连接,向服务端发送一个 ACK 表示连接彻底释放
TCP 如何保证可靠传输
- 握手,应答机制
- 滑动窗口控制
- 滑动窗口是 TCP 协议控制可靠性的核心。发送方将数据拆包,变成多个分组,然后将这些分组放入一个拥有滑动窗口的数组,按先入先出(FIFO)的顺序依次发出。
- 窗口中的分组会一次性发送
- 窗口中最小的分组如果收到 ACK,窗口就会发生滑动,如果最小序号的分组长时间没有收到 ACK,就会触发整个窗口的数组重新发送
- 发送方窗口和接收方窗口的区别在于已发送部分就等于已接收,中间为窗口,未发送部分就是未接收部分。窗口大小通常是接收方决定,当接收方给发送方回复 ack 的时候会携带接收方窗口大小,发送方就会根据这个回复来动态调整自己的窗口大小
- 快速重传【WIP】
- 拥塞控制
- 慢启动--指数启动--线性--回归慢启动
对比 DCP
- 可靠性差异。TCP 会保证数据正确性和顺序,在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。UDP 只管发送数据封包。
- 基于连接与无连接
- 传输速度
- 场景差异
- 流控技术。TCP 在发送缓冲区中存储数据,并在接收缓冲区中接收数据
TCP 是怎么判断丢包的?