Interview-Network

TCP建立和断开连接

三次握手大致过程:

发起方:发送SYN=1,seq=x,进入SYN_SENT

接收方:回复ACK=1,SYN=1,seq=y,ack=x+1,进入SYN_RECV并分配资源

发起方:回复ACK=1,seq=x+1,ack=y+1,进入ESTABLISHED并分配资源

接收方:收到回复,进入ESTABLISHED

通信信道不可靠,少于三次握手无法保证双方都进入ESTABLISED状态或造成资源的浪费。

一次握手:包可以丢失或者延迟,发起方不知道接收方有没有接收到链接发起请求以及是否愿意接收数据,接收方也不知道发起方是不是还愿意建立连接。

两次握手:

  1. 假设ACK包成功发送,但是此时发起方不打算建立连接了,那服务器也不知道,就只能等到超时,造成资源浪费;
  2. 可能因为已失效的数据包产生错误。例如,发起方第一次发送的SYN没有及时到达接收方,超时重发的第二个SYN到达了接收方,接收方回复ACK,发起方接收到之后双方链接建立,这时第一个SYN到达接收方,接收方又回复ACK,认为和发起方建立了新的链接,然而此时发起方并没有建立连接的意愿,所以不予理会,但是接收方不知道,只能耗费大量资源等待。这个链接并不是发起方主动想要建立的,是因为通信延迟意外出现的。 而如果有第三次,那么此时发起方不会回复SYN,接收方得不到响应,超时后就关闭连接释放资源了。

四次挥手大致过程:

发起方:发送FIN=1,seq=u,进入FIN_WAIT_1`

接收方:回复ACK=1,seq=y,ack=u+1,进入CLOSE_WAIT

接收方:回复FIN=1,ACK=1,seq=w,ack=u+1,进入LSAT_ACK

发起方:回复ACK=1,seq=u+1,ack=w+1,进入TIME_WAIT

接收方:收到回复,进入CLOSED并释放资源

发起方:等待2MSL后进入CLOSED并释放资源

本质上和三次握手一样,只是可能还有数据传输,所以需要四次挥手。如果接收方没有数据需要传输,也可以在第二步发送ACK=1,FIN=1,seq=y,ack=u+1,发起方接收到之后就会直接进入TIME_WAIT,就和三次握手一致了。

2MSL保证了发起方和接收方的FIN包或ACK包一定会送达目的地或者再也不会送达。如果发起方不等待直接释放连接,如果最后的ACK丢失,那么接收方就会不断重发,迟迟无法进入CLOSED状态导致资源的浪费;保证链路上该次链接的报文都已经消失;

TCP 性质

计算机网络 - 传输层

可靠性:TCP超时重传,超过时限没收到确认,那么重传该数据包。

滑动窗口:发送方和接受方各有一个相同大小的窗口,接收方不需要对窗口中每一个数据包确认,只需要确认窗口中最后一个按需到达的数据包。发送方收到接收方确认后就可以将窗口向右滑动,继续发送窗口内未发送的数据,根据接收方的确认选择是否重发窗口中数据包,窗口大小可以动态调整。

流量控制:

拥塞控制: