提纲:

🔥TCP模型

  • TCP首部字段

  • 三次握手

  • 四次挥手

  • TCP粘包与拆包

  • TCP的可靠传输

  • 拥塞算法

🎈面试八股真题——【Java八股-第十九期】Socket 统一总结

一、TCP模型

1. TCP首部字段

  • 1、源端口号与目标端口号

  • 2、序列号SN:表示当前发送的字节流数据第一个字节的编号

  • 3、确认号ACK:表示从确认号N之前的数据都已接收完毕

  • 4、控制位

    • SYN:表示建立连接请求

    • ACK:表示ACK确认号是否有效

    • FIN:表示终端连接请求

    • URG:表示紧急数据包,不会在缓冲中等待

    • PSH:表示将本数据包与缓冲中所有数据包发出

    • RST:表示连接出错,需要重新连接

  • 5、校验和——校验数据在传输过程中是否发生改变

  • 6、滑动窗口——由接收方根据流量控制(当前接收方缓冲区剩余大小)与拥塞控制(全局网络拥塞情况)计算得到,用来限制发送方单次传输数据大小上限,防止数据在传输过程中因接收能力丢失

2.三次握手

  • 1、客户端向服务端发送一个控制位ACK=0,SYN=1的数据包表示请求建立连接,发送后客户端进入SYN-SENT状态

  • 2、服务端接收到数据包后,分配缓存空间,并返回给客户端一个ACK=1,SYN=1的数据包,确认号ack为客户端数据包序列号加一,服务端进入SYN-RCVD状态

  • 3、客户端接收到数据包后,返回给客户端ACK=1的数据包,进入Establish状态,传输连接正式建立

3.四次挥手

  • 1、客户端完成所有数据传输,向服务端发送一个FIN=1的终止连接报文,并设置序列号为传输数据的最后一个字节序号,发送后客户端进入FIN-Wait一阶段

  • 2、服务端接收到终止连接报文,并返回给客户端一个ACK确认报文,此时客户端进入FIN-Wait二阶段,客户端无法再进行数据传输,然而服务端可能还存在没有发送给客户端的数据,因此不能立刻关闭连接

  • 3、服务端在发送完所有数据后,再发送一个ACK=1,FIN=1的终止确认给客户端,此时服务端进入LAST-ACK状态

  • 4、客户端收到响应后,返回给服务端一个ACK=1的响应,并进入TIME-WAIT状态,等待时间为2MSL,即两倍的最大数据段传输时间

4.TCP粘包与拆包

  • UDP基于用户数据报传输,给多少发多少,并在首部记录了数据包长度,不存在粘包问题

  • TCP是基于报文段的字节流传输,在传输时会根据发送缓冲区剩余大小将一个大的应用层数据包拆成多个数据段,或将多个小包粘成一个数据段传输,从而造成数据的边界模糊问题

  • TCP报文段长度还收到MSS,即最大报文长度控制,MSS = MTU - IP首部 - TCP首部,MTU即最大数据长度,一个以太网帧数据长度为1518字节(MTU=1500)

  • 解决方法

    • 1、在数据包结尾添加标识