TCP头格式
1. TCP协议要关注的几个问题
- 顺序问题
- 丢包问题
- 连接维护
- 流量控制
- 拥塞控制
2. TCP的三次握手?
连接维护问题涉及到建立连接,这就要讲到TCP的三次握手,“你好,我是A” “你好A,我是B” “你好B” ,客户端发出请求,服务端收到并发出确认接收应答,客户端收到应答并发送收到应答的应答,创建连接成功。具体传输过程如图
SYN:代表请求创建连接,所以在三次握手中前两次要SYN=1,表示这两次用于建立连接。
ACK:代表确认接受,从上面可以发现,不管是三次握手还是四次分手,在回应的时候都会加上ACK=1,表示消息接收到了,并且在建立连接以后的发送数据时,都需加上ACK=1,来表示数据接收成功。
seq:序列号,什么意思呢?当发送一个数据时,数据是被拆成多个数据包来发送,序列号就是对每个数据包进行编号,这样接受方才能对数据包进行再次拼接。
ack:这个代表下一个数据包的编号,这也就是为什么第二请求时,ack是seq+1。
3.TCP为什么需要四次握手断开连接?
tcp是双向的,每个方向断开连接都需要请求和确认,所以是四次。
4. 顺序问题和丢包问题
TCP使用累计应答模式来保证靠谱性。每个包都有一个序号ID,并且按照ID一个一个发送,为了保证不丢包,对于发送的包都要应答,但不是每个都应答,而是会应该某个ID表示都收到了。
但是万一还是丢了??
这个时候会采用确认与重发机制:超时重试和快速重传
超时重试 :对每一个发送了但是没有收到ACK的包,都设定一个定时器,如果超过这个时间,就要重新尝试。而超时时间采用自适应重传算法,根据网络状态不停变化,并且再一次超时的包的超时时间设为上次的两倍。
快速重传: 接受方收到的数据流中存在空格,会发送三个对于空格之前的那个包的ACK,客户端收到这三个ACK,不等超时,立马重传。
5. 流量控制问题
当接收方因为某种原因无法再接收包,这个信息会随着最后的ACK到达发送方时被发送方知道,发送方的窗口也会调整为0,然后发送方会定时发送窗口探测数据包,适时调整窗口大小。
6. 拥塞控制问题
上面的流量控制是怕把接收端缓存塞满,这里的拥塞控制是怕把网络塞满,
它们都是通过窗口大小来实现的。
发送端发送速度过快,导致网络通信管道被填满,容易产生包的丢失和超时重传。
解决办法:TCP BBR拥塞算法,找到一个平衡点,将管道填满但是不填满中间设备的缓存。