TCP
tcp是一种面向连接的协议,通过提供可靠连接解决了数据传输的问题
- 可靠性传输:TCP确保数据包在网络传输过程中不会丢失、不重复、按顺序到达
- 流量控制:TCP通过滑动窗口机制调节发送方的数据发送
- 拥塞控制:通过拥塞避免算法来防止网络过载
- 连接管理:通过三次握手建立连接、四次挥手断开连接来管理会话,确保通信的可靠性和状态的同步
TCP的三次握手
客户端先发送一个SYN(同步序列编号)消息给服务器,服务器收到后回复一个SYN-ACK(同步序列编号-确认)消息,最后客户端再发送一个ACK(确认)消息确认服务器已经收到SYN-ACK消息

为什么需要三次握手
避免历史错误信息的建立,减少通信双方不必要的资源消耗;帮助双方同步初始化序列号
四次挥手
- FIN -> ACK:客户端主动关闭连接,发送FIN包,进入FIN_WAIT_1状态,服务器收到FIN后,表示不再接收数据,但是可能继续发送数据
- ACK:服务器发送ACK包,表示确认收到FIN包,进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态
- FIN -> ACK:服务器完成所有的数据传输后发送FIN包,进入LAST_ACK状态,客户端收到FIN包后,准备关闭连接
- ACK:客户端发送最后一个ACK包,进入TIME_WAIT状态,等待可能迟到的FIN包,服务器收到ACK包后关闭连接,客户端在TIME_WAIT状态计时结束后关闭连接
拥塞控制的步骤
- 慢启动
- 发送方在连接建立初期,缓慢增加数据发送速率,初始的拥塞窗口(cwnd)通常未一个MSS(最大报文段大小),然后在每次收到ACK后成倍增加cwnd,直到达到慢启动值(ssthresh)或者检测到网络拥堵
- 拥塞避免
- 当cwnd达到ssthresh后,TCP进入拥堵避免阶段,拥塞窗口的增长速度从指数变为线性增长,即每个RTT(往返时间)增加一个MSS,保持网络稳定
- 快速重传
- 发送方在收到3个重复的ACK后,立即重传被认为丢失的报文段,无需等待超时,减少了重传的延迟
- 快速恢复
- 快速重传后,TCP不进入慢启动,而是减少cwnd到当前的一半,并设置ssthresh为当前新设置的cwnd的值,然后开始线性增加cwnd,以快速恢复到丢包前的传输速率
粘包与拆包
是什么
粘包指的是多个数据包在接收方被合并成一个包接受,导致多条数据粘在一起,无法区分这些数据的界限;拆包指的是一个数据包在接收方被拆成多个数据包,导致一条完整的数据被拆成多个部分
为什么
粘包:主要是由于TCP是面向字节流的协议,不关心数据边界,数据在发送方可能一次性发送,接收方读取的时候会将多个消息拼接在一起;拆包:由于网络传输中的最大传输单元限制或者发送缓冲区大小限制,导致一个大包拆成多个小包
怎么办
- 使用定长消息:每个消息都有固定长度,接收方按照固定长度读取数据
- 添加消息分隔符:每个消息之间添加特定的分隔符,用来区分消息
- 使用消息头:在消息头部添加长度字段,接收方根据这个字段读取相应的长度
UDP
UDP是一种面向报文的协议,不具有可靠性,消息在网络传输中可能会丢失,不提供复杂的控制机制。UDP支持一对一、一对多、多对多的交互。
