为什么TCP是三次握手,四次挥手?
因为tcp是全双工的数据流通信,如果只有两次,就是客户端的请求报文和服务端的响应报文,那就只能从客户端到服务端发送数据。而三次握手可以保证服务器从客户端接收到响应报文从而建立起服务器到客户端的数据传输。
为什么不是四次呢?
因为服务器返回的报文中包含了对客户端的响应和对客户端的请求,将中间两次报文合为一次,就将四次缩为三次,减少通信开销。
三次握手解决的是TCP全双工的连接,而两次只能建立单工通信。而三次能解决的为什么要用四次握手呢?
那为什么是四次挥手呢?
因为TCP是全双工的通信,客户端可以随时关闭向服务器发送数据,只要发送一个关闭请求的报文,然后收到服务器的响应报文就处于等待服务器的报文的状态,此时客户端已经不能再向服务器发送数据。然后当服务器不再向客户端发送数据,此时要断开连接了,就向客户端发送关闭请求,此时服务器到客户端的连接关闭,客户端到服务器的连接也关闭,至此双工的通信结束。
参考
https://blog.csdn.net/yeweilei/article/details/79279963
注意,TCP传输的是字节流,滑动窗口和拥塞窗口的大小单位都是字节。而且TCP必须接受后确认,接受确认机制和超时重传机制还有字节流的编号都保证了TCP的可靠性。还有TCP的流量控制和拥塞控制机制。
比如请求报文中的seq=x,响应报文中是 ack=x+1,这表示字节序号为x的字节被接收了,响应x+1是作为应答,表示希望下次发送的数据是序号从x+1开始的字节数据。
TCP的实际的发送窗口大小是被接收方控制的流量窗口和发送方的拥塞控制窗口的最小值。
TCP的拥塞控制中的慢启动实际上是接受到一个字节的数据就应答一次,阻塞窗口的大小就加1,所以实际上是指数增长。
TCP的快重传是不用等到发送方的计时器结束了再重传,而是当接收到3次及以上的相同ack响应报文,就开始重传ack中的那个x+1的报文段数据。为什么会接收到三次相同的报文? 那是因为如果某一段报文分组丢失没有被接收方接收到,就会返回那个报文分组的字节流的第一个编号,无论接收到哪段报文分组,都会返回这个编号。
流量控制是限制发送方发送速率来考虑接收方的接受能力。
拥塞控制是限制发送方发送速率来考虑网络节点的接受能力。