前端面试-tcp详解

·  阅读 1096

什么是tcp

TCP(Transmission Control Protocol)传输控制协议:面向连接,面向字节流的双全工可靠通讯。

tcp有什么特点

特点描述
面向连接通讯双方进行通讯前需要建立连接
面向字节流tcp传输数据是没有边界的,若一次传输报文长度过长则分块传输,同理若过短则多个传输
双全工建立一次连接后通讯双方可以互发数据
可靠不丢失,无差错,按序到达

TCP如何建立连接

三次握手

1 客户端发送一个同步位(SYN)为1,序号(seq)为x的连接请求至服务端,进入同步已发生状态

2 服务端收到后即发生一个 确认位(ACK)为1,确认号(ack)为x+1,序号(seq)为y的确认报文至客户端,并进入同步已收到状态

3 客户端收到确认报文后回复一个确认位(ACK)为1,确认号(ack)为y+1的连接确认报文至服务端,进入连接已创建阶段

944365-895493e20637d2b0 (1).png

为什么要三次握手

1 确保发送方和接受方都具备发送与接受的能力

2 避免无效连接突然连接上服务器形成死锁,造成资源浪费。如果没有三次连接,某一次连接请求因为网络原因滞留,过一段时间后再次与服务器建立连接,服务器会一直等到数据接收,而发送端明显没有数据需要发送

四次挥手

1 客户端向服务端发送一个终止位(FIN)为1,序号(seq)为x的终止报文,进入终止等待1阶段

2 服务端接受到终止请求后,回复一个确认位(ACK)为1,确认号(ack)为x+1,序号为w的的确认请求,进入关闭等待阶段。客户端收到后进入终止等待2阶段,此时客户端-->服务端的连接断开,客户端将不再往服务端发送数据。而服务端若还有数据未发生可以继续发送。

3 若服务端已无数据发送,即发送一个终止位(FIN)为1,序号(seq)为w的终止请求,进入最后确认阶段。

4 客户端收到确认请求后,向服务端回复一个确认位(ACK)为1,确认号(ack)为w+1的确认请求进入时间等待阶段,并于两个最长报文时间段后关闭连接。服务器则在收到确认请求后随即关闭连接。

944365-6162a7db50ebb9d3.png

为什么要四次挥手

因为服务端在断开连接的时候,确认回复和终止回复是分两次发生的,即在回复客户端断开请求的时候服务端可能还有数据需要发送,需要等待所有数据发送完成后才能发送断开回复。

为什么要等待2MSL

防止客户端最后一次确认关闭请求能顺利到达服务端并关闭服务端连接。如果客户端在发送最终确认请求后即关闭,服务端若未收到则会再次发送一次终止请求,此时客户端已经关闭则无法做出应答,导致服务端连接不能被关闭。

为什么tcp通讯能保证数据不丢失,无差错,按序传输

重要概念 滑动窗口

发送窗口:任何时刻发送端都维持一组连续的待发送的允许发送帧的帧序号。每收到一个确认帧,发送窗口就向前移动一个位置。当窗口内无可发送数据时便会停止发送直至收到新的确认帧再向前移动窗口。

接受窗口:任何时刻接受端都维持一组连续的可以接收的帧的帧序号。 每收到发送端发送的一个数据帧则向前按序移动一个位置

1 出错重传(当出现差错时,让发送方重传数据)。

实现方法: 自动重传请求协议ARQ,通过确认机制和超时重传机制保障可靠通讯,出现差错接受方无须重新请求,接收方在等待超时后将再次重传。

实现类型:停止等待ARQ协议 连续ARQ协议

停止等待ARQ协议

发送方每发送一帧数据需要等待接收方确认回复后再发送下一帧,此时发送窗口和接收窗口大小皆为1。

当数据出差错时,接收窗口停止接收,发送方在等待超时后必须重新发送该数据帧,若接收方接收到两个相同序号的发送帧则丢弃不向上交付。

连续ARQ协议

为了提高通讯效率,发送方不需要等待每个数据帧都确认后再发送数据,而是采用累积确认。对于多个数据分组只需要对最后一个分组进行确认即代表之前的所有数据分组都已收到无误。

当数据出差错时 有两种处理方式

1 回退N帧

每当一个分组损坏,发送方就需要重传所有待确认的分组,虽然其中有些分组实际上已经完整地被接收了。 此时发送窗口>1接收窗口=1

2 选择重传

此时发送窗口>1,接收窗口>1。接收端每接收一个在当前接收窗口内的数据分组都将其缓存并给发送端返回确认,不管前面的数据有没有出错(和回退N不一样的地方),待到连续的数据帧组满了后在向上交付。而接收端则为每一个数据帧设置超时时间,在发送窗口内某一个数据帧超时后则进行重发。

2 速度匹配(当接收方来不及接收收到的数据时,可通知发送方降低发送数据的效率)。

实现方法:流量控制 & 拥塞控制协议

流量控制

接受方根据自己接受缓存的大小动态调整发送窗口的大小,从而达到控制速率的目的。

死锁问题:在接收端为发送端发送0窗口大小的报文段后,过段时间又有了新的缓存空间,而此时带有新的窗口大小的报文丢失。发送端则会因为发送窗口为0而无法发送数据。

解决死锁:tcp发送双方在收到0窗口报文后即开启计时,在计时结束后发送一个试探报文,若窗口为0则重置计时,非0则打破死锁。

拥塞控制

慢开始 拥塞避免
慢开始 : 开始发送报文时拥塞窗口设置为一个MMS(最大报文段),每经过一个传输轮次窗口值就翻倍。
拥塞避免 : 开始发送报文时拥塞窗口设置为一个MMS(最大报文段),每经过一个传输轮次窗口值就+1。

一个传输轮次: 发送窗口所有允许发送的数据都发送出去并收到确认回复。

过程:当cwnd<ssthresh(慢开始门限)时采用慢开始,cwnd>ssthresh时采用拥塞避免。当出现拥塞时, cwnd置为1,ssthresh为出现拥塞时发送窗口的一半,并重新开始慢开始算法。

快重传 快恢复
快重传 当接收端收到一个失序报文段后立即发送重复确认,当接收端收到3个重复确认后不需要等待该报文段的最大超时时间立即重传该报文。
快恢复 出现快重传后将ssthresh设置为当前发送窗口的一半,cwnd = ssthress + 3 * MSS。再执行拥塞避免使发送窗口成线性增长
分类:
前端
标签:
分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改